summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2021-07-07 20:36:00 -0300
committerJesusaves <cpntb1@ymail.com>2021-07-07 20:36:00 -0300
commit6967b9e0b63d19141d4f59b7933a960ac81916d0 (patch)
tree8ecd9cd2461f3598cb7faece71eb77162aa4ef2a
parent9877fd4ad81120af8e63e96d5d429092014dc017 (diff)
parent046c659193e1ca8bd13478678d1277df8bf9395c (diff)
downloadserverdata-6967b9e0b63d19141d4f59b7933a960ac81916d0.tar.gz
serverdata-6967b9e0b63d19141d4f59b7933a960ac81916d0.tar.bz2
serverdata-6967b9e0b63d19141d4f59b7933a960ac81916d0.tar.xz
serverdata-6967b9e0b63d19141d4f59b7933a960ac81916d0.zip
Merge branch 'master' into legacy
Override all files with 'master' version. This version is meant to preserve git history as requested by bjorn.
-rw-r--r--.editorconfig9
-rw-r--r--.gitattributes3
-rw-r--r--.gitignore131
-rw-r--r--.gitlab-ci.yml105
-rw-r--r--.mailmap75
-rw-r--r--.tools/conf/mariadb/battle.conf32
-rw-r--r--.tools/conf/mariadb/char-server.conf31
-rw-r--r--.tools/conf/mariadb/constants.conf31
-rw-r--r--.tools/conf/mariadb/inter-server.conf32
-rw-r--r--.tools/conf/mariadb/login-server.conf32
-rw-r--r--.tools/conf/mariadb/logs.conf32
-rw-r--r--.tools/conf/mariadb/map-server.conf32
-rw-r--r--.tools/conf/mariadb/msg_conf.txt0
-rw-r--r--.tools/conf/mariadb/ports.conf8
-rw-r--r--.tools/conf/mariadb/script.conf32
-rw-r--r--.tools/conf/mariadb/socket.conf32
-rw-r--r--.tools/conf/mariadb/sql_connection.conf52
-rw-r--r--.tools/conf/mysql/battle.conf32
-rw-r--r--.tools/conf/mysql/char-server.conf31
-rw-r--r--.tools/conf/mysql/constants.conf31
-rw-r--r--.tools/conf/mysql/inter-server.conf32
-rw-r--r--.tools/conf/mysql/login-server.conf32
-rw-r--r--.tools/conf/mysql/logs.conf32
-rw-r--r--.tools/conf/mysql/map-server.conf32
-rw-r--r--.tools/conf/mysql/msg_conf.txt0
-rw-r--r--.tools/conf/mysql/ports.conf8
-rw-r--r--.tools/conf/mysql/script.conf32
-rw-r--r--.tools/conf/mysql/socket.conf32
-rw-r--r--.tools/conf/mysql/sql_connection.conf52
-rwxr-xr-x.tools/jobs/build.sh15
-rwxr-xr-x.tools/jobs/cloneall.sh5
-rwxr-xr-x.tools/jobs/clonedata.sh5
-rwxr-xr-x.tools/jobs/initdb.sh23
-rwxr-xr-x.tools/jobs/install.sh10
-rwxr-xr-x.tools/jobs/newlines.sh10
-rwxr-xr-x.tools/jobs/runserver.sh38
-rwxr-xr-x.tools/jobs/runservervalgrind.sh37
-rwxr-xr-x.tools/jobs/spaces.sh10
-rw-r--r--.tools/npc/motd-debug-text.txt4
-rwxr-xr-x.tools/scripts/init.sh218
-rw-r--r--COPYING674
-rw-r--r--Makefile37
-rw-r--r--conf/atcommand.conf91
-rw-r--r--conf/battlegrounds.conf124
-rw-r--r--conf/channels.conf.base76
-rw-r--r--conf/char/char-server.conf255
-rw-r--r--conf/clans.conf48
-rw-r--r--conf/common/inter-server.conf128
-rw-r--r--conf/common/map-index.conf34
-rw-r--r--conf/common/socket.conf106
-rw-r--r--conf/global/console.conf67
-rw-r--r--conf/grf-files.txt12
-rw-r--r--conf/groups.conf489
-rw-r--r--conf/import-tmpl/battle.conf32
-rw-r--r--conf/import-tmpl/char-server.conf32
-rw-r--r--conf/import-tmpl/inter-server.conf32
-rw-r--r--conf/import-tmpl/login-server.conf32
-rw-r--r--conf/import-tmpl/logs.conf32
-rw-r--r--conf/import-tmpl/map-server.conf32
-rw-r--r--conf/import-tmpl/msg_conf.txt0
-rw-r--r--conf/import-tmpl/script.conf32
-rw-r--r--conf/import-tmpl/socket.conf32
-rw-r--r--conf/login/login-server.conf205
-rw-r--r--conf/map/battle.conf88
-rw-r--r--conf/map/battle/battle.conf180
-rw-r--r--conf/map/battle/battleground.conf40
-rw-r--r--conf/map/battle/client.conf240
-rw-r--r--conf/map/battle/drops.conf157
-rw-r--r--conf/map/battle/exp.conf114
-rw-r--r--conf/map/battle/feature.conf101
-rw-r--r--conf/map/battle/gm.conf66
-rw-r--r--conf/map/battle/guild.conf73
-rw-r--r--conf/map/battle/homunc.conf71
-rw-r--r--conf/map/battle/items.conf137
-rw-r--r--conf/map/battle/limits.conf57
-rw-r--r--conf/map/battle/misc.conf173
-rw-r--r--conf/map/battle/monster.conf276
-rw-r--r--conf/map/battle/party.conf110
-rw-r--r--conf/map/battle/pet.conf107
-rw-r--r--conf/map/battle/player.conf235
-rw-r--r--conf/map/battle/skill.conf362
-rw-r--r--conf/map/battle/status.conf47
-rw-r--r--conf/map/charhelp.txt28
-rw-r--r--conf/map/help.txt309
-rw-r--r--conf/map/logs.conf184
-rw-r--r--conf/map/map-server.conf114
-rw-r--r--conf/map/maps.conf136
-rw-r--r--conf/map/script.conf74
-rw-r--r--conf/messages.conf1649
-rw-r--r--conf/network.conf37
-rw-r--r--conf/plugins.conf41
-rw-r--r--conf/readme.txt22
-rw-r--r--db/.editorconfig7
-rw-r--r--db/GeoIP.datbin0 -> 668134 bytes
-rw-r--r--db/abra_db.txt14
-rw-r--r--db/achievement_rank_db.conf43
-rw-r--r--db/attendance_db.conf119
-rw-r--r--db/cashshop_db.conf26
-rw-r--r--db/castle_db.conf53
-rw-r--r--db/clans.conf137
-rw-r--r--db/constants.conf3800
-rw-r--r--db/craft_db.conf1921
-rw-r--r--db/create_arrow_db.txt11
-rw-r--r--db/elemental_db.txt24
-rw-r--r--db/elemental_skill_db.txt91
-rw-r--r--db/guild_skill_tree.txt28
-rw-r--r--db/homun_skill_tree.txt15
-rw-r--r--db/item_db2.conf3
-rw-r--r--db/item_options.conf1116
-rw-r--r--db/job_db2.txt38
-rw-r--r--db/magicmushroom_db.txt27
-rw-r--r--db/map_index.txt132
-rw-r--r--db/mercenary_db.txt6
-rw-r--r--db/mercenary_skill_db.txt5
-rw-r--r--db/mob_chat_db.txt4
-rw-r--r--db/mob_classchange.txt5
-rw-r--r--db/mob_db2.conf101
-rw-r--r--db/mob_item_ratio.txt30
-rw-r--r--db/mob_pouch.txt5
-rw-r--r--db/mob_skill_db2.conf59
-rw-r--r--db/option_drop_groups.conf65
-rw-r--r--db/pet_db2.conf73
-rw-r--r--db/pre-re/achievement_db.conf134
-rw-r--r--db/pre-re/attr_fix.txt56
-rw-r--r--db/pre-re/exp_group_db.conf73
-rw-r--r--db/pre-re/exp_guild.txt51
-rw-r--r--db/pre-re/exp_homun.txt154
-rw-r--r--db/pre-re/homunculus_db.txt30
-rw-r--r--db/pre-re/item_chain.conf42
-rw-r--r--db/pre-re/item_combo_db.conf43
-rw-r--r--db/pre-re/item_db.conf14819
-rw-r--r--db/pre-re/item_group.conf20
-rw-r--r--db/pre-re/item_lapineddukddak.conf44
-rw-r--r--db/pre-re/item_packages.conf25
-rw-r--r--db/pre-re/job_db.conf145
-rw-r--r--db/pre-re/map_zone_db.conf490
-rw-r--r--db/pre-re/mob_boss.txt5
-rw-r--r--db/pre-re/mob_branch.txt5
-rw-r--r--db/pre-re/mob_db.conf6968
-rw-r--r--db/pre-re/mob_poring.txt5
-rw-r--r--db/pre-re/mob_race2_db.txt5
-rw-r--r--db/pre-re/mob_skill_db.conf771
-rw-r--r--db/pre-re/pet_db.conf97
-rw-r--r--db/pre-re/refine_db.conf330
-rw-r--r--db/pre-re/size_fix.txt7
-rw-r--r--db/pre-re/skill_db.conf39370
-rw-r--r--db/pre-re/skill_tree.conf136
-rw-r--r--db/pre-re/statpoint.txt255
-rw-r--r--db/produce_db.txt9
-rw-r--r--db/quest_db.conf78
-rw-r--r--db/re/level_penalty.txt14
-rw-r--r--db/roulette_db.conf16
-rw-r--r--db/sc_config.conf3806
-rw-r--r--db/si_config.conf698
-rw-r--r--db/skill_changematerial_db.txt11
-rw-r--r--db/skill_improvise_db.txt12
-rw-r--r--db/spellbook_db.txt7
-rw-r--r--db/stylist_db.conf267
-rw-r--r--db/translations.conf20
-rw-r--r--langs/lang_de.old0
-rw-r--r--langs/lang_de.txt6673
-rw-r--r--langs/lang_en.old465
-rw-r--r--langs/lang_en.txt6673
-rw-r--r--langs/lang_es.old0
-rw-r--r--langs/lang_es.txt6673
-rw-r--r--langs/lang_fr.old0
-rw-r--r--langs/lang_fr.txt6673
-rw-r--r--langs/lang_pt_BR.old0
-rw-r--r--langs/lang_pt_BR.txt6673
-rw-r--r--langs/langs.txt5
-rw-r--r--log/.placeholder0
-rw-r--r--maps/pre-re/000-1.mcachebin0 -> 63 bytes
-rw-r--r--maps/pre-re/001-1.mcachebin0 -> 927 bytes
-rw-r--r--maps/pre-re/001-2.mcachebin0 -> 453 bytes
-rw-r--r--maps/pre-re/001-3.mcachebin0 -> 527 bytes
-rw-r--r--maps/pre-re/002-1.mcachebin0 -> 1003 bytes
-rw-r--r--maps/pre-re/002-2.mcachebin0 -> 579 bytes
-rw-r--r--maps/pre-re/002-3.mcachebin0 -> 322 bytes
-rw-r--r--maps/pre-re/002-4.mcachebin0 -> 512 bytes
-rw-r--r--maps/pre-re/002-5.mcachebin0 -> 481 bytes
-rw-r--r--maps/pre-re/003-1.mcachebin0 -> 456 bytes
-rw-r--r--maps/pre-re/003-4.mcachebin0 -> 969 bytes
-rw-r--r--maps/pre-re/004-1.mcachebin0 -> 556 bytes
-rw-r--r--maps/pre-re/004-3.mcachebin0 -> 449 bytes
-rw-r--r--maps/pre-re/004-4.mcachebin0 -> 493 bytes
-rw-r--r--maps/pre-re/004-5.mcachebin0 -> 436 bytes
-rw-r--r--maps/pre-re/005-3.mcachebin0 -> 782 bytes
-rw-r--r--maps/pre-re/006-1.mcachebin0 -> 1097 bytes
-rw-r--r--maps/pre-re/006-2.mcachebin0 -> 389 bytes
-rw-r--r--maps/pre-re/006-3.mcachebin0 -> 1090 bytes
-rw-r--r--maps/pre-re/007-1.mcachebin0 -> 796 bytes
-rw-r--r--maps/pre-re/007-2.mcachebin0 -> 114 bytes
-rw-r--r--maps/pre-re/008-1.mcachebin0 -> 801 bytes
-rw-r--r--maps/pre-re/009-1.mcachebin0 -> 289 bytes
-rw-r--r--maps/pre-re/009-2.mcachebin0 -> 606 bytes
-rw-r--r--maps/pre-re/009-3.mcachebin0 -> 1126 bytes
-rw-r--r--maps/pre-re/009-4.mcachebin0 -> 616 bytes
-rw-r--r--maps/pre-re/009-5.mcachebin0 -> 222 bytes
-rw-r--r--maps/pre-re/009-6.mcachebin0 -> 140 bytes
-rw-r--r--maps/pre-re/009-7.mcachebin0 -> 216 bytes
-rw-r--r--maps/pre-re/009-8.mcachebin0 -> 713 bytes
-rw-r--r--maps/pre-re/010-1.mcachebin0 -> 1050 bytes
-rw-r--r--maps/pre-re/010-2.mcachebin0 -> 340 bytes
-rw-r--r--maps/pre-re/011-1.mcachebin0 -> 760 bytes
-rw-r--r--maps/pre-re/011-3.mcachebin0 -> 162 bytes
-rw-r--r--maps/pre-re/011-4.mcachebin0 -> 1262 bytes
-rw-r--r--maps/pre-re/011-6.mcachebin0 -> 2259 bytes
-rw-r--r--maps/pre-re/012-1.mcachebin0 -> 1291 bytes
-rw-r--r--maps/pre-re/012-3.mcachebin0 -> 3871 bytes
-rw-r--r--maps/pre-re/012-4.mcachebin0 -> 4007 bytes
-rw-r--r--maps/pre-re/013-1.mcachebin0 -> 1028 bytes
-rw-r--r--maps/pre-re/013-2.mcachebin0 -> 142 bytes
-rw-r--r--maps/pre-re/013-3.mcachebin0 -> 1046 bytes
-rw-r--r--maps/pre-re/014-1.mcachebin0 -> 747 bytes
-rw-r--r--maps/pre-re/014-3.mcachebin0 -> 718 bytes
-rw-r--r--maps/pre-re/015-1.mcachebin0 -> 970 bytes
-rw-r--r--maps/pre-re/015-3.mcachebin0 -> 133 bytes
-rw-r--r--maps/pre-re/016-1.mcachebin0 -> 728 bytes
-rw-r--r--maps/pre-re/016-2.mcachebin0 -> 104 bytes
-rw-r--r--maps/pre-re/017-1.mcachebin0 -> 1303 bytes
-rw-r--r--maps/pre-re/017-2.mcachebin0 -> 84 bytes
-rw-r--r--maps/pre-re/017-3.mcachebin0 -> 482 bytes
-rw-r--r--maps/pre-re/017-4.mcachebin0 -> 435 bytes
-rw-r--r--maps/pre-re/017-9.mcachebin0 -> 99 bytes
-rw-r--r--maps/pre-re/018-1.mcachebin0 -> 1000 bytes
-rw-r--r--maps/pre-re/018-2.mcachebin0 -> 334 bytes
-rw-r--r--maps/pre-re/018-3.mcachebin0 -> 1635 bytes
-rw-r--r--maps/pre-re/019-1.mcachebin0 -> 595 bytes
-rw-r--r--maps/pre-re/019-3.mcachebin0 -> 657 bytes
-rw-r--r--maps/pre-re/019-4.mcachebin0 -> 407 bytes
-rw-r--r--maps/pre-re/020-1.mcachebin0 -> 624 bytes
-rw-r--r--maps/pre-re/020-2.mcachebin0 -> 325 bytes
-rw-r--r--maps/pre-re/020-3.mcachebin0 -> 601 bytes
-rw-r--r--maps/pre-re/021-3.mcachebin0 -> 901 bytes
-rw-r--r--maps/pre-re/023-1.mcachebin0 -> 1173 bytes
-rw-r--r--maps/pre-re/023-2.mcachebin0 -> 79 bytes
-rw-r--r--maps/pre-re/023-3.mcachebin0 -> 884 bytes
-rw-r--r--maps/pre-re/025-1.mcachebin0 -> 1381 bytes
-rw-r--r--maps/pre-re/025-3.mcachebin0 -> 1249 bytes
-rw-r--r--maps/pre-re/025-4.mcachebin0 -> 1416 bytes
-rw-r--r--maps/pre-re/026-1.mcachebin0 -> 1484 bytes
-rw-r--r--maps/pre-re/026-2.mcachebin0 -> 422 bytes
-rw-r--r--maps/pre-re/027-1.mcachebin0 -> 1208 bytes
-rw-r--r--maps/pre-re/027-2.mcachebin0 -> 245 bytes
-rw-r--r--maps/pre-re/027-3.mcachebin0 -> 497 bytes
-rw-r--r--maps/pre-re/027-4.mcachebin0 -> 755 bytes
-rw-r--r--maps/pre-re/027-5.mcachebin0 -> 424 bytes
-rw-r--r--maps/pre-re/027-6.mcachebin0 -> 199 bytes
-rw-r--r--maps/pre-re/027-7.mcachebin0 -> 178 bytes
-rw-r--r--maps/pre-re/027-8.mcachebin0 -> 149 bytes
-rw-r--r--maps/pre-re/028-1.mcachebin0 -> 1112 bytes
-rw-r--r--maps/pre-re/028-3.mcachebin0 -> 352 bytes
-rw-r--r--maps/pre-re/029-1.mcachebin0 -> 873 bytes
-rw-r--r--maps/pre-re/029-2.mcachebin0 -> 340 bytes
-rw-r--r--maps/pre-re/029-3.mcachebin0 -> 190 bytes
-rw-r--r--maps/pre-re/029-4.mcachebin0 -> 365 bytes
-rw-r--r--maps/pre-re/030-1.mcachebin0 -> 442 bytes
-rw-r--r--maps/pre-re/030-2.mcachebin0 -> 580 bytes
-rw-r--r--maps/pre-re/030-3.mcachebin0 -> 502 bytes
-rw-r--r--maps/pre-re/030-4.mcachebin0 -> 173 bytes
-rw-r--r--maps/pre-re/031-1.mcachebin0 -> 680 bytes
-rw-r--r--maps/pre-re/031-2.mcachebin0 -> 98 bytes
-rw-r--r--maps/pre-re/031-3.mcachebin0 -> 3220 bytes
-rw-r--r--maps/pre-re/031-4.mcachebin0 -> 315 bytes
-rw-r--r--maps/pre-re/032-3.mcachebin0 -> 668 bytes
-rw-r--r--maps/pre-re/033-1.mcachebin0 -> 592 bytes
-rw-r--r--maps/pre-re/034-1.mcachebin0 -> 1319 bytes
-rw-r--r--maps/pre-re/034-2.mcachebin0 -> 115 bytes
-rw-r--r--maps/pre-re/035-2.mcachebin0 -> 110 bytes
-rw-r--r--maps/pre-re/036-2.mcachebin0 -> 110 bytes
-rw-r--r--maps/pre-re/041-1.mcachebin0 -> 412 bytes
-rw-r--r--maps/pre-re/042-1.mcachebin0 -> 692 bytes
-rw-r--r--maps/pre-re/043-1.mcachebin0 -> 605 bytes
-rw-r--r--maps/pre-re/043-3.mcachebin0 -> 702 bytes
-rw-r--r--maps/pre-re/043-4.mcachebin0 -> 1336 bytes
-rw-r--r--maps/pre-re/045-1.mcachebin0 -> 2578 bytes
-rw-r--r--maps/pre-re/046-1.mcachebin0 -> 1305 bytes
-rw-r--r--maps/pre-re/046-3.mcachebin0 -> 782 bytes
-rw-r--r--maps/pre-re/047-1.mcachebin0 -> 2436 bytes
-rw-r--r--maps/pre-re/047-3.mcachebin0 -> 926 bytes
-rw-r--r--maps/pre-re/048-2.mcachebin0 -> 822 bytes
-rw-r--r--maps/pre-re/051-1.mcachebin0 -> 637 bytes
-rw-r--r--maps/pre-re/051-3.mcachebin0 -> 459 bytes
-rw-r--r--maps/pre-re/052-1.mcachebin0 -> 327 bytes
-rw-r--r--maps/pre-re/052-2.mcachebin0 -> 449 bytes
-rw-r--r--maps/pre-re/055-1.mcachebin0 -> 846 bytes
-rw-r--r--maps/pre-re/055-3.mcachebin0 -> 663 bytes
-rw-r--r--maps/pre-re/056-2.mcachebin0 -> 155 bytes
-rw-r--r--maps/pre-re/057-1.mcachebin0 -> 497 bytes
-rw-r--r--maps/pre-re/069-2.mcachebin0 -> 341 bytes
-rw-r--r--maps/pre-re/070-1.mcachebin0 -> 1303 bytes
-rw-r--r--maps/pre-re/070-3.mcachebin0 -> 227 bytes
-rw-r--r--maps/pre-re/099-1.mcachebin0 -> 668 bytes
-rw-r--r--maps/pre-re/099-2.mcachebin0 -> 478 bytes
-rw-r--r--maps/pre-re/099-3.mcachebin0 -> 274 bytes
-rw-r--r--maps/pre-re/099-4.mcachebin0 -> 198 bytes
-rw-r--r--maps/pre-re/099-5.mcachebin0 -> 198 bytes
-rw-r--r--maps/pre-re/099-6.mcachebin0 -> 470 bytes
-rw-r--r--maps/pre-re/099-7.mcachebin0 -> 1348 bytes
-rw-r--r--maps/pre-re/099-8.mcachebin0 -> 3726 bytes
-rw-r--r--maps/pre-re/botcheck.mcachebin0 -> 66 bytes
-rw-r--r--maps/pre-re/fermi.mcachebin0 -> 63 bytes
-rw-r--r--maps/pre-re/sec_pri.mcachebin0 -> 115 bytes
-rw-r--r--maps/re/001-1.mcachebin0 -> 930 bytes
-rw-r--r--maps/re/001-2.mcachebin0 -> 453 bytes
-rw-r--r--maps/re/001-3.mcachebin0 -> 527 bytes
-rw-r--r--maps/re/002-1.mcachebin0 -> 1003 bytes
-rw-r--r--maps/re/002-2.mcachebin0 -> 579 bytes
-rw-r--r--maps/re/002-3.mcachebin0 -> 322 bytes
-rw-r--r--maps/re/002-4.mcachebin0 -> 512 bytes
-rw-r--r--maps/re/002-5.mcachebin0 -> 481 bytes
-rw-r--r--maps/re/003-1.mcachebin0 -> 456 bytes
-rw-r--r--maps/re/003-4.mcachebin0 -> 969 bytes
-rw-r--r--maps/re/004-1.mcachebin0 -> 556 bytes
-rw-r--r--maps/re/004-3.mcachebin0 -> 449 bytes
-rw-r--r--maps/re/004-4.mcachebin0 -> 493 bytes
-rw-r--r--maps/re/004-5.mcachebin0 -> 402 bytes
-rw-r--r--maps/re/005-3.mcachebin0 -> 782 bytes
-rw-r--r--maps/re/006-1.mcachebin0 -> 1097 bytes
-rw-r--r--maps/re/006-2.mcachebin0 -> 389 bytes
-rw-r--r--maps/re/006-3.mcachebin0 -> 1090 bytes
-rw-r--r--maps/re/007-1.mcachebin0 -> 796 bytes
-rw-r--r--maps/re/007-2.mcachebin0 -> 111 bytes
-rw-r--r--maps/re/008-1.mcachebin0 -> 801 bytes
-rw-r--r--maps/re/009-1.mcachebin0 -> 289 bytes
-rw-r--r--maps/re/009-2.mcachebin0 -> 598 bytes
-rw-r--r--maps/re/009-3.mcachebin0 -> 1126 bytes
-rw-r--r--maps/re/009-4.mcachebin0 -> 616 bytes
-rw-r--r--maps/re/009-5.mcachebin0 -> 222 bytes
-rw-r--r--maps/re/009-6.mcachebin0 -> 140 bytes
-rw-r--r--maps/re/009-7.mcachebin0 -> 216 bytes
-rw-r--r--maps/re/009-8.mcachebin0 -> 703 bytes
-rw-r--r--maps/re/010-1.mcachebin0 -> 1049 bytes
-rw-r--r--maps/re/010-2.mcachebin0 -> 340 bytes
-rw-r--r--maps/re/011-1.mcachebin0 -> 766 bytes
-rw-r--r--maps/re/011-3.mcachebin0 -> 151 bytes
-rw-r--r--maps/re/011-4.mcachebin0 -> 1125 bytes
-rw-r--r--maps/re/011-6.mcachebin0 -> 2259 bytes
-rw-r--r--maps/re/012-1.mcachebin0 -> 1273 bytes
-rw-r--r--maps/re/012-3.mcachebin0 -> 3820 bytes
-rw-r--r--maps/re/012-4.mcachebin0 -> 4007 bytes
-rw-r--r--maps/re/013-1.mcachebin0 -> 1028 bytes
-rw-r--r--maps/re/013-2.mcachebin0 -> 142 bytes
-rw-r--r--maps/re/013-3.mcachebin0 -> 1046 bytes
-rw-r--r--maps/re/014-1.mcachebin0 -> 737 bytes
-rw-r--r--maps/re/014-3.mcachebin0 -> 718 bytes
-rw-r--r--maps/re/015-1.mcachebin0 -> 970 bytes
-rw-r--r--maps/re/015-3.mcachebin0 -> 133 bytes
-rw-r--r--maps/re/016-1.mcachebin0 -> 728 bytes
-rw-r--r--maps/re/016-2.mcachebin0 -> 104 bytes
-rw-r--r--maps/re/017-1.mcachebin0 -> 1303 bytes
-rw-r--r--maps/re/017-2.mcachebin0 -> 80 bytes
-rw-r--r--maps/re/017-3.mcachebin0 -> 482 bytes
-rw-r--r--maps/re/017-4.mcachebin0 -> 435 bytes
-rw-r--r--maps/re/017-9.mcachebin0 -> 96 bytes
-rw-r--r--maps/re/018-1.mcachebin0 -> 1000 bytes
-rw-r--r--maps/re/018-2.mcachebin0 -> 334 bytes
-rw-r--r--maps/re/018-3.mcachebin0 -> 1635 bytes
-rw-r--r--maps/re/019-1.mcachebin0 -> 595 bytes
-rw-r--r--maps/re/019-3.mcachebin0 -> 657 bytes
-rw-r--r--maps/re/019-4.mcachebin0 -> 407 bytes
-rw-r--r--maps/re/020-1.mcachebin0 -> 624 bytes
-rw-r--r--maps/re/020-2.mcachebin0 -> 315 bytes
-rw-r--r--maps/re/020-3.mcachebin0 -> 601 bytes
-rw-r--r--maps/re/021-3.mcachebin0 -> 901 bytes
-rw-r--r--maps/re/023-1.mcachebin0 -> 1173 bytes
-rw-r--r--maps/re/023-2.mcachebin0 -> 86 bytes
-rw-r--r--maps/re/023-3.mcachebin0 -> 884 bytes
-rw-r--r--maps/re/025-1.mcachebin0 -> 1385 bytes
-rw-r--r--maps/re/025-3.mcachebin0 -> 1249 bytes
-rw-r--r--maps/re/025-4.mcachebin0 -> 1416 bytes
-rw-r--r--maps/re/026-1.mcachebin0 -> 1484 bytes
-rw-r--r--maps/re/026-2.mcachebin0 -> 422 bytes
-rw-r--r--maps/re/027-1.mcachebin0 -> 1213 bytes
-rw-r--r--maps/re/027-2.mcachebin0 -> 245 bytes
-rw-r--r--maps/re/027-3.mcachebin0 -> 477 bytes
-rw-r--r--maps/re/027-4.mcachebin0 -> 755 bytes
-rw-r--r--maps/re/027-5.mcachebin0 -> 424 bytes
-rw-r--r--maps/re/027-6.mcachebin0 -> 199 bytes
-rw-r--r--maps/re/027-7.mcachebin0 -> 178 bytes
-rw-r--r--maps/re/027-8.mcachebin0 -> 149 bytes
-rw-r--r--maps/re/028-1.mcachebin0 -> 1112 bytes
-rw-r--r--maps/re/028-3.mcachebin0 -> 352 bytes
-rw-r--r--maps/re/029-1.mcachebin0 -> 873 bytes
-rw-r--r--maps/re/029-2.mcachebin0 -> 340 bytes
-rw-r--r--maps/re/029-3.mcachebin0 -> 190 bytes
-rw-r--r--maps/re/029-4.mcachebin0 -> 365 bytes
-rw-r--r--maps/re/030-1.mcachebin0 -> 442 bytes
-rw-r--r--maps/re/030-2.mcachebin0 -> 580 bytes
-rw-r--r--maps/re/030-3.mcachebin0 -> 502 bytes
-rw-r--r--maps/re/030-4.mcachebin0 -> 173 bytes
-rw-r--r--maps/re/031-1.mcachebin0 -> 680 bytes
-rw-r--r--maps/re/031-2.mcachebin0 -> 98 bytes
-rw-r--r--maps/re/031-3.mcachebin0 -> 3220 bytes
-rw-r--r--maps/re/031-4.mcachebin0 -> 315 bytes
-rw-r--r--maps/re/032-3.mcachebin0 -> 612 bytes
-rw-r--r--maps/re/033-1.mcachebin0 -> 592 bytes
-rw-r--r--maps/re/034-1.mcachebin0 -> 1319 bytes
-rw-r--r--maps/re/034-2.mcachebin0 -> 115 bytes
-rw-r--r--maps/re/035-2.mcachebin0 -> 110 bytes
-rw-r--r--maps/re/036-2.mcachebin0 -> 110 bytes
-rw-r--r--maps/re/041-1.mcachebin0 -> 406 bytes
-rw-r--r--maps/re/042-1.mcachebin0 -> 692 bytes
-rw-r--r--maps/re/043-1.mcachebin0 -> 605 bytes
-rw-r--r--maps/re/043-3.mcachebin0 -> 702 bytes
-rw-r--r--maps/re/043-4.mcachebin0 -> 1336 bytes
-rw-r--r--maps/re/045-1.mcachebin0 -> 2578 bytes
-rw-r--r--maps/re/046-1.mcachebin0 -> 1293 bytes
-rw-r--r--maps/re/046-3.mcachebin0 -> 782 bytes
-rw-r--r--maps/re/047-1.mcachebin0 -> 2436 bytes
-rw-r--r--maps/re/047-3.mcachebin0 -> 926 bytes
-rw-r--r--maps/re/048-2.mcachebin0 -> 822 bytes
-rw-r--r--maps/re/051-1.mcachebin0 -> 637 bytes
-rw-r--r--maps/re/051-3.mcachebin0 -> 464 bytes
-rw-r--r--maps/re/052-1.mcachebin0 -> 327 bytes
-rw-r--r--maps/re/052-2.mcachebin0 -> 426 bytes
-rw-r--r--maps/re/055-1.mcachebin0 -> 846 bytes
-rw-r--r--maps/re/055-3.mcachebin0 -> 663 bytes
-rw-r--r--maps/re/056-2.mcachebin0 -> 155 bytes
-rw-r--r--maps/re/057-1.mcachebin0 -> 497 bytes
-rw-r--r--maps/re/069-2.mcachebin0 -> 341 bytes
-rw-r--r--maps/re/070-1.mcachebin0 -> 1303 bytes
-rw-r--r--maps/re/070-3.mcachebin0 -> 227 bytes
-rw-r--r--maps/re/099-1.mcachebin0 -> 590 bytes
-rw-r--r--maps/re/099-2.mcachebin0 -> 442 bytes
-rw-r--r--maps/re/099-3.mcachebin0 -> 274 bytes
-rw-r--r--maps/re/099-4.mcachebin0 -> 198 bytes
-rw-r--r--maps/re/099-5.mcachebin0 -> 198 bytes
-rw-r--r--maps/re/099-6.mcachebin0 -> 438 bytes
-rw-r--r--maps/re/099-7.mcachebin0 -> 1260 bytes
-rw-r--r--maps/re/099-8.mcachebin0 -> 3726 bytes
-rw-r--r--maps/re/botcheck.mcachebin0 -> 66 bytes
-rw-r--r--npc/000-1/_import.txt3
-rw-r--r--npc/000-1/exit.txt22
-rw-r--r--npc/001-1/_import.txt24
-rw-r--r--npc/001-1/_mobs.txt7
-rw-r--r--npc/001-1/_warps.txt16
-rw-r--r--npc/001-1/adrian.txt42
-rw-r--r--npc/001-1/ched.txt14
-rw-r--r--npc/001-1/children.txt91
-rw-r--r--npc/001-1/constable.txt7
-rw-r--r--npc/001-1/dock.txt42
-rw-r--r--npc/001-1/eomie.txt111
-rw-r--r--npc/001-1/ferry_master.txt19
-rw-r--r--npc/001-1/gate_guards.txt21
-rw-r--r--npc/001-1/gossip.txt57
-rw-r--r--npc/001-1/guards.txt93
-rw-r--r--npc/001-1/inac.txt15
-rw-r--r--npc/001-1/mapflags.txt2
-rw-r--r--npc/001-1/north_shops.txt43
-rw-r--r--npc/001-1/npcs.txt70
-rw-r--r--npc/001-1/sewer_east.txt15
-rw-r--r--npc/001-1/sewer_north.txt15
-rw-r--r--npc/001-1/stat_reset.txt6
-rw-r--r--npc/001-1/tinris.txt186
-rw-r--r--npc/001-1/tombstones.txt65
-rw-r--r--npc/001-1/weellos.txt31
-rw-r--r--npc/001-2/_import.txt18
-rw-r--r--npc/001-2/_warps.txt17
-rw-r--r--npc/001-2/bank.txt6
-rw-r--r--npc/001-2/david.txt52
-rw-r--r--npc/001-2/fieri.txt117
-rw-r--r--npc/001-2/forge_shops.txt36
-rw-r--r--npc/001-2/government_building.txt154
-rw-r--r--npc/001-2/heathin.txt338
-rw-r--r--npc/001-2/jhedia.txt60
-rw-r--r--npc/001-2/manakins.txt45
-rw-r--r--npc/001-2/mapflags.txt2
-rw-r--r--npc/001-2/pauline.txt257
-rw-r--r--npc/001-2/sandra.txt103
-rw-r--r--npc/001-2/tathin.txt28
-rw-r--r--npc/001-2/tondar.txt55
-rw-r--r--npc/001-2/wizards.txt26
-rw-r--r--npc/001-2/yanis.txt39
-rw-r--r--npc/001-3/_import.txt7
-rw-r--r--npc/001-3/_mobs.txt3
-rw-r--r--npc/001-3/_warps.txt3
-rw-r--r--npc/001-3/guards.txt32
-rw-r--r--npc/001-3/mapflags.txt2
-rw-r--r--npc/001-3/pvpflag.txt1
-rw-r--r--npc/002-1/_import.txt20
-rw-r--r--npc/002-1/_mobs.txt15
-rw-r--r--npc/002-1/_warps.txt18
-rw-r--r--npc/002-1/anwar.txt172
-rw-r--r--npc/002-1/bard.txt117
-rw-r--r--npc/002-1/elanore.txt506
-rw-r--r--npc/002-1/gaurds.txt15
-rw-r--r--npc/002-1/itka.txt19
-rw-r--r--npc/002-1/lieutenant_dausen.txt110
-rw-r--r--npc/002-1/luca.txt348
-rw-r--r--npc/002-1/mapflags.txt1
-rw-r--r--npc/002-1/mine_debug.txt68
-rw-r--r--npc/002-1/nickos.txt113
-rw-r--r--npc/002-1/nomads.txt13
-rw-r--r--npc/002-1/npcs.txt22
-rw-r--r--npc/002-1/sarah.txt75
-rw-r--r--npc/002-1/soul-menhir.txt15
-rw-r--r--npc/002-1/stewen.txt22
-rw-r--r--npc/002-1/traveler.txt7
-rw-r--r--npc/002-2/_import.txt21
-rw-r--r--npc/002-2/_warps.txt19
-rw-r--r--npc/002-2/bakery.txt166
-rw-r--r--npc/002-2/barber.txt10
-rw-r--r--npc/002-2/bleacher.txt130
-rw-r--r--npc/002-2/casino.txt195
-rw-r--r--npc/002-2/dedication.txt8
-rw-r--r--npc/002-2/hetchel.txt417
-rw-r--r--npc/002-2/imec.txt115
-rw-r--r--npc/002-2/inya.txt216
-rw-r--r--npc/002-2/kps.txt152
-rw-r--r--npc/002-2/kylian.txt360
-rw-r--r--npc/002-2/latoy.txt26
-rw-r--r--npc/002-2/mapflags.txt2
-rw-r--r--npc/002-2/omar.txt329
-rw-r--r--npc/002-2/phaet.txt28
-rw-r--r--npc/002-2/rebecca.txt82
-rw-r--r--npc/002-2/shops.txt18
-rw-r--r--npc/002-2/stranger.txt394
-rw-r--r--npc/002-2/troupe_leader.txt61
-rw-r--r--npc/002-3/_import.txt8
-rw-r--r--npc/002-3/_warps.txt5
-rw-r--r--npc/002-3/mapflags.txt1
-rw-r--r--npc/002-3/merchant.txt19
-rw-r--r--npc/002-3/mining_camp_barrier.txt13
-rw-r--r--npc/002-3/nathan.txt103
-rw-r--r--npc/002-3/traveler.txt7
-rw-r--r--npc/002-4/_import.txt10
-rw-r--r--npc/002-4/_mobs.txt16
-rw-r--r--npc/002-4/_warps.txt3
-rw-r--r--npc/002-4/mapflags.txt1
-rw-r--r--npc/002-4/mine_triggerone.txt49
-rw-r--r--npc/002-4/mine_triggerthree.txt49
-rw-r--r--npc/002-4/mine_triggertwo.txt50
-rw-r--r--npc/002-4/naem.txt132
-rw-r--r--npc/002-4/underground_palace_barrier.txt13
-rw-r--r--npc/002-5/_import.txt7
-rw-r--r--npc/002-5/_mobs.txt19
-rw-r--r--npc/002-5/_warps.txt3
-rw-r--r--npc/002-5/chest.txt37
-rw-r--r--npc/002-5/mapflags.txt1
-rw-r--r--npc/002-5/sema.txt62
-rw-r--r--npc/003-1/_import.txt2
-rw-r--r--npc/003-4/_import.txt5
-rw-r--r--npc/003-4/_mobs.txt8
-rw-r--r--npc/003-4/_warps.txt5
-rw-r--r--npc/003-4/ashley.txt60
-rw-r--r--npc/004-1/_import.txt4
-rw-r--r--npc/004-1/_mobs.txt9
-rw-r--r--npc/004-1/_warps.txt4
-rw-r--r--npc/004-3/_import.txt5
-rw-r--r--npc/004-3/_mobs.txt9
-rw-r--r--npc/004-3/_warps.txt9
-rw-r--r--npc/004-3/mapflags.txt1
-rw-r--r--npc/004-4/_import.txt5
-rw-r--r--npc/004-4/_mobs.txt11
-rw-r--r--npc/004-4/_warps.txt8
-rw-r--r--npc/004-4/mapflags.txt1
-rw-r--r--npc/004-5/_import.txt6
-rw-r--r--npc/004-5/_mobs.txt14
-rw-r--r--npc/004-5/_warps.txt3
-rw-r--r--npc/004-5/chest.txt26
-rw-r--r--npc/004-5/mapflags.txt1
-rw-r--r--npc/005-3/_import.txt5
-rw-r--r--npc/005-3/_mobs.txt7
-rw-r--r--npc/005-3/_warps.txt12
-rw-r--r--npc/005-3/mapflags.txt1
-rw-r--r--npc/006-1/_import.txt11
-rw-r--r--npc/006-1/_mobs.txt23
-rw-r--r--npc/006-1/_warps.txt32
-rw-r--r--npc/006-1/mapflags.txt1
-rw-r--r--npc/006-1/mika.txt8
-rw-r--r--npc/006-1/miriam.txt323
-rw-r--r--npc/006-1/pachua.txt237
-rw-r--r--npc/006-1/spirit.txt294
-rw-r--r--npc/006-1/traveler.txt7
-rw-r--r--npc/006-1/tree.txt159
-rw-r--r--npc/006-2/_import.txt6
-rw-r--r--npc/006-2/_warps.txt6
-rw-r--r--npc/006-2/mapflags.txt1
-rw-r--r--npc/006-2/npcs.txt99
-rw-r--r--npc/006-2/shops.txt34
-rw-r--r--npc/006-3/_import.txt5
-rw-r--r--npc/006-3/_mobs.txt28
-rw-r--r--npc/006-3/_warps.txt22
-rw-r--r--npc/006-3/mapflags.txt1
-rw-r--r--npc/007-1/_import.txt6
-rw-r--r--npc/007-1/_mobs.txt11
-rw-r--r--npc/007-1/_warps.txt6
-rw-r--r--npc/007-1/mapflags.txt1
-rw-r--r--npc/007-1/voltain.txt377
-rw-r--r--npc/007-2/_import.txt4
-rw-r--r--npc/007-2/_warps.txt3
-rw-r--r--npc/007-2/witch.txt996
-rw-r--r--npc/008-1/_import.txt13
-rw-r--r--npc/008-1/_mobs.txt11
-rw-r--r--npc/008-1/_warps.txt10
-rw-r--r--npc/008-1/andra.txt170
-rw-r--r--npc/008-1/annualeaster.txt214
-rw-r--r--npc/008-1/banu.txt97
-rw-r--r--npc/008-1/diryn.txt7
-rw-r--r--npc/008-1/dock.txt84
-rw-r--r--npc/008-1/george.txt42
-rw-r--r--npc/008-1/hinnak.txt256
-rw-r--r--npc/008-1/mapflags.txt1
-rw-r--r--npc/008-1/mikhail.txt61
-rw-r--r--npc/009-1/_import.txt15
-rw-r--r--npc/009-1/_mobs.txt7
-rw-r--r--npc/009-1/_warps.txt14
-rw-r--r--npc/009-1/constable.txt9
-rw-r--r--npc/009-1/event.txt160
-rw-r--r--npc/009-1/guide.txt184
-rw-r--r--npc/009-1/jack.txt272
-rw-r--r--npc/009-1/mapflags.txt2
-rw-r--r--npc/009-1/milly.txt452
-rw-r--r--npc/009-1/old_man.txt38
-rw-r--r--npc/009-1/old_woman.txt83
-rw-r--r--npc/009-1/sabine.txt29
-rw-r--r--npc/009-1/soul-menhir.txt15
-rw-r--r--npc/009-1/water_pump.txt5
-rw-r--r--npc/009-2/_import.txt25
-rw-r--r--npc/009-2/_warps.txt24
-rw-r--r--npc/009-2/airlia.txt242
-rw-r--r--npc/009-2/alan.txt216
-rw-r--r--npc/009-2/bernard.txt124
-rw-r--r--npc/009-2/doctor.txt87
-rw-r--r--npc/009-2/drunks.txt14
-rw-r--r--npc/009-2/entertainer.txt40
-rw-r--r--npc/009-2/inspector.txt139
-rw-r--r--npc/009-2/kfahr.txt1071
-rw-r--r--npc/009-2/lena.txt119
-rw-r--r--npc/009-2/mapflags.txt2
-rw-r--r--npc/009-2/misc.txt59
-rw-r--r--npc/009-2/nicholas.txt401
-rw-r--r--npc/009-2/nurse.txt538
-rw-r--r--npc/009-2/olana.txt238
-rw-r--r--npc/009-2/peter.txt153
-rw-r--r--npc/009-2/richard.txt6
-rw-r--r--npc/009-2/selim.txt173
-rw-r--r--npc/009-2/shops.txt75
-rw-r--r--npc/009-2/trader.txt153
-rw-r--r--npc/009-2/waitress.txt71
-rw-r--r--npc/009-2/wyara.txt553
-rw-r--r--npc/009-2/yalina.txt10
-rw-r--r--npc/009-3/_import.txt7
-rw-r--r--npc/009-3/_mobs.txt6
-rw-r--r--npc/009-3/_warps.txt6
-rw-r--r--npc/009-3/mapflags.txt1
-rw-r--r--npc/009-3/sword.txt177
-rw-r--r--npc/009-3/warp.txt26
-rw-r--r--npc/009-4/_import.txt10
-rw-r--r--npc/009-4/_mobs.txt9
-rw-r--r--npc/009-4/_warps.txt8
-rw-r--r--npc/009-4/barriers.txt268
-rw-r--r--npc/009-4/mapflags.txt1
-rw-r--r--npc/009-4/orum.txt607
-rw-r--r--npc/009-4/orum_warps.txt33
-rw-r--r--npc/009-4/torches.txt286
-rw-r--r--npc/009-4/waric.txt93
-rw-r--r--npc/009-5/_import.txt4
-rw-r--r--npc/009-5/_warps.txt3
-rw-r--r--npc/009-5/mapflags.txt2
-rw-r--r--npc/009-6/_import.txt5
-rw-r--r--npc/009-6/_warps.txt3
-rw-r--r--npc/009-6/brodomir.txt249
-rw-r--r--npc/009-6/mapflags.txt2
-rw-r--r--npc/009-7/_import.txt11
-rw-r--r--npc/009-7/_warps.txt3
-rw-r--r--npc/009-7/battlemaster.txt83
-rw-r--r--npc/009-7/core.txt114
-rw-r--r--npc/009-7/debug.txt155
-rw-r--r--npc/009-7/eventHandler.txt88
-rw-r--r--npc/009-7/mapflags.txt2
-rw-r--r--npc/009-7/rouge.txt129
-rw-r--r--npc/009-7/shops.txt36
-rw-r--r--npc/009-7/trapdoor.txt62
-rw-r--r--npc/009-8/_import.txt5
-rw-r--r--npc/009-8/_warps.txt15
-rw-r--r--npc/009-8/celestia.txt297
-rw-r--r--npc/009-8/mapflags.txt2
-rw-r--r--npc/010-1/_import.txt5
-rw-r--r--npc/010-1/_mobs.txt15
-rw-r--r--npc/010-1/_warps.txt7
-rw-r--r--npc/010-1/mapflags.txt1
-rw-r--r--npc/010-2/_import.txt10
-rw-r--r--npc/010-2/_warps.txt9
-rw-r--r--npc/010-2/band.txt36
-rw-r--r--npc/010-2/chef.txt126
-rw-r--r--npc/010-2/dimonds.txt595
-rw-r--r--npc/010-2/doug.txt21
-rw-r--r--npc/010-2/loratay.txt1053
-rw-r--r--npc/010-2/mapflags.txt1
-rw-r--r--npc/010-2/workers.txt15
-rw-r--r--npc/011-1/_import.txt9
-rw-r--r--npc/011-1/_mobs.txt16
-rw-r--r--npc/011-1/_warps.txt8
-rw-r--r--npc/011-1/alchemist.txt1033
-rw-r--r--npc/011-1/auldsbel.txt1291
-rw-r--r--npc/011-1/mapflags.txt1
-rw-r--r--npc/011-1/oscar.txt486
-rw-r--r--npc/011-1/shops.txt18
-rw-r--r--npc/011-3/_import.txt6
-rw-r--r--npc/011-3/_mobs.txt4
-rw-r--r--npc/011-3/_warps.txt3
-rw-r--r--npc/011-3/hermit.txt64
-rw-r--r--npc/011-3/mapflags.txt1
-rw-r--r--npc/011-4/_import.txt6
-rw-r--r--npc/011-4/_mobs.txt9
-rw-r--r--npc/011-4/_warps.txt13
-rw-r--r--npc/011-4/bl_barrier.txt24
-rw-r--r--npc/011-4/mapflags.txt1
-rw-r--r--npc/011-6/_import.txt8
-rw-r--r--npc/011-6/_mobs.txt49
-rw-r--r--npc/011-6/_warps.txt24
-rw-r--r--npc/011-6/barrier.txt15
-rw-r--r--npc/011-6/bryant.txt73
-rw-r--r--npc/011-6/crastur.txt220
-rw-r--r--npc/011-6/mapflags.txt1
-rw-r--r--npc/012-1/_import.txt9
-rw-r--r--npc/012-1/_mobs.txt13
-rw-r--r--npc/012-1/_warps.txt13
-rw-r--r--npc/012-1/amrak.txt9
-rw-r--r--npc/012-1/flowerpentagram2.txt90
-rw-r--r--npc/012-1/injured-mouboo.txt226
-rw-r--r--npc/012-1/mapflags.txt1
-rw-r--r--npc/012-1/shops.txt95
-rw-r--r--npc/012-3/_import.txt9
-rw-r--r--npc/012-3/_mobs.txt18
-rw-r--r--npc/012-3/_warps.txt12
-rw-r--r--npc/012-3/beheader.txt187
-rw-r--r--npc/012-3/mana-seed.txt227
-rw-r--r--npc/012-3/mapflags.txt1
-rw-r--r--npc/012-3/traveler.txt7
-rw-r--r--npc/012-3/warningsigns.txt16
-rw-r--r--npc/012-4/_import.txt6
-rw-r--r--npc/012-4/_mobs.txt66
-rw-r--r--npc/012-4/_warps.txt5
-rw-r--r--npc/012-4/mapflags.txt1
-rw-r--r--npc/012-4/pvpflag.txt1
-rw-r--r--npc/013-1/_import.txt8
-rw-r--r--npc/013-1/_mobs.txt17
-rw-r--r--npc/013-1/_warps.txt7
-rw-r--r--npc/013-1/flowerpentagram.txt93
-rw-r--r--npc/013-1/mapflags.txt1
-rw-r--r--npc/013-1/sagatha.txt403
-rw-r--r--npc/013-1/traveler.txt6
-rw-r--r--npc/013-2/_import.txt7
-rw-r--r--npc/013-2/_warps.txt5
-rw-r--r--npc/013-2/apprentice.txt98
-rw-r--r--npc/013-2/mapflags.txt1
-rw-r--r--npc/013-2/notes.txt204
-rw-r--r--npc/013-2/wizard.txt218
-rw-r--r--npc/013-3/_import.txt9
-rw-r--r--npc/013-3/_mobs.txt30
-rw-r--r--npc/013-3/_warps.txt28
-rw-r--r--npc/013-3/barrier.txt27
-rw-r--r--npc/013-3/mapflags.txt1
-rw-r--r--npc/013-3/mask_chest.txt218
-rw-r--r--npc/013-3/misc.txt5
-rw-r--r--npc/013-3/sword_chest.txt42
-rw-r--r--npc/014-1/_import.txt6
-rw-r--r--npc/014-1/_mobs.txt18
-rw-r--r--npc/014-1/_warps.txt5
-rw-r--r--npc/014-1/mapflags.txt1
-rw-r--r--npc/014-1/wedding-officiator.txt26
-rw-r--r--npc/014-3/_import.txt5
-rw-r--r--npc/014-3/_mobs.txt3
-rw-r--r--npc/014-3/_warps.txt6
-rw-r--r--npc/014-3/mapflags.txt1
-rw-r--r--npc/015-1/_import.txt8
-rw-r--r--npc/015-1/_mobs.txt12
-rw-r--r--npc/015-1/_warps.txt5
-rw-r--r--npc/015-1/alice.txt94
-rw-r--r--npc/015-1/barrier.txt5
-rw-r--r--npc/015-1/mapflags.txt2
-rw-r--r--npc/015-1/sword.txt331
-rw-r--r--npc/015-3/_import.txt8
-rw-r--r--npc/015-3/_mobs.txt6
-rw-r--r--npc/015-3/_warps.txt3
-rw-r--r--npc/015-3/barrier.txt38
-rw-r--r--npc/015-3/katze.txt185
-rw-r--r--npc/015-3/mapflags.txt3
-rw-r--r--npc/015-3/pot.txt122
-rw-r--r--npc/016-1/_import.txt7
-rw-r--r--npc/016-1/_mobs.txt11
-rw-r--r--npc/016-1/_warps.txt4
-rw-r--r--npc/016-1/gwendolyn.txt539
-rw-r--r--npc/016-1/mapflags.txt2
-rw-r--r--npc/016-1/rossy.txt288
-rw-r--r--npc/016-2/_import.txt3
-rw-r--r--npc/016-2/_warps.txt4
-rw-r--r--npc/017-1/_import.txt7
-rw-r--r--npc/017-1/_mobs.txt20
-rw-r--r--npc/017-1/_warps.txt10
-rw-r--r--npc/017-1/flowerpentagram1.txt77
-rw-r--r--npc/017-1/flowerpentagram5.txt128
-rw-r--r--npc/017-1/mapflags.txt1
-rw-r--r--npc/017-2/_import.txt4
-rw-r--r--npc/017-2/_warps.txt4
-rw-r--r--npc/017-2/mapflags.txt1
-rw-r--r--npc/017-3/_import.txt4
-rw-r--r--npc/017-3/_warps.txt11
-rw-r--r--npc/017-3/mapflags.txt1
-rw-r--r--npc/017-4/_import.txt7
-rw-r--r--npc/017-4/_warps.txt9
-rw-r--r--npc/017-4/guardingspirit.txt95
-rw-r--r--npc/017-4/mapflags.txt1
-rw-r--r--npc/017-4/orum.txt821
-rw-r--r--npc/017-4/waric.txt407
-rw-r--r--npc/017-9/_import.txt5
-rw-r--r--npc/017-9/_warps.txt7
-rw-r--r--npc/017-9/mapflags.txt1
-rw-r--r--npc/017-9/npcs.txt36
-rw-r--r--npc/018-1/_import.txt9
-rw-r--r--npc/018-1/_mobs.txt29
-rw-r--r--npc/018-1/_warps.txt19
-rw-r--r--npc/018-1/flowerpentagram3.txt102
-rw-r--r--npc/018-1/mapflags.txt1
-rw-r--r--npc/018-1/mike.txt26
-rw-r--r--npc/018-1/miners.txt35
-rw-r--r--npc/018-1/sword.txt10
-rw-r--r--npc/018-2/_import.txt10
-rw-r--r--npc/018-2/_mobs.txt3
-rw-r--r--npc/018-2/_warps.txt9
-rw-r--r--npc/018-2/angus.txt20
-rw-r--r--npc/018-2/books.txt21
-rw-r--r--npc/018-2/caul.txt1088
-rw-r--r--npc/018-2/mapflags.txt1
-rw-r--r--npc/018-2/miners.txt173
-rw-r--r--npc/018-2/receptionist.txt66
-rw-r--r--npc/018-3/_import.txt8
-rw-r--r--npc/018-3/_mobs.txt25
-rw-r--r--npc/018-3/_warps.txt24
-rw-r--r--npc/018-3/bookcase.txt66
-rw-r--r--npc/018-3/evil-obelisk.txt30
-rw-r--r--npc/018-3/mapflags.txt1
-rw-r--r--npc/018-3/sword.txt10
-rw-r--r--npc/019-1/_import.txt7
-rw-r--r--npc/019-1/_mobs.txt6
-rw-r--r--npc/019-1/_warps.txt6
-rw-r--r--npc/019-1/mapflags.txt1
-rw-r--r--npc/019-1/santa_helper.txt92
-rw-r--r--npc/019-1/snowman.txt84
-rw-r--r--npc/019-3/_import.txt5
-rw-r--r--npc/019-3/_mobs.txt4
-rw-r--r--npc/019-3/_warps.txt5
-rw-r--r--npc/019-3/mapflags.txt1
-rw-r--r--npc/019-4/_import.txt5
-rw-r--r--npc/019-4/_mobs.txt6
-rw-r--r--npc/019-4/_warps.txt4
-rw-r--r--npc/019-4/mapflags.txt1
-rw-r--r--npc/020-1/KrickKrackKrock.txt17
-rw-r--r--npc/020-1/_import.txt10
-rw-r--r--npc/020-1/_mobs.txt3
-rw-r--r--npc/020-1/_warps.txt12
-rw-r--r--npc/020-1/mapflags.txt2
-rw-r--r--npc/020-1/rockscissor.txt13
-rw-r--r--npc/020-1/soul-menhir.txt15
-rw-r--r--npc/020-1/traveler.txt6
-rw-r--r--npc/020-1/well.txt103
-rw-r--r--npc/020-2/_import.txt8
-rw-r--r--npc/020-2/_warps.txt8
-rw-r--r--npc/020-2/baktar.txt225
-rw-r--r--npc/020-2/banker.txt16
-rw-r--r--npc/020-2/furquest.txt646
-rw-r--r--npc/020-2/mapflags.txt2
-rw-r--r--npc/020-2/shops.txt57
-rw-r--r--npc/020-3/_import.txt5
-rw-r--r--npc/020-3/_mobs.txt6
-rw-r--r--npc/020-3/_warps.txt9
-rw-r--r--npc/020-3/mapflags.txt1
-rw-r--r--npc/021-3/_import.txt5
-rw-r--r--npc/021-3/_mobs.txt12
-rw-r--r--npc/021-3/_warps.txt6
-rw-r--r--npc/021-3/mapflags.txt1
-rw-r--r--npc/023-1/_import.txt4
-rw-r--r--npc/023-1/_mobs.txt15
-rw-r--r--npc/023-1/_warps.txt15
-rw-r--r--npc/023-2/_import.txt3
-rw-r--r--npc/023-2/_warps.txt2
-rw-r--r--npc/023-3/_import.txt4
-rw-r--r--npc/023-3/_mobs.txt8
-rw-r--r--npc/023-3/_warps.txt10
-rw-r--r--npc/025-1/_import.txt7
-rw-r--r--npc/025-1/_mobs.txt12
-rw-r--r--npc/025-1/_warps.txt5
-rw-r--r--npc/025-1/barrier.txt15
-rw-r--r--npc/025-1/mapflags.txt2
-rw-r--r--npc/025-1/reset.txt5
-rw-r--r--npc/025-3/_import.txt6
-rw-r--r--npc/025-3/_mobs.txt6
-rw-r--r--npc/025-3/_warps.txt4
-rw-r--r--npc/025-3/barriers.txt1274
-rw-r--r--npc/025-3/mapflags.txt1
-rw-r--r--npc/025-4/_import.txt8
-rw-r--r--npc/025-4/_mobs.txt4
-rw-r--r--npc/025-4/_warps.txt3
-rw-r--r--npc/025-4/battlecaves.txt953
-rw-r--r--npc/025-4/clauquer.txt114
-rw-r--r--npc/025-4/julia.txt44
-rw-r--r--npc/025-4/mapflags.txt2
-rw-r--r--npc/026-1/_import.txt11
-rw-r--r--npc/026-1/_mobs.txt16
-rw-r--r--npc/026-1/_warps.txt7
-rw-r--r--npc/026-1/evil_guard.txt26
-rw-r--r--npc/026-1/headless_man.txt202
-rw-r--r--npc/026-1/husband.txt344
-rw-r--r--npc/026-1/mapflags.txt2
-rw-r--r--npc/026-1/sign.txt6
-rw-r--r--npc/026-1/soul-menhir.txt15
-rw-r--r--npc/026-1/traveler.txt7
-rw-r--r--npc/026-2/_import.txt16
-rw-r--r--npc/026-2/_warps.txt13
-rw-r--r--npc/026-2/barman.txt9
-rw-r--r--npc/026-2/cerhan.txt38
-rw-r--r--npc/026-2/crying_child.txt206
-rw-r--r--npc/026-2/diary.txt53
-rw-r--r--npc/026-2/door.txt20
-rw-r--r--npc/026-2/eurni.txt15
-rw-r--r--npc/026-2/golbenez.txt614
-rw-r--r--npc/026-2/gy_inn_shops.txt93
-rw-r--r--npc/026-2/innkeeper.txt457
-rw-r--r--npc/026-2/lover.txt307
-rw-r--r--npc/026-2/mapflags.txt2
-rw-r--r--npc/026-2/testnpcs.txt57
-rw-r--r--npc/026-2/werewolf.txt176
-rw-r--r--npc/027-1/_import.txt7
-rw-r--r--npc/027-1/_mobs.txt18
-rw-r--r--npc/027-1/_warps.txt4
-rw-r--r--npc/027-1/crypt.txt10
-rw-r--r--npc/027-1/graves.txt108
-rw-r--r--npc/027-1/mapflags.txt2
-rw-r--r--npc/027-2/_import.txt8
-rw-r--r--npc/027-2/_mobs.txt6
-rw-r--r--npc/027-2/_warps.txt5
-rw-r--r--npc/027-2/alacrius.txt123
-rw-r--r--npc/027-2/caretaker.txt112
-rw-r--r--npc/027-2/mapflags.txt2
-rw-r--r--npc/027-2/thurston.txt21
-rw-r--r--npc/027-3/_import.txt8
-rw-r--r--npc/027-3/_mobs.txt10
-rw-r--r--npc/027-3/_warps.txt4
-rw-r--r--npc/027-3/casket_traps.txt72
-rw-r--r--npc/027-3/general_krukan_door.txt15
-rw-r--r--npc/027-3/mapflags.txt1
-rw-r--r--npc/027-3/monsters.txt66
-rw-r--r--npc/027-4/_import.txt8
-rw-r--r--npc/027-4/_mobs.txt7
-rw-r--r--npc/027-4/_warps.txt4
-rw-r--r--npc/027-4/casket_traps.txt72
-rw-r--r--npc/027-4/general_razha_door.txt15
-rw-r--r--npc/027-4/mapflags.txt1
-rw-r--r--npc/027-4/monsters.txt67
-rw-r--r--npc/027-5/_import.txt7
-rw-r--r--npc/027-5/_mobs.txt9
-rw-r--r--npc/027-5/_warps.txt3
-rw-r--r--npc/027-5/casket_traps.txt72
-rw-r--r--npc/027-5/general_terogan_door.txt15
-rw-r--r--npc/027-5/mapflags.txt1
-rw-r--r--npc/027-6/_import.txt6
-rw-r--r--npc/027-6/casket_traps.txt63
-rw-r--r--npc/027-6/general_krukan.txt225
-rw-r--r--npc/027-6/general_krukan_exitdoor.txt11
-rw-r--r--npc/027-6/mapflags.txt2
-rw-r--r--npc/027-7/_import.txt5
-rw-r--r--npc/027-7/general_razha.txt229
-rw-r--r--npc/027-7/general_razha_exitdoor.txt11
-rw-r--r--npc/027-7/mapflags.txt2
-rw-r--r--npc/027-8/_import.txt5
-rw-r--r--npc/027-8/general_terogan.txt315
-rw-r--r--npc/027-8/general_terogan_exitdoor.txt11
-rw-r--r--npc/027-8/mapflags.txt2
-rw-r--r--npc/028-1/_import.txt5
-rw-r--r--npc/028-1/_warps.txt3
-rw-r--r--npc/028-1/mapflags.txt1
-rw-r--r--npc/028-1/portal.txt14
-rw-r--r--npc/028-3/_import.txt4
-rw-r--r--npc/028-3/_warps.txt3
-rw-r--r--npc/028-3/mapflags.txt1
-rw-r--r--npc/029-1/_import.txt21
-rw-r--r--npc/029-1/_mobs.txt8
-rw-r--r--npc/029-1/_warps.txt7
-rw-r--r--npc/029-1/aahna.txt9
-rw-r--r--npc/029-1/barrier.txt21
-rw-r--r--npc/029-1/dock.txt42
-rw-r--r--npc/029-1/ferry_master.txt19
-rw-r--r--npc/029-1/hasan.txt203
-rw-r--r--npc/029-1/hideandseek.txt388
-rw-r--r--npc/029-1/kaan.txt118
-rw-r--r--npc/029-1/liana.txt38
-rw-r--r--npc/029-1/mapflags.txt1
-rw-r--r--npc/029-1/monster_guide.txt48
-rw-r--r--npc/029-1/rewards_master.txt147
-rw-r--r--npc/029-1/soul-menhir.txt15
-rw-r--r--npc/029-1/traveler.txt7
-rw-r--r--npc/029-1/tutorial.txt51
-rw-r--r--npc/029-1/valon.txt106
-rw-r--r--npc/029-1/vincent.txt134
-rw-r--r--npc/029-1/zegas.txt94
-rw-r--r--npc/029-2/_import.txt15
-rw-r--r--npc/029-2/_mobs.txt3
-rw-r--r--npc/029-2/_warps.txt8
-rw-r--r--npc/029-2/bankroom.txt5
-rw-r--r--npc/029-2/barrels.txt44
-rw-r--r--npc/029-2/barrels_config.txt84
-rw-r--r--npc/029-2/cynric.txt6
-rw-r--r--npc/029-2/mapflags.txt3
-rw-r--r--npc/029-2/morgan.txt158
-rw-r--r--npc/029-2/nyle.txt47
-rw-r--r--npc/029-2/sorfina.txt386
-rw-r--r--npc/029-2/stat_reset.txt45
-rw-r--r--npc/029-2/tanisha.txt286
-rw-r--r--npc/029-2/two_arms.txt32
-rw-r--r--npc/029-3/_import.txt5
-rw-r--r--npc/029-3/barrier.txt9
-rw-r--r--npc/029-3/mapflags.txt2
-rw-r--r--npc/029-3/parua.txt400
-rw-r--r--npc/029-4/_import.txt4
-rw-r--r--npc/029-4/_mobs.txt8
-rw-r--r--npc/029-4/_warps.txt3
-rw-r--r--npc/030-1/_import.txt4
-rw-r--r--npc/030-1/_mobs.txt6
-rw-r--r--npc/030-1/_warps.txt3
-rw-r--r--npc/030-2/_import.txt17
-rw-r--r--npc/030-2/_warps.txt17
-rw-r--r--npc/030-2/avalia.txt219
-rw-r--r--npc/030-2/basic_npcs.txt73
-rw-r--r--npc/030-2/bedding_helper.txt97
-rw-r--r--npc/030-2/chief_helper.txt92
-rw-r--r--npc/030-2/eljas.txt206
-rw-r--r--npc/030-2/empty_boxes_helper.txt63
-rw-r--r--npc/030-2/glitter_helper.txt94
-rw-r--r--npc/030-2/guards.txt32
-rw-r--r--npc/030-2/mapflags.txt1
-rw-r--r--npc/030-2/present_helper.txt82
-rw-r--r--npc/030-2/roasted_acorns_helper.txt73
-rw-r--r--npc/030-2/shipping_helper.txt113
-rw-r--r--npc/030-2/storage_helper.txt104
-rw-r--r--npc/030-2/wrapping_paper_helper.txt139
-rw-r--r--npc/030-3/_import.txt5
-rw-r--r--npc/030-3/_warps.txt3
-rw-r--r--npc/030-3/mapflags.txt1
-rw-r--r--npc/030-3/orum_homunculus.txt466
-rw-r--r--npc/030-4/_import.txt4
-rw-r--r--npc/030-4/mana_battery.txt433
-rw-r--r--npc/030-4/mapflags.txt2
-rw-r--r--npc/031-1/_import.txt9
-rw-r--r--npc/031-1/_mobs.txt6
-rw-r--r--npc/031-1/_warps.txt5
-rw-r--r--npc/031-1/angelaOutside.txt131
-rw-r--r--npc/031-1/dock.txt40
-rw-r--r--npc/031-1/frozenbeard.txt22
-rw-r--r--npc/031-1/house.txt9
-rw-r--r--npc/031-1/mapflags.txt1
-rw-r--r--npc/031-2/_import.txt6
-rw-r--r--npc/031-2/_warps.txt4
-rw-r--r--npc/031-2/angelaHouse.txt136
-rw-r--r--npc/031-2/cindyHouse.txt43
-rw-r--r--npc/031-2/mapflags.txt1
-rw-r--r--npc/031-3/_import.txt6
-rw-r--r--npc/031-3/_mobs.txt91
-rw-r--r--npc/031-3/_warps.txt51
-rw-r--r--npc/031-3/labyrinth.txt10
-rw-r--r--npc/031-3/mapflags.txt1
-rw-r--r--npc/031-4/_import.txt5
-rw-r--r--npc/031-4/barrier.txt9
-rw-r--r--npc/031-4/cindyCave.txt234
-rw-r--r--npc/031-4/mapflags.txt2
-rw-r--r--npc/032-3/_import.txt5
-rw-r--r--npc/032-3/_mobs.txt12
-rw-r--r--npc/032-3/_warps.txt4
-rw-r--r--npc/032-3/mapflags.txt1
-rw-r--r--npc/033-1/_import.txt11
-rw-r--r--npc/033-1/_mobs.txt6
-rw-r--r--npc/033-1/_warps.txt4
-rw-r--r--npc/033-1/backDoor.txt9
-rw-r--r--npc/033-1/barbarianinit.txt25
-rw-r--r--npc/033-1/birrod.txt263
-rw-r--r--npc/033-1/kimarr.txt405
-rw-r--r--npc/033-1/mapflags.txt1
-rw-r--r--npc/033-1/traveler.txt7
-rw-r--r--npc/033-1/yerrnk.txt205
-rw-r--r--npc/034-1/_import.txt7
-rw-r--r--npc/034-1/_mobs.txt8
-rw-r--r--npc/034-1/_warps.txt8
-rw-r--r--npc/034-1/ambushs.txt870
-rw-r--r--npc/034-1/mapflags.txt1
-rw-r--r--npc/034-1/yetiSpawn.txt58
-rw-r--r--npc/034-2/_import.txt4
-rw-r--r--npc/034-2/_warps.txt4
-rw-r--r--npc/034-2/mapflags.txt1
-rw-r--r--npc/035-2/_import.txt7
-rw-r--r--npc/035-2/casino.txt9
-rw-r--r--npc/035-2/emblems.txt36
-rw-r--r--npc/035-2/koga.txt35
-rw-r--r--npc/035-2/mapflags.txt2
-rw-r--r--npc/035-2/shops.txt23
-rw-r--r--npc/036-2/_import.txt7
-rw-r--r--npc/036-2/casino.txt9
-rw-r--r--npc/036-2/emblems.txt26
-rw-r--r--npc/036-2/koga-candor.txt28
-rw-r--r--npc/036-2/mapflags.txt2
-rw-r--r--npc/036-2/shops.txt36
-rw-r--r--npc/041-1/_import.txt4
-rw-r--r--npc/041-1/_mobs.txt13
-rw-r--r--npc/041-1/_warps.txt4
-rw-r--r--npc/042-1/_import.txt4
-rw-r--r--npc/042-1/_mobs.txt12
-rw-r--r--npc/042-1/_warps.txt4
-rw-r--r--npc/043-1/_import.txt4
-rw-r--r--npc/043-1/_mobs.txt5
-rw-r--r--npc/043-1/_warps.txt3
-rw-r--r--npc/043-3/_import.txt5
-rw-r--r--npc/043-3/_mobs.txt11
-rw-r--r--npc/043-3/_warps.txt6
-rw-r--r--npc/043-3/mapflags.txt1
-rw-r--r--npc/043-4/_import.txt5
-rw-r--r--npc/043-4/_mobs.txt24
-rw-r--r--npc/043-4/_warps.txt5
-rw-r--r--npc/043-4/mapflags.txt1
-rw-r--r--npc/045-1/_import.txt5
-rw-r--r--npc/045-1/_mobs.txt17
-rw-r--r--npc/045-1/_warps.txt5
-rw-r--r--npc/045-1/mapflags.txt1
-rw-r--r--npc/046-1/_import.txt5
-rw-r--r--npc/046-1/_mobs.txt13
-rw-r--r--npc/046-1/_warps.txt12
-rw-r--r--npc/046-1/mapflags.txt1
-rw-r--r--npc/046-3/_import.txt5
-rw-r--r--npc/046-3/_mobs.txt17
-rw-r--r--npc/046-3/_warps.txt8
-rw-r--r--npc/046-3/mapflags.txt1
-rw-r--r--npc/047-1/_import.txt5
-rw-r--r--npc/047-1/_mobs.txt24
-rw-r--r--npc/047-1/_warps.txt16
-rw-r--r--npc/047-1/mapflags.txt1
-rw-r--r--npc/047-3/_import.txt5
-rw-r--r--npc/047-3/_mobs.txt23
-rw-r--r--npc/047-3/_warps.txt11
-rw-r--r--npc/047-3/mapflags.txt1
-rw-r--r--npc/048-2/_import.txt26
-rw-r--r--npc/048-2/_warps.txt19
-rw-r--r--npc/048-2/bluesageConfig.txt71
-rw-r--r--npc/048-2/helperAccused.txt139
-rw-r--r--npc/048-2/helperBookpages1.txt136
-rw-r--r--npc/048-2/helperBookpages2.txt83
-rw-r--r--npc/048-2/helperBookpages3.txt62
-rw-r--r--npc/048-2/helperChief.txt117
-rw-r--r--npc/048-2/helperCleaning1.txt98
-rw-r--r--npc/048-2/helperCleaning2.txt67
-rw-r--r--npc/048-2/helperCleaning3.txt71
-rw-r--r--npc/048-2/helperCleaning4.txt62
-rw-r--r--npc/048-2/helperCleaning5.txt64
-rw-r--r--npc/048-2/helperJanitor.txt96
-rw-r--r--npc/048-2/helperMInk.txt100
-rw-r--r--npc/048-2/helperMReed.txt89
-rw-r--r--npc/048-2/helperMSilk.txt84
-rw-r--r--npc/048-2/helperMYetiClaw.txt91
-rw-r--r--npc/048-2/helperResting1.txt63
-rw-r--r--npc/048-2/helperResting2.txt64
-rw-r--r--npc/048-2/mapflags.txt1
-rw-r--r--npc/048-2/sageNikolai.txt359
-rw-r--r--npc/048-2/slimes.txt603
-rw-r--r--npc/048-2/traveler.txt7
-rw-r--r--npc/048-2/visitors.txt36
-rw-r--r--npc/051-1/_import.txt9
-rw-r--r--npc/051-1/_mobs.txt4
-rw-r--r--npc/051-1/desert.txt132
-rw-r--r--npc/051-1/desertmonsters.txt153
-rw-r--r--npc/051-1/forest.txt76
-rw-r--r--npc/051-1/forestmonsters.txt22
-rw-r--r--npc/051-1/janitor.txt23
-rw-r--r--npc/051-1/mapflags.txt2
-rw-r--r--npc/051-3/_import.txt9
-rw-r--r--npc/051-3/_mobs.txt18
-rw-r--r--npc/051-3/ambush.txt165
-rw-r--r--npc/051-3/jailslimes.txt28
-rw-r--r--npc/051-3/janitor.txt9
-rw-r--r--npc/051-3/locks.txt65
-rw-r--r--npc/051-3/mapflags.txt2
-rw-r--r--npc/051-3/reinforcements.txt83
-rw-r--r--npc/052-1/_import.txt6
-rw-r--r--npc/052-1/_mobs.txt3
-rw-r--r--npc/052-1/channelling.txt339
-rw-r--r--npc/052-1/janitor.txt17
-rw-r--r--npc/052-1/mapflags.txt2
-rw-r--r--npc/052-2/_import.txt8
-rw-r--r--npc/052-2/chest.txt167
-rw-r--r--npc/052-2/janitor.txt32
-rw-r--r--npc/052-2/lobby.txt352
-rw-r--r--npc/052-2/mapflags.txt2
-rw-r--r--npc/052-2/partyroom.txt267
-rw-r--r--npc/052-2/storage.txt179
-rw-r--r--npc/055-1/_import.txt8
-rw-r--r--npc/055-1/_mobs.txt19
-rw-r--r--npc/055-1/_warps.txt9
-rw-r--r--npc/055-1/flowerpentagram4.txt114
-rw-r--r--npc/055-1/mapflags.txt1
-rw-r--r--npc/055-1/pumpkins.txt147
-rw-r--r--npc/055-1/traveler.txt7
-rw-r--r--npc/055-3/_import.txt5
-rw-r--r--npc/055-3/_mobs.txt10
-rw-r--r--npc/055-3/_warps.txt8
-rw-r--r--npc/055-3/mapflags.txt1
-rw-r--r--npc/056-2/_import.txt7
-rw-r--r--npc/056-2/_warps.txt4
-rw-r--r--npc/056-2/barrier.txt17
-rw-r--r--npc/056-2/mapflags.txt2
-rw-r--r--npc/056-2/mirak.txt139
-rw-r--r--npc/056-2/notes.txt13
-rw-r--r--npc/057-1/_import.txt5
-rw-r--r--npc/057-1/_mobs.txt20
-rw-r--r--npc/057-1/_warps.txt3
-rw-r--r--npc/057-1/mapflags.txt1
-rw-r--r--npc/069-2/_import.txt3
-rw-r--r--npc/069-2/_warps.txt4
-rw-r--r--npc/070-1/_import.txt3
-rw-r--r--npc/070-1/mapflags.txt1
-rw-r--r--npc/070-3/_import.txt2
-rw-r--r--npc/099-1/_import.txt3
-rw-r--r--npc/099-1/_warps.txt67
-rw-r--r--npc/099-2/_import.txt3
-rw-r--r--npc/099-2/_warps.txt22
-rw-r--r--npc/099-3/_import.txt3
-rw-r--r--npc/099-3/_warps.txt16
-rw-r--r--npc/099-4/_import.txt2
-rw-r--r--npc/099-5/_import.txt3
-rw-r--r--npc/099-5/mapflag.txt2
-rw-r--r--npc/099-6/_import.txt3
-rw-r--r--npc/099-6/_warps.txt22
-rw-r--r--npc/099-7/_import.txt4
-rw-r--r--npc/099-7/boss.txt743
-rw-r--r--npc/099-7/cronos.txt156
-rw-r--r--npc/099-8/_import.txt2
-rw-r--r--npc/_anchors.txt11
-rw-r--r--npc/_import.txt135
-rw-r--r--npc/annuals/check_time.txt46
-rw-r--r--npc/annuals/fathertime.txt32
-rw-r--r--npc/annuals/halloween/config.txt284
-rw-r--r--npc/annuals/halloween/debug.txt138
-rw-r--r--npc/annuals/halloween/munro.txt46
-rw-r--r--npc/annuals/halloween/trick_or_treat.txt322
-rw-r--r--npc/annuals/tree_beard.txt1038
-rw-r--r--npc/annuals/xmas/barriers.txt155
-rw-r--r--npc/annuals/xmas/config.txt252
-rw-r--r--npc/annuals/xmas/core.txt229
-rw-r--r--npc/annuals/xmas/debug.txt220
-rw-r--r--npc/annuals/xmas/helpers.txt44
-rw-r--r--npc/annuals/xmas/list.txt98
-rw-r--r--npc/annuals/xmas/mobmanager.txt77
-rw-r--r--npc/annuals/xmas/reagents.txt139
-rw-r--r--npc/annuals/xmas/states.txt51
-rw-r--r--npc/botcheck/_import.txt3
-rw-r--r--npc/botcheck/mapflags.txt3
-rw-r--r--npc/commands/debug-quest.txt102
-rw-r--r--npc/commands/debug.txt688
-rw-r--r--npc/commands/force-rename.txt46
-rw-r--r--npc/commands/gm.txt41
-rw-r--r--npc/commands/ipcheck.txt71
-rw-r--r--npc/commands/kami.txt86
-rw-r--r--npc/commands/language.txt60
-rw-r--r--npc/commands/numa.txt100
-rw-r--r--npc/commands/python.txt27
-rw-r--r--npc/commands/rate-management.txt231
-rw-r--r--npc/commands/resync.txt45
-rw-r--r--npc/commands/scheduled-broadcasts.txt227
-rw-r--r--npc/commands/warp.txt86
-rw-r--r--npc/dev/ci_test.txt47
-rw-r--r--npc/dev/test.txt814
-rw-r--r--npc/fermi/_import.txt3
-rw-r--r--npc/fermi/_warps.txt3
-rw-r--r--npc/functions/DyeConfig.txt41
-rw-r--r--npc/functions/alchemy.txt91
-rw-r--r--npc/functions/array.txt464
-rw-r--r--npc/functions/asklanguage.txt72
-rw-r--r--npc/functions/banker.txt182
-rw-r--r--npc/functions/barber.txt223
-rw-r--r--npc/functions/bitwise.txt176
-rw-r--r--npc/functions/clear_vars.txt30
-rw-r--r--npc/functions/confused-tree-dict.txt515
-rw-r--r--npc/functions/dailyquest.txt164
-rw-r--r--npc/functions/default_npc_checks.txt137
-rw-r--r--npc/functions/dynamic_menu.txt289
-rw-r--r--npc/functions/evil_obelisk.txt96
-rw-r--r--npc/functions/ferry.txt135
-rw-r--r--npc/functions/filters.txt132
-rw-r--r--npc/functions/game_rules.txt22
-rw-r--r--npc/functions/ghost.txt36
-rw-r--r--npc/functions/global_event_handler.txt49
-rw-r--r--npc/functions/gm_island.txt71
-rw-r--r--npc/functions/goodbye.txt152
-rw-r--r--npc/functions/headstyles.txt46
-rw-r--r--npc/functions/inc_sc_bonus.txt105
-rw-r--r--npc/functions/inn.txt34
-rw-r--r--npc/functions/input.txt110
-rw-r--r--npc/functions/inventoryplace.txt36
-rw-r--r--npc/functions/location.txt128
-rw-r--r--npc/functions/lockpicking.txt87
-rw-r--r--npc/functions/magic.txt159
-rw-r--r--npc/functions/main.txt750
-rw-r--r--npc/functions/math.txt105
-rw-r--r--npc/functions/miriam.txt17
-rw-r--r--npc/functions/mob_points.txt83
-rw-r--r--npc/functions/motd.txt10
-rw-r--r--npc/functions/motdconfig.txt38
-rw-r--r--npc/functions/npcmove.txt142
-rw-r--r--npc/functions/npcmovegraph.txt489
-rw-r--r--npc/functions/permissions.txt36
-rw-r--r--npc/functions/process_equip.txt26
-rw-r--r--npc/functions/quests.txt67
-rw-r--r--npc/functions/quiz.txt92
-rw-r--r--npc/functions/random-talk.txt207
-rw-r--r--npc/functions/scoreboards.txt273
-rw-r--r--npc/functions/slot_machine.txt92
-rw-r--r--npc/functions/soul_menhir.txt60
-rw-r--r--npc/functions/stat_reset.txt49
-rw-r--r--npc/functions/string.txt211
-rw-r--r--npc/functions/time.txt117
-rw-r--r--npc/functions/timer.txt89
-rw-r--r--npc/functions/travelers.txt235
-rw-r--r--npc/functions/undead_debug.txt111
-rw-r--r--npc/functions/vault.txt114
-rw-r--r--npc/functions/water_bottle.txt43
-rw-r--r--npc/functions/weather.txt244
-rw-r--r--npc/items/brawling_item.txt15
-rw-r--r--npc/items/mirror.txt18
-rw-r--r--npc/items/pickled_beets.txt9
-rw-r--r--npc/items/purification_potion.txt26
-rw-r--r--npc/items/require_stat.txt17
-rw-r--r--npc/items/rubber_bat.txt10
-rw-r--r--npc/items/scented_candle.txt36
-rw-r--r--npc/items/scissors.txt12
-rw-r--r--npc/items/shock_sweet.txt14
-rw-r--r--npc/items/unreleased_item.txt14
-rw-r--r--npc/items/warpTowels.txt150
-rw-r--r--npc/magic/config.txt434
-rw-r--r--npc/magic/final.txt259
-rw-r--r--npc/magic/level0-monsterinfo.txt38
-rw-r--r--npc/magic/level0-reapercry.txt228
-rw-r--r--npc/magic/level0-wand.txt25
-rw-r--r--npc/magic/level1-aggravate.txt16
-rw-r--r--npc/magic/level1-experience.txt55
-rw-r--r--npc/magic/level1-flare-dart.txt23
-rw-r--r--npc/magic/level1-grow-plants.txt29
-rw-r--r--npc/magic/level1-lesser-heal.txt63
-rw-r--r--npc/magic/level1-magic-blade.txt27
-rw-r--r--npc/magic/level1-summon-maggots.txt15
-rw-r--r--npc/magic/level1-transmutations.txt95
-rw-r--r--npc/magic/level2-arrow-hail.txt44
-rw-r--r--npc/magic/level2-happy-curse.txt32
-rw-r--r--npc/magic/level2-lay-on-hands.txt71
-rw-r--r--npc/magic/level2-lightning-strike.txt24
-rw-r--r--npc/magic/level2-magic-knuckles.txt19
-rw-r--r--npc/magic/level2-protect.txt51
-rw-r--r--npc/magic/level2-rain.txt55
-rw-r--r--npc/magic/level2-shear.txt54
-rw-r--r--npc/magic/level2-summon-monsters.txt53
-rw-r--r--npc/magic/level2-toxic-dart.txt23
-rw-r--r--npc/pre-re/scripts_main.conf4
-rw-r--r--npc/scripts.conf135
-rw-r--r--npc/sec_pri/_import.txt2
-rwxr-xr-xscript-checker42
-rw-r--r--sql-files/init.sql4
-rw-r--r--sql-files/initremote.sql4
-rw-r--r--sql-files/logs.sql186
-rw-r--r--sql-files/main.sql1105
-rw-r--r--sql-files/tools/convert_engine_innodb.sql56
-rw-r--r--sql-files/tools/convert_engine_myisam.sql56
-rw-r--r--sql-files/tools/convert_passwords.sql3
-rw-r--r--sql-files/upgrades/2013-02-14--16-15.sql7
-rw-r--r--sql-files/upgrades/2013-02-15--18-06.sql3
-rw-r--r--sql-files/upgrades/2013-03-05--01-05.sql3
-rw-r--r--sql-files/upgrades/2013-03-06--00-00.sql9
-rw-r--r--sql-files/upgrades/2013-03-09--01-56.sql4
-rw-r--r--sql-files/upgrades/2013-03-27--18-35.sql3
-rw-r--r--sql-files/upgrades/2013-04-16--01-24.sql3
-rw-r--r--sql-files/upgrades/2013-04-16--02-15.sql4
-rw-r--r--sql-files/upgrades/2013-10-09--21-38.sql3
-rw-r--r--sql-files/upgrades/2013-10-10--16-36.sql7
-rw-r--r--sql-files/upgrades/2013-10-27--16-47.sql6
-rw-r--r--sql-files/upgrades/2013-10-30--19-53.sql5
-rw-r--r--sql-files/upgrades/2013-10-30--21-12.sql3
-rw-r--r--sql-files/upgrades/2013-10-31--07-49.sql6
-rw-r--r--sql-files/upgrades/2013-11-09--00-03.sql5
-rw-r--r--sql-files/upgrades/2013-11-15--00-06.sql105
-rw-r--r--sql-files/upgrades/2013-11-15--19-57.sql5
-rw-r--r--sql-files/upgrades/2013-11-16--07-49.sql3
-rw-r--r--sql-files/upgrades/2013-11-18--08-23.sql65
-rw-r--r--sql-files/upgrades/2013-12-24--00-15.sql8
-rw-r--r--sql-files/upgrades/2014-01-04--16-47.sql61
-rw-r--r--sql-files/upgrades/2014-01-06--17-22.sql16
-rw-r--r--sql-files/upgrades/2014-02-19--17-57.sql4
-rw-r--r--sql-files/upgrades/2014-03-25--23-57.sql3
-rw-r--r--sql-files/upgrades/2014-04-07--22-04.sql3
-rw-r--r--sql-files/upgrades/2014-04-26--10-00.sql3
-rw-r--r--sql-files/upgrades/2014-05-17--00-06.sql3
-rw-r--r--sql-files/upgrades/2014-09-01--16-53.sql5
-rw-r--r--sql-files/upgrades/2014-11-03--00-45.sql3
-rw-r--r--sql-files/upgrades/2015-07-02--18-14.sql74
-rw-r--r--sql-files/upgrades/2015-07-08--13-08.sql6
-rw-r--r--sql-files/upgrades/2015-08-27--20-42.sql3
-rw-r--r--sql-files/upgrades/2015-12-16--12-57.sql26
-rw-r--r--sql-files/upgrades/2015-12-17--15-58.sql22
-rw-r--r--sql-files/upgrades/2016-03-10--22-18.sql22
-rw-r--r--sql-files/upgrades/2016-07-08--02-42.sql35
-rw-r--r--sql-files/upgrades/2016-07-08--02-51.sql30
-rw-r--r--sql-files/upgrades/2016-10-03--20-27.sql23
-rw-r--r--sql-files/upgrades/2016-10-26--10-29.sql23
-rw-r--r--sql-files/upgrades/2017-03-02--11-40.sql93
-rw-r--r--sql-files/upgrades/2017-03-05--08-09.sql15
-rw-r--r--sql-files/upgrades/2017-03-15--14-29.sql74
-rw-r--r--sql-files/upgrades/2017-06-04--15-04.sql24
-rw-r--r--sql-files/upgrades/2017-06-04--15-05.sql23
-rw-r--r--sql-files/upgrades/2017-11-04--10-39.sql6
-rw-r--r--sql-files/upgrades/2018-02-26--15-57.sql6
-rw-r--r--sql-files/upgrades/2018-03-10--04-06.sql24
-rw-r--r--sql-files/upgrades/2018-06-03--00-10.sql40
-rw-r--r--sql-files/upgrades/2018-06-03--17-16.sql24
-rw-r--r--sql-files/upgrades/2018-06-05--12-02.sql24
-rw-r--r--sql-files/upgrades/2018-07-24--03-23.sql22
-rw-r--r--sql-files/upgrades/2018-09-01--05-22.sql63
-rw-r--r--sql-files/upgrades/2018-12-14--01-02.sql24
-rw-r--r--sql-files/upgrades/2018-12-29--07-51.sql29
-rw-r--r--sql-files/upgrades/2019-04-08--21-52.sql29
-rw-r--r--sql-files/upgrades/2019-04-25--02-12.sql24
-rw-r--r--sql-files/upgrades/2019-05-09--18-07.sql22
-rw-r--r--sql-files/upgrades/2019-08-08--19-43.sql95
-rw-r--r--sql-files/upgrades/2019-10-05--19-01.sql28
-rw-r--r--sql-files/upgrades/2019-10-12--14-21.sql23
-rw-r--r--sql-files/upgrades/2019-11-22--23-58.sql23
-rw-r--r--sql-files/upgrades/2020-01-24--01-09.sql63
-rw-r--r--sql-files/upgrades/2020-03-22--01-56.sql23
-rw-r--r--sql-files/upgrades/2020-03-22--03-09.sql24
-rw-r--r--sql-files/upgrades/2020-05-01--04-44.sql25
-rw-r--r--sql-files/upgrades/2020-05-10--23-11.sql43
-rw-r--r--sql-files/upgrades/index.txt66
-rwxr-xr-xtest_char4
-rwxr-xr-xtest_login4
-rwxr-xr-xtest_map4
1438 files changed, 195038 insertions, 82 deletions
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..cc391d8c
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,9 @@
+# top-most EditorConfig file
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/.gitattributes b/.gitattributes
index c8c0c178..bbb4a20d 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,2 @@
-*.wlk binary
+# treat script files as C (for highlighting in merge requests)
+npc/**/*.txt linguist-language=C gitlab-language=c
diff --git a/.gitignore b/.gitignore
index 737e623f..f8339302 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,126 @@
-# Server files
-log/
-gm.log.*
-online.*
-/converter.txt
+#Global
+.Apple*
+.DS_Store
+._*
+.clang_complete
+.local.vimrc
+.ycm_extra_conf.py*
+Thumbs.db
+
+# /
+/*.exe
+/*.ilk
+/*.log
+/*.ncb
+/*.opensdf
+/*.opt
+/*.pdb
+/*.pid
+/*.sdf
+/*.stackdump
+/*.suo
+/*.exp
+/*.lib
+/autom4te.cache/
+/start-log.txt
+/char-server
+/config.log
+/config.status
+/core
+/ipch
+/login-server
+/Makefile.cache
+/map-server
+/mapcache
+/configure
+/versions
+
+# /plugins -- everything
+/plugins/
+
+#OSX Xcode project user-sensitive-stuff
+/DerivedData
+/Hercules
+/build
+/Hercules.xcodeproj/xcuserdata
+/Hercules.xcodeproj/project.xcworkspace/xcuserdata/
+/Hercules.xcodeproj/project.xcworkspace/xcshareddata/Hercules.xccheckout
+
+# /3rdparty/libconfig/
+/3rdparty/libconfig/Makefile
+/3rdparty/libconfig/*.o
+
+# /3rdparty/mt19937ar/
+/3rdparty/mt19937ar/Makefile
+/3rdparty/mt19937ar/*.o
+
+# /cache/
+/cache/
+
+# /conf/
+/conf/import
+
+# /log/
+/log/*.log
+/log/*.leaks
+/log/*.tmp
+
+# /src/char/
+/src/char/Makefile
+/src/char/obj_sql
+
+# /src/common/
+/src/common/Makefile
+/src/common/obj_all
+/src/common/obj_sql
+/src/common/sysinfo.inc
+
+# /src/login/
+/src/login/Makefile
+/src/login/obj_sql
+
+# /src/map/
+/src/map/Makefile
+/src/map/obj_sql
+/src/map/pcre.h
+
+# /src/test/
+/src/test/Makefile
+/src/test/obj
+
+# /src/tool/
+/src/tool/Makefile
+/src/tool/obj_all
+
+# /src/plugins/
+/src/plugins/Makefile
+
+# /tools/
+/tools/convert
+/tools/adduser
+/tools/*.exe
+/tools/*.ilk
+/tools/*.pdb
+/tools/HPMHookGen/Makefile
+/tools/HPMHookGen/doxyoutput
+
+# /vcproj-*
+/vcproj-*/*.user
+/vcproj-*/char-server
+/vcproj-*/login-server
+/vcproj-*/map-server
+/vcproj-*/mapcache
+/vcproj-*/plugin-*/
+
+# temp files
+*.txt~
+*.conf~
+*.py~
+*.bak
+/gmon.out
+/gprof_*
+
+# auto created configs
+conf/channels.conf
+npc/commands/motd-debug-text.txt
+*.diff
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ae6566a3..c42bdf94 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,36 +1,79 @@
stages:
-- deploy
+- lint
+- test
-image: ubuntu:rolling
-before_script:
- - uname -a
+variables:
+ GET_SOURCES_ATTEMPTS: "5"
+ ARTIFACT_DOWNLOAD_ATTEMPTS: "5"
+ MYSQL_ROOT_PASSWORD: root
+ packetver: "20170517"
-pages:
- stage: deploy
- variables:
- GIT_STRATEGY: clone
- GIT_SUBMODULE_STRATEGY: recursive
- GIT_DEPTH: "1"
- UPDATE_DIR: "../../../public"
- UPDATE_HTTP: "none"
- CC: "clang"
+newlines:
+ stage: lint
script:
- - apt-get -qq update
- - apt-get install -qq -y make clang zip zlib1g-dev zlibc python
- - mkdir public
- - make updates
- - make news
- - cp -v world/map/news.txt public/
- - cp -v world/map/news.html public/
- - cp -v world/map/news.rss public/
- - cp -v world/map/news.json public/
- - echo '<title>static update server</title><a href="TMW.zip">TMW.zip</a><br><a href="TMW-music.zip">TMW-music.zip</a><br><a href="news.txt">news.txt</a><br><a href="resources.xml">resources.xml</a>' > public/index.html
- # path for legacy compatibility
- - mkdir -p public/updates
- - cp -v public/*.* public/updates/
+ - ./.tools/jobs/install.sh "dos2unix git-core"
+ - ./.tools/jobs/newlines.sh
+ image: debian:unstable
artifacts:
- paths:
- - public
- only:
- - web
- - pushes
+ untracked: true
+ when: always
+ expire_in: 3 week
+
+spaces:
+ stage: lint
+ script:
+ - ./.tools/jobs/install.sh "sed git-core"
+ - cd npc
+ - ../.tools/jobs/spaces.sh
+ image: debian:unstable
+ artifacts:
+ untracked: true
+ when: always
+ expire_in: 3 week
+
+mariadb_run_latest_gcc7:
+ stage: test
+ needs: []
+ script:
+ - export CC=gcc-7
+ - export HERCCPPFLAGS=" -Wno-format-overflow"
+ - export ASAN_OPTIONS=detect_stack_use_after_return=true:strict_init_order=true:detect_odr_violation=0
+ - ./.tools/jobs/install.sh "mysql-client-5.7
+ gcc-7
+ git-core
+ make autoconf automake autopoint
+ libtool libmariadbclient-dev-compat libz-dev libpcre3-dev"
+ - ./.tools/jobs/cloneall.sh
+ - ./.tools/jobs/initdb.sh mariadb
+ - ./.tools/jobs/build.sh "--enable-packetver=${packetver} --enable-epoll --enable-debug --enable-sanitize=full --disable-manager --enable-Werror --enable-buildbot" "--enable-werror --enable-lto --enable-sanitize"
+ - ./.tools/jobs/runserver.sh mariadb
+ image: ubuntu:18.04
+ services:
+ - mariadb:latest
+ artifacts:
+ untracked: true
+ when: always
+ expire_in: 3 week
+
+mariadb_run_valgrind_latest:
+ stage: test
+ needs: []
+ script:
+ - export CC=gcc-6
+ - ./.tools/jobs/install.sh "mysql-client
+ gcc-6
+ git-core
+ make autoconf automake autopoint
+ libtool mariadb-client libmariadbclient-dev-compat libz-dev libpcre3-dev
+ valgrind"
+ - ./.tools/jobs/cloneall.sh
+ - ./.tools/jobs/initdb.sh mariadb
+ - ./.tools/jobs/build.sh "--enable-packetver=${packetver} --enable-epoll --enable-debug --disable-manager --enable-Werror --enable-buildbot" "--enable-werror"
+ - ./.tools/jobs/runservervalgrind.sh mariadb
+ image: debian:stretch
+ services:
+ - mariadb:latest
+ artifacts:
+ untracked: true
+ when: always
+ expire_in: 3 week
diff --git a/.mailmap b/.mailmap
index ee02e960..9d753f39 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1,47 +1,32 @@
-Ali-G <gauvain.dauchy@free.fr> ali-g <gauvain.dauchy@free.fr>
-Ali-G <gauvain.dauchy@free.fr> Ali-G <gauvain@devil.(none)>
-Ali-G <gauvain.dauchy@free.fr> alige Ali-G <aligetmw@hotmail.fr>
-Bjørn Lindeijer <bjorn@lindeijer.nl> Thorbjørn Lindeijer <thorbjorn@lindeijer.nl>
-Bjørn Lindeijer <bjorn@lindeijer.nl> Thorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com>
-Chuck Miller <shadowmil@gmail.com> Charles Miller <shadowmil@gmail.com>
-Coffee <coffee@coffee-EP45-UD3L.(none)> coffee <coffee@coffee-EP45-UD3L.(none)>
-Coffee <coffee@coffee-EP45-UD3L.(none)> Coffee <coffee@coffee-ep45-ud3l.(none)>
-Coffee <coffee@coffee-EP45-UD3L.(none)> cafe <cafe@cafe-EP45-UD3L.(none)>
-Darky <dark_mage.87@mail.ru> Dark_Mage <dark_mage.87@mail.ru>
-Darky <dark_mage.87@mail.ru> Darky <developer@Pirat.(none)>
-Darky <dark_mage.87@mail.ru> Darky <rf_online@mail.ru>
-Darky <dark_mage.87@mail.ru> Developer <developer@Pirat.(none)>
-Dennis Friis <peavey@inspircd.org> Dennis Friis <peavey@placid.dk>
-Dennis Friis <peavey@inspircd.org> peavey <peavey@inspircd.org>
-Enchilado <crunchy@crunchy-Satellite-L300.(none)> crunchy <crunchy@crunchy-Satellite-L300.(none)>
-Enchilado <crunchy@crunchy-Satellite-L300.(none)> Enchilado <crunchy@crunchy-satellite-l300.(none)>
-Enchilado <crunchy@crunchy-Satellite-L300.(none)> Enchilado <pheonixvania@gmail.com>
-Enchilado <crunchy@crunchy-Satellite-L300.(none)> enchilado <www.e.sayers@gmail.com>
-Fate <fate-tmw@googlemail.com> Fate <fate@kino.cs.colorado.edu>
-Fate <fate-tmw@googlemail.com> Fate <fate.tmw@googlemail.com>
-Freeyorp <Freeyorp101@hotmail.com> Freeyorp <freeyorp101@hotmail.com>
-Freeyorp <Freeyorp101@hotmail.com> Freeyorp <Freeyorp101@NOSPAM@hotmail.com>
-Freeyorp <Freeyorp101@hotmail.com> Freeyorp <TheFreeYorp+github@gmail.com>
-Jarrett Thomas-Huxley <fotherjarrett@gmail.com> fother <fotherjarrett@gmail.com>
-Jessica Tölke <jtoelke@mail.upb.de> jtoelke <jtoelke@gmx.de>
-Joseph Greene <fluffyanddeadly999@gmail.com> Pihro <fluffyanddeadly999@gmail.com>
-meways <mewaysID@yahoo.com> Meway <meway@meway.dyndns.org>
-meways <mewaysID@yahoo.com> meways <mewaysid@yahoo.com>
-remoitnane <remoit(DOT)nane(AT)gmail(DOT)com> No Name <remoit(DOT)nane(AT)gmail(DOT)com>
-remoitnane <remoit(DOT)nane(AT)gmail(DOT)com> remoitnane <remoit(dot)nane(at)gmail(dot)com>
-Stefan Dombrowski <stefan@uni-bonn.de> Stefan Dombrowski <sdo451@gmail.com>
-Wombat <hpwombat@yahoo.com> brokendoor <brokendoor@brokendoor-desktop.(none)>
-<git@gumi.ca> <mekolat@users.noreply.github.com>
-<git@gumi.ca> <mekolat@gmail.com>
-gumi <git@gumi.ca> meko <git@gumi.ca>
-gumi <git@gumi.ca> mekolat <git@gumi.ca>
Jesusaves <jesusalva@themanaworld.org> Jesusaves <cpntb1@ymail.com>
+Jesusaves <jesusalva@themanaworld.org> Jonatas L. Nogueira <cpntb1@ymail.com>
+Alige <aligetmw@hotmail.fr> Alige <gauvain.dauchy@free.fr>
+Alige <aligetmw@hotmail.fr> Alige <alige@debian>
+Reid <reidyaro@gmail.com> Reid Yaro <reidyaro@gmail.com>
+Reid <reidyaro@gmail.com> Reid <reid@Chlian>
+Reid <reidyaro@gmail.com> Reid Yaro <reid@Julie>
+Reid <reidyaro@gmail.com> Reid <reid@IdeaPad.(none)>
+gumi <git@gumi.ca> gumi <mekolat@users.noreply.github.com>
+Hal9000 <miglietta.francesco@gmail.com> Hal9OOO <miglietta.francesco@gmail.com>
+Hal9000 <miglietta.francesco@gmail.com> Hal9OOO (Francesco Miglietta) <miglietta.francesco@gmail.com>
+Hal9000 <miglietta.francesco@gmail.com> epoc <epoc@hal9000.(none)>
+Hal9000 <miglietta.francesco@gmail.com> <epoc@halthink.(none)>
+Micksha <ms-shaman@gmx.de> Micksha <Micksha@users.noreply.github.com>
+omatt <m.vuoso@laposte.net> omattornot <m.vuoso@laposte.net>
+omatt <m.vuoso@laposte.net> omatt <m.vuoso@laposte.net>
+gumi <git@gumi.ca> mekolat <mekolat@users.noreply.github.com>
wushin <pasekei@gmail.com> Wushin <pasekei@gmail.com>
-The Kandiman <thekandiman@gmail.com> The Kandiman <kandiman@kandiman.(none)>
-The Kandiman <thekandiman@gmail.com> TheKandiman <thekandiman@gmail.com>
-Ben Longbons <b.r.longbons@gmail.com> o11c <b.r.longbons@gmail.com>
-jak1 <mike.wollmann@gmail.com> Mike <mikewollmann@gmail.com>
-Cassy1 <cassy.tmw@gmail.com> Cassy <cassy.tmw@gmail.com>
-David Gay <oddshocks@riseup.net> David Gay <oddshocks@gmail.com>
-WildX <wildx@evolonline.org> WildX001 <wildx@evolonline.org>
-Monwarez <monwarez@gmail.com> monwarez <monwarez@users.noreply.github.com>
+Monwarez <monwarez@gmail.com> Thibault Payet <monwarez@gmail.com>
+Monwarez <monwarez@gmail.com> User Monwarez <monwarez@gmail.com>
+Vasily_Makarov <danilka.pro@gmail.com> Dan Sagunov <danilka.pro@gmail.com>
+Vasily_Makarov <danilka.pro@gmail.com> Dan Sagunov <dan@archdemon.(none)>
+Vasily_Makarov <danilka.pro@gmail.com> dan <dan@dan-P41-ES3G.(none)>
+Vasily_Makarov <danilka.pro@gmail.com> Vasily <danilka.pro@gmail.com>
+Akko Teru <none@null.nil> Teru <9bi at [comc]ast dot net>
+jak1 <jak1@germantmw.de> jak1 <jak89_1@ftb4u.de>
+Kurt Kuschinski <hocus@themanaworld.org> Hocus <hocus@themanaworld.org>
+Kurt Kuschinski <hocus@themanaworld.org> Kurt Kuschinski <kurt.kuschinski@gmail.com>
+Saweres <onshine20@gmail.com> root <root@saweres.localdomain>
+Mikko <mikko.devel@gmail.com> Mikko <mikko@debian>
+Ledmitz <ledmitz@gmail.com> Ledmitz <smoothshifter@tuta.io>
+
diff --git a/.tools/conf/mariadb/battle.conf b/.tools/conf/mariadb/battle.conf
new file mode 100644
index 00000000..ff05022c
--- /dev/null
+++ b/.tools/conf/mariadb/battle.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Battle local configuration file.
+//=========================================================================
+
+battle_configuration: {
+ // See conf/map/battle.conf for details
+}
diff --git a/.tools/conf/mariadb/char-server.conf b/.tools/conf/mariadb/char-server.conf
new file mode 100644
index 00000000..448b8d18
--- /dev/null
+++ b/.tools/conf/mariadb/char-server.conf
@@ -0,0 +1,31 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Character Server local configuration file.
+//=========================================================================
+
+min_char_class: 0
+max_char_class: 6
diff --git a/.tools/conf/mariadb/constants.conf b/.tools/conf/mariadb/constants.conf
new file mode 100644
index 00000000..7d269595
--- /dev/null
+++ b/.tools/conf/mariadb/constants.conf
@@ -0,0 +1,31 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2016 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Battle local configuration file.
+//=========================================================================
+
+debug: 0
+SERVER_USES_VAULT: 0
diff --git a/.tools/conf/mariadb/inter-server.conf b/.tools/conf/mariadb/inter-server.conf
new file mode 100644
index 00000000..9cd3932f
--- /dev/null
+++ b/.tools/conf/mariadb/inter-server.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Inter Server local configuration file.
+//=========================================================================
+
+inter_configuration: {
+ // See conf/common/inter-server.conf
+}
diff --git a/.tools/conf/mariadb/login-server.conf b/.tools/conf/mariadb/login-server.conf
new file mode 100644
index 00000000..c8f1f854
--- /dev/null
+++ b/.tools/conf/mariadb/login-server.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Login Server local configuration file.
+//=========================================================================
+
+login_configuration: {
+ // See conf/login/login-server.conf for details
+}
diff --git a/.tools/conf/mariadb/logs.conf b/.tools/conf/mariadb/logs.conf
new file mode 100644
index 00000000..47e5a665
--- /dev/null
+++ b/.tools/conf/mariadb/logs.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Log local configuration file.
+//=========================================================================
+
+map_log: {
+ // See conf/map/logs.conf for details
+}
diff --git a/.tools/conf/mariadb/map-server.conf b/.tools/conf/mariadb/map-server.conf
new file mode 100644
index 00000000..11e4356b
--- /dev/null
+++ b/.tools/conf/mariadb/map-server.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Map Server local configuration file.
+//=========================================================================
+
+map_configuration: {
+ // See conf/map/map-server.conf for details
+}
diff --git a/.tools/conf/mariadb/msg_conf.txt b/.tools/conf/mariadb/msg_conf.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/.tools/conf/mariadb/msg_conf.txt
diff --git a/.tools/conf/mariadb/ports.conf b/.tools/conf/mariadb/ports.conf
new file mode 100644
index 00000000..7d5481e3
--- /dev/null
+++ b/.tools/conf/mariadb/ports.conf
@@ -0,0 +1,8 @@
+// Login server port
+login_port: 6901
+
+// Character server port
+char_port: 6122
+
+// Map server port
+map_port: 5122
diff --git a/.tools/conf/mariadb/script.conf b/.tools/conf/mariadb/script.conf
new file mode 100644
index 00000000..042644ff
--- /dev/null
+++ b/.tools/conf/mariadb/script.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Script local configuration file.
+//=========================================================================
+
+script_configuration: {
+ // See conf/map/script.conf for details
+}
diff --git a/.tools/conf/mariadb/socket.conf b/.tools/conf/mariadb/socket.conf
new file mode 100644
index 00000000..57806f21
--- /dev/null
+++ b/.tools/conf/mariadb/socket.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Sockets local configuration file
+//=========================================================================
+
+socket_configuration: {
+ // See conf/common/socket.conf for details.
+}
diff --git a/.tools/conf/mariadb/sql_connection.conf b/.tools/conf/mariadb/sql_connection.conf
new file mode 100644
index 00000000..1e0e559f
--- /dev/null
+++ b/.tools/conf/mariadb/sql_connection.conf
@@ -0,0 +1,52 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2016 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= SQL connection configuration file.
+//=========================================================================
+// This file affects how ALL server sql connections work, unless explictly
+// defined so in the server configuration file (See
+// doc/global_configuration.txt for more information).
+//=========================================================================
+
+sql_connection: {
+ // [INTER] You can specify the codepage to use in your mySQL tables here.
+ // (Note that this feature requires MySQL 4.1+)
+ //default_codepage: ""
+
+ // [LOGIN] Is `userid` in account_db case sensitive?
+ //case_sensitive: false
+
+ // For IPs, ideally under linux, you want to use localhost instead of 127.0.0.1.
+ // Under windows, you want to use 127.0.0.1. If you see a message like
+ // "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"
+ // and you have localhost, switch it to 127.0.0.1
+ db_hostname: "mariadb"
+ db_port: 3306
+ db_username: "evol"
+ db_password: "evol"
+ db_database: "evol"
+ //codepage:""
+}
diff --git a/.tools/conf/mysql/battle.conf b/.tools/conf/mysql/battle.conf
new file mode 100644
index 00000000..ff05022c
--- /dev/null
+++ b/.tools/conf/mysql/battle.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Battle local configuration file.
+//=========================================================================
+
+battle_configuration: {
+ // See conf/map/battle.conf for details
+}
diff --git a/.tools/conf/mysql/char-server.conf b/.tools/conf/mysql/char-server.conf
new file mode 100644
index 00000000..448b8d18
--- /dev/null
+++ b/.tools/conf/mysql/char-server.conf
@@ -0,0 +1,31 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Character Server local configuration file.
+//=========================================================================
+
+min_char_class: 0
+max_char_class: 6
diff --git a/.tools/conf/mysql/constants.conf b/.tools/conf/mysql/constants.conf
new file mode 100644
index 00000000..7d269595
--- /dev/null
+++ b/.tools/conf/mysql/constants.conf
@@ -0,0 +1,31 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2016 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Battle local configuration file.
+//=========================================================================
+
+debug: 0
+SERVER_USES_VAULT: 0
diff --git a/.tools/conf/mysql/inter-server.conf b/.tools/conf/mysql/inter-server.conf
new file mode 100644
index 00000000..9cd3932f
--- /dev/null
+++ b/.tools/conf/mysql/inter-server.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Inter Server local configuration file.
+//=========================================================================
+
+inter_configuration: {
+ // See conf/common/inter-server.conf
+}
diff --git a/.tools/conf/mysql/login-server.conf b/.tools/conf/mysql/login-server.conf
new file mode 100644
index 00000000..c8f1f854
--- /dev/null
+++ b/.tools/conf/mysql/login-server.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Login Server local configuration file.
+//=========================================================================
+
+login_configuration: {
+ // See conf/login/login-server.conf for details
+}
diff --git a/.tools/conf/mysql/logs.conf b/.tools/conf/mysql/logs.conf
new file mode 100644
index 00000000..47e5a665
--- /dev/null
+++ b/.tools/conf/mysql/logs.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Log local configuration file.
+//=========================================================================
+
+map_log: {
+ // See conf/map/logs.conf for details
+}
diff --git a/.tools/conf/mysql/map-server.conf b/.tools/conf/mysql/map-server.conf
new file mode 100644
index 00000000..11e4356b
--- /dev/null
+++ b/.tools/conf/mysql/map-server.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Map Server local configuration file.
+//=========================================================================
+
+map_configuration: {
+ // See conf/map/map-server.conf for details
+}
diff --git a/.tools/conf/mysql/msg_conf.txt b/.tools/conf/mysql/msg_conf.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/.tools/conf/mysql/msg_conf.txt
diff --git a/.tools/conf/mysql/ports.conf b/.tools/conf/mysql/ports.conf
new file mode 100644
index 00000000..7d5481e3
--- /dev/null
+++ b/.tools/conf/mysql/ports.conf
@@ -0,0 +1,8 @@
+// Login server port
+login_port: 6901
+
+// Character server port
+char_port: 6122
+
+// Map server port
+map_port: 5122
diff --git a/.tools/conf/mysql/script.conf b/.tools/conf/mysql/script.conf
new file mode 100644
index 00000000..042644ff
--- /dev/null
+++ b/.tools/conf/mysql/script.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Script local configuration file.
+//=========================================================================
+
+script_configuration: {
+ // See conf/map/script.conf for details
+}
diff --git a/.tools/conf/mysql/socket.conf b/.tools/conf/mysql/socket.conf
new file mode 100644
index 00000000..57806f21
--- /dev/null
+++ b/.tools/conf/mysql/socket.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Sockets local configuration file
+//=========================================================================
+
+socket_configuration: {
+ // See conf/common/socket.conf for details.
+}
diff --git a/.tools/conf/mysql/sql_connection.conf b/.tools/conf/mysql/sql_connection.conf
new file mode 100644
index 00000000..b469dbf0
--- /dev/null
+++ b/.tools/conf/mysql/sql_connection.conf
@@ -0,0 +1,52 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2016 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= SQL connection configuration file.
+//=========================================================================
+// This file affects how ALL server sql connections work, unless explictly
+// defined so in the server configuration file (See
+// doc/global_configuration.txt for more information).
+//=========================================================================
+
+sql_connection: {
+ // [INTER] You can specify the codepage to use in your mySQL tables here.
+ // (Note that this feature requires MySQL 4.1+)
+ //default_codepage: ""
+
+ // [LOGIN] Is `userid` in account_db case sensitive?
+ //case_sensitive: false
+
+ // For IPs, ideally under linux, you want to use localhost instead of 127.0.0.1.
+ // Under windows, you want to use 127.0.0.1. If you see a message like
+ // "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"
+ // and you have localhost, switch it to 127.0.0.1
+ db_hostname: "mysql"
+ db_port: 3306
+ db_username: "evol"
+ db_password: "evol"
+ db_database: "evol"
+ //codepage:""
+}
diff --git a/.tools/jobs/build.sh b/.tools/jobs/build.sh
new file mode 100755
index 00000000..8b57f711
--- /dev/null
+++ b/.tools/jobs/build.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+export LOGFILE=gcc6.log
+
+source ./.tools/scripts/init.sh
+
+pwd
+cd ..
+
+build_init
+
+cd server-code
+check_error $?
+
+make_server "$1" "$2"
diff --git a/.tools/jobs/cloneall.sh b/.tools/jobs/cloneall.sh
new file mode 100755
index 00000000..79bb8d03
--- /dev/null
+++ b/.tools/jobs/cloneall.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+source ./.tools/scripts/init.sh
+
+do_init
diff --git a/.tools/jobs/clonedata.sh b/.tools/jobs/clonedata.sh
new file mode 100755
index 00000000..95fa77a5
--- /dev/null
+++ b/.tools/jobs/clonedata.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+source ./.tools/scripts/init.sh
+
+do_init_data
diff --git a/.tools/jobs/initdb.sh b/.tools/jobs/initdb.sh
new file mode 100755
index 00000000..d6c2480f
--- /dev/null
+++ b/.tools/jobs/initdb.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+source ./.tools/scripts/init.sh
+
+cd ../server-data
+
+export host=$1
+cd sql-files
+
+export CMD="mysql --force -u root -proot --host=${host}"
+check_error $?
+echo $CMD <./initremote.sql
+$CMD <./initremote.sql
+check_error $?
+
+export CMD="mysql -u evol -pevol --host=${host} evol"
+echo Creating tables...
+echo $CMD <main.sql
+$CMD <main.sql
+check_error $?
+echo $CMD <logs.sql
+$CMD <logs.sql
+check_error $?
diff --git a/.tools/jobs/install.sh b/.tools/jobs/install.sh
new file mode 100755
index 00000000..dd762e1a
--- /dev/null
+++ b/.tools/jobs/install.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+source ./.tools/scripts/init.sh
+
+update_repos
+aptget_update
+
+aptget_install $*
+
+do_init_data
diff --git a/.tools/jobs/newlines.sh b/.tools/jobs/newlines.sh
new file mode 100755
index 00000000..23309f70
--- /dev/null
+++ b/.tools/jobs/newlines.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+find -H . -type f -name "*.txt" -o -name "*.conf" -exec dos2unix {} \;
+
+export RES=$(git diff --name-only)
+if [[ -n "${RES}" ]]; then
+ echo "Wrong new lines detected in files:"
+ git diff --name-only
+ exit 1
+fi
diff --git a/.tools/jobs/runserver.sh b/.tools/jobs/runserver.sh
new file mode 100755
index 00000000..6bff48ab
--- /dev/null
+++ b/.tools/jobs/runserver.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+source ./.tools/scripts/init.sh
+
+function run_server {
+ echo "running: $1 --run-once $2"
+ $1 --run-once $2 2>runlog.txt
+ export errcode=$?
+ export teststr=$(cat runlog.txt)
+ if [[ -n "${teststr}" ]]; then
+ echo "Errors found in running server $1."
+ cat runlog.txt
+ echo "Errors found in running server $1."
+ exit 1
+ else
+ echo "No errors found for server $1."
+ fi
+ if [ ${errcode} -ne 0 ]; then
+ echo "server $1 terminated with exit code ${errcode}"
+ echo "Test failed"
+ exit 1
+ fi
+}
+
+do_init_tools
+init_configs $1
+
+cd server-data
+pwd
+ls -la
+
+run_server ./login-server
+run_server ./char-server
+
+ARGS="--load-script npc/dev/test.txt "
+ARGS="--load-plugin script_mapquit $ARGS --load-script npc/dev/ci_test.txt"
+
+run_server ./map-server "$ARGS"
diff --git a/.tools/jobs/runservervalgrind.sh b/.tools/jobs/runservervalgrind.sh
new file mode 100755
index 00000000..6442b091
--- /dev/null
+++ b/.tools/jobs/runservervalgrind.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+source ./.tools/scripts/init.sh
+
+function run_server {
+ echo "running: $1 --run-once $2"
+ valgrind -q --read-var-info=yes --track-origins=yes --malloc-fill=11 --free-fill=55 --show-reachable=yes --leak-check=full --leak-resolution=high --partial-loads-ok=yes --error-limit=no $1 --run-once $2 2>runlog.txt
+ export errcode=$?
+ export teststr=$(grep "invalid" runlog.txt)
+ cat runlog.txt
+ if [[ -n "${teststr}" ]]; then
+ echo "Errors found in running server $1."
+ exit 1
+ else
+ echo "No errors found for server $1."
+ fi
+ if [ ${errcode} -ne 0 ]; then
+ echo "server $1 terminated with exit code ${errcode}"
+ echo "Test failed"
+ exit 1
+ fi
+}
+
+do_init_tools
+init_configs $1
+
+cd server-data
+pwd
+ls -la
+
+run_server ./login-server
+run_server ./char-server
+
+ARGS="--load-script npc/dev/test.txt "
+ARGS="--load-plugin script_mapquit $ARGS --load-script npc/dev/ci_test.txt"
+
+run_server ./map-server "$ARGS"
diff --git a/.tools/jobs/spaces.sh b/.tools/jobs/spaces.sh
new file mode 100755
index 00000000..ef4ccf37
--- /dev/null
+++ b/.tools/jobs/spaces.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+find -H . -type f -name "*.txt" -exec sed -i 's/[[:blank:]]*$//' {} \;
+
+export RES=$(git diff --name-only)
+if [[ -n "${RES}" ]]; then
+ echo "Extra spaces before new lines detected in files:"
+ git diff --name-only
+ exit 0 # Not relevant
+fi
diff --git a/.tools/npc/motd-debug-text.txt b/.tools/npc/motd-debug-text.txt
new file mode 100644
index 00000000..a57c9a2a
--- /dev/null
+++ b/.tools/npc/motd-debug-text.txt
@@ -0,0 +1,4 @@
+function script MOTD_debug_text {
+ setarray $@Debug_Messages$[0], "";
+ return;
+}
diff --git a/.tools/scripts/init.sh b/.tools/scripts/init.sh
new file mode 100755
index 00000000..a6ca5f7e
--- /dev/null
+++ b/.tools/scripts/init.sh
@@ -0,0 +1,218 @@
+#!/bin/bash
+
+mkdir logs
+
+export dir=$(pwd)
+export ERRFILE=${dir}/logs/${LOGFILE}
+
+cat /etc/os-release
+
+rm ${ERRFILE}
+
+function check_error {
+ if [ "$1" != 0 ]; then
+ echo "Error $1"
+ exit $1
+ fi
+}
+
+function update_repos {
+ if [ "$CI_SERVER" == "" ];
+ then
+ return
+ fi
+
+ export DATA=$(cat /etc/resolv.conf|grep "nameserver 1.10.100.101")
+ if [ "$DATA" != "" ];
+ then
+ echo "Detected local runner"
+ sed -i 's!http://httpredir.debian.org/debian!http://1.10.100.103/debian!' /etc/apt/sources.list
+ else
+ echo "Detected non local runner"
+ fi
+}
+
+function gitclone1 {
+ echo git clone $2 $3
+ git clone $2 $3
+ if [ "$?" != 0 ]; then
+ echo git clone $1 $3
+ git clone $1 $3
+ return $?
+ fi
+ return $?
+}
+
+function gitclone {
+ export name1=$1/$2
+ export name2=${CI_BUILD_REPO##*@}
+ export name2=https://${name2%/*}/$2
+
+ gitclone1 "$name1" "$name2" $3
+ if [ "$?" != 0 ]; then
+ sleep 1s
+ gitclone1 "$name1" "$name2" $3
+ if [ "$?" != 0 ]; then
+ sleep 3s
+ gitclone1 "$name1" "$name2" $3
+ if [ "$?" != 0 ]; then
+ sleep 5s
+ gitclone1 "$name1" "$name2" $3
+ fi
+ fi
+ fi
+ check_error $?
+}
+
+function update_repos {
+ if [ "$CI_SERVER" == "" ];
+ then
+ return
+ fi
+
+ export DATA=$(cat /etc/resolv.conf|grep "nameserver 1.10.100.101")
+ if [ "$DATA" != "" ];
+ then
+ echo "Detected local runner"
+ sed -i 's!http://httpredir.debian.org/debian!http://1.10.100.103/debian!' /etc/apt/sources.list
+ else
+ echo "Detected non local runner"
+ fi
+}
+
+function aptget_update {
+ update_repos
+ echo apt-get update
+ apt-get update
+ if [ "$?" != 0 ]; then
+ sleep 1s
+ apt-get update
+ if [ "$?" != 0 ]; then
+ sleep 1s
+ apt-get update
+ fi
+ fi
+ check_error $?
+}
+
+function aptget_install {
+ echo apt-get -y install $*
+ apt-get -y install $*
+ if [ "$?" != 0 ]; then
+ sleep 1s
+ apt-get -y install $*
+ if [ "$?" != 0 ]; then
+ sleep 2s
+ apt-get -y install $*
+ fi
+ fi
+ check_error $?
+}
+
+function make_server {
+ ls -la ../server-data
+ ls -la ../server-data/plugins
+ echo source src/evol/tools/vars.sh
+ source ./src/evol/tools/vars.sh
+ check_error $?
+ export CPPFLAGS="$CPPFLAGS -DI_AM_AWARE_OF_THE_RISK_AND_STILL_WANT_TO_RUN_HERCULES_AS_ROOT"
+ echo "autoreconf -i"
+ autoreconf -i
+ check_error $?
+ echo ./configure $1 CPPFLAGS=\"${CPPFLAGS}${HERCCPPFLAGS}\"
+ ./configure $1 CPPFLAGS="$CPPFLAGS$HERCCPPFLAGS"
+ export err="$?"
+ if [ "$err" != 0 ]; then
+ echo "Error $err"
+ echo cat config.log
+ cat config.log
+ exit $err
+ fi
+ echo "make -j2"
+ make -j2
+ check_error $?
+ echo "make -j2 plugin.script_mapquit"
+ make -j2 plugin.script_mapquit
+ check_error $?
+ make install
+ check_error $?
+
+ cd src/evol
+ echo "autoreconf -i"
+ mkdir m4
+ autoreconf -i
+ check_error $?
+ mkdir build
+ cd build
+ echo ../configure $2 CPPFLAGS=\"${VARS}\"
+ ../configure $2 CPPFLAGS="${VARS}"
+ check_error $?
+ echo "make -j2 V=0"
+ make -j2 V=0
+ check_error $?
+ cd ../../../..
+ ls -la server-data/plugins
+}
+
+function do_init_data {
+ mkdir shared
+ cd ..
+ rm -rf server-data
+ cp -r ${CI_PROJECT_NAME:=serverdata} server-data
+ ls -la server-data
+ check_error $?
+}
+
+function do_init_tools {
+ cd ..
+ rm -rf tools
+ #gitclone https://gitlab.com/themanaworld/evolved evol-tools.git tools
+ gitclone https://gitlab.com/TMW2 evol-tools.git tools
+}
+
+function do_init {
+ do_init_data
+ rm -rf server-code
+ gitclone https://gitlab.com/jesusalva hercules.git server-code
+ check_error $?
+ cd server-code/src
+ check_error $?
+ gitclone https://gitlab.com/tmwae evol-hercules.git evol
+ check_error $?
+ cd ../..
+ check_error $?
+ mkdir -p server-data/plugins
+}
+
+function build_init {
+ if [ "$CI_SERVER" == "" ];
+ then
+ return
+ fi
+ mkdir -p /local/bin
+ echo "#!/bin/bash" > /local/bin/id
+ echo "echo 1000" >> /local/bin/id
+ export PATH="/local/bin:$PATH"
+ chmod +x /local/bin/id
+ echo "fake id check"
+ id
+
+ cd server-code/src/evol
+ source tools/vars.sh
+ check_error $?
+ cd ../../..
+ check_error $?
+ echo $CC --version
+ $CC --version
+ check_error $?
+}
+
+function init_configs {
+ cd tools/localserver
+ ./installconfigs.sh
+ cd ../..
+ cp server-data/.tools/conf/$1/* server-data/conf/import/
+ cp server-data/.tools/npc/motd-* server-data/npc/commands/
+ ls -la server-data/conf/import
+ cat server-data/conf/import/inter_conf.txt
+}
diff --git a/COPYING b/COPYING
new file mode 100644
index 00000000..94a9ed02
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..b66e50be
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,37 @@
+.PHONY: new server-update server-updatebuild maps build buildasan config updateconfig initdb updatedb givegm updates constdb
+
+new: build config initdb
+
+server-update: updateconfig updatedb
+
+server-updatebuild: build updateconfig updatedb
+
+maps:
+ cd ../tools/hercules/ ; ./tmx_converter.py ../../client-data/ ../../server-data ; ./convert_tmx_to_mapcache.py
+
+build:
+ cd ../tools/localserver/ ; ./build.sh
+
+buildasan:
+ cd ../tools/localserver/ ; ./buildasan.sh
+
+config:
+ cd ../tools/localserver/ ; ./installconfigs.sh
+
+updateconfig:
+ cd ../tools/localserver/ ; ./updateconfigs.sh
+
+initdb:
+ cd ../tools/localserver/ ; ./initdb.sh
+
+updatedb:
+ cd ../tools/localserver/ ; ./updatedb.sh
+
+givegm:
+ cd ../tools/localserver/ ; ./givegm.sh ${ID}
+
+updates:
+ cd ../tools/update/ ; ./createnew.sh ; ./create_music.sh
+
+constdb:
+ mkdir -p doc && ./map-server --run-once --load-plugin constdb2doc --constdb2doc && cp -f doc/constants.md ../docs/server/scripts/constants.md; rm -r doc
diff --git a/conf/atcommand.conf b/conf/atcommand.conf
new file mode 100644
index 00000000..722dfe35
--- /dev/null
+++ b/conf/atcommand.conf
@@ -0,0 +1,91 @@
+/* Atcommands and charcommands configuration file */
+
+/* The symbol that will be used to recognize commands.
+You can set any one character except:
+ - control-characters (0x00-0x1f),
+ - '%' (party chat symbol)
+ - '$' (guild chat symbol)
+ - '/' (client commands symbol)
+atcommand_symbol represents @commands used locally.
+charcommand_symbol represents #commands used on other players.
+*/
+
+atcommand_symbol : "@"
+charcommand_symbol: "#" // We can use $ if this overlaps with ManaPlus
+
+/* Command aliases
+You can define aliases for any command. Aliases work just like the original command.
+Format is
+ <commandname>: ["<alias>", ...]
+*/
+
+aliases: {
+ mobinfo: ["mi"]
+ iteminfo: ["ii"]
+ time: ["date", "serverdate", "servertime"]
+ tonpc: ["npc"]
+ autotrade: ["at"]
+ help: ["h"]
+ jumpto: ["goto", "warpto"]
+ mount: ["mountpeco"]
+ who: ["whois"]
+ npctalk: ["npctalkc"]
+ gvgon: ["gpvpon"]
+ gvgoff: ["gpvpoff"]
+ jobchange: ["job"]
+ load: ["return"]
+ warp: ["rura", "mapmove"]
+ dye: ["ccolor"]
+ hairstyle: ["hstyle"]
+ haircolor: ["hcolor"]
+ monster: ["spawn"]
+ blvl: ["lvup", "blevel", "baselvl", "baselvup", "baselevel", "baselvlup"]
+ jlvl: ["jlevel", "joblvl", "joblvup", "joblevel", "joblvlup"]
+ glvl: ["glevel", "guildlvl", "guildlvup", "guildlevel", "guildlvlup"]
+ allskill: ["allskills", "skillall", "skillsall"]
+ allstats: ["allstat", "statall", "statsall"]
+ ban: ["banish"]
+ unban: ["unbanish"]
+ unjail: ["discharge"]
+ homlevel: ["hlvl", "hlevel", "homlvl", "homlvup"]
+ homevolution: ["homevolve"]
+ mutearea: ["stfu"]
+ monsterignore: ["battleignore", "safe"]
+ raise: ["revive"]
+ kill: ["die"]
+ guildstorage: ["gstorage"]
+ accinfo: ["accountinfo"]
+ itemreset: ["clearinventory"]
+ channel: ["main"]
+ autoloottype: ["aloottype"]
+ camerainfo: ["setcamera", "viewpointvalue"]
+ tee: ["t"]
+ log: ["l"]
+ request: ["wgm"]
+}
+
+/* List of commands that should not be logged at all */
+/* Add as many commands as you like */
+nolog: {
+ iteminfo: 1
+ mobinfo: 1
+ uptime: 1
+ duel: 1
+ accept: 1
+ reject: 1
+ noask: 1
+ time: 1
+ jailtime: 1
+ email: 1
+ rates: 1
+ help: 1
+ commands: 1
+ charcommands: 1
+ refresh: 1
+ // Should we log @hugo and @linus? They're quite spammy
+}
+
+/* Commands help file */
+help: {
+ @include "conf/map/help.txt"
+}
diff --git a/conf/battlegrounds.conf b/conf/battlegrounds.conf
new file mode 100644
index 00000000..2b4184e1
--- /dev/null
+++ b/conf/battlegrounds.conf
@@ -0,0 +1,124 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//====================================================
+//= http://herc.ws/board/topic/928-memory-slasher-may-30-patch/
+//====================================================
+//= Fields (TODO/INCOMPLETE)
+//= arenas: ({
+//= //- allowedTypes defines what kind of applications the arena will accept, setting is not case-sensitive and is ok with whitespaces
+//= allowedTypes: "Solo | Party" //Arena Accepts solo and party-type joins
+//= allowedTypes: "guild|party" //Arena Accepts solo and guild-type joins
+//= allowedTypes: "All" //Arena Accepts solo, party and guild-type joins
+//= //- fillAnnounce (optional arena param)
+//= })
+battlegrounds: (
+{
+ /* feature is not complete */
+ feature_off: true
+ /* character variable for global bg delay */
+ global_delay_var: "BG_Delay_Tick"
+ /* how many seconds to consider a player "afk" and kick him out? */
+ maximum_afk_seconds: 30
+
+ /* one can add as many as he wishes */
+ /* for custom ones, need to edit "lua files/entryqueue/entryqueuelist.lua" [Ind/Hercules] */
+ arenas: ({
+ name: "Tierra Gorge" //must match the name in client files
+ event: "Tierra_BG2::OnPlayerListReady"
+ allowedTypes: "All" /* Solo, Party and Guild */
+ minLevel: 80
+ maxLevel: 150
+ reward: {/* amount of badges awarded on each case */
+ win: 3
+ loss: 1
+ draw: 1
+ }
+ minPlayers: 6 /* minimum amount of players to start */
+ maxPlayers: 60 /* maximum amount of players */
+ minTeamPlayers: 6 /* minimum amount of team members required for a team (party or guild) to join */
+ delay_var: "Tierra_BG_Tick" /* char variable name that will store the delay for this match */
+ maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
+ fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
+ pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ },{
+ name: "Flavius" //must match the name in client files
+ event: "start#bat_b01::OnPlayerListReady"
+ allowedTypes: "All" /* Solo, Party and Guild */
+ minLevel: 80
+ maxLevel: 150
+ reward: {/* amount of badges awarded on each case */
+ win: 9
+ loss: 3
+ draw: 3
+ }
+ minPlayers: 2 /* minimum amount of players to start (DEBUG VALUE, CHANGE BACK) */
+ maxPlayers: 60 /* maximum amount of players */
+ minTeamPlayers: 6 /* minimum amount of team members required for a team (party or guild) to join */
+ delay_var: "Flavius_BG_Tick" /* char variable name that will store the delay for this match */
+ maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
+ fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
+ pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ },{
+ name: "KVM (Level 80 and up)" //must match the name in client files
+ event: "KvM03_BG::OnPlayerListReady"
+ allowedTypes: "All" /* Solo, Party and Guild */
+ minLevel: 80
+ maxLevel: 150
+ reward: {/* amount of badges awarded on each case */
+ win: 5
+ loss: 1
+ draw: 1
+ }
+ minPlayers: 4 /* minimum amount of players to start */
+ maxPlayers: 60 /* maximum amount of players */
+ minTeamPlayers: 5 /* minimum amount of team members required for a team (party or guild) to join */
+ delay_var: "KVM_BG_Tick" /* char variable name that will store the delay for this match */
+ maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
+ fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
+ pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ },{
+ name: "KVM (Level 60~79)" //must match the name in client files
+ event: "KvM03_BG::OnPlayerListReady"
+ allowedTypes: "All" /* Solo, Party and Guild */
+ minLevel: 60
+ maxLevel: 79
+ reward: {/* amount of badges awarded on each case */
+ win: 2
+ loss: 0
+ draw: 1
+ }
+ minPlayers: 4 /* minimum amount of players to start */
+ maxPlayers: 60 /* maximum amount of players */
+ minTeamPlayers: 5 /* minimum amount of team members required for a team (party or guild) to join */
+ delay_var: "KVM_BG_Tick" /* char variable name that will store the delay for this match */
+ maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
+ fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
+ pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ },{
+ name: "KVM (Level 59 and below)" //must match the name in client files
+ event: "KvM03_BG::OnPlayerListReady"
+ allowedTypes: "All" /* Solo, Party and Guild */
+ minLevel: 1
+ maxLevel: 59
+ reward: {/* amount of badges awarded on each case */
+ win: 1
+ loss: 0
+ draw: 0
+ }
+ minPlayers: 4 /* minimum amount of players to start */
+ maxPlayers: 60 /* maximum amount of players */
+ minTeamPlayers: 5 /* minimum amount of team members required for a team (party or guild) to join */
+ delay_var: "KVM_BG_Tick" /* char variable name that will store the delay for this match */
+ maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
+ fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
+ pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ }
+ )
+})
diff --git a/conf/channels.conf.base b/conf/channels.conf.base
new file mode 100644
index 00000000..f7bdad32
--- /dev/null
+++ b/conf/channels.conf.base
@@ -0,0 +1,76 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//====================================================
+//================= More Information =================
+// http://herc.ws/board/topic/316-introducing-hercules-channel-system/
+//====================================================
+chsys: (
+{
+ /* Default Channels (available on boot) */
+ default_channels: {
+ /* channel_name : channel_messages_color */
+ main: "Orange" /* Available as #main */
+ support: "Blue" /* Available as #support */
+ trade: "Red" /* Available as #trade */
+ gm: "Red"
+ lang: "Green"
+ offtopic: "Cyan" /* Available as #offtopic */
+ /* You may add as many channels as you like */
+ }
+ /* Colors Available */
+ colors: {
+ Default: "0xffffff" /* Custom channels use the first color listed unless a font is selected through @channel. */
+ Red: "0xff0000"
+ Blue: "0x83cfe9"
+ Orange: "0xe57c00"
+ Cyan: "0x00b89d"
+ Yellow: "0xffff90"
+ Green: "0x28bf00"
+ Light_Green: "0x3dff98"
+ Normal: "0x00ff00"
+ /* As many colors as you like */
+ }
+ /* Allow users to create their own (private) channels through @channels command? */
+ /* (must also allow players to use @channels in groups.conf) */
+ allow_user_channel_creation: true
+
+ /* "map_local_channel" is a instanced channel unique to each map. */
+ map_local_channel: true
+ map_local_channel_name: "map" /* Available as #map */
+ map_local_channel_color: "Yellow"
+ map_local_channel_autojoin: true /* You can disable autojoin in specific maps through a mapflag or zone. */
+
+ /* "ally_channel" is a channel shared by all your guild allies */
+ ally_channel_enabled: true
+ ally_channel_name: "ally" /* Available as #ally */
+ ally_channel_color: "Green"
+ ally_channel_autojoin: true /* Will members autojoin to their respective #ally chats when they log-in? */
+
+ /* "irc_channel" is a special channel connected to a specific chat room in any irc network. */
+ irc_channel_enabled: false
+ irc_channel_name: "irc" /* available as #irc */
+ irc_channel_color: "Light_Green"
+ irc_channel_network: "irc.freenode.net:6667" /* network to connect to (:and port) */
+ irc_channel_channel: "#themanaworld" /* channel in the network above to join */
+ irc_channel_nick: "testbot" /* nick the bot will use */
+ irc_channel_nick_pw: "" /* password to this nick (if any) to identify to nick server on the irc network */
+ irc_channel_use_ghost: false /* whether to send a GHOST command to the nick server (requires irc_channel_nick_pw to be defined) */
+ irc_channel_autojoin: true
+ irc_flood_protection_enabled: true /* Whether to enable anti-flood protection for outgoing messages */
+ irc_flood_protection_rate: 1000 /* The delay between messages during anti-flood protection (milliseconds) */
+ irc_flood_protection_burst: 3 /* The maximum number of messages that are sent at once burst size before triggering the anti-flood protection */
+
+ // @channel setopt MessageDelay <delay>
+ // Sets the maximum amount of message delay (in seconds) allowed for a channel.
+ // Default: 10
+ // Max: 255
+ channel_opt_msg_delay: 10
+}
+)
diff --git a/conf/char/char-server.conf b/conf/char/char-server.conf
new file mode 100644
index 00000000..0e5a7c6e
--- /dev/null
+++ b/conf/char/char-server.conf
@@ -0,0 +1,255 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Character Server configuration file.
+//=========================================================================
+
+char_configuration: {
+ @include "conf/global/console.conf"
+ @include "conf/import/sql_connection.conf"
+
+ // Server name, use alternative character such as ASCII 160 for spaces.
+ // NOTE: Do not use spaces or any of these characters which are not allowed in
+ // Windows filenames \/:*?"<>|
+ // ... or else guild emblems won't work client-side!
+ server_name: "TMW Evolved"
+
+ // Wisp name for server: used to send wisp from server to players (between 4 to 23 characters)
+ wisp_server_name: "Server"
+
+ // Guild earned exp modifier.
+ // Adjusts taxed exp before adding it to the guild's exp. For example,
+ // if set to 200, the guild receives double the player's taxed exp.
+ guild_exp_rate: 100
+
+ // Information related to inter-server behavior
+ inter: {
+ // Server Communication username and password.
+ userid: "s1"
+ passwd: "p1"
+
+ // Login Server IP
+ // The character server connects to the login server using this IP address.
+ // NOTE: This is useful when you are running behind a firewall or are on
+ // a machine with multiple interfaces.
+ //login_ip: "127.0.0.1"
+
+ // The character server listens on the interface with this IP address.
+ // NOTE: This allows you to run multiple servers on multiple interfaces
+ // while using the same ports for each server.
+ //bind_ip: "127.0.0.1"
+
+ // Character Server IP
+ // The IP address which clients will use to connect.
+ // Set this to what your server's public IP address is.
+ //char_ip: "127.0.0.1"
+
+ @include "conf/import/ports.conf"
+ }
+
+ // Connection permission
+ permission: {
+ // Enable or disable creation of new characters.
+ enable_char_creation: true
+
+ // Display (New) in the server list.
+ display_new: false
+
+ // Maximum users able to connect to the server.
+ // Set to 0 to disable users to log-in. (-1 means unlimited)
+ max_connect_user: -1
+
+ // Group ID that is allowed to bypass the server limit of users.
+ // Default: -1 = nobody (there are no groups with ID < 0)
+ // See: conf/groups.conf
+ gm_allow_group: -1
+
+ // Type of server.
+ // No functional side effects at the moment.
+ // Displayed next to the server name in the client.
+ // 0=normal, 1=maintenance, 2=over 18, 3=paying, 4=F2P
+ server_type: 0
+
+ // Minimum Group ID to join char server when it is on char_server_type 1 (maintenance)
+ maintenance_min_group_id: 99
+ }
+
+ // Player-related configuration
+ player: {
+ new: {
+ // Start point (Renewal)
+ start_point_re: {
+ map: "000-0"
+ x: 22
+ y: 24
+ }
+
+ // Starting items for new characters
+ //{
+ // id: Item id
+ // amount: Item amount
+ // loc: Item position, same as in item_db if you want the item to be equipped, otherwise 0 (optional)
+ // stackable: Is stackable? (not stackable item types: weapon, armor, egg, pet armor)
+ //},
+ start_items: (
+// {
+// id: 1201 // Knife
+// amount: 1
+// loc: 2
+// stackable: false
+// },
+// {
+// id: 2301 // Cotton_Shirt
+// amount: 1
+// loc: 16
+// stackable: false
+// },
+ )
+
+ // Starting zeny
+ zeny: 0
+ }
+
+ // Character name configuration
+ name: {
+ // Name used for unknown characters
+ unknown_char_name: "Unknown"
+
+ // Allow or not identical name for characters but with a different case (upper/lower):
+ // example: Test-test-TEST-TesT; Value: 0 not allowed (default), 1 allowed
+ name_ignoring_case: false
+
+ // Manage possible letters/symbol in the name of charater. Control character (0x00-0x1f) are never accepted. Possible values are:
+ // NOTE: Applies to character, party and guild names.
+ // 0: no restriction (default)
+ // 1: only letters/symbols in 'name_letters' option.
+ // 2: Letters/symbols in 'name_letters' option are forbidden. All others are possibles.
+ name_option: 1
+
+ // Set the letters/symbols that you want use with the 'char_name_option' option.
+ // Note: Don't add spaces unless you mean to add 'space' to the list.
+ name_letters: "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+
+ // Block renaming if character is in a guild or a party? (BOOL)
+ // Athena: false Aegis: true
+ // This check is imposed by Aegis to avoid dead entries in databases and is not needed on Hercules, as we clear data properly
+ use_aegis_rename: false
+ }
+
+ deletion: {
+ // Restrict character deletion by BaseLevel
+ // 0: no restriction (players can delete characters of any level)
+ // -X: you can't delete chars with BaseLevel <= X
+ // Y: you can't delete chars with BaseLevel >= Y
+ // e.g. char_del_level: 80 (players can't delete characters with 80+ BaseLevel)
+ level: 0
+
+ // Amount of time in seconds by which the character deletion is delayed.
+ // Default: 86400 (24 hours)
+ // NOTE: Requires client 2010-08-03aragexeRE or newer.
+ delay: 86400
+
+ // Block deletion if character is inside a guild or a party? (BOOL)
+ // default: false official: true
+ // !!This check is imposed by Aegis to avoid dead entries in databases and _is_not_needed_ as we clear data properly!!
+ use_aegis_delete: false
+ }
+
+ // Size for the fame-lists
+ fame: {
+ alchemist: 10
+ blacksmith: 10
+ taekwon: 10
+ }
+ }
+
+ database: {
+ // How often should server save all guild related information? (character save interval is defined on the map config)
+ // (in seconds)
+ autosave_time: 60
+
+ // What folder the DB files are in (abra_db.txt, etc.)
+ db_path: "db"
+
+ // To log the character server?
+ log_char: true
+ }
+
+ //==================================================================
+ // Pincode system
+ //==================================================================
+ pincode: {
+ // A window is opened before you can select your character and you will have to enter a pincode by using only your mouse
+ // NOTE: Requires client 2011-03-09aragexeRE or newer.
+ // Default: true
+ enabled: false
+
+ // Request Pincode only on login or on everytime char select is accessed?
+ // 0: only on login (default)
+ // 1: everytime the char select window is accessed
+ request: 0
+
+ // How often does a user have to change his pincode?
+ // Default: 0
+ // 0: never
+ // X: every X minutes
+ change_time: 0
+
+ // How often can a user enter the wrong password?
+ // Default: 3
+ // Maximum allowed by clientside: 3
+ max_tries: 3
+
+ // Whether or not to refuse pincodes that are blacklisted
+ // Default: true
+ check_blacklisted: true
+
+ // Blacklisted pincodes
+ blacklist: [
+ "0000",
+ "1111",
+ "2222",
+ "3333",
+ "4444",
+ "5555",
+ "6666",
+ "7777",
+ "8888",
+ "9999",
+ "0123",
+ "1234",
+ "2345",
+ "3456",
+ "4567",
+ "5678",
+ "6789",
+ "7890"
+ ]
+ }
+
+}
+
+import: "conf/import/char-server.conf"
diff --git a/conf/clans.conf b/conf/clans.conf
new file mode 100644
index 00000000..82211fce
--- /dev/null
+++ b/conf/clans.conf
@@ -0,0 +1,48 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2017-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Clan System local configuration file.
+//=========================================================================
+
+clan_configuration: {
+
+ // Maximum players for each clan
+ MaxMembers: 500
+
+ // Maximum alliances/oppositions for each clan
+ MaxRelations: 6
+
+ // how many hours player must be inactive to be kicked?
+ // Disabled: 0
+ // Official: 336 (2 weeks)
+ InactivityKickTime: 336
+
+ // Checks each clan member every 'InactivityCheckTime' hour(s) (default 24h, minimum value of 1h)
+ InactivityCheckTime: 24
+
+ // Clan Database
+ @include "db/clans.conf"
+}
diff --git a/conf/common/inter-server.conf b/conf/common/inter-server.conf
new file mode 100644
index 00000000..6db189a7
--- /dev/null
+++ b/conf/common/inter-server.conf
@@ -0,0 +1,128 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Inter Server configuration file.
+//=========================================================================
+// Settings that are shared by more than one of the main servers
+//=========================================================================
+
+inter_configuration: {
+ // Level range for sharing within a party
+ party_share_level: 15 // FIXME: Split RE and pre-RE
+
+ // Log configuration
+ log: {
+ // Log Inter Connections, etc.?
+ log_inter: true
+
+ // Inter Log Filename
+ inter_log_filename: "log/inter.log"
+
+ // Log database SQL connection
+ @include "conf/import/sql_connection.conf"
+ }
+
+ mysql_reconnect: {
+ // == MySQL Reconnect Settings
+ // ===========================
+ // - mysql_reconnect_type
+ // - 1: when mysql disconnects during runtime, the server tries to reconnect mysql_reconnect_count times and,
+ // -- if unsuccessful, the server is shut down
+ // - 2: when mysql disconnects during runtime it tries to reconnect indefinitely
+ type: 2
+
+ // - mysql_reconnect_count
+ // - number of reconnect attempts the server should do when the database disconnects during runtime
+ // - only used when mysql_reconnect_type is 1
+ count: 1
+ }
+
+ // ALL MySQL Database Table names
+ // DO NOT CHANGE ANYTHING BEYOND THIS LINE UNLESS YOU KNOW YOUR DATABASE DAMN WELL
+ // this is meant for people who KNOW their stuff, and for some reason want to change their
+ // database layout. [CLOWNISIUS]
+ database_names: {
+ account_db: "login"
+ login_db: "loginlog"
+ ipban_table: "ipbanlist"
+ char_db: "char"
+ interlog_db: "interlog"
+ ragsrvinfo_db: "ragsrvinfo"
+ registry: {
+ acc_reg_num_db: "acc_reg_num_db"
+ acc_reg_str_db: "acc_reg_str_db"
+ char_reg_str_db: "char_reg_str_db"
+ char_reg_num_db: "char_reg_num_db"
+ global_acc_reg_num_db: "global_acc_reg_num_db"
+ global_acc_reg_str_db: "global_acc_reg_str_db"
+ map_reg_num_db: "map_reg_num_db"
+ map_reg_str_db: "map_reg_str_db"
+ }
+ pc: {
+ hotkey_db: "hotkey"
+ scdata_db: "sc_data"
+ cart_db: "cart_inventory"
+ achievement_db: "char_achievements"
+ inventory_db: "inventory"
+ charlog_db: "charlog"
+ storage_db: "storage"
+ skill_db: "skill"
+ memo_db: "memo"
+ party_db: "party"
+ pet_db: "pet"
+ friend_db: "friends"
+ mail_db: "mail"
+ auction_db: "auction"
+ quest_db: "quest"
+ homunculus_db: "homunculus"
+ skill_homunculus_db: "skill_homunculus"
+ mercenary_db: "mercenary"
+ mercenary_owner_db: "mercenary_owner"
+ elemental_db: "elemental"
+ account_data_db: "account_data"
+ }
+ guild: {
+ main_db: "guild"
+ alliance_db: "guild_alliance"
+ castle_db: "guild_castle"
+ expulsion_db: "guild_expulsion"
+ member_db: "guild_member"
+ skill_db: "guild_skill"
+ position_db: "guild_position"
+ storage_db: "guild_storage"
+ }
+ autotrade_merchants_db: "autotrade_merchants"
+ autotrade_data_db: "autotrade_data"
+ npc_market_data_db: "npc_market_data"
+ npc_barter_data_db: "npc_barter_data"
+ npc_expanded_barter_data_db: "npc_expanded_barter_data"
+ }
+
+ // Show warning in console if some string translation missing for selected language
+}
+warn_missing_translation: false
+
+import: "conf/import/inter-server.conf"
diff --git a/conf/common/map-index.conf b/conf/common/map-index.conf
new file mode 100644
index 00000000..b3a1b4e8
--- /dev/null
+++ b/conf/common/map-index.conf
@@ -0,0 +1,34 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Map Index configuration file.
+//=========================================================================
+
+mapindex_configuration: {
+ // Full path to the map_index.txt file
+ // Default: db/map_index.txt
+ file_path: "db/map_index.txt"
+}
diff --git a/conf/common/socket.conf b/conf/common/socket.conf
new file mode 100644
index 00000000..eb7d494b
--- /dev/null
+++ b/conf/common/socket.conf
@@ -0,0 +1,106 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Sockets configuration file
+//=========================================================================
+
+socket_configuration: {
+ // How long can a socket stall before closing the connection (in seconds)?
+ stall_time: 60
+
+ // Display debug reports (When something goes wrong during the report, the report is saved.)
+ debug: false
+
+ // Linux/Epoll: Maxmimum Events per cycle
+ // Default Value:
+ // (Maxmimum Supported Connections)/2
+ // NOTE: this controls the maximum collected socket-events per-cycle (call to epoll_wait())
+ // for example settings this to 32 will allow up to 32 events (incomming data/new connections
+ // per server-cycle.
+ // NOTE: Recommended Settings is at least half the maxmimum supported connections
+ // Settings this to a lower value, may cause lags/delays
+ // Depending on available CPU Time
+ // NOTE: This Setting is only available on Linux when build using EPoll as event dispatcher!
+ //
+ //epoll_maxevents: 1024
+
+ // Maximum allowed size for clients packets in bytes.
+ // Default Values:
+ // 24576 (Clients < 20131223)
+ // 65535 (Clients >= 20131223)
+ // NOTE: To reduce the size of reported packets, lower the values of defines, which
+ // have been customized, such as MAX_STORAGE, MAX_GUILD_STORAGE or MAX_CART.
+ // NOTE: Do not modify this setting, unless the client has been modified to support
+ // larger packets. The client will crash, when it receives larger packets.
+ //socket_max_client_packet: 65535
+
+ //----- IP Rules Settings -----
+ ip_rules: {
+ // If IP's are checked when connecting.
+ // This also enables DDoS protection.
+ enable: true
+
+ // Order of the checks
+ // deny,allow : Checks deny rules, then allow rules. Allows if no rules match.
+ // allow,deny : Checks allow rules, then deny rules. Allows if no rules match.
+ // mutual-failure : Allows only if an allow rule matches and no deny rules match.
+ // (default is deny,allow)
+ order: "deny,allow"
+
+ // IP rules
+ // allow : Accepts connections from the ip range (even if flagged as DDoS)
+ // deny : Rejects connections from the ip range
+ // The rules are processed in order, the first matching rule of each list (allow and deny) is used
+ allow_list: (
+ //"127.0.0.1",
+ //"192.168.0.0/16",
+ //"10.0.0.0/255.0.0.0",
+ //"all",
+ )
+ deny_list: (
+ //"127.0.0.1",
+ )
+ }
+
+ //---- DDoS Protection Settings ----
+ // If ddos.count connection request are made within ddos.interval ms, it assumes it's a DDoS attack
+ ddos: {
+ // Consecutive attempts interval (msec)
+ // (default is 3000 msecs, 3 seconds)
+ interval: 3000 //ddos_interval
+
+ // Consecutive attempts trigger
+ // (default is 5 attemps)
+ count: 5 //ddos_count
+
+ // The time interval after which the threat of DDoS is assumed to be gone (ms)
+ // After this amount of time, the DDoS restrictions are lifted.
+ // (default is 600000ms, 10min)
+ autoreset: 600000 //ddos_autoreset
+ }
+}
+
+import: "conf/import/socket.conf"
diff --git a/conf/global/console.conf b/conf/global/console.conf
new file mode 100644
index 00000000..57d58b2f
--- /dev/null
+++ b/conf/global/console.conf
@@ -0,0 +1,67 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Server Console configuration file.
+//=========================================================================
+// This file affects how ALL server consoles work, unless explictly defined
+// so in the server configuration file (See doc/global_configuration.txt
+// for more information).
+//=========================================================================
+
+console: {
+ // Time-stamp format which will be printed before all messages.
+ // Can at most be 20 characters long.
+ // Common formats:
+ // %I:%M:%S %p (hour:minute:second 12 hour, AM/PM format)
+ // %H:%M:%S (hour:minute:second, 24 hour format)
+ // %d/%b/%Y (day/Month/year)
+ // For full format information, consult the strftime() manual.
+ //timestamp_format: "[%d/%b %H:%M]"
+
+ // If redirected output contains escape sequences (color codes)
+ stdout_with_ansisequence: false
+
+ // Makes server output more silent by omitting certain types of messages:
+ // 1: Hide Information messages
+ // 2: Hide Status messages
+ // 4: Hide Notice Messages
+ // 8: Hide Warning Messages
+ // 16: Hide Error and SQL Error messages.
+ // 32: Hide Debug Messages
+ // Example: "console_silent: 7" Hides information, status and notice messages (1+2+4)
+ console_silent: 0
+
+ // [CHAR] Display information on the console whenever characters/guilds/parties/pets are loaded/saved?
+ save_log: true
+
+ // [MAP] Makes server log selected message types to a file in the /log/ folder
+ // 1: Log Warning Messages
+ // 2: Log Error and SQL Error messages.
+ // 4: Log Debug Messages
+ // Example: "console_msg_log: 7" logs all 3 kinds
+ // Messages logged by this overrides console_silent setting
+ console_msg_log: 7
+}
diff --git a/conf/grf-files.txt b/conf/grf-files.txt
new file mode 100644
index 00000000..6af05857
--- /dev/null
+++ b/conf/grf-files.txt
@@ -0,0 +1,12 @@
+//-----------------------------------------
+// GRF Files
+// Add as many as needed.
+//-----------------------------------------
+//grf: C:\Program Files\Gravity\RO\rdata.grf
+//grf: C:\Program Files\Gravity\RO\data.grf
+
+//-----------------------------------------
+// Data Directory
+// Use the base folder, not the data\ path.
+//-----------------------------------------
+//data_dir: C:\Program Files\Gravity\RO\
diff --git a/conf/groups.conf b/conf/groups.conf
new file mode 100644
index 00000000..60271a5b
--- /dev/null
+++ b/conf/groups.conf
@@ -0,0 +1,489 @@
+/*
+Player groups configuration file
+---------------------------------
+
+This file defines "player groups" and their privileges.
+
+Each group has its id and name, lists of available commands and other
+permissions, and a list of other groups it inherits from.
+
+
+Group settings
+--------------
+<id>
+Unique group number. The only required field.
+
+<name>
+Any string. If empty, defaults to "Group <id>". It is used in several @who
+commands.
+
+<level>
+Equivalent of GM level, which was used in revisions before r15572. You can
+set it to any number, but usually it's between 0 (default) and 99. Members of
+groups with lower level can not perform some actions/commands (like @kick) on
+members of groups with higher level. It is what script command getgmlevel()
+returns. Group level can also be used to override trade restrictions
+(db/item_trade.txt).
+
+<commands>
+A group of settings
+ <command name> : <bool>
+or
+ <commandname> : [ <bool>, <bool> ]
+First boolean value is for atcommand, second one for charcommand. If set to
+true, group can use command. If only atcommand value is provided, false is
+assumed for charcommand. If a command name is not included, false is assumed for
+both atcommand and charcommand.
+For a full list of available commands, see: doc/atcommands.txt.
+Command names must not be aliases.
+
+<log_commands>
+Boolean value. If true then all commands used by the group will be logged to
+atcommandlog. If setting is omitted in a group definition, false is assumed.
+Requires 'log_commands' to be enabled in 'conf/logs.conf'.
+
+<permissions>
+A group of settings
+ <permission> : <bool>
+If a permission is not included, false is assumed.
+For a full list of available permissions, see: doc/permissions.txt
+
+<inherit>
+A list of group names that given group will inherit commands and permissions
+from. Group names are case-sensitive.
+
+Inheritance results
+-------------------
+Both multiple inheritance (Group 2 -> Group 1 and Group 3 -> Group 1) and
+recursive inheritance (Group 3 -> Group 2 -> Group 1) are allowed.
+
+Inheritance rules should not create cycles (eg Group 1 inherits from Group 2,
+and Group inherits from Group 1 at the same time). Configuration with cycles is
+considered faulty and can't be processed fully by server.
+
+Command or permission is inherited ONLY if it's not already defined for the
+group.
+If group inherits from multiple groups, and the same command or permission is
+defined for more than one of these groups, it's undefined which one will be
+inherited.
+
+Syntax
+------
+This config file uses libconfig syntax:
+http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-Files
+
+0: Player
+1: Trusted Player
+
+20/21: Support (Trusted Player + Common)
+
+40/41: Developer (Support + DEV)
+
+50/51: Event Coordinator (Support + EVTC)
+
+60/61: Game Master (Support + GM)
+
+80/81: Community Coordinator (Support + DEV + EVTC + GM)
+
+99: Administrator (All Perms)
+
+NYI commands:
+hairstyle and haircolor (use @debug-look)
+snow, sakura, clouds, clouds2, fog, fireworks, leaves, clearweather
+changesex (faulty)
+misceffect (I don't understand)
+
+*/
+
+groups: (
+{
+ id: 0 /* group 0 is the default group for every new account */
+ name: "Player"
+ level: 0
+ inherit: ( /*empty list*/ )
+ commands: {
+ help: true
+ commands: true
+ duel: true
+ accept: true
+ reject: true
+ invite: true
+ leave: true
+ noask: true // Autoreject duels
+ email: true
+ request: true
+ time: true
+ jailtime: true
+ rates: true
+ breakguild: true
+ changegm: true
+ // Bugfix-level commands
+ hominfo: true
+ refresh: true
+ // KillSteal commands (???)
+ noks: true
+ }
+ permissions: {
+ /* without this basic permissions regular players could not
+ trade or party */
+ can_trade: true
+ can_party: true
+ }
+},
+// ===== Trusted Players and Bots
+{
+ id: 1
+ name: "Trusted Player"
+ inherit: ( "Player" ) /* can do everything Players can and more */
+ level: 1
+ commands: {
+ // Information Commands
+ whogm: true
+ uptime: true
+ charcommands: true
+ exp: true
+ mobinfo: true
+ iteminfo: true
+ whodrops: true
+ homstats: true
+ whereis: true
+ tee: true
+ log: true
+ // Server Spam Limit commands
+ showexp: true
+ showzeny: true
+ showdelay: true
+ // Community Commands
+ channel: true
+ // Convenience Commands
+ autotrade: true
+ }
+ log_commands: true
+ permissions: {
+ show_client_version: true
+ }
+},
+// ===== Support
+{
+ id: 20
+ name: "Support"
+ inherit: ( "Trusted Player" )
+ level: 20
+ commands: {
+ // Information Commands
+ version: true
+ where: [true, true]
+ who: true
+ who2: true
+ who3: true
+ whomap: true
+ whomap2: true
+ whomap3: true
+ users: true
+ mobsearch: true
+ idsearch: true
+ showmobs: true
+ skillid: true
+ // Movement Commands
+ tonpc: true
+ jumpto: true
+ warp: true
+ jump: true
+ slide: true
+ memo: true
+ save: true
+ load: true
+ hugo: true
+ linus: true
+ // Community Commands
+ broadcast: true
+ localbroadcast: true
+ hidenpc: true
+ shownpc: true
+ stats: [true, true]
+ refresh: [true, true]
+ // Moderation Commands
+ kick: true
+ mute: true
+ unmute: true
+ // Convenience Commands
+ monsterignore: true
+ autoloot: true
+ alootid: true
+ autoloottype: true
+ storage: true
+ mail: true
+ effect: true
+ }
+ log_commands: true
+ permissions: {
+ send_gm: true
+ receive_requests: true
+ view_equipment: true
+ }
+},
+{
+ id: 21
+ name: "Support (Hidden)"
+ inherit: ( "Support" )
+ level: 20
+ commands: {
+ }
+ log_commands: true
+ permissions: {
+ send_gm: false
+ }
+},
+// ===== Developer
+{
+ id: 40
+ name: "Developer"
+ inherit: ( "Support" )
+ level: 40
+ commands: {
+ npcmove: true
+ day: true
+ night: true
+ gat: true
+ skilltree: true
+ heal: true
+ alive: true
+ loadnpc: true
+ unloadnpc: true
+ reloadnpc: true
+ delitem: true
+ refine: true
+ speed: true
+ itemreset: true
+ reset: true
+ mapinfo: true
+ }
+ log_commands: true
+ permissions: {
+ }
+},
+{
+ id: 41
+ name: "Developer (Hidden)"
+ inherit: ( "Developer" )
+ level: 40
+ commands: {
+ }
+ log_commands: true
+ permissions: {
+ send_gm: false
+ }
+},
+// ===== Event Coordinator
+{
+ id: 50
+ name: "Event Coordinator"
+ inherit: ( "Support" )
+ level: 50
+ commands: {
+ fakename: true
+ invisible: true
+
+ // Community Commands
+ heal: [true, true]
+ alive: [true, true]
+ monster: [true, true]
+ monstersmall: [true, true]
+ monsterbig: [true, true]
+ summon: [true, true]
+ killmonster2: [true, true]
+ cleanarea: [true, true]
+ cleanmap: true
+ clone: [true, true]
+ slaveclone: [true, true]
+ evilclone: [true, true]
+ disguise: [true, true]
+ undisguise: [true, true]
+ pvpon: true
+ pvpoff: true
+ gvgon: true
+ gvgoff: true
+ npctalk: true
+ }
+ log_commands: true
+ permissions: {
+ }
+},
+{
+ id: 51
+ name: "Event Coordinator (Hidden)"
+ inherit: ( "Event Coordinator" )
+ level: 50
+ commands: {
+ }
+ log_commands: true
+ permissions: {
+ send_gm: false
+ }
+},
+// ===== Game Master
+{
+ id: 60
+ name: "Game Master"
+ inherit: ( "Support" )
+ level: 60
+ commands: {
+ blvl: [true, true]
+ jlvl: [true, true]
+ str: [true, true]
+ agi: [true, true]
+ vit: [true, true]
+ int: [true, true]
+ dex: [true, true]
+ luk: [true, true]
+ allstats: true
+ invisible: true
+ speed: [true, true]
+ guild: [true, true]
+
+ // Moderation Commands
+ jailfor: true
+ jail: true
+ unjail: true
+ ban: true
+ block: true
+ unban: true
+ delitem: [true, true]
+ mutearea: true
+ reset: [true, true]
+ itemreset: [true, true]
+ dropall: [true, true]
+ storeall: [true, true]
+ accinfo: true
+ storagelist: [true, true]
+ cartlist: [true, true]
+ itemlist: [true, true]
+
+ // Community Commands
+ heal: [true, true]
+ alive: [true, true]
+ slide: [true, true]
+ warp: [true, true]
+ killer: true
+ killable: true
+ pvpon: true
+ pvpoff: true
+ gvgon: true
+ gvgoff: true
+ cvcon: true
+ cvcoff: true
+ killmonster: [true, true]
+ killmonster2: [true, true]
+ recall: true
+ cleanmap: true
+ nuke: [true, true]
+ skillon: true
+ skilloff: true
+ raisemap: true
+ npctalk: true
+
+ }
+ log_commands: true
+ permissions: {
+ who_display_aid: true
+ view_hpmeter: true
+ join_chat: true
+ kick_chat: true
+ hide_session: true
+ hack_info: true
+ }
+},
+{
+ id: 61
+ name: "Game Master (Hidden)"
+ inherit: ( "Game Master" )
+ level: 60
+ commands: {
+ }
+ log_commands: true
+ permissions: {
+ send_gm: false
+ }
+},
+// ===== Community Coordinator (GM/DEV)
+{
+ id: 80
+ name: "Community Coordinator"
+ inherit: ( "Support", "Developer", "Event Coordinator", "Game Master" )
+ level: 80
+ commands: {
+ addwarp: true
+ refine: [true, true]
+ repairall: [true, true]
+ allowks: true
+ item: [true, true]
+ item2: [true, true]
+ itembound: [true, true]
+ itembound2: [true, true]
+ zeny: [true, true]
+
+ // Community Commands
+ raise: true
+ partyrecall: true
+ guildrecall: true
+ doom: true
+ doommap: true
+ refreshall: true // Use with caution
+ effect: [true, true]
+ marry: [true, true] // Use with caution
+ divorce: true
+
+ // Change status and options
+ displaystatus: [true, true]
+ option: [true, true]
+ partyoption: [true, true]
+
+ // Moderation Commands
+ clearstorage: true
+ cleargstorage: true
+ recallall: true
+ breakguild: [true, true]
+ changeleader: [true, true]
+
+ }
+ log_commands: true
+ permissions: {
+ any_warp: true
+ }
+},
+{
+ id: 81
+ name: "Community Coordinator (Hidden)"
+ inherit: ( "Community Coordinator" )
+ level: 80
+ commands: {
+ }
+ log_commands: true
+ permissions: {
+ send_gm: false
+ }
+},
+// ===== Administrator
+// (There isn't a hidden admin yet)
+{
+ id: 99
+ name: "Administrator"
+ level: 99
+ inherit: ( "Community Coordinator" )
+ commands: {
+ /* not necessary due to all_commands: true */
+ }
+ log_commands: true
+ permissions: {
+ can_trade_bound: false
+ can_party: true
+ all_skill: false
+ all_equipment: true
+ skill_unconditional: false
+ use_check: true
+ use_changemaptype: true
+ all_commands: true
+ hchsys_admin: true
+ }
+}
+)
diff --git a/conf/import-tmpl/battle.conf b/conf/import-tmpl/battle.conf
new file mode 100644
index 00000000..ff05022c
--- /dev/null
+++ b/conf/import-tmpl/battle.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Battle local configuration file.
+//=========================================================================
+
+battle_configuration: {
+ // See conf/map/battle.conf for details
+}
diff --git a/conf/import-tmpl/char-server.conf b/conf/import-tmpl/char-server.conf
new file mode 100644
index 00000000..3162a31a
--- /dev/null
+++ b/conf/import-tmpl/char-server.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Character Server local configuration file.
+//=========================================================================
+
+char_configuration: {
+ // See conf/char/char-server.conf for details
+}
diff --git a/conf/import-tmpl/inter-server.conf b/conf/import-tmpl/inter-server.conf
new file mode 100644
index 00000000..9cd3932f
--- /dev/null
+++ b/conf/import-tmpl/inter-server.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Inter Server local configuration file.
+//=========================================================================
+
+inter_configuration: {
+ // See conf/common/inter-server.conf
+}
diff --git a/conf/import-tmpl/login-server.conf b/conf/import-tmpl/login-server.conf
new file mode 100644
index 00000000..c8f1f854
--- /dev/null
+++ b/conf/import-tmpl/login-server.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Login Server local configuration file.
+//=========================================================================
+
+login_configuration: {
+ // See conf/login/login-server.conf for details
+}
diff --git a/conf/import-tmpl/logs.conf b/conf/import-tmpl/logs.conf
new file mode 100644
index 00000000..47e5a665
--- /dev/null
+++ b/conf/import-tmpl/logs.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Log local configuration file.
+//=========================================================================
+
+map_log: {
+ // See conf/map/logs.conf for details
+}
diff --git a/conf/import-tmpl/map-server.conf b/conf/import-tmpl/map-server.conf
new file mode 100644
index 00000000..11e4356b
--- /dev/null
+++ b/conf/import-tmpl/map-server.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Map Server local configuration file.
+//=========================================================================
+
+map_configuration: {
+ // See conf/map/map-server.conf for details
+}
diff --git a/conf/import-tmpl/msg_conf.txt b/conf/import-tmpl/msg_conf.txt
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/conf/import-tmpl/msg_conf.txt
diff --git a/conf/import-tmpl/script.conf b/conf/import-tmpl/script.conf
new file mode 100644
index 00000000..042644ff
--- /dev/null
+++ b/conf/import-tmpl/script.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Script local configuration file.
+//=========================================================================
+
+script_configuration: {
+ // See conf/map/script.conf for details
+}
diff --git a/conf/import-tmpl/socket.conf b/conf/import-tmpl/socket.conf
new file mode 100644
index 00000000..57806f21
--- /dev/null
+++ b/conf/import-tmpl/socket.conf
@@ -0,0 +1,32 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Sockets local configuration file
+//=========================================================================
+
+socket_configuration: {
+ // See conf/common/socket.conf for details.
+}
diff --git a/conf/login/login-server.conf b/conf/login/login-server.conf
new file mode 100644
index 00000000..da36d0aa
--- /dev/null
+++ b/conf/login/login-server.conf
@@ -0,0 +1,205 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Login Server configuration file.
+//=========================================================================
+
+login_configuration: {
+ // Login-server's console configuration
+ @include "conf/global/console.conf"
+
+ inter: {
+ // The login server listens on the interface with this IP address.
+ // NOTE: This allows you to run multiple servers on multiple interfaces
+ // while using the same ports for each server.
+ //bind_ip: "127.0.0.1"
+
+ // Interval (in minutes) to execute a DNS/IP update. Disabled by default.
+ // Enable it if your server uses a dynamic IP which changes with time.
+ //ip_sync_interval: 10
+
+ @include "conf/import/ports.conf"
+ }
+
+ log: {
+ // To log the login server?
+ // NOTE: The login-sql server needs the login logs to enable dynamic pass failure bans.
+ log_login: true
+
+ // Indicate how to display date in logs, to players, etc.
+ date_format: "%Y-%m-%d %H:%M:%S"
+ }
+
+ // for packet version >= 20170726
+ users_count: {
+ // if false, dont show any colored strings.
+ // if true, show special users count numbers for coloring char servers.
+ send_user_count_description: true
+
+ // users counts for use different colors.
+ // below 'low' show green text
+ // below 'medium' show oragne text
+ // below 'high' show red text
+ // higher 'high' show purple text
+ low: 200
+ medium: 500
+ high: 1000
+ }
+
+ // Account engine configuration
+ account: {
+ // Can you use _M/_F to make new accounts on the server?
+ new_account: true
+
+ // If new_account is enabled, minimum length to userid and passwords should be 4?
+ // Must be 'true' unless your client uses both 'Disable 4 LetterUserID/Password' Diffs
+ new_acc_length_limit: true
+
+ // Account registration flood protection system
+ // allowed_regs is the number of registrations allowed in time_allowed (in seconds)
+ allowed_regs: 1
+ time_allowed: 10
+
+ // Starting additional sec from now for the limited time at creation of account
+ // -1: new account are created with UNlimited time (default value)
+ // 0 or more: new accounts was created by addition of the value (in sec) to the actual time (to set first limited time)
+ start_limited_time: -1
+
+ // Store passwords as MD5 hashes instead of plaintext ?
+ // NOTE: Will not work with clients that use <passwordencrypt>
+ use_MD5_passwords: false
+
+ // Account data engine storage configuration
+ @include "conf/import/sql_connection.conf"
+
+ //==================================================================
+ // IP banning system
+ //==================================================================
+ ipban: {
+ enabled: true
+
+ // Interval (in seconds) to clean up expired IP bans. 0 = disabled. default = 60.
+ // NOTE: Even if this is disabled, expired IP bans will be cleaned up on login server start/stop.
+ // Players will still be able to login if an ipban entry exists but the expiration time has already passed.
+ cleanup_interval: 60
+
+ // SQL connection settings
+ @include "conf/import/sql_connection.conf"
+
+ // Dynamic password failure ipban system
+ dynamic_pass_failure: {
+ enabled: true
+
+ // Interval in minutes between failed tries
+ // Only failed tries between this interval will be accounted when banning
+ ban_interval: 5
+
+ // How many failures before adding a temporary ban entry?
+ ban_limit: 7
+
+ // Duration of the ban in minutes
+ ban_duration: 5
+ }
+ } // login_configuration.account.ipban
+ } // login_configuration.account
+
+ permission: {
+ // Required account group id to connect to server.
+ // -1: disabled
+ // 0 or more: group id
+ group_id_to_connect: -1
+
+ // Minimum account group id required to connect to server.
+ // Will not function if group_id_to_connect config is enabled.
+ // -1: disabled
+ // 0 or more: group id
+ min_group_id_to_connect: -1
+
+ // Check The clientversion set in the clientinfo ?
+ check_client_version: false
+
+ // What version we would allow to connect? (if check_client_version is enabled)
+ client_version_to_connect: 20
+
+ //==================================================================
+ // Client hash checking system
+ //==================================================================
+ // Note: see doc/md5_hashcheck.txt for more details.
+ hash: {
+ // Client MD5 hash check
+ // If turned on, the login server will check if the client's hash matches
+ // the value below, and will not connect tampered clients.
+ enabled: false
+
+ // Client MD5 hashes
+ // The client with the specified hash can be used to log in by players with
+ // a group_id equal to or greater than the given value.
+ // If you specify 'disabled' as hash, players with a group_id greater than or
+ // equal to the given value will be able to log in regardless of hash (and even
+ // if their client does not send a hash at all.)
+ MD5_hashes: (
+ //{
+ // group_id: group id
+ // hash: client hash
+ //},
+ //{
+ // group_id: 0
+ // hash: "113e195e6c051bb1cfb12a644bb084c5"
+ //},
+ //{
+ // group_id: 10
+ // hash: "cb1ea78023d337c38e8ba5124e2338ae"
+ //},
+ //{
+ // group_id: 99
+ // hash: "disabled"
+ //},
+ )
+ } // login_configuration.permission.hash
+
+ DNS_blacklist: {
+ // DNS Blacklist Blocking
+ // If enabled, each incoming connection will be tested against the blacklists
+ // on the specified dnsbl_servers
+ enabled: false
+
+ dnsbl_servers: (
+ // Here are some free DNS Blacklist Services: http://en.wikipedia.org/wiki/Comparison_of_DNS_blacklists
+ "bl.blocklist.de", // IP-Addresses who attack other servers/honeypots over SSH, FTP, IMAP, etc.
+ //"ircbl.ahbl.org", // AHBL (open proxies, compromised machines, comment spammers)
+ //"safe.dnsbl.sorbs.net", // All zones in dnsbl.sorbs.net except "recent" and "escalations"
+ //"sbl-xbl.spamhaus.org", // Spamhaus blacklist (spammers, open proxies)
+ "socks.dnsbl.sorbs.net", // Open SOCKS proxy servers
+ //"tor.ahbl.org", // Current tor relay and exit nodes
+ )
+ } // login_configuration.DNS_blacklist
+ } // login_configuration.permission
+
+}
+
+update_server: "http://updates.tmw2.org/messworld/"
+
+import: "conf/import/login-server.conf"
diff --git a/conf/map/battle.conf b/conf/map/battle.conf
new file mode 100644
index 00000000..f8c6b9a1
--- /dev/null
+++ b/conf/map/battle.conf
@@ -0,0 +1,88 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Battle Configuration File
+//=========================================================================
+
+battle_configuration: {
+ // General battle-related settings.
+ @include "conf/map/battle/battle.conf"
+
+ // Settings specific to the client.
+ @include "conf/map/battle/client.conf"
+
+ // General drop-related configs.
+ @include "conf/map/battle/drops.conf"
+
+ // Experience rates, exp penalties, stats and max level settings.
+ @include "conf/map/battle/exp.conf"
+
+ // GM levels, atcommands and hack-related configs.
+ @include "conf/map/battle/gm.conf"
+
+ // Guild and WoE settings
+ @include "conf/map/battle/guild.conf"
+
+ // Battleground settings
+ @include "conf/map/battle/battleground.conf"
+
+ // Item/card-specific and crafting related options.
+ @include "conf/map/battle/items.conf"
+
+ // Mob related configuration
+ @include "conf/map/battle/monster.conf"
+
+ // Party related configuration
+ @include "conf/map/battle/party.conf"
+
+ // Pet related configuration
+ @include "conf/map/battle/pet.conf"
+
+ // Homunc related configuration
+ @include "conf/map/battle/homunc.conf"
+
+ // Player specific settings
+ @include "conf/map/battle/player.conf"
+
+ // Skill related settings
+ @include "conf/map/battle/skill.conf"
+
+ // Status change related settings
+ @include "conf/map/battle/status.conf"
+
+ // Feature control (on/off) settings
+ @include "conf/map/battle/feature.conf"
+
+ // Different calculation limits
+ @include "conf/map/battle/limits.conf"
+
+ // Anything else that didn't fit anywhere else.
+ // Includes duel, day/night, mute/manner, log settings.
+ @include "conf/map/battle/misc.conf"
+}
+
+ // Your custom config goes here.
+import: "conf/import/battle.conf"
diff --git a/conf/map/battle/battle.conf b/conf/map/battle/battle.conf
new file mode 100644
index 00000000..f902e639
--- /dev/null
+++ b/conf/map/battle/battle.conf
@@ -0,0 +1,180 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Battle) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//=========================================================================
+
+// Who should have a baseatk value (makes str affect damage)? (Note 3)
+enable_baseatk: 9
+
+// Who can have perfect flee? (Note 3)
+enable_perfect_flee: 1
+
+// Who can have critical attacks? (Note 3)
+// (Note that there are some skills that always do critical hit regardless of this)
+enable_critical: 27
+
+// Critical adjustment rate for non-players (Note 2)
+mob_critical_rate: 100
+critical_rate: 100
+
+// Should normal attacks give you a walk delay? (Note 3)
+// If false, characters can move as soon as they start an attack (attack animation
+// or walk animation may be omitted client-side, causing cropped attacks or
+// monsters that teleport to you)
+// Otherwise, the delay is equal to the 'attack animation' (amotion)
+attack_walk_delay: 14
+
+// Move-delay adjustment after being hit. (Note 2)
+// The 'can't walk' delay after being hit is calculated as a percentage of the damage animation duration.
+// NOTE: Only affects the normal delay from a single attack, not the delay added by the multihit_delay option below.
+pc_damage_walk_delay_rate: 0
+damage_walk_delay_rate: 100
+
+// Move-delay adjustment for multi-hitting attacks.
+// When hit by a multi-hitting skill like Lord of Vermillion or Jupitel Thunder, characters will be
+// unable to move for an additional "(number of hits -1) * multihit_delay" milliseconds.
+// 80 is the setting that feels like Aegis (vs Sonic Blows)
+// 230 is the setting that makes walkdelay last until the last hit (vs Jupitel thunder)
+multihit_delay: 80
+
+// Damaged delay rate for players (Note 2)
+// (Setting to false/0 will be like always endure)
+player_damage_delay_rate: 100
+
+// Should race or element be used to consider someone undead?
+// 0 = element undead
+// 1 = race undead
+// 2 = both (either one works)
+undead_detect_type: 2
+
+// Does HP recover if hit by an attribute that's same as your own? (Note 1)
+// (Will not work in Renewal)
+attribute_recover: false
+
+// What is the minimum and maximum hitrate of normal attacks?
+min_hitrate: 5
+max_hitrate: 100
+
+// Type of penalty that is applied to FLEE when more than agi_penalty_count monsters are targetting player
+// 0 = no penalty is applied
+// 1 = agi_penalty_num is reduced from FLEE as a %
+// 2 = agi_penalty_num is reduced from FLEE as an exact amount
+agi_penalty_type: 1
+
+// When agi penalty is enabled, to whom it should apply to? (Note 3)
+// By default, only players get the penalty.
+agi_penalty_target: 9
+
+// Amount of enemies required to be targetting player before FLEE begins to be penalized
+agi_penalty_count: 3
+
+// Amount of FLEE penalized per each attacking monster more than agi_penalty_count
+agi_penalty_num: 10
+
+// Type of penalty that is applied to both equipment and vit DEF when more than vit_penalty_count monsters are targetting player
+// 0 = no penalty is applied
+// 1 = vit_penalty_num is reduced from DEF as a %
+// 2 = vit_penalty_num is reduced from DEF as an exact amount
+vit_penalty_type: 1
+
+// When vit penalty is enabled, to whom it should apply to? (Note 3)
+// By default, only players get the penalty.
+vit_penalty_target: 1
+
+// Amount of enemies required to be targetting player before defense begins to be penalized
+vit_penalty_count: 3
+
+// Amount of VIT defense penalized per each attacking monster more than vit_penalty_count
+vit_penalty_num: 5
+
+// Use alternate method of DEF calculation for physical attacks.
+// With 0, disabled (use normal def% reduction with further def2 reduction)
+// At 1 or more defense is subtraction of (DEF* value).
+// eg: 10 + 50 def becomes 0 + (10*type + 50)
+weapon_defense_type: 0
+
+// MDEF, same as above....(MDEF*value)
+magic_defense_type: 0
+
+// Change attacker's direction to face opponent on every attack? (Note 3)
+// NOTE: On official servers knockback of some skills like Firewall is always based on the
+// last direction walked. Even when attacking in a completely different direction, the
+// knockback direction won't change, so e.g. if you walk north and then attack an enemy to
+// the south you will still be knocked back to the south by Firewall. Immobile monsters
+// will always be knocked back to the south as their default direction is north.
+attack_direction_change: 0
+
+// For those who is set, their innate attack element is "not elemental"
+// (100% versus on all defense-elements) (Note 3)
+// NOTE: This is the setting that makes it so non-players can hit for full
+// damage against Ghost-type targets with normal attacks (eg: vs. Ghostring).
+attack_attr_none: 14
+
+// Rate at which equipment can break (base rate before it's modified by any skills)
+// 1 = 0.01% chance. Default for official servers: 0
+equip_natural_break_rate: 0
+
+// Overall rate of which your own equipment can break. (Note 2)
+// This rate affects penalty breaking rate of skills such as power-thrust and your natural breaking rate
+// (from equip_natural_break_rate). If a Sage's endow skill fails and this is above 0, the selected char's
+// weapon will be broken.
+equip_self_break_rate: 100
+
+// Overall rate at which you can break target's equipment. (Note 2)
+// This affects the behaviour of skills like acid terror and meltdown
+equip_skill_break_rate: 100
+
+// Do weapon attacks have a attack speed delay before actual damage is applied? (Note 1)
+// NOTE: The official setting is true, even thought it degrades performance a bit.
+delay_battle_damage: false
+
+// Are arrows/ammo consumed when used on a bow/gun?
+// 0 = No
+// 1 = Yes
+// 2 = Yes even for skills that do not specify arrow consumption when said
+// skill is weapon-based and used with ranged weapons (auto-guesses which
+// skills should consume ammo when it's acquired via a card or plagiarize)
+arrow_decrement: 1
+
+// Should the item script bonus 'Autospell' check for range/obstacles before casting?
+// Official behavior is false, setting this to true will make skills use their defined
+// range. For example, Sonic Blow requires a 2 cell distance before autocasting is allowed.
+// This setting also affects autospellwhenhit.
+autospell_check_range: false
+
+// If both the attacker and the target are on the same tile, should the target be knocked back to the left?
+// Official behavior is true, setting this to false will knock the target back behind the attacker.
+knockback_left: true
+
+// Should the target be able of dodging damage by snapping away to the edge of the screen?
+// Official behavior is false
+snap_dodge: false
diff --git a/conf/map/battle/battleground.conf b/conf/map/battle/battleground.conf
new file mode 100644
index 00000000..08c7fcd8
--- /dev/null
+++ b/conf/map/battle/battleground.conf
@@ -0,0 +1,40 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Battlegrounds) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//=========================================================================
+
+// Flee penalty on BG grounds.
+// NOTE: It's %, not absolute, so 20 is -20% of your total flee
+bg_flee_penalty: 20
+
+// Interval before updating the bg-member map mini-dots (milliseconds)
+bg_update_interval: 1000
diff --git a/conf/map/battle/client.conf b/conf/map/battle/client.conf
new file mode 100644
index 00000000..0422cfcf
--- /dev/null
+++ b/conf/map/battle/client.conf
@@ -0,0 +1,240 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Client) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//=========================================================================
+
+// Whether to enable the official packet obfuscation support (good vs WPE)
+// 0: disabled
+// 1: optional (not recommended) -- identifies whether it is required
+// 2: enabled (recommended)
+packet_obfuscation: 0
+
+// Minimum delay between whisper/global/party/guild messages (in ms)
+// Messages that break this threshold are silently omitted.
+min_chat_delay: 20
+
+// Valid range of dyes and styles on the client.
+min_hair_style: 0
+max_hair_style: 29
+min_hair_color: 0
+max_hair_color: 20
+min_cloth_color: 0
+max_cloth_color: 4
+min_body_style: 0
+max_body_style: 4
+
+// When set to true, the damage field in packets sent from woe maps will be set
+// to -1, making it impossible for GMs, Bots and Hexed clients to know the
+// actual damage caused by attacks. (Note 1)
+hide_woe_damage: true
+
+// "hair style" number that identifies pet.
+// NOTE: The client uses the "hair style" field in the mob packet to tell them apart from mobs.
+// This value is always higher than the max hair-style available in said client.
+// Known values to work (all 2005 clients):
+// older sakexes: 20
+// sakexe 0614: 24
+// sakexe 0628 (and later): 100
+pet_hair_style: 100
+
+// Visible area size (how many squares away from a player can they see)
+area_size: 15
+
+// Chat area size (how many squares away from a player can they chat)
+chat_area_size: 15
+
+// Area which monster death packets should be sent to.
+// This should be set to the farthest distance a player can reach in 250ms
+// after a monster dies.
+// Setting it to (area_size + 18) (18 being the range of Monk's Snap skill)
+// should be a great value
+dead_area_size: 32
+
+// Maximum walk path (how many cells a player can walk going to cursor)
+// default: 17(official)
+max_walk_path: 17
+
+// Maximum allowed 'level' value that can be sent in unit packets.
+// Use together with the aura_lv setting to tell when exactly to show the aura.
+// NOTE: You also need to adjust the client if you want this to work.
+// NOTE: Default is 99. Values above 127 will probably behave incorrectly.
+// NOTE: If you don't know what this does, don't change it!!!
+max_lv: 99
+
+// Level required to display an aura.
+// NOTE: This assumes that sending max_lv to the client will display the aura.
+// NOTE: aura_lv must not be less than max_lv.
+// Example: If max_lv is 99 and aura_lv is 150, characters with level 99~149
+// will be sent as being all level 98, and only characters with level
+// 150 or more will be reported as having level 99 and show an aura.
+aura_lv: 99
+
+// Units types affected by max_lv and aura_lv settings. (Note 3)
+// Note: If an unit type, which normally does not show an aura, is
+// set it will obtain an aura when it meets the level requirement.
+// Default: 0 (none)
+client_limit_unit_lv: 0
+
+// Will tuxedo and wedding dresses be shown when worn? (Note 1)
+wedding_modifydisplay: false
+
+// Save Clothes color. (This will degrade performance) (Note 1)
+save_clothcolor: true
+
+// Save body styles? (Note 1)
+save_body_style: false
+
+// Do not display cloth colors for the wedding costume?
+// Note: Both save_clothcolor and wedding_modifydisplay have to be enabled
+// for this option to take effect. Set this to true if your cloth palettes
+// pack doesn't has wedding palettes (or has less than the other jobs)
+wedding_ignorepalette: false
+
+// Do not display cloth colors for the Xmas costume?
+// Set this to true if your cloth palettes pack doesn't has Xmas palettes (or has less than the other jobs)
+xmas_ignorepalette: false
+
+// Do not display cloth colors for the Summer costume?
+// Set this to true if your cloth palettes pack doesn't has Summer palettes (or has less than the other jobs)
+summer_ignorepalette: false
+
+// Do not display cloth colors for the Hanbok costume?
+// Set this to true if your cloth palettes pack doesn't has Hanbok palettes (or has less than the other jobs)
+hanbok_ignorepalette: false
+
+// Do not display cloth colors for the Oktoberfest costume?
+// Set this to true if your cloth palettes pack doesn't has Oktoberfest palettes (or has less than the other jobs)
+oktoberfest_ignorepalette: false
+
+// Do not display cloth colors for the Summer 2 costume?
+// Set this to true if your cloth palettes pack doesn't has Summer 2 palettes (or has less than the other jobs)
+summer2_ignorepalette: false
+
+// Show Hercules version to users when the login?
+display_version: false
+
+// When affected with the "Hallucination" status effect, send the effect to client? (Note 1)
+// Note: Set to false if the client lags due to the "Wavy" screen effect.
+display_hallucination: true
+
+// Set this to 1 if your client supports status change timers and you want to use them
+// Clients from 2009 onward support this
+display_status_timers: true
+
+// Randomizes the dice emoticon server-side, to prevent clients from forging
+// packets for the desired number. (Note 1)
+client_reshuffle_dice: true
+
+// Sorts the character and guild storage before it is sent to the client.
+// Official servers do not sort storage. (Note 1)
+// NOTE: Enabling this option degrades performance.
+client_sort_storage: false
+
+// Duration of client's self mute in minutes.
+// Note: Do not enable this, if you enabled commands for players,
+// because the client sees multiple commands in succession as spam.
+// Default: 0 (means disabled)
+client_accept_chatdori: 0
+
+// Limits use of blank (transparent) pixels in guild emblems to a set
+// percentage of the total.
+// Official servers do not enforce this technically to date, but some disallow
+// use of blank emblems in their rules. (Note 2)
+// A value of 100 (allowing 100% blank pixels) disables this check.
+// NOTE: Enabling this option slightly degrades performance.
+client_emblem_max_blank_percent: 100
+
+// Show the MVP EXP reward message for clients 2013-12-23cRagexe and newer? (Note 1)
+// kRO removed the packet and this re-enables the message.
+// Official: false.
+mvp_exp_reward_message: false
+
+// Displays the same HP value as official servers do when a character is dead.
+// (Note 1)
+// On official servers, HP are never displayed as 0, but when dead, they
+// display the value that will be shown after resurrection (50% HP for novice
+// classes, 1 HP for other classes). Athena servers, instead, show the real
+// value (0 when dead), to avoid confusion.
+// Note: this is only a visual setting, and the server will internally handle
+// it as 0 regardless of this. This means that scripts will know that the
+// character has 0 HP when dead.
+// Default: true (Official behavior)
+display_fake_hp_when_dead: false
+
+// Send ping timer
+// For clients 20190320 Re+
+// Interval in seconds for each timer invoke.
+ping_timer_inverval: 30
+
+// Send packets timeout in seconds before ping packet can be sent.
+// For clients 20190320 Re+
+ping_time: 20
+
+// Drop or not connection after client send disconnect request packet
+// Official is false
+drop_connection_on_quit: true
+
+// When to display the rate modifier messages?
+// 0x0 - Never display rate modifier messages.
+// 0x1 - Display rate modifier messages upon login.
+// 0x2 - Display rate modifier messages upon map change.
+// 0x4 - Display rate modifier messages upon teleporting (regardless of changing maps).
+// Default: 0x1 (Official behavior.)
+display_rate_messages: 0x1
+
+// When to display the configuration messages and which? (Note 3)
+//
+// Flags for when to display the configuration messages:
+// 0x000 - Never display configuration messages.
+// 0x001 - Display configuration messages upon login. (Default. Should always be set.)
+// 0x002 - Display configuration messages upon map change.
+// 0x004 - Display configuration messages upon teleporting (regardless of changing maps).
+//
+// Flags for which configuration messages are displayed:
+// 0x010 - Character's party invitation state. (Default.)
+// 0x020 - Character's view equipment state. (Default.)
+// 0x040 - Character's Urgent Call state. (Default.)
+// 0x080 - Character's pet auto-feed state. (Default.)
+// 0x100 - Character's homunculus auto-feed state. (Default.)
+//
+// Default: 0x1F1 (Official behavior.)
+display_config_messages: 0x1F1
+
+// When to display the overweight messages?
+// 0x0 - Never display overweight messages.
+// 0x1 - Display overweight messages upon login. (Default.)
+// 0x2 - Display overweight messages upon map change. (Default.)
+// Default: 0x3 (Official behavior.)
+display_overweight_messages: 0x3
+
+// Show tip of the day window upon login?
+show_tip_window: false
diff --git a/conf/map/battle/drops.conf b/conf/map/battle/drops.conf
new file mode 100644
index 00000000..10d78ffe
--- /dev/null
+++ b/conf/map/battle/drops.conf
@@ -0,0 +1,157 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Drops) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+//=========================================================================
+
+// If an item is dropped, does it go straight into the users inventory? (Note 1)
+item_auto_get: false
+
+// How long does it take for an item to disappear from the floor after it is dropped? (in milliseconds)
+flooritem_lifetime: 120000
+
+// Grace time during which only the person who did the most damage to a monster can get the item? (in milliseconds)
+item_first_get_time: 15000
+
+// Grace time during which only the first and second person who did the most damage to a monster can get the item? (in milliseconds)
+// (Takes effect after item_first_get_time elapses)
+item_second_get_time: 10000
+
+// Grace time during which only the first, second and third person who did the most damage to a monster can get the item? (in milliseconds)
+// (Takes effect after the item_second_get_time elapses)
+item_third_get_time: 5000
+
+// Grace time to apply to MvP reward items when the Most Valuable Player can't get the prize item and it drops on the ground? (in milliseconds)
+mvp_item_first_get_time: 10000
+
+// Grace time for the first and second MvP so they can get the item? (in milliseconds)
+// (Takes effect after mvp_item_first_get_time elapses)
+mvp_item_second_get_time: 10000
+
+// Grace time for the first, second and third MvP so they can get the item? (in milliseconds)
+// (Takes effect after mvp_item_second_get_time elapses)
+mvp_item_third_get_time: 2000
+
+// Item drop rates (Note 2)
+
+// The rate the common items are dropped (Items that are in the ETC tab, besides card)
+item_rate_common: 100
+item_rate_common_boss: 100
+item_drop_common_min: 1
+item_drop_common_max: 10000
+
+// The rate healing items are dropped (items that restore HP or SP)
+item_rate_heal: 100
+item_rate_heal_boss: 100
+item_drop_heal_min: 1
+item_drop_heal_max: 10000
+
+// The rate at which usable items (in the item tab) other then healing items are dropped.
+item_rate_use: 100
+item_rate_use_boss: 100
+item_drop_use_min: 1
+item_drop_use_max: 10000
+
+// The rate at which equipment is dropped.
+item_rate_equip: 100
+item_rate_equip_boss: 100
+item_drop_equip_min: 1
+item_drop_equip_max: 10000
+
+// The rate at which cards are dropped
+item_rate_card: 100
+item_rate_card_boss: 100
+item_drop_card_min: 1
+item_drop_card_max: 10000
+
+// The rate adjustment for the MVP items that the MVP gets directly in their inventory
+item_rate_mvp: 100
+item_drop_mvp_min: 1
+item_drop_mvp_max: 10000
+
+// The rate adjustment for card-granted item drops.
+item_rate_adddrop: 100
+item_drop_add_min: 1
+item_drop_add_max: 10000
+
+// Rate adjustment for Treasure Box drops (these override all other modifiers)
+item_rate_treasure: 100
+item_drop_treasure_min: 1
+item_drop_treasure_max: 10000
+
+// Use logarithmic drops? (Note 1)
+// Logarithmic drops scale drop rates in a non-linear fashion using the equation
+// Droprate(x,y) = x * (5 - log(x)) ^ (ln(y) / ln(5))
+// Where x is the original drop rate and y is the drop_rate modifier (the previously mentioned item_rate* variables)
+// Use the following table for an idea of how the rate will affect drop rates when logarithmic drops are used:
+// Y: Original Drop Rate
+// X: Rate drop modifier (eg: item_rate_equip)
+// X\Y | 0.01 0.02 0.05 0.10 0.20 0.50 1.00 2.00 5.00 10.00 20.00
+// -----+---------------------------------------------------------------
+// 50 | 0.01 0.01 0.03 0.06 0.11 0.30 0.62 1.30 3.49 7.42 15.92
+// 100 | 0.01 0.02 0.05 0.10 0.20 0.50 1.00 2.00 5.00 10.00 20.00
+// 200 | 0.02 0.04 0.09 0.18 0.35 0.84 1.61 3.07 7.16 13.48 25.13
+// 500 | 0.05 0.09 0.22 0.40 0.74 1.65 3.00 5.40 11.51 20.00 33.98
+// 1000 | 0.10 0.18 0.40 0.73 1.30 2.76 4.82 8.28 16.47 26.96 42.69
+// 2000 | 0.20 0.36 0.76 1.32 2.28 4.62 7.73 12.70 23.58 36.33 53.64
+// 5000 | 0.50 0.86 1.73 2.91 4.81 9.11 14.45 22.34 37.90 53.91 72.53
+//10000 | 1.00 1.67 3.25 5.28 8.44 15.24 23.19 34.26 54.57 72.67 91.13
+//20000 | 2.00 3.26 6.09 9.59 14.83 25.49 37.21 52.55 77.70 97.95 100%
+//50000 | 5.00 7.87 13.98 21.12 31.23 50.31 69.56 92.48 100% 100% 100%
+item_logarithmic_drops: false
+
+// Can the monster's drop rate become 0? (Note 1)
+// Default: false (as in official servers).
+drop_rate0item: false
+
+// Makes your LUK value affect drop rates on an absolute basis.
+// Setting to 100 means each luk adds 0.01% chance to find items
+// (regardless of item's base drop rate).
+drops_by_luk: 0
+
+// Makes your LUK value affect drop rates on a relative basis.
+// Setting to 100 means each luk adds 1% chance to find items
+// (So at 100 luk, everything will have double chance of dropping).
+drops_by_luk2: 0
+
+// Whether or not Marine Spheres and Floras summoned by Alchemist drop items?
+// This setting has three available values:
+// 0: Nothing drops.
+// 1: Only marine spheres drop items.
+// 2: All alchemist summons drop items.
+alchemist_summon_reward: 1
+
+// The maximum number of full iterations that server can do when dropping an item with options.
+// When picking random options for a dropped item, it does lots of iterations to choose the option to be set,
+// this value limits the number of iterations to avoid making the server hang in a long loop.
+option_drop_max_loop: 10
+
+// Does autoloot take into account player bonuses and penalties? (Note 1)
+// If RENEWAL_DROP, Bubble Gum, or any other modifiers are active autoloot will take them into account.
+autoloot_adjust: false
diff --git a/conf/map/battle/exp.conf b/conf/map/battle/exp.conf
new file mode 100644
index 00000000..5db2cfb4
--- /dev/null
+++ b/conf/map/battle/exp.conf
@@ -0,0 +1,114 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Experience) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: The max level of classes is stored in the exp table.
+// See files db/exp.txt and db/exp2.txt to change them.
+//=========================================================================
+
+// Rate at which exp. is given. (Note 2)
+base_exp_rate: 100
+
+// Rate at which job exp. is given. (Note 2)
+job_exp_rate: 100
+
+// Turn this on to allow a player to level up more than once from a kill. (Note 1)
+multi_level_up: true
+
+// Setting this can cap the max experience one can get per kill specified as a
+// % of the current exp bar. (Every 10 = 1.0%)
+// For example, set it to 500 and no matter how much exp the mob gives,
+// it can never give you above half of your current exp bar.
+max_exp_gain_rate: 0
+
+// Method of calculating earned experience when defeating a monster:
+// 0 = uses damage given / total damage as damage ratio
+// 1 = uses damage given / max_hp as damage ratio
+// NOTE: Using type 1 disables the bonus where the first attacker gets
+// his share of the exp doubled when multiple people attack the mob.
+exp_calc_type: 0
+
+// Experience increase per attacker. That is, every additional attacker to the
+// monster makes it give this much more experience
+// (eg: 5 people attack with 25 here, +(25*4)% -> +100% exp)
+exp_bonus_attacker: 30
+
+// Max number of attackers at which exp bonus is capped
+// (eg: if set at 5, the max bonus is 4*bonus-per-char regardless of attackers)
+exp_bonus_max_attacker: 10
+
+// MVP bonus exp rate. (Note 2)
+mvp_exp_rate: 100
+
+// Rate of base/job exp given by NPCs. (Note 2)
+quest_exp_rate: 100
+
+// The rate of job exp. from using Heal skill (100 is the same as the heal amount, 200 is double.
+// The balance of the exp. rate is best used with 5 to 10)
+heal_exp: 0
+
+// The rate of exp. that is gained by the process of resurrection, a unit is 0.01%.
+// Experience calculations for the experience value * level difference of the person revived / 100 * resurrection_exp/10000 which the revived player has can be got.
+resurrection_exp: 0
+
+// The rate of job exp. when using discount and overcharge on an NPC
+// (in 0.01% increments - 100 is 1%, 10000 is normal, 20000 is double.)
+// The way it is calculated is (money received * skill lv) * shop_exp / 10000.
+shop_exp: 0
+
+// PVP exp. Do players get exp in PvP maps
+// (Note: NOT exp from players, but from normal leveling)
+pvp_exp: true
+
+// When a player dies, how should we penalize them?
+// 0 = No penalty.
+// 1 = Lose % of current level when killed.
+// 2 = Lose % of total experience when killed.
+death_penalty_type: 0
+
+// Base exp. penalty rate (Each 100 is 1% of their exp)
+death_penalty_base: 100
+
+// Job exp. penalty rate (Each 100 is 1% of their exp)
+death_penalty_job: 100
+
+// When a player dies (to another player), how much zeny should we penalize them with?
+// NOTE: It is a percentage of their zeny, so 100 = 1%
+zeny_penalty: 0
+
+// Will display experience gained from killing a monster. (Note 1)
+disp_experience: false
+
+// Will display zeny earned (from mobs, trades, etc) (Note 1)
+disp_zeny: false
+
+// Use the contents of db/statpoint.txt when doing a stats reset and leveling up? (Note 1)
+// If false, an equation will be used which preserves statpoints earned/lost
+// through external means (ie: stat point buyers/sellers)
+use_statpoint_table: true
diff --git a/conf/map/battle/feature.conf b/conf/map/battle/feature.conf
new file mode 100644
index 00000000..ea0a5e54
--- /dev/null
+++ b/conf/map/battle/feature.conf
@@ -0,0 +1,101 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Feature) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+//=========================================================================
+
+features: {
+ // Buying store (Note 1)
+ // Requires: 2010-04-27aRagexeRE or later
+ buying_store: false
+
+ // Search stores (Note 1)
+ // Requires: 2010-08-03aRagexeRE or later
+ search_stores: false
+
+ // Atcommand suggestions (Note 1)
+ // If one type incomplete atcommand, it will suggest the complete ones.
+ atcommand_suggestions: false
+
+ // Banking (Note 1)
+ // Requires: 2013-07-24aRagexe or later
+ banking: true
+
+ // Auction (Note 1)
+ // Feature became unstable on clients 2012 onwards (exact date not known),
+ // it has been fixed on clients 2013-05-15 onwards however.
+ auction: false
+
+ // Roulette (Note 1)
+ // Requires: 2014-10-22bRagexe or later
+ // Disabled by default while test version is out; enable at your own risk -- the mean dev.
+ roulette: false
+
+ // Enabled RoDEX (Note 1)
+ // Requires: 2015-05-13aRagexe or later
+ rodex: true
+
+ // Allow usage of "Account Mail" box in RoDEX?
+ // Requires: 2016-03-16aRagexeRE or later
+ // This is disabled in client-side in some client versions
+ // Disabled by default
+ rodex_use_accountmail: false
+
+ // Allow Homunculus autofeeding
+ // true: enable (Default)
+ // false: disable
+ enable_homun_autofeed: true
+
+ // Allow Pet autofeeding
+ // true: enable (Default)
+ // false: disable
+ enable_pet_autofeed: true
+
+ // Enable Attendance System for clients >= 2018-03-07bRagexeRE or 2018-04-04bRagexe or 2018-04-11aRagexe_zero
+ // true: enable (Default)
+ // false: disable
+ enable_attendance_system: false
+
+ // Attendance End time in the format YearMonthDay
+ feature_attendance_endtime: 20180331
+
+ // Enable Achievement System
+ // true: enable (Default)
+ // false: disable
+ enable_achievement_system: false
+
+ // Enable Refinery UI (requires 2016-10-05Ragexe/RE)
+ // true: enable (Default)
+ // false: disable
+ enable_refinery_ui: false
+
+ // Replace Refine NPCs with Refinery UI
+ // true: enable
+ // false: disable (default)
+ replace_refine_npcs: false
+}
diff --git a/conf/map/battle/gm.conf b/conf/map/battle/gm.conf
new file mode 100644
index 00000000..2155940e
--- /dev/null
+++ b/conf/map/battle/gm.conf
@@ -0,0 +1,66 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (GM) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+//=========================================================================
+
+// The maximum quantity of monsters that can be summoned per GM command (0 denotes an unlimited quantity)
+atcommand_spawn_quantity_limit: 100
+
+// Maximum number of slave-clones that can be have by using the @slaveclone at command. (0 denotes unlimited quantity)
+atcommand_slave_clone_limit: 25
+
+// If false, commands require exact player name. If true, entering a partial
+// name will work, as long as there's only one match from all players in the
+// current map server.
+partial_name_scan: false
+
+// (@) @allstats/@str/@agi/@vit/@int/@dex/@luk
+// allow gms to bypass the maximum stat parameter? ( if true gm stats can go up to 32k )
+// default: false
+atcommand_max_stat_bypass: false
+
+// Ban people that try trade dupe.
+// Duration of the ban, in minutes (default: 5). To disable the ban, set 0.
+ban_hack_trade: 0
+
+// requires RENEWAL_DROP to be enabled (src/map/config/renewal.h)
+// modifies @mobinfo to display the users' real drop rate as per renewal_drop formula
+// modifies @iteminfo to not display the minimum item drop rate (since it can't tell the mob level)
+atcommand_mobinfo_type: 0
+
+// Ignore warpable area configuration.
+// Set the minimum group id to ignore invalid cells when warping.
+// Default group is 2. Use 100 to disable this setting.
+gm_ignore_warpable_area: 20
+
+// Should atcommands trigger level up events for NPCs? (Note 1)
+// This option is for @baselevelup and @joblevelup
+// Default: false
+atcommand_levelup_events: false
diff --git a/conf/map/battle/guild.conf b/conf/map/battle/guild.conf
new file mode 100644
index 00000000..bd26b667
--- /dev/null
+++ b/conf/map/battle/guild.conf
@@ -0,0 +1,73 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Guild) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+//=========================================================================
+
+// When making a guild, an Emperium is consumed? (Note 1)
+guild_emperium_check: false
+
+// Maximum tax limit on a guild member.
+guild_exp_limit: 50
+
+// Maximum castles one guild can own (0 = unlimited)
+guild_max_castles: 0
+
+// How guild skills cooldown works?
+// 0 - you relog with the same cooldown remaining as from when you logged out
+// 1 - restarts the cooldown upon login to its full duration.
+// 2 - like 1, but your logged off time is also decreased from the remaining cooldown (Aegis)
+guild_skill_relog_delay: 2
+
+// Flee penalty on gvg grounds. Official value is 20 (Note 2)
+// NOTE: It's %, not absolute, so 20 is -20% of your total flee
+gvg_flee_penalty: 20
+
+// Can the 'Glory of Guild' skill be learnt in the Guild window,
+// and does changing emblems require it? (Note 1)
+// P.S: This skill is not implemented on official servers
+require_glory_guild: false
+
+// Limit Guild alliances. Value is 0 to 3.
+// If you want to change this value, clear the guild alliance table.
+// Default is 3
+max_guild_alliance: 3
+
+// When to display the guild notice?
+// 0x0 - Never display guild notice.
+// 0x1 - Display guild notice upon login.
+// 0x2 - Display guild notice upon map change.
+// 0x4 - Display guild notice upon teleporting (regardless of changing maps).
+// Default: 0x7 (Official behavior.)
+guild_notice_changemap: 0x1
+
+// Can guild members invite/expel members inside guild castles in WoE/GvG? (Note 1)
+// default: false
+guild_castle_invite: false
+guild_castle_expulsion: false
diff --git a/conf/map/battle/homunc.conf b/conf/map/battle/homunc.conf
new file mode 100644
index 00000000..f2ed4d8d
--- /dev/null
+++ b/conf/map/battle/homunc.conf
@@ -0,0 +1,71 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Homunculus) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//=========================================================================
+
+// Homunculus setting (Note 3)
+// Activates various 'quirks' that makes them behave unlike normal characters.
+// 0x001: Can't be targetted by support skills (except for their master)
+// 0x004: Mobs will always go after them instead of players until attacked
+// 0x008: Copy their master's speed on spawn/map-change
+// 0x010: They display luk/3+1 instead of their actual critical in the
+// stat window (by default they don't crit)
+// 0x020: Their Min-Matk is always the same as their max
+// 0x040: Skill re-use delay is reset when they are vaporized.
+hom_setting: 0x1D
+
+// The rate a homunculus will get friendly by feeding it. (Note 2)
+homunculus_friendly_rate: 100
+
+// Can you name a homunculus more then once? (Note 1)
+hom_rename: false
+
+// Intimacy needed to use Evolved Vanilmirth's Bio Explosion
+hvan_explosion_intimate: 45000
+
+// Show stat growth to the owner when an Homunculus levels up
+homunculus_show_growth: true
+
+// Does autoloot work, when a monster is killed by homunculus only?
+homunculus_autoloot: true
+
+// Should homunculi Vaporize when Master dies?
+homunculus_auto_vapor: true
+
+// Max level for regular Homunculus
+homunculus_max_level: 99
+
+// Max level for Homunculus S
+homunculus_S_max_level: 150
+
+// Bonus EXP homunculus received from master? (Note 2)
+hom_bonus_exp_from_master: 10
diff --git a/conf/map/battle/items.conf b/conf/map/battle/items.conf
new file mode 100644
index 00000000..e2925a3d
--- /dev/null
+++ b/conf/map/battle/items.conf
@@ -0,0 +1,137 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Items) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//=========================================================================
+
+// The highest value at which an item can be sold via the merchant vend skill. (in zeny)
+vending_max_value: 1000000000
+
+// Whether to allow buying from vending chars that are at their max. zeny limit.
+// If set to true, the rest of the zeny above the char's capacity will disappear.
+vending_over_max: true
+
+// Tax to apply to all vending transactions (eg: 10000 = 100%, 50 = 0.50%)
+// When a tax is applied, the item's full price is charged to the buyer, but
+// the vender will not get the whole price paid (they get 100% - this tax).
+vending_tax: 200
+
+// Show the buyer's name when successfully vended an item
+buyer_name: true
+
+// Forging success rate. (Note 2)
+weapon_produce_rate: 100
+
+// Prepare Potion success rate. (Note 2)
+potion_produce_rate: 100
+
+// Do produced items have the maker's name on them? (Note 3)
+// 0x01: Produced Weapons
+// 0x02: Produced Potions
+// 0x04: Produced Arrows
+// 0x08: Produced Holy Water/Ancilla
+// 0x10: Produced Deadly Potions
+// 0x80: Other produced items.
+produce_item_name_input: 0x03
+
+// Is a monster summoned via dead branch aggressive? (Note 1)
+dead_branch_active: true
+
+// Should summoned monsters check the player's base level? (dead branches) (Note 1)
+// On officials this is false - monsters summoned from dead/bloody branches can be ANY level.
+// Change to true to only summon monsters less than or equal to the player's base level.
+random_monster_checklv: false
+
+// Can any player equip any item regardless of the gender restrictions
+// NOTE: Wedding Rings and Whips/Musical Instruments will check gender regardless of setting.
+ignore_items_gender: true
+
+// Item check? (Note 1)
+// On map change it will check for items not tagged as "available" and
+// auto-delete them from inventory/cart.
+// NOTE: An item is not available if it was not loaded from the item_db or you
+// specify it as unavailable in db/item_avail.txt
+item_check: false
+
+// How much time must pass between item uses?
+// Only affects the delay between using items, prevents healing item abuse. Recommended ~500 ms
+// On officials this is 0, but it's set to 100ms as a measure against bots/macros.
+item_use_interval: 100
+
+// Required level of bNoMagicDamage before Status Changes are blocked (Golden Thief Bug card).
+// For example, if left at 50. An item can give bNoMagicDamage,40;
+// which reduces magic damage by 40%, but does not blocks status changes.
+gtb_sc_immunity: 50
+
+// Enable autospell card effects to stack?
+// NOTE: Different cards that grant the same skill will both
+// always work independently of each other regardless of setting.
+autospell_stacking: false
+
+// Will disabled consumables (disabled by map_zone_db.conf) be consumed when trying to use them?
+// Default: true (official)
+item_restricted_consumption_type: false
+
+// Which item actions are allowed while interacting with NPC? (Note 3)
+// Script commands 'enable_items/disable_items' will not be overridden. (See doc/script_commands.txt.)
+// 0x0 (ITEMENABLEDNPC_NONE) - Don't allow any item actions.
+// 0x1 (ITEMENABLEDNPC_EQUIP) - Allow changing equipment.
+// 0x2 (ITEMENABLEDNPC_CONSUME) - Allow consuming usable items.
+// Official RE: 0x1 (Default value.)
+// Official Pre-RE: 0x3
+item_enabled_npc: 0x1
+
+// Unequip the equipments that has disabled by map_zone_db.conf ?
+// 0 : disabled equipments and cards are nullify (official)
+// 1 : disabled equipments are unequip, disabled cards are nullify
+// 2 : disabled equipments are nullify, disabled cards will caused the equipment to unequip
+// 3 : disabled equipments are unequip, disabled cards will caused the equipment to unequip (1+2)
+unequip_restricted_equipment: 0
+
+// When unequip a bow with arrow equipped, it also unequip the arrow?
+// Default: true (Official behavior, applies only in Renewal)
+bow_unequip_arrow: false
+
+// How much should rental mounts increase a player's movement speed? (Note 2)
+// Official: 25 (Default)
+boarding_halter_speed: 25
+
+// Allow to use items when the storage is open?
+// Official: false (Default)
+storage_use_item: false
+
+// Minimum item buy price at shop
+// Default: 1
+min_item_buy_price: 1
+
+// Minimum item sell price at shop
+// Default: 0
+min_item_sell_price: 0
diff --git a/conf/map/battle/limits.conf b/conf/map/battle/limits.conf
new file mode 100644
index 00000000..78498219
--- /dev/null
+++ b/conf/map/battle/limits.conf
@@ -0,0 +1,57 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Limits) Configuration File
+//=========================================================================
+
+// basic attack limits
+batk_min_limit: 0
+batk_max_limit: 65535
+
+// magic attack limits
+
+matk_min_limit: 0
+matk_max_limit: 65535
+
+// weapon attack limits
+watk_min_limit: 0
+watk_max_limit: 65535
+
+// flee limits
+flee_min_limit: 1
+flee_max_limit: 32767
+
+// flee2 limits
+flee2_min_limit: 10
+flee2_max_limit: 32767
+
+// critical attack limits
+critical_min_limit: 10
+critical_max_limit: 32767
+
+// hit limits
+hit_min_limit: 1
+hit_max_limit: 32767
diff --git a/conf/map/battle/misc.conf b/conf/map/battle/misc.conf
new file mode 100644
index 00000000..4aa273f8
--- /dev/null
+++ b/conf/map/battle/misc.conf
@@ -0,0 +1,173 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Misc) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//=========================================================================
+
+// PK Server Mode.
+// Turns entire server pvp(excluding towns).
+// Experience loss is doubled if killed by another player.
+// When players hunt monsters over 20 levels higher, they will receive 15%
+// additional exp., and 25% chance of receiving more items.
+// There is a nopvp.txt for setting up maps not to have pk on in this mode.
+// Novices cannot be attacked and cannot attack.
+// Normal pvp counter and rank display are disabled as well.
+// Note: If pk_mode is set to 2 instead of 1, players will receive a
+// manner penalty of 5 each time they kill another player (see manner_system
+// config to adjust how this will affect players)
+pk_mode: 0
+
+// Manner/karma system configuration. Specifies how does negative manner
+// (red no chat bubble) affects players (add as needed):
+// 0: No penalties.
+// 1: Disables chatting (includes whispers, party/guild msgs, etc)
+// 2: Disables skill usage
+// 4: Disables commands usage
+// 8: Disables item usage/picking/dropping
+// 16: Disables room creation (chatrooms and vending shops)
+manner_system: 31
+
+// For PK Server Mode. Change this to define the minimum level players can start PK-ing
+pk_min_level: 55
+
+// For PK Server Mode. It specifies the maximum level difference between
+// players to let them attack each other. 0 disables said limit.
+pk_level_range: 0
+
+// Display skill usage in console? (for debug only) (default: false) (Note 3)
+skill_log: false
+
+// Display battle log? (for debug only) (default: false) (Note 1)
+battle_log: false
+
+// Display other stuff? (for debug only) (default: false) (Note 1)
+etc_log: false
+
+// Do you want to debug warp points? If set to true, warp points will appear as flags.(Note 1)
+// It will also run on start-up a warp-check to print out which warp points lead directly on
+// top of on-touch npcs (which can lead to infinite loopback warping situations)
+warp_point_debug: false
+
+// Choose if server begin with night (true) or day (false)
+night_at_start: false
+
+// Define duration in msec of the day (default: 7200000 = 2 hours)
+// Set to 0 to disable day cycle (but not @day GM command).
+// Except 0, minimum is 60000 (1 minute)
+day_duration: 0
+
+// Define duration in msec of the night (default: 1800000 = 30 min)
+// Set to 0 to disable night cycle (but not @night GM command).
+// Except 0, minimum is 60000 (1 minute)
+night_duration: 0
+
+// Using duel on pvp-maps
+duel_allow_pvp: false
+
+// Using duel on gvg-maps
+duel_allow_gvg: false
+
+// Allow using teleport/warp when dueling
+duel_allow_teleport: false
+
+// Autoleave duel when die
+duel_autoleave_when_die: true
+
+// Delay between using @duel in seconds
+duel_time_interval: 60
+
+// Restrict duel usage to same map
+duel_only_on_same_map: false
+
+// Determines max number of characters that can stack within a single cell.
+// Official - Only affects the walking routines of characters, including monsters.
+// If a unit stops walking and is on a cell with more than stack limit
+// characters on it, it will walk to the closest free cell.
+// Custom - This variation will make every full cell to be considered a wall.
+// NOTE: For this setting to take effect you have to use a server compiled
+// with Cell Stack Limit support (see src/map/map.h)
+official_cell_stack_limit: 0
+custom_cell_stack_limit: 1
+
+// If false while walking not check occupied cells
+// If true while walking check occupied cells
+check_occupied_cells: false
+
+// Allow autotrade only in map with autotrade flag?
+// Set this to "false" will allow autotrade where no "autotrade" mapflag is set
+// Set this to "true" to only allow autotrade on maps with "autotrade" mapflag
+at_mapflag: false
+
+// Set this to the amount of minutes autotrade chars will be kicked from the server.
+at_timeout: 0
+
+// Auction system, fee per hour. Default is 12000
+auction_feeperhour: 12000
+
+// Auction maximum sell price
+auction_maximumprice: 500000000
+
+// Minimum delay between each store search query in seconds.
+searchstore_querydelay: 10
+
+// Maximum amount of results a store search query may yield, before
+// it is canceled.
+searchstore_maxresults: 30
+
+// Whether or not gaining and loosing of cash points is displayed (Note 1).
+// Default: false
+cashshop_show_points: false
+
+// Whether or not mail box status is displayed upon login.
+// Default: 0
+// 0 = No
+// 1 = Yes
+// 2 = Yes, when there are unread mails
+mail_show_status: 0
+
+// Is monster transformation disabled during Guild Wars?
+// If set to true, monster transforming is automatically removed/disabled when entering castles during WoE times
+mon_trans_disable_in_gvg: false
+
+// Whether AegisName and SpriteName lookups are case sensitive
+// Default: true (as in official servers)
+// When this is set to true, item and monster lookups through atcommands and
+// script commands will match AegisNames and SpriteNames only when the case
+// matches. Display name lookups are not affected by this setting.
+// Example: Given the two items:
+// - { Id: 553, AegisName: "Bun", Name: "Bao" }
+// - { Id: 6115, AegisName: "Bun_", Name: "Bun" }
+// query when true when false
+// @item bun # 6115 # 553
+// @item Bun # 553 # 553
+// @item Bao # 553 # 553
+// @item Bun_ # 6115 # 6115
+case_sensitive_aegisnames: true
diff --git a/conf/map/battle/monster.conf b/conf/map/battle/monster.conf
new file mode 100644
index 00000000..871bcba7
--- /dev/null
+++ b/conf/map/battle/monster.conf
@@ -0,0 +1,276 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Monster) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//=========================================================================
+
+// The HP rate of MVPs. (Note 2)
+mvp_hp_rate: 100
+
+// The HP rate of normal monsters (that is monsters that are not MVP's) (Note 2)
+monster_hp_rate: 100
+
+// The maximum attack speed of a monster
+monster_max_aspd: 199
+
+// Defines various mob AI related settings. (Note 3)
+// 0x001: When enabled mobs will update their target cell every few iterations
+// (normally they never update their target cell until they reach it while
+// chasing)
+// 0x002: Makes mob use their "rude attack" skill (usually warping away) if they
+// are attacked and they can't attack back regardless of how they were
+// attacked (eg: GrimTooth), otherwise, their rude attack" is only activated
+// if they can't melee reach the target (eg: sniping)
+// 0x004: If not set, mobs that can change target only do so when melee attacked
+// (distance player/mob < 3), otherwise mobs may change target and chase
+// ranged attackers. This flag also overrides the 'provoke' target.
+// 0x008: When set, mobs scatter as soon as they lose their target. Use this mode
+// to make it much harder to mob-train by hiding and collecting them on a
+// single spot (ie: GrimTooth training)
+// 0x010: If set, mob skills defined for friends will also trigger on themselves.
+// 0x020: When set, the monster ai is executed for all monsters in maps that
+// have players on them, instead of only for mobs who are in the vicinity
+// of players.
+// 0x040: When set, when the mob's target changes map, the mob will walk towards
+// any npc-warps in it's sight of view (use with mob_warp below)
+// 0x100: When set, a mob will pick a random skill from it's list and start from
+// that instead of checking skills in orders (when unset, if a mob has too
+// many skills, the ones near the end will rarely get selected)
+// 0x200: When set, a mob's skill re-use delay will not be applied to all entries of
+// the same skill, instead, only to that particular entry (eg: Mob has heal
+// on six lines in the mob_skill_db, only the entry that is actually used
+// will receive the delay). This will make monsters harder, especially MvPs.
+// 0x400: Set this to make mobs have a range of 9 for all skills. Otherwise, they
+// will obey the normal skill range rules.
+// Example: 0x140 -> Chase players through warps + use skills in random order.
+monster_ai: 0x001
+
+// How often should a monster rethink its chase?
+// 0: Every 100ms (MIN_MOBTHINKTIME)
+// 1: Every cell moved
+// 2: Every 2 cells moved
+// 3: Every 3 cells moved (official)
+// x: Every x cells moved
+// Regardless of this setting, a monster will always rethink its chase if it has
+// reached its target. Increase this value if you want to make monsters continue
+// moving after they lost their target (hide, no line of sight, etc.).
+monster_chase_refresh: 2
+
+// Should mobs be able to be warped (add as needed)?
+// 0: Disable.
+// 1: Enable mob-warping when standing on NPC-warps
+// 2: Enable mob-warping when standing on Priest Warp Portals
+// 4: Disable warping when the target map is a 'nobranch' map.
+mob_warp: 0
+
+// If these are set above 0, they define the time (in ms) during which monsters
+// will have their 'AI' active after all players have left their vicinity.
+mob_active_time: 0
+boss_active_time: 0
+
+// Mobs and Pets view-range adjustment (range2 column in the mob_db) (Note 2)
+view_range_rate: 100
+
+// Chase Range is the base minimum-chase that a mob gives before giving up
+// (as long as the target is outside their field of view). This is the range3
+// column in the mob_db. (Note 2)
+chase_range_rate: 100
+
+// Allow monsters to be aggresive and attack first? (Note 1)
+monster_active_enable: true
+
+// Should the mob_db names override the mob names specified in the spawn files?
+// 0: No
+// 1: always use the mob_db Name column (english mob name)
+// 2: always use the mob_db JName column (original Kro mob name)
+override_mob_names: 0
+
+// Monster damage delay rate (Note 2)
+// Setting to 0 is like they always have endure.
+monster_damage_delay_rate: 100
+
+// Looting monster actions.
+// 0 = Monster will consume the item.
+// 1 = Monster will not consume the item.
+monster_loot_type: 0
+
+// Chance of mob casting a skill (Note 2)
+// Higher rates lead to 100% mob skill usage with no/few normal attacks.
+// Set to 0 to disable mob skills.
+mob_skill_rate: 100
+
+// Mob skill delay adjust (Note 2)
+// After a mob has casted a skill, there is a delay before being able to
+// re-cast it. Note that skills with a delay of 0 can't be affected by this
+// setting.
+mob_skill_delay: 100
+
+// Rate of monsters on a map, 200 would be twice as many as normal. (Note 2)
+mob_count_rate: 100
+
+// Respawn rate of monsters on a map. 50 would make mobs respawn twice as fast (half delay time) (Note 2)
+// Note: This does not affects mobs with immediate respawn (most normal mobs)
+mob_spawn_delay: 100
+plant_spawn_delay: 100
+boss_spawn_delay: 100
+
+// Should mobs not spawn within the viewing range of players?
+// 0 is disabled, otherwise it is the number of retries before giving up
+// and spawning the mob within player-view anyway, unless the max (100) is used,
+// in which case the mob will not be spawned, and it'll be retried again in
+// 5 seconds.
+// NOTE: This has no effect on mobs that always spawn on the very same cell
+// (like ant eggs) except if you set it to the max.
+no_spawn_on_player: 0
+
+// Should spawn coordinates in the mob-spawn files be ignored? (Note 1)
+// If set to true, all monsters will have a random respawn spot across the whole
+// map regardless of what the mob-spawn file says.
+force_random_spawn: false
+
+// Do summon slaves inherit the passive/aggressive traits of their master?
+// 0: No, retain original mode.
+// 1: Slaves are always aggressive.
+// 2: Slaves are always passive.
+// 3: Same as master's aggressive/passive state.
+slaves_inherit_mode: 3
+
+// Do summon slaves have the same walking speed as their master?
+// NOTE: The default is 3 for official servers.
+// 0: Never.
+// 1: If the master can walk
+// 2: If the master can't walk (even motionless mobs have a speed
+// entry in their mob_db)
+// 3: Always
+slaves_inherit_speed: 0
+
+// Will summoned monsters (alchemists, or @summon'ed monsters) attack cause a
+// chance of triggering the master's autospell cards? (Note 1)
+summons_trigger_autospells: true
+
+// When a mob is attacked by another monster, will the mob retaliate against the master of said mob instead of the mob itself?
+// NOTE: Summoned mobs are both those acquired via @summon and summoned by Alchemists
+retaliate_to_master: true
+
+// Whether mobs should change target temporarily when a skill triggers a counter mob skill (Note 1)
+// eg: Mob attacks player B, and player A casts a skill C. If set to true and the
+// mob has a skill that is triggered by skill C, then A will be the target of
+// the skill, otherwise B will be targetted by the reaction skill.
+mob_changetarget_byskill: false
+
+// If monster's class is changed will it fully recover HP? (Note 1)
+monster_class_change_full_recover: true
+
+// Display some mob info next to their name? (add as needed)
+// (does not works on guardian or Emperium)
+// 1: Display mob HP (Hp/MaxHp format)
+// 2: Display mob HP (Percent of full life format)
+// 4: Display mob's level
+show_mob_info: 0
+
+// Zeny from mobs
+zeny_from_mobs: false
+
+// Monsters level up (monster will level up each time a player is killed and they will grow stronger)
+// Exp rate is calculated ((monster level-original monster level)*(exp*(mobs_level_up_exp rate/100)))
+// NOTE: Does not apply to WoE Guardians.
+mobs_level_up: false
+mobs_level_up_exp_rate: 1
+
+// Dynamic Mobs Options
+// Use dynamic mobs? (recommended for small-medium sized servers)
+dynamic_mobs: true
+
+// Remove Mobs even if they are hurt
+mob_remove_damaged: true
+
+// Delay before removing mobs from empty maps (default 5 min = 300 secs)
+mob_remove_delay: 300000
+
+// Defines on who the mob npc_event gets executed when a mob is killed.
+// Type 1: On the player that killed the mob (if killed by a non-player, resorts to type 0)
+// Type 0: On the player that did the most damage to the mob.
+// NOTE: This affects who gains the Castle when the Emperium is broken.
+mob_npc_event_type: 1
+
+// Time in milliseconds to activate protection against Kill Steal
+// Set to 0 to disable it.
+// If this is activated and a player is using @noks, damage from others players (KS) not in the party
+// will be reduced to 0.
+ksprotection: 1200
+
+// Should MVP slaves retain their target when summoned back to their master?
+mob_slave_keep_target: true
+
+// Whether or not to spawn the mvp tomb.
+// See http://irowiki.org/wiki/MVP#Gravestone
+mvp_tomb_enabled: true
+
+// Delay before a tomb is spawned, in milliseconds.
+// Default: 10000 (10 seconds)
+mvp_tomb_spawn_delay: 10000
+
+// Show hp bar on monsters? (Default: yes)
+// NOTE: only works on client 2012-04-04aRagexeRE onwards
+show_monster_hp_bar: true
+
+// Whether or not the size of specially summoned mobs influences experience, drop rates,
+// and stats. The rates will be doubled for large mobs, and halved for small ones.
+// This is only invoked under the 'monster' command, @monsterbig, and @monstersmall. (Note 1)
+// Default: false
+mob_size_influence: false
+
+// How should a monster be trapped by an icewall casted directly on it?
+// On official servers, monsters can only leave an icewall to the west and south. If their target is north or east of
+// them they will continously try to chase it but fail doing so. This brings them into a loop during which they will use
+// idle and chase skills. Boss monsters on the other hand will behave like a trapped monster, do not move and will use
+// idle and rudeattacked skills (when attacked).
+// 0: Monster won't be stuck in icewall at all.
+// 1: Monster will behave like a trapped monster.
+// 2-255: Number of loops a monster will go through the behavior described above before it frees itself from icewall.
+// NOTE: On some servers, normal monsters can free themselves after 15-35 second depending on their speed. On other
+// servers, they will be stuck inside icewall until it expires. Also, many official servers (e.g. iRO) have casting
+// icewall completely blocked on all maps that have boss monsters on them.
+// Default (least exploitable): mob - 75, boss - 0
+// Default (most official): mob - 220, boss - 1
+mob_icewall_walk_block: 220
+boss_icewall_walk_block: 1
+
+// Which level of of Vulture's Eye and Snake's Eye should monsters have learned?
+// Officially monsters don't have these skills learned, so their ranged skills
+// only have a range of 9. If you put a number higher than 0, their range will
+// be increased by that number.
+monster_eye_range_bonus: 0
+
+// Should slaves chase after what their master is chasing?
+// false: Don't chase after what master is chasing. (old behavior)
+// true: Chase after what master is chasing. (official, default)
+slave_chase_masters_chasetarget: true
diff --git a/conf/map/battle/party.conf b/conf/map/battle/party.conf
new file mode 100644
index 00000000..0886e72b
--- /dev/null
+++ b/conf/map/battle/party.conf
@@ -0,0 +1,110 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Party) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+//=========================================================================
+
+// If someone steals (gank/steal skills), show name in party? (Note 1)
+show_steal_in_same_party: false
+
+// Interval before updating the party-member map mini-dots (milliseconds)
+party_update_interval: 1000
+
+// Method used to update party-mate hp-bars:
+// 0: Aegis - bar is updated every time HP changes (bandwidth intensive)
+// 1: Athena - bar is updated with the party map dots (up to 1 second delay)
+party_hp_mode: 0
+
+// When changing party leader, should the new leader be in the same map
+// as the current leader. (Note 1)
+// true: Aegis - They must be in the same map
+// false: Athena - They can be in different maps
+party_change_leader_same_map: false
+
+// When 'Party Share' item sharing is enabled in a party,
+// announce in the party which party-member received the item and what's he received? (Note 1)
+show_party_share_picker: false
+
+// What types of items are going to be announced when 'show_party_share_picker' is active?
+// 1: IT_HEALING, 2: IT_UNKNOWN, 4: IT_USABLE, 8: IT_ETC,
+// 16: IT_WEAPON, 32: IT_ARMOR, 64: IT_CARD, 128: IT_PETEGG,
+// 256: IT_PETARMOR, 512: IT_UNKNOWN2, 1024: IT_AMMO, 2048: IT_DELAYCONSUME
+// 262144: IT_CASH
+// 112: Card + Armor (rings) + Weapon
+show_picker_item_type: 112
+
+// Method of distribution when item party share is enabled in a party:
+// 0: Normal (item goes to a random party member)
+// 1: Item Share is disabled for non-mob drops (player/pet drops)
+// 2: Round Robin (items are distributed evenly and in order among members)
+// 3: 1+2
+party_item_share_type: 0
+
+// Is exp/item sharing disabled for idle members in the party?
+// Set to 0, or the amount of seconds (NOT milliseconds) that need to pass before considering
+// a character idle.
+// Characters in a chat/vending are always considered idle.
+// A character's idle status is reset upon item use/skill use/attack (auto attack counts too)/movement.
+idle_no_share: 300
+
+// Give additional experience bonus per party-member involved on even-share parties (excluding yourself)?
+// ex. If set to 10, an even-share party of 5 people will receive +40% exp (4 members * 10% exp):
+// 140% party experience in total, so each member receives 140%/5 = 28% exp (instead of 20%).
+party_even_share_bonus: 5
+
+// Display party name regardless if player is in a guild.
+// Official servers do not display party name unless the user is in a guild. (Note 1)
+display_party_name: true
+
+// When and how to send the party options? (Note 3)
+//
+// Flags for when to display the party options:
+// 0x00000 - Never send party options.
+// 0x00001 - Send party options upon login. (Default. Should always be set.)
+// 0x00002 - Send party options upon map change.
+// 0x00004 - Send party options upon teleporting (regardless of changing maps).
+// 0x00008 - Send party options upon successfully changing options manually. (Default. Should always be set.)
+// 0x00010 - Send party options upon unsuccessfully changing options manually. (Tried to enable EXP sharing if not allowed.) (Default.)
+// 0x00020 - Send party options upon changing options automatically. (Default. Should always be set.)
+// 0x00040 - Send party options upon joining party. (Default. Should always be set.)
+// 0x00080 - Send party options upon leaving party. (Default.)
+//
+// Flags for how to send the party options:
+// 0x00100 - Send party options to all party members upon unsuccessfully changing options manually. (Tried to enable EXP sharing if not allowed.) (Default.)
+// 0x00200 - Send all party options upon login.
+// 0x00400 - Send all party options upon map change.
+// 0x00800 - Send all party options upon teleporting (regardless of changing maps).
+// 0x01000 - Send all party options upon successfully changing options manually. (Default.)
+// 0x02000 - Send all party options upon unsuccessfully changing options manually. (Tried to enable EXP sharing if not allowed.) (Default.)
+// 0x04000 - Send all party options upon changing options automatically.
+// 0x08000 - Send all party options upon joining party.
+// 0x10000 - Send all party options upon leaving party.
+//
+// Default: 0x31F9 (Official behavior.)
+send_party_options: 0x31F9
diff --git a/conf/map/battle/pet.conf b/conf/map/battle/pet.conf
new file mode 100644
index 00000000..e2bf9f66
--- /dev/null
+++ b/conf/map/battle/pet.conf
@@ -0,0 +1,107 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Pet) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//=========================================================================
+
+// Use the offical formula to calculate the pet catch rate? (Note 1)
+// Official formula:
+// CatchRate = CaptureRate * (100 - 100 * MonsterHP / MonsterMaxHP) / 100 + CaptureRate
+// Custum *Athena formula:
+// CatchRate = (CaptureRate + (CharacterBaseLevel - MonsterLevel) * 30 + CharacterLuk * 20) * (200 - 100 * MonsterHP / MonsterMaxHP) / 100
+// (CaptureRate is defined in db/(pre-)re/pet_db.conf.)
+pet_catch_rate_official_formula: true
+
+// Rate for catching pets (Note 2)
+pet_catch_rate: 100
+
+// Can you name a pet more then once? (Note 1)
+pet_rename: true
+
+// The rate a pet will get friendly by feeding it. (Note 2)
+pet_friendly_rate: 100
+
+// The rate at which a pet will become hungry. (Note 2)
+pet_hungry_delay_rate: 100
+
+// If your pet is hungry by how much will the friendlyness decrease by. (Default is 5)
+// Note: The friendlyness is 0-1000 total, at 0 the pet runs away.
+pet_hungry_friendly_decrease: 5
+
+// Does the pet need its equipment before it does its skill? (Note 1)
+pet_equip_required: true
+
+// When the master attacks a monster, whether or not the pet will also attack. (Note 1)
+pet_attack_support: false
+
+// When the master receives damage from the monster, whether or not the pet attacks back. (Note 1)
+pet_damage_support: false
+
+// Minimum intimacy necessary for a pet to support their master. Default is 900
+// (intimacy goes from 0 to 1000). At this minimum, support rate is 50% of pet's normal value.
+// At max (1000) support rate is 150%.
+pet_support_min_friendly: 900
+
+// Same as above, but this is to use the pet_script field with official pet abilities.
+pet_equip_min_friendly: 900
+
+// Whether or not the pet's will use skills. (Note 1)
+// Note: Offensive pet skills need at least pet_attack_support or
+// pet_damage_support to work (they trigger while the pet is attacking).
+pet_status_support: false
+
+// Rate at which a pet will support it's owner in battle. (Note 2)
+// Affects pet_attack_support & pet_damage_support.
+pet_support_rate: 100
+
+// Does the pets owner receive exp from the pets damage?
+pet_attack_exp_to_master: false
+
+// The rate exp. is gained from the pet attacking monsters
+pet_attack_exp_rate: 100
+
+// Pet leveling system. Use 0 to disable (default).
+// When enabled, a pet's level is a fixed % of the master's. (Note 2)
+// If 200%, pet has double level, if 50% pet has half your level, etc.
+pet_lv_rate: 0
+
+// When pet leveling is enabled, what is the max stats for pets?
+pet_max_stats: 99
+
+// When pet leveling is enabled, these are the imposed caps on
+// min/max damage. Note that these only cap atk1 and atk2, if you
+// enable pet_str, their max damage is then their base_atk + pet_max_atk2
+pet_max_atk1: 500
+pet_max_atk2: 1000
+
+// Should the pet immediately be removed when its intimacy drops to 0? (Note 1)
+// If set to false the pet will randomly walk around the map before being removed.
+pet_remove_immediately: true
diff --git a/conf/map/battle/player.conf b/conf/map/battle/player.conf
new file mode 100644
index 00000000..263d47a6
--- /dev/null
+++ b/conf/map/battle/player.conf
@@ -0,0 +1,235 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Player) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field.
+//=========================================================================
+
+// Players' maximum HP rate? (Default is 100)
+hp_rate: 100
+
+// Players' maximum SP rate? (Default is 100)
+sp_rate: 100
+
+// Whether or not cards and attributes of the left hand are applied to the right hand attack (Note 1)
+// (It is true on official servers)
+left_cardfix_to_right: true
+
+// The amount of HP a player will respawn with, 0 is default.
+// (Unit is in percentage of total HP, 100 is full heal of HP, 0 is respawn with 1HP total.)
+restart_hp_rate: 50
+
+// The amount of SP a player will respawn with, 0 is default.
+// (Unit is in percentage of total SP, 100 is full heal of SP, 0 is respawn with 1SP total.)
+restart_sp_rate: 0
+
+// Can a normal player by-pass the skill tree? (Note 1)
+player_skillfree: false
+
+// When set to true, forces skill points gained from 1st class to be put into 1st class
+// skills, and forces novice skill points to be put into the basic skill. (Note 1)
+player_skillup_limit: true
+
+// Quest skills can be learned? (Note 1)
+// Setting this to true can open an exploit on your server!
+quest_skill_learn: false
+
+// When skills are reset, quest skills are reset as well? (Note 1)
+// Setting this to true can open an exploit on your server!
+// NOTE: If you have quest_skill_learn set to true, quest skills are always reset.
+quest_skill_reset: false
+
+// You must have basic skills to be able to sit, trade, form a party or create a chatroom? (Note 1)
+basic_skill_check: true
+
+// When teleporting, or spawning to a map, how long before a monster sees you if you don't move? (time is in milliseconds)
+// That is, when you go to a map and don't move, how long before the monsters will notice you.
+// When moving, attacking or doing similar actions, the effect ends instantly.
+// Value is also affected by 'invincible_time_inc' mapflag
+player_invincible_time: 5000
+
+// When set to true, it prevent portal abuse for avoid hits. Official value is false.
+fix_warp_hit_delay_abuse: true
+
+// The time interval for HP to restore naturally. (in milliseconds)
+natural_healhp_interval: 6000
+
+// The time interval for SP to restore naturally. (in milliseconds)
+natural_healsp_interval: 8000
+
+// Automatic healing skill's time interval. (in milliseconds)
+natural_heal_skill_interval: 10000
+
+// The maximum weight for a character to carry when the character stops healing naturally. (in %)
+natural_heal_weight_rate: 50
+
+// Maximum atk speed. (Default 190, Highest allowed 199)
+max_aspd: 190
+
+// Same as max_aspd, but for 3rd classes. (Default 193, Highest allowed 199)
+max_third_aspd: 193
+
+// Maximum walk speed rate (200 would be capped to twice the normal speed)
+max_walk_speed: 300
+
+// Maximum HP. (Default is 1000000)
+max_hp: 1000000
+
+// Maximum SP. (Default is 1000000)
+max_sp: 1000000
+
+// Max limit of char stats. (agi, str, etc.)
+max_parameter: 100
+
+// Same as max_parameter, but for 3rd classes.
+max_third_parameter: 130
+
+// Same as max_parameter, but for extended classes (Ex. Super Novice, Kagero/Oboro, Rebellion).
+max_extended_parameter: 125
+
+// Same as max_parameter, but for summoner class
+max_summoner_parameter: 120
+
+// Same as max_parameter, but for baby classes.
+max_baby_parameter: 80
+
+// Same as max_parameter, but for baby 3rd's.
+max_baby_third_parameter: 117
+
+// Max armor def/mdef
+// NOTE: This setting have no effect if server is run on Renewal Mode (RENEWAL)
+// NOTE: does not affects skills and status effects like Mental Strength
+// If weapon_defense_type is non-zero, it won't apply to max def.
+// If magic_defense_type is non-zero, it won't apply to max mdef.
+max_def: 99
+
+// Def to Def2 conversion bonus. If the armor def/mdef exceeds max_def,
+// the remaining is converted to vit def/int mdef using this multiplier
+// (eg: if set to 10, every armor point above the max becomes 10 vit defense points)
+over_def_bonus: 0
+
+// Max weight carts can hold.
+max_cart_weight: 8000
+
+// Prevent logout of players after being hit for how long (in ms, 0 disables)?
+prevent_logout: 10000
+
+// When should the server prevent a player from logging out? Have no effect if prevent_logout is disabled. (Note 3)
+// Official servers prevent players from logging out after attacking, casting skills, and taking damage.
+// 0 = Players can always logout
+// 1 = Prevent logout on login
+// 2 = Prevent logout after attacking
+// 4 = Prevent logout after casting skill
+// 8 = Prevent logout after being hit
+prevent_logout_trigger: 14
+
+// Display the drained hp/sp values from normal attacks? (Ie: Hunter Fly card)
+show_hp_sp_drain: false
+
+// Display the gained hp/sp values from killing mobs? (Ie: Sky Deleter Card)
+show_hp_sp_gain: true
+
+// Show the critical bonus for katar class weapon in player status window? On
+// official server, the critical bonus from katar class weapon isn't display.
+// (Default: false)
+show_katar_crit_bonus: true
+
+// If set, when A accepts B as a friend, B will also be added to A's friend
+// list, otherwise, only A appears in B's friend list.
+// NOTE: this setting only enables friend auto-adding; auto-deletion does not work yet
+friend_auto_add: true
+
+// Are simultaneous trade/party/guild invite requests automatically rejected?
+invite_request_check: true
+
+// Players' will drop a 'Skull' when killed?
+// 0 = Disabled
+// 1 = Dropped only in PvP maps
+// 2 = Dropped in all situations
+bone_drop: 0
+
+// Do mounted (on Peco) characters increase their size
+// 0 = no
+// 1 = only Normal Classes on Peco have Big Size
+// 2 = only Baby Classes on Peco have Medium Size
+// 3 = both Normal Classes on Peco have Big Size
+// and Baby Classes on Peco have Medium Size
+character_size: 0
+
+// Idle characters can receive autoloot?
+// Set to the time in seconds where an idle character will stop receiving
+// items from Autoloot (0: disabled).
+idle_no_autoloot: 0
+
+// Minimum distance a vending/chat room must be from a NPC in order to be placed
+// Default: 3 (0: disabled).
+min_npc_vendchat_distance: 0
+
+// If min_npc_vendchat_distance is enabled,
+// can players vend/chat room nearby hidden npc? (Ie: FAKE_NPC/HIDDEN_WARP_NPC)
+vendchat_near_hiddennpc: false
+
+// Super Novice's fury is enabled to increments of 10%, such as at 10.0%, 20.0% - 80.0%, 90.0%
+// Changing snovice_call_type config to 1 enables its use at 0%, for maxed super novices.
+// default: 0
+snovice_call_type: 0
+
+// How the server should measure the character's idle time? (Note 3)
+// 0x001 - Walk Request
+// 0x002 - UseSkillToID Request ( targetted skill use attempt )
+// 0x004 - UseSkillToPos Request ( aoe skill use attempt )
+// 0x008 - UseItem Request ( including equip/unequip )
+// 0x010 - Attack Request
+// 0x020 - Chat Request ( whisper, party, guild, bg, etca )
+// 0x040 - Sit/Standup Request
+// 0x080 - Emotion Request
+// 0x100 - DropItem Request
+// 0x200 - @/#Command Request
+// 0x400 - NPC Script Interaction
+// Please note that at least 1 option has to be enabled.
+// Be mindful that the more options used, the easier it becomes to cheat features that rely on idletime (e.g. checkidle()).
+// Default: walk ( 0x1 ) + useskilltoid ( 0x2 ) + useskilltopos ( 0x4 ) + useitem ( 0x8 ) + attack ( 0x10 ) = 0x1F
+idletime_criteria: 0x1F
+
+// Can players get ATK/DEF from refinements on costume/shadow equips?
+// Default: yes (Official behavior not known)
+costume_refine_def: true
+shadow_refine_def: true
+shadow_refine_atk: true
+
+// Keep player facing direction after warping?
+// Default: false (on official servers players always faces north)
+player_warp_keep_direction: true
+
+// Can dead players do actions like trading, open a chat room, etc.?
+// 0x0 - Don't allow trading and open chat rooms.
+// 0x1 - Allow trading when dead.
+// 0x2 - Allow open chat room when dead.
+// default: 0x3 (Official)
+allowed_actions_when_dead: 0x3
diff --git a/conf/map/battle/skill.conf b/conf/map/battle/skill.conf
new file mode 100644
index 00000000..5f2f6575
--- /dev/null
+++ b/conf/map/battle/skill.conf
@@ -0,0 +1,362 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Skill) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//=========================================================================
+
+// The rate of time it takes to cast a spell (Note 2, 0 = No casting time)
+casting_rate: 100
+
+// Delay time after casting (Note 2)
+delay_rate: 100
+
+// Does the delay time depend on the caster's DEX and/or AGI? (Note 1)
+// Note: On Official servers, neither Dex nor Agi affect delay time
+delay_dependon_dex: false
+delay_dependon_agi: false
+
+// Minimum allowed delay for ANY skills after casting (in milliseconds) (Note 1)
+// Note: Setting this to anything above 0 can stop speedhacks.
+min_skill_delay_limit: 100
+
+// This delay is the min 'can't walk delay' of all skills.
+// NOTE: Do not set this too low, if a character starts moving too soon after
+// doing a skill, the client will not update this, and the player/mob will
+// appear to "teleport" afterwards.
+default_walk_delay: 300
+
+// Completely disable skill delay of the following types (Note 3)
+// NOTE: By default mobs don't have the skill delay as specified in the skill
+// database, but follow their own 'reuse' skill delay which is specified on
+// the mob skill db. When set, the delay for all skills become
+// min_skill_delay_limit.
+no_skill_delay: 2
+
+// At what dex does the cast time become zero (instant cast)?
+castrate_dex_scale: 150
+
+// How much (dex*2+int) does variable cast turns zero?
+vcast_stat_scale: 530
+
+// What level of leniency should the skill system give for skills when
+// accounting attack motion (ASPD) for casting skills (Note 2, between 0 and 300)
+//
+// NOTE: Setting this to 100% may cause some issues with valid skills not being cast.
+// The time difference between client and server varies so allowing 90% leniency
+// should be enough to forgive very small margins of error.
+skill_amotion_leniency: 90
+
+// Will normal attacks be able to ignore the delay after skills? (Note 1)
+skill_delay_attack_enable: true
+
+// Range added to skills after their cast time finishes.
+// Decides how far away the target can walk away after the skill began casting before the skill fails.
+// 0 disables this range checking (default)
+skill_add_range: 0
+
+// If the target moves out of range while casting, do we take the items and SP for the skill anyway? (Note 1)
+skill_out_range_consume: false
+
+// Does the distance between caster and target define if the skill is a ranged skill? (Note 3)
+// If set, when the distance between caster and target is greater than 3 the skill is considered long-range, otherwise it's a melee range.
+// If not set, then the range is determined by the skill's range (if it is above 5, the skill is ranged).
+// Default 14 (mobs + pets + homun)
+skillrange_by_distance: 14
+
+// Should the equipped weapon's range override the skill's range defined in the skill_db for most weapon-based skills? (Note 3)
+// NOTE: Skills affected by this option are those whose range in the skill_db are negative. By default always the skill range is used.
+// Note that if you want all monster skills to have a range of 9 you need to set monster_ai&0x400.
+skillrange_from_weapon: 0
+
+// Should a check on the caster's status be performed in all skill attacks?
+// When set to true, meteors, storm gust and any other ground skills will have
+// no effect while the caster is unable to fight (eg: stunned).
+skill_caster_check: true
+
+// Should ground placed skills be removed as soon as the caster dies? (Note 3)
+clear_skills_on_death: 0
+
+// Should ground placed skills be removed when the caster changes maps? (Note 3)
+clear_skills_on_warp: 15
+
+// Setting this to true will override the target mode of ground-based skills with the flag 0x01 to "No Enemies"
+// The two skills affected by default are Pneuma and Safety Wall (if set to true, those two skills will not protect everyone, but only allies)
+// See db/skill_unit_db.txt for more info.
+defunit_not_enemy: false
+
+// Do skills do at least 'hits' damage when they don't miss/are blocked?
+// (for example, will firebolts always do "number of bolts" damage versus plants?)
+// Values (add as appropriate): 1 for weapon-based attacks, 2 for magic attacks, 4 for misc attacks.
+skill_min_damage: 6
+
+// The delay rate of monk's combo (Note 2)
+combo_delay_rate: 100
+
+// Use alternate auto Counter Attack Skill Type? (Note 3)
+// For those characters on which it is set, 100% Critical,
+// Otherwise it disregard DEF and HIT+20, CRI*2
+auto_counter_type: 15
+
+// Can ground skills be placed on top of each other? (Note 3)
+// By default, skills with UF_NOREITERATION set cannot be stacked on top of
+// other skills, this setting will override that. (skill_unit_db)
+skill_reiteration: 0
+
+// Can ground skills NOT be placed underneath/near players/monsters? (Note 3)
+// If set, only skills with UF_NOFOOTSET set will be affected (skill_unit_db)
+skill_nofootset: 1
+
+// Should traps (hunter traps + quagmire) change their target to "all" inside gvg/pvp grounds? (Note 3)
+// Default on official servers: true for player-traps
+gvg_traps_target_all: 1
+
+// Hunter's traps visibility setting (with HiddenTrap: true on skill_db.conf)
+// Here we have 2 configs:
+// visibility stands to how traps are displayed by default:
+// 0: Traps are always visible to everyone (Hercules/Pre-renewal)
+// 1: Traps with HiddenTrap: true are hidden in versus maps (PvP/GvG/BG)
+// 2: Traps with HiddenTrap: true are always invisible (Renewal) (Default)
+// Notes: - Invisibility applies to players that are not in caster's party.
+// - Invisible traps can be made visible to everyone with Hunter's Detecting skill.
+//
+// display_on_trigger tells if HiddenTraps should become visible once triggered
+// 0: Do not make traps visible once triggered (except for Ankle Snare) (Aegis)
+// 1: Always make traps visible once triggered (Hercules)
+trap_options: {
+ visibility: 2
+ display_on_trigger: 1
+}
+
+// Restrictions applied to the Alchemist's Summon Flora skill (add as necessary)
+// 1: Enable players to damage the floras outside of versus grounds.
+// 2: Disable having different types out at the same time
+// (eg: forbid summoning anything except hydras when there's already
+// one hydra out)
+summon_flora_setting: 3
+
+// When songs are canceled, terminated or the character goes out of the
+// area of effect, there's an additional effect that lasts for 20 seconds
+// Should that time be reset for each song?
+// 0: No, you must recast the song AFTER those 20 seconds to have the effect again (Aegis)
+// 1: Yes, recasting songs reset the 20 seconds timer (eathena)
+song_timer_reset: 0
+
+// Whether placed down skills will check walls (Note 1)
+// (Makes it so that Storm Gust/Lord of Vermillion/etc when cast next to a wall, won't hit on the other side)
+skill_wall_check: true
+
+// When cloaking, Whether the wall is checked or not. (Note 1)
+// Note: When the skill does not checks for walls, you will always be considered
+// as if you had a wall-next to you (you always get the wall-based speed).
+// Add the settings as required, being hit always uncloaks you.
+// 0 = doesn't check for walls
+// 1 = Check for walls
+// 2 = Cloaking is not canceled when attacking.
+// 4 = Cloaking is not canceled when using skills
+player_cloak_check_type: 1
+monster_cloak_check_type: 4
+
+// Can't place unlimited land skills at the same time (Note 3)
+land_skill_limit: 9
+
+// Determines which kind of skill-failed messages should be sent:
+// 0 - Enable by default
+// 1 - Disable all skill-failed messages.
+// 2 - Disable skill-failed messages due to can-act delays.
+// 4 - Disable failed message from Snatcher
+// 8 - Disable failed message from Envenom
+display_skill_fail: 2
+
+// Can a player in chat room (in-game), be warped by a warp portal? (Note 1)
+chat_warpportal: false
+
+// What should the wizard's "Sense" skill display on the defense fields?
+// 0: Do not show defense
+// 1: Base defense [RE default]
+// 2: Vit/Int defense
+// 3: Both (the addition of both)
+sense_type: 0
+
+// Which finger offensive style will be used?
+// 0 = Aegis style (single multi-hit attack)
+// 1 = Athena style (multiple consecutive attacks)
+finger_offensive_type: 0
+
+// Grandcross Settings (Don't mess with these)
+// If set to false, hit interval is increased based on the amount of mobs standing on the same cell
+// (means that when there's stacked mobs in the same cell, they won't receive all hits)
+gx_allhit: false
+
+// Grandcross display type (Default 1)
+// 0: Yellow character
+// 1: White character
+gx_disptype: 1
+
+// Max Level Difference for Devotion
+devotion_level_difference: 10
+
+// If false than you can use the ensemble skills alone. (Note 1)
+player_skill_partner_check: true
+
+// Remove trap type
+// 0 = Aegis system : Returns 1 'Trap' item
+// 1 = Athena system : Returns all items used to deploy the trap
+skill_removetrap_type: 0
+
+// Does using bow to do a backstab give a 50% damage penalty? (Note 1)
+backstab_bow_penalty: true
+
+// How many times you could try to steal from a mob.
+// Note: It helps to avoid stealing exploit on monsters with few rare items
+// Use 0 to disable (max allowed value is 255)
+skill_steal_max_tries: 0
+
+// Can Rogues plagiarize advanced job skills
+// 0 = no restriction
+// 1 = only stalker may plagiarize advanced skills
+// 2 = advanced skills cannot be plagiarized by anyone
+// Official servers setting: 2
+copyskill_restrict: 2
+
+// Does Berserk/Frenzy cancel other self-buffs when used?
+berserk_cancels_buffs: false
+
+// Level and Strength of "MVP heal". When someone casts a heal of this level or
+// above, the heal formula is bypassed and this value is used instead.
+max_heal: 9999
+max_heal_lv: 11
+
+// Emergency Recall Guild Skill setting (add as appropriate).
+// Note that for the skill to be usable at all,
+// you need at least one of 1/2 and 4/8
+// 1: Skill is usable outside of woe.
+// 2: Skill is usable during woe.
+// 4: Skill is usable outside of GvG grounds
+// 8: Skill is usable on GvG grounds
+//16: Disable skill from "nowarpto" maps
+// (it will work on GVG castles even if they are set to nowarpto, though)
+emergency_call: 11
+
+// Guild Aura Skills setting (add as appropriate).
+// (This affects GD_LEADERSHIP, GD_GLORYWOUNDS, GD_SOULCOLD and GD_HAWKEYES)
+// Note that for the skill to be usable at all,
+// you need at least one of 1/2 and 4/8
+// 1: Skill works outside of woe.
+// 2: Skill works during woe.
+// 4: Skill works outside of GvG grounds
+// 8: Skill works on GvG grounds
+//16: Disable skill from affecting Guild Master
+guild_aura: 31
+
+// Allows players to skip menu when casting Teleport level 1
+// Menu contains two options. "Random" and "Cancel"
+skip_teleport_lv1_menu: false
+
+// Allow use of SG skills without proper day (Sun/Moon/Star) ?
+allow_skill_without_day: false
+
+// Allow use of ES-type magic on players?
+allow_es_magic_player: false
+
+// Miracle of the Sun, Moon and Stars skill ratio (100% = 10000)
+sg_miracle_skill_ratio: 2
+
+// Miracle of the Sun, Moon and Stars skill duration in milliseconds
+sg_miracle_skill_duration: 3600000
+
+// Angel of the Sun, Moon and Stars skill ratio (100% = 10000)
+sg_angel_skill_ratio: 10
+
+// Skills that bHealPower has effect on
+// 1: Heal, 2: Sanctuary, 4: Potion Pitcher, 8: Slim Pitcher, 16: Apple of Idun, 32: Highness Heal
+skill_add_heal_rate: 7
+
+// Whether the damage of EarthQuake with a single target on screen is able to be reflected.
+// Note: On official server, EQ is reflectable when there is only one target on the screen,
+// which might be an exploit to hunt the MVPs.
+eq_single_target_reflectable: true
+
+// On official server, you will receive damage from Reflection and some Tarot Card even in invincible status.
+// When this setting is enabled, it allows you to immune to all kinds of damage, including those stated previous.
+// (The number will show but no actual damage will be done)
+invincible_nodamage: false
+
+// Dancing Weapon Switch
+// On official server, a fix is in place that prevents the switching of weapons to cancel songs.
+// Default: true
+dancing_weaponswitch_fix: true
+
+// Skill Trap Type (GvG)
+// 0: (official) Traps in GvG only make player stop moving after its walk path is complete, and it activates other traps on the way.
+// 1: Traps in GvG make player stop moving right when stepping over it.
+skill_trap_type: 0
+
+// Trap Reflect
+// Whether the damage from traps must be reflected (for example by Reflect Shield or High Orc Card)?
+// true: Aegis - traps are reflected
+// false: Athena - traps are not reflected
+trap_reflect: true
+
+// Max Possible Level of Monster skills
+// Note: If your MVPs are too tough, reduce it to 10.
+mob_max_skilllvl: 100
+
+// Area of Bowling Bash chain reaction
+// 0: Use official gutter line system
+// 1: Gutter line system without demi gutter bug
+// 2-20: Area around caster (2 = 5x5, 3 = 7x7, 4 = 9x9, ..., 20 = 41x41)
+// Note: If you knock the target out of the area it will only be hit once and won't do splash damage
+bowling_bash_area: 0
+
+// On official servers, Storm Gust consists of 81 units that all deal 3x3 splash damage "away from center". Due to
+// south-western cells being processed first, this usually leads to a knockback to the northeast. Knockback at the
+// edges will be away from SG. Knockback direction can also be influenced by Ganbantein and Land Protector. If you
+// punch a hole into SG it will for example create a "suck in" effect.
+// If you disable this setting, the knockback direction will be completely random (eAthena style).
+stormgust_knockback: true
+
+// Magic Rod's animation behavior (Note 1)
+// 0 : (official) Magic Rod's animation occurs every time it is used.
+// 1 : Magic Rod's animation would not occur unless a spell was absorbed. (old behavior)
+magicrod_type: 0
+
+// Which skills are allowed to use while interacting with NPC?
+// 0 (SKILLENABLEDNPC_NONE) - Don't allow using skills.
+// 1 (SKILLENABLEDNPC_SELF) - Allow using non-damaging self skills.
+// 2 (SKILLENABLEDNPC_ALL) - Allow using all skills.
+// Official RE: 0 (Default value.)
+// Official Pre-RE: 1
+skill_enabled_npc: 0
+
+// Close the storage/gstorage when teleported? (Note 1)
+// true : (Official)
+// false : (Athena)
+teleport_close_storage: true
diff --git a/conf/map/battle/status.conf b/conf/map/battle/status.conf
new file mode 100644
index 00000000..5f6fe68d
--- /dev/null
+++ b/conf/map/battle/status.conf
@@ -0,0 +1,47 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+// Battle (Status) Configuration File
+//=========================================================================
+// Note 1: Value is a config switch (true/false)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//=========================================================================
+
+// Should skill casting be canceled when inflicted by curse/stun/sleep/etc (includes silence) (Note 3)?
+status_cast_cancel: 0
+
+// Adjustment for the natural rate of resistance from status changes.
+// If 50, status defense is halved, and you need twice as much stats to block
+// them (eg: 200 vit to completely block stun)
+pc_status_def_rate: 50
+mob_status_def_rate: 50
+
+// Maximum resistance to status changes. (100 = 100%)
+// NOTE: Cards and equipment can go over this limit, so it only applies to natural resist.
+pc_max_status_def: 75
+mob_max_status_def: 75
diff --git a/conf/map/charhelp.txt b/conf/map/charhelp.txt
new file mode 100644
index 00000000..e3acddbb
--- /dev/null
+++ b/conf/map/charhelp.txt
@@ -0,0 +1,28 @@
+ 40:--- CHARACTER CMD ---
+ 40:#statsall <char name> - Set all stats of a player to maximum.
+ 40:#itemlist <char name> - Displays all items of a player.
+ 40:#storagelist <char name> - Displays all items of a player's storage.
+ 40:#stats <char name> - Displays a characters stats.
+ 60:#option <char name> <param1> <param2> <param3> - Like @option command but only to target character.
+ 50:#mountpeco <char name> - Give/remove to a player a peco (Class is required, but not skill).
+ 50:#petrename <char name> - Re-enable pet rename to a player.
+ 60:#save <char name> <map> <x> <y> - Changes the target players respawn point.
+ 60:#baselvl/#blvl <char name> <#> - Change a characters base level.
+ 60:#joblvl/#jlvl <char name> <#> - Change a characters job level.
+ 60:#job/#jobchange <char name> <job ID> - Changes target characters job.
+ 60:#zeny <char name> <amount> - Give/take a players Zeny
+ 60:#cash <char name> <amount> - Give/take a player cash points
+ 60:#points <char name> <amount> - Give/take a player Kafra points
+ 60:#stpoint <char name> <amount> - Give/take a players stat points
+ 60:#skpoint <char name> <amount> - give/take a players skill points
+ 60:#skreset <char name> - Reset skills of a character.
+ 60:#streset <char name> - Reset stats of a character.
+ 60:#reset <char name> - Reset stats AND skills of a character.
+ 60:#questskill <char name> <#> - Gives to a player the specified quest skill.
+ 60:#lostskill <char name> <#> - Takes away the specified quest skill from the player.
+ 60:#delitem <char name> <item_name_or_ID> <quantity> - Remove items from a character
+ 50:#model <char name> <hair type> <hair color> <clothes color> - Changes a player's model
+ 60:#disguise <char name> <monster_name_or_monster_ID> - Changes disguise of a player
+ 60:#undisguise <char name> - Cancels disguise of a player
+ 60:#changesex <char name> - Changes sex of a player (all characters of the account)
+ 60:#warp/#rura+ <char name> <mapname> <x> <y> - Warps character to location of choice
diff --git a/conf/map/help.txt b/conf/map/help.txt
new file mode 100644
index 00000000..45d17c75
--- /dev/null
+++ b/conf/map/help.txt
@@ -0,0 +1,309 @@
+// This is help file that contains help messages for atcommands/charcommands.
+
+// Format:
+// <command>: "<help message>"
+
+// This file uses libconfig syntax.
+
+help: "Params: <command>\n" "Shows help for specified command."
+noask: "Auto rejects deals/invites."
+me: "Params: <message>\n" "Displays normal text as a message in this format: *name message* (like /me in mIRC)."
+fakename: "Params: <name>\n" "Changes your name to your choice temporarily."
+npctalk: "Params: <NPC name> <message>\n" "Forces a NPC to display a message in normal chat."
+broadcast: "Params: <message>\n" "Broadcasts a message with your name (in yellow)."
+kami: "Params: <message>\n" "Broadcasts a message without your name (in yellow)."
+kamib: "Params: <message>\n" "Broadcasts a message without your name (in blue)."
+localbroadcast: "Params: <message>\n" "Broadcasts a message with your name (in yellow) only on your map."
+commands: "Displays a list of commands that you can use."
+rates: "Displays the server's current rates."
+uptime: "Displays how long the server has been online."
+showdelay: "Shows/hides the \"There is a delay after this skill\" message."
+exp: "Displays current levels and % progress."
+mobinfo: "Params: <monster name|ID>\n" "Shows monster info (stats, exp, drops etc)."
+iteminfo: "Params: <item name|ID>\n" "Shows item info (type, price etc)."
+whodrops: "Params: <item name|ID>\n" "Shows who drops an item (monster with highest drop rates)."
+version: "Displays SVN version of the server."
+email: "Params: <current email> <new email>\n" "Changes your account e-mail address."
+where: "Params: <char name>\n" "Tells you the location of a character."
+time: "Shows the date and time of the server."
+showexp: "Displays/hides experience gained."
+showzeny: "Displays/hides Zeny gained."
+mobsearch: "Params: <monster name|ID>\n" "Shows the location of a certain mob on the current map."
+who: "Params: [<name>]\n" "Shows a list of online players and their party and guild."
+who2: "Params: [<name>]\n" "Shows a list of online players and their job."
+who3: "Params: [<name>]\n" "Shows a list of online players and their location."
+whomap: "@whomap/@whomap2/@whomap3 [map] - like @who/@who2/@who3 but only for specified map."
+whogm: "Params: [match_text] - Like @who+@who2+who3, but only for GM."
+guildspy: "Params: <guild name|id> - You will receive all messages of the guild channel (Chat logging must be enabled)"
+partyspy: "@partyspy <party name|id> - You will receive all messages of the party channel (Chat logging must be enabled)"
+mapinfo: "Params: [<0-3> [map]] - Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat)."
+go: "Params: <city name|number>\n" "Warps you to a city.\n"
+ " -3: (Memo point 2) 14: louyang 31: mora\n"
+ " -2: (Memo point 1) 15: start point 32: dewata\n"
+ " -1: (Memo point 0) 16: prison/jail 33: malangdo island\n"
+ " 0: prontera 17: jawaii 34: malaya port\n"
+ " 1: morocc 18: ayothaya 35: eclage\n"
+ " 2: geffen 19: einbroch\n"
+ " 3: payon 20: lighthalzen\n"
+ " 4: alberta 21: einbech\n"
+ " 5: izlude 22: hugel\n"
+ " 6: aldebaran 23: rachel\n"
+ " 7: xmas (lutie) 24: veins\n"
+ " 8: comodo 25: moscovia\n"
+ " 9: yuno 26: midgard camp\n"
+ " 10: amatsu 27: manuk\n"
+ " 11: gonryun 28: splendide\n"
+ " 12: umbala 29: brasilis\n"
+ " 13: niflheim 30: el dicastes\n"
+jumpto: "Params: <char name>\n" "Warps you to selected character."
+follow: "Params: <char name>\n" "Follow a player."
+mount: "Give/remove you a peco (Class is required, but not skill)"
+disguise: "Params: <monster name|ID>\n" "Change your appearence to other players to a mob."
+undisguise: "Restore your normal appearance."
+disguiseguild: "Disguises all online characters of a guild."
+undisguiseguild: "Restore the normal appearance of all characters of a guild."
+model: "Params: <hair ID: 0-17> <hair color: 0-8> <clothes color: 0-4> - Changes your characters appearence."
+size: "Params: <1-3> Changes your size (1-Smallest 2-Biggest 3-Normal)"
+sizeall: "Changes the size of all players."
+sizeguild: "Changes the size of all online characters of a guild."
+invisible: "Makes you character invisible (GM invisibility). Type again to become visible."
+save: "Sets respawn point to current spot."
+load: "Warps you to your save point."
+warp: "Params: <mapname> [<x> <y>]\n" "Warps you to the selected map and position."
+jump: "Params: [<x> [<y>]]\n" "Randomly warps you like a flywing."
+jobchange: "Params: <job name|ID>\n" "Changes your job.\n"
+ "----- Novice / 1st Class -----\n"
+ " 0 Novice 1 Swordman 2 Magician 3 Archer\n"
+ " 4 Acolyte 5 Merchant 6 Thief\n"
+ "----- 2nd Class -----\n"
+ " 7 Knight 8 Priest 9 Wizard 10 Blacksmith\n"
+ " 11 Hunter 12 Assassin 14 Crusader 15 Monk\n"
+ " 16 Sage 17 Rogue 18 Alchemist 19 Bard\n"
+ " 20 Dancer\n"
+ "----- High Novice / High 1st Class -----\n"
+ "4001 Novice High 4002 Swordman High 4003 Magician High 4004 Archer High\n"
+ "4005 Acolyte High 4006 Merchant High 4007 Thief High\n"
+ "----- Transcendent 2nd Class -----\n"
+ "4008 Lord Knight 4009 High Priest 4010 High Wizard 4011 Whitesmith\n"
+ "4012 Sniper 4013 Assassin Cross 4015 Paladin 4016 Champion\n"
+ "4017 Professor 4018 Stalker 4019 Creator 4020 Clown\n"
+ "4021 Gypsy\n"
+ "----- 3rd Class (Regular) -----\n"
+ "4054 Rune Knight 4055 Warlock 4056 Ranger 4057 Arch Bishop\n"
+ "4058 Mechanic 4059 Guillotine Cross 4066 Royal Guard 4067 Sorcerer\n"
+ "4068 Minstrel 4069 Wanderer 4070 Sura 4071 Genetic\n"
+ "4072 Shadow Chaser\n"
+ "----- 3rd Class (Transcendent) -----\n"
+ "4060 Rune Knight 4061 Warlock 4062 Ranger 4063 Arch Bishop\n"
+ "4064 Mechanic 4065 Guillotine Cross 4073 Royal Guard 4074 Sorcerer\n"
+ "4075 Minstrel 4076 Wanderer 4077 Sura 4078 Genetic\n"
+ "4079 Shadow Chaser\n"
+ "----- Expanded Class -----\n"
+ " 23 Super Novice 24 Gunslinger 25 Ninja 4045 Super Baby\n"
+ "4046 Taekwon 4047 Star Gladiator 4049 Soul Linker 4050 Gangsi\n"
+ "4051 Death Knight 4052 Dark Collector 4190 Ex. Super Novice 4191 Ex. Super Baby\n"
+ "4211 Kagerou 4212 Oboro 4215 Rebellion 4218 Summoner\n"
+ "----- Baby Novice And Baby 1st Class -----\n"
+ "4023 Baby Novice 4024 Baby Swordman 4025 Baby Magician 4026 Baby Archer\n"
+ "4027 Baby Acolyte 4028 Baby Merchant 4029 Baby Thief\n"
+ "---- Baby 2nd Class ----\n"
+ "4030 Baby Knight 4031 Baby Priest 4032 Baby Wizard 4033 Baby Blacksmith\n"
+ "4034 Baby Hunter 4035 Baby Assassin 4037 Baby Crusader 4038 Baby Monk\n"
+ "4039 Baby Sage 4040 Baby Rogue 4041 Baby Alchemist 4042 Baby Bard\n"
+ "4043 Baby Dancer\n"
+ "---- Baby 3rd Class ----\n"
+ "4096 Baby Rune Knight 4097 Baby Warlock 4098 Baby Ranger 4099 Baby Arch Bishop\n"
+ "4100 Baby Mechanic 4101 Baby Glt. Cross 4102 Baby Royal Guard 4103 Baby Sorcerer\n"
+ "4104 Baby Minstrel 4105 Baby Wanderer 4106 Baby Sura 4107 Baby Genetic\n"
+ "4108 Baby Shadow Chaser\n"
+ "---- Modes And Others ----\n"
+ " 22 Wedding 26 Christmas 27 Summer 4048 Star Gladiator (Union)\n"
+option: "Params: <param1> <param2>(stackable) <param3>(stackable)\n" "Adds different visual effects on or around your character.\n"
+" <param1> <param2> <param3>\n"
+"01: Stone 01: Sight 01: Sight 512: Cart Lv. 4\n"
+"02: Frozen 02: Curse 02: Hiding 1024: Cart Lv. 5\n"
+"03: Stun 04: Silence 04: Cloaking 2048: Orc Head\n"
+"04: Sleep 08: Signum 08: Cart Lv. 1 4096: Wedding\n"
+"06: Petrify 16: Blind 16: Falcon 8192: Ruwach\n"
+"07: Burning 32: Angelus 32: Riding 16384: Chasewalk\n"
+"08: Imprison 64: Bleeding 64: Invisible\n"
+"16: (Nothing) 128: D. Poison 128: Cart Lv. 2\n"
+"32: (Nothing) 256: Fear 256: Cart Lv. 3"
+heal: "Params: [<HP> <SP>]\n" "Heals the desired amount of HP and SP. No value specified will do a full heal."
+dye: "Params: <clothes palette no.>\n" "Changes your characters clothes color."
+hairstyle: "Params: <hairstyle no.>\n" "Changes your hair style."
+haircolor: "Params <hair palette no.>\n" "Changes your hair color."
+speed: "Params: <1-1000>\n" "Changes you walking speed. 1 being the fastest and 1000 the slowest. Default is 150."
+effect: "Params: <effect id> [<flag>]\n" "Give an effect to your character."
+dropall: "Throws all your possession on the ground."
+storeall: "Puts all your possessions in storage."
+killable: "Make your character killable."
+memo: "Params: [memo position]\n" "Set/change a memo location (no position: display memo points)."
+spiritball: "Params: <1-100>\n" "Gives you \"spirit spheres\" like from the skill \"Call Spirits\".\n"
+questskill: "Params: <#>\n" "Gives you the specified quest skill\n"
+"Novice = 142: First Aid, 143: Act Dead\n"
+"Archer = 147: Create Arrow, 148: Charge Arrow\n"
+"Swordman = 144: Moving HP Recovery, 145: Attack Weak Point, 146: Auto Berserk\n"
+"Acolyte = 156: Holy Light\n"
+"Thief = 149: Throw Sand, 150: Back Sliding, 151: Take Stone, 152: Throw Stone\n"
+"Merchant = 153: Cart Revolution, 154: Change Cart, 155: Crazy Uproar, 2535: Open Buying Store\n"
+"Magician = 157: Energy Coat\n"
+"Hunter = 1009: Phantasmic Arrow\n"
+"Bard = 1010: Pang Voice\n"
+"Dancer = 1011: Wink of Charm\n"
+"Knight = 1001: Charge Attack\n"
+"Crusader = 1002: Shrink\n"
+"Priest = 1014: Redemptio\n"
+"Monk = 1015: Ki Translation, 1016: Ki Explosio\n"
+"Assassin = 1003: Sonic Acceleration, 1004: Throw Venom Knife\n"
+"Rogue = 1005: Close Confine\n"
+"Blacksmith = 1012: Unfair Trick, 1013: Greed\n"
+"Alchemist = 238: Basis of Life\n"
+"Wizard = 1006: Sight Blaster\n"
+"Sage = 1007: Create Elemental Converter, 1008: Elemental Change (Water), 1017: Elemental Change (Earth), 1018: Elemental Change (Fire), 1019: Elemental Change (Wind)"
+lostskill: "Params: <#>\n" "Takes away the specified quest skill from you\n"
+"Novice = 142: First Aid, 143: Act Dead\n"
+"Archer = 147: Create Arrow, 148: Charge Arrow\n"
+"Swordman = 144: Moving HP Recovery, 145: Attack Weak Point, 146: Auto Berserk\n"
+"Acolyte = 156: Holy Light\n"
+"Thief = 149: Throw Sand, 150: Back Sliding, 151: Take Stone, 152: Throw Stone\n"
+"Merchant = 153: Cart Revolution, 154: Change Cart, 155: Crazy Uproar, 2535: Open Buying Store\n"
+"Magician = 157: Energy Coat\n"
+"Hunter = 1009: Phantasmic Arrow\n"
+"Bard = 1010: Pang Voice\n"
+"Dancer = 1011: Wink of Charm\n"
+"Knight = 1001: Charge Attack\n"
+"Crusader = 1002: Shrink\n"
+"Priest = 1014: Redemptio\n"
+"Monk = 1015: Ki Translation, 1016: Ki Explosio\n"
+"Assassin = 1003: Sonic Acceleration, 1004: Throw Venom Knife\n"
+"Rogue = 1005: Close Confine\n"
+"Blacksmith = 1012: Unfair Trick, 1013: Greed\n"
+"Alchemist = 238: Basis of Life\n"
+"Wizard = 1006: Sight Blaster\n"
+"Sage = 1007: Create Elemental Converter, 1008: Elemental Change (Water), 1017: Elemental Change (Earth), 1018: Elemental Change (Fire), 1019: Elemental Change (Wind)"
+skillid: "Params: <name>\n" "Look up a skill by name"
+useskill: "Params: <skillid> <skillv> <target>\n" "Use a skill on target"
+skilltree: "Params: <skillnum> <charname>\n" "Prints the skill tree needed to get a skill for the target player."
+marry: "Params: <player name>\n" "Marry another player."
+divorce: "Divorce player."
+alive: "Revives yourself from death."
+blvl: "Params: <number of levels>\n" "Raises your base level the desired number of levels."
+jlvl: "Params: <number of levels>\n" "Raises your job level the desired number of levels."
+allskill: "Give you all skills."
+stpoint: "Params: <number of points> - Gives you the desired number of stat points."
+skpoint: "Params: <number of points> - Gives you the desired number of skill points."
+zeny: "Params: <amount> - Gives you desired amount of Zeny."
+cash: "Params: <amount> - Gives you the specified amount of cash points."
+points: "Params: <amount> - Gives you the specified amount of Kafra Points."
+str: "Params: <amount>\n" "Raises STR by given amount."
+agi: "Params: <amount>\n" "Raises AGI by given amount."
+dex: "Params: <amount>\n" "Raises DEX by given amount."
+vit: "Params: <amount>\n" "Raises VIT by given amount."
+int: "Params: <amount>\n" "Raises INT by given amount."
+luk: "Params: <amount>\n" "Raises LUK by given amount."
+allstats: "Params: <value>\n" "Adds value in all stats (maximum if no value)."
+addwarp: "Params: <map name> <x coord> <y coord>\n"
+killmonster2: "Kills all monsters of your map (without drops)."
+monster: "Params: <monster name|ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]\n"
+ "@monster2 <desired_monster_name> <monster name|ID> [<number to spawn> [<x coord> [<y coord>]]]\n"
+"@spawn/@monster/@summon/@monster2 \"desired monster name\" <monster name|ID> [<number to spawn> [<x coord> [<y coord>]]]\n"
+"@spawn/@monster/@summon/@monster2 <monster name|ID> \"desired monster name\" [<number to spawn> [<x coord> [<y coord>]]]\n"
+" Spawns the desired monster with any desired name."
+monstersmall: "Params: <monster name|ID>\n" "Spawns a smaller version of a monster."
+monsterbig: "Params: <monster name|ID>\n" "Spawns a larger version of a monster."
+killmonster: "Params: <map>\n" "Kill all monsters of the map (they drop)"
+autoloot: "Params: <on|off|#>\n" "Makes items go straight into your inventory."
+autotrade: "Allows you to vend while you are offline."
+changegm: "Params: <charname>\n" "Changes the leader of your guild (You must be guild leader)"
+changeleader: "Params: <charname>\n" "Changes the leader of your party (You must be party leader)"
+request: "Params: <message>\n" "Sends a message to all connected GMs (via the gm whisper system)"
+sound: "Params: <path to file in data folder or GRF file>\n" "Plays a sound from the data folder or GRF file located on the client."
+clone: "Params: <charname>\n" "Spawns a supportive clone of the given player."
+slaveclone: "Params: <charname>\n" "Spawns a supportive clone of the given player that follows the creator around."
+evilclone: "Params: <charname>\n" "Spawns an aggressive clone of the given player."
+changesex: "Changes your gender."
+duel: "Starts a duel."
+invite: "Invites a player to a duel."
+accept: "Accepts an invitation to a duel."
+reject: "Rejects an invitation to a duel."
+leave: "Leaves a duel."
+mail: "Open mail box."
+storage: "Opens storage."
+itemreset: "Remove all your items."
+guildstorage: "Opens guild storage."
+idsearch: "Params: <part_of_item_name>\n" "Search all items that name have part_of_item_name"
+refine: "Params: <equip position> <+/- amount>"
+produce: "Params: <equip name or equip ID> <element> <# of very's>\n"
+" Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind\n"
+" You can add up to 3 Star Crumbs and 1 element\n"
+repairall: "Repair all items of your inventory"
+item: "Params: <item name or ID> <quantity>\n" "Gives you the desired item."
+item2: "Params: <item name or ID> <quantity> <identified_flag> <refine> <broken_flag> <Card1> <Card2> <Card3> <Card4>\n" "Gives you the desired item."
+pvpon: "Turns pvp on on the current map"
+pvpoff: "Turns pvp off on the current map"
+gvgon: "Turns gvg on on the current map"
+gvgoff: "Turns gvg off on the current map"
+agitstart: "Starts War of Emperium"
+agitend: "End War of Emperium"
+party: "Params: <party_name>\n" "Create a party."
+guild: "Params: <guild_name>\n" "Create a guild."
+glvl: "Params: <# of levels>\n" "Raise Guild by desired number of levels"
+guildrecall: "Params: <guild name|ID>\n" "Warps all online characters of a guild to you."
+partyrecall: "Params: <party name|ID>\n" "Warps all online characters of a party to you."
+petrename: "Re-enable pet rename"
+pettalk: "Params: <message>\n" "Makes your pet say a message."
+petfriendly: "Params: <#>\n" "Set pet friendly amount (0-1000) 1000 = Max"
+pethungry: "Params: <#>\n" "Set pet hungry amount (0-100) 100 = Max"
+hatch: "Create a pet from your inventory eggs list."
+makeegg: "Params: <pet_id>\n" "Gives pet egg for monster number in pet DB"
+kick: "Params: <char name>\n" "Kicks specified character off the server"
+unjail: "Params: <char name>\n" "Discharges specified character/prisoner"
+kill: "Params: <char name>\n" "Kills player."
+recall: "Params: <char name>\n" "Warps target character to you."
+raise: "Params: <char name>\n" "Revives target character."
+block: "Params: <char name>\n" "Permanently blocks an account."
+unblock: "Params: <char name>\n" "Unblocks an account."
+ban: "Params: <time> <name>\n" "Temporarily ban an account.\n"
+ " time usage: adjustment (+/- value) and element (y/a, m, d/j, h, mn, s)\n"
+ " Example: @ban +1m-2mn1s-6y testplayer\n"
+unban: "Params: <name> - Unban a account"
+jail: "Params: <char name> - Sends specified character in jails"
+trade: "Params: <char name> - Open a trade window with a another player"
+recallall: "Warps every character online to you."
+doom: "Kills all NON GM chars on the server."
+doommap: "Kills all non GM characters on the map."
+raisemap: "Resurrects all characters on the map."
+night: "Enables night mode on all maps, all characters are affected."
+day: "Disables night mode and restores regular lighting, all characters are affected."
+skillon: "turn skills on for a map"
+skilloff: "turn skills on for a map"
+snow: "Makes all maps to have the snow weather effect."
+clouds: "Makes all maps to have the cloudy weather effect."
+clouds2: "Makes all maps to have another cloudy weather effect."
+fog: "Makes all maps to have the fog weather effect."
+fireworks: "Makes all maps to have the fireworks weather effect."
+sakura: "Makes all maps to have the sakura weather effect."
+leaves: "Makes all maps to have the leaves weather effect."
+shownpc: "Params: <NPC name>\n" "Enable a NPC"
+hidenpc: "Params: <NPC name>\n" "Disable a NPC"
+loadnpc: "Params: <path to script>\n" "Load the specified script file path."
+unloadnpc: "Params: <NPC name>\n" "Unload the specified NPC according to name."
+adjgroup: "Params: <level> <char name> - Do a temporary adjustment of the GM level of a player"
+kickall: "Kick all characters off the server"
+mapexit: "Kick all players and shut down map-server."
+reloaditemdb: "Reload item database."
+reloadmobdb: "Reload monster database."
+reloadquestdb: "Reload quest database."
+reloadskilldb: "Reload skills definition database."
+reloadscript: "Reload all scripts."
+gat: "For debugging (you inspect around gat)"
+send: "For debugging (packet variety)"
+nuke: "Params: <char name>\n" "Blow somebody up, including those surrounding them."
+autoloottype: "Manage a list of autolooting item types.\n"
+" To add an item type to the list, use \"@autoloottype +<type name>\".\n"
+" To remove an item type, use \"@autoloottype -<type name>\".\n"
+" Type List: healing, usable, etc, weapon, armor, card, petegg, petarmor, ammo.\n"
+" \"@autoloottype reset\" will clear your autoloottype list."
+feelreset: "Reset 'Feeling' maps."
+hatereset: "Reset 'Hatred' targets."
diff --git a/conf/map/logs.conf b/conf/map/logs.conf
new file mode 100644
index 00000000..85e110f2
--- /dev/null
+++ b/conf/map/logs.conf
@@ -0,0 +1,184 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Log configuration file.
+//=========================================================================
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given, assume unit
+// types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
+//=========================================================================
+
+map_log: {
+ // Enable Logs? (Note 3)
+ // 0x00000000 - Don't log at all
+ // 0x00000001 - (T) Log trades X
+ // 0x00000002 - (V) Log vending transactions X
+ // 0x00000004 - (P) Log items drop/picked by players X
+ // 0x00000008 - (M) Log items dropped by monsters
+ // 0x00000010 - (S) Log NPC transactions (buy/sell)
+ // 0x00000020 - (N) Log Script transactions (items deleted/acquired through quests)
+ // 0x00000040 - (D) Log items stolen from mobs (Steal/Gank)
+ // 0x00000080 - (C) Log player-used items (consumables/pet&hom&merc food/items used for skills&attacks)
+ // 0x00000100 - (O) Log produced/ingredient items
+ // 0x00000200 - (U) Log MVP prize items
+ // 0x00000400 - (A) Log player created/deleted items (through @/# commands)
+ // 0x00000800 - (R) Log items placed/retrieved from storage.
+ // 0x00001000 - (G) Log items placed/retrieved from guild storage.
+ // 0x00002000 - (E) Log mail system transactions.
+ // 0x00004000 - (I) Log auction system transactions.
+ // 0x00008000 - (B) Log buying store transactions
+ // 0x00010000 - (X) Log other transactions
+ // 0x00020000 - (K) Log account bank transactions
+ // 0x00040000 - (Y) Divorce
+ // 0x00080000 - (Z) Roulette
+ // 0x00100000 - (W) Rental
+ // 0x00200000 - (Q) Card
+ // 0x00400000 - (J) Invalid in inventory
+ // 0x00800000 - (H) Invalid in cart
+ // 0x01000000 - (@) Egg
+ // 0x02000000 - (0) Quest
+ // 0x04000000 - (1) Skill
+ // 0x08000000 - (2) Refine
+ // 0x10000000 - (L) Log items looted by monsters
+ // 0x20000000 - (3) Achievements
+ // Example: Log trades+vending+script items+created items: 1+2+32+1024 = 1059
+ // Please note that moving items from inventory to cart and back is not logged by design.
+ enable: 0xFFDF7FF
+
+ // Logging files/tables
+ // Following settings specify where to log to. If 'use_sql' is
+ // true, SQL tables are assumed, otherwise flat files.
+ database: {
+ // Use MySQL Logs? (Note 1)
+ use_sql: true
+
+ // Flat files
+ // log_gm_db: "log/atcommandlog.log"
+ // log_branch_db: "log/branchlog.log"
+ // log_chat_db: "log/chatlog.log"
+ // log_mvpdrop_db: "log/mvplog.log"
+ // log_npc_db: "log/npclog.log"
+ // log_pick_db: "log/picklog.log"
+ // log_zeny_db: "log/zenylog.log"
+ // SQL tables
+ log_gm_db: "atcommandlog"
+ log_branch_db: "branchlog"
+ log_chat_db: "chatlog"
+ log_mvpdrop_db: "mvplog"
+ log_npc_db: "npclog"
+ log_pick_db: "picklog"
+ log_zeny_db: "zenylog"
+ }
+
+ // Log Dead Branch Usage (Note 1)
+ log_branch: false
+
+ // Track Zeny Changes
+ // Filter settings
+ // 0 - don't log; 1 - log any zeny changes; 2.....1000000 - minimal absolute logging zeny value
+ log_zeny: 1
+
+ // Log MVP Monster Drops (Note 1)
+ // Outdated. Use Pick_Log instead. But this log could be useful to keep track slayed MVPs
+ log_mvpdrop: false
+
+ // Log AtCommands & Charcommands (Note 1)
+ // Only commands issued by player groups ('conf/groups.conf') with
+ // 'log_commands' setting set to 'true' will be logged.
+ log_commands: true
+
+ // Log NPC 'logmes' commands (Note 1)
+ log_npc: true
+
+ // Logging filters
+ filter: {
+ item: {
+ // Filters
+ // if any condition is true then the item will be logged
+ // 0 = Don't log at all
+ // 1 = Log any item
+ // Advanced Filter Bits by item type: ||
+ // 0x002 - Healing items (0)
+ // 0x004 - Etc Items(3) + Arrows (10)
+ // 0x008 - Usable Items(2) + Lures,Scrolls(11) + Usable Cash Items(18)
+ // 0x010 - Weapon(4)
+ // 0x020 - Shields,Armor,Headgears,Accessories,etc(5)
+ // 0x040 - Cards(6)
+ // 0x080 - Pet Accessories(8) + Eggs(7) (well, monsters don't drop 'em but we'll use the same system for ALL logs)
+ // 0x100 - Log expensive items ( >= price_items_log)
+ // 0x200 - Log big amount of items ( >= amount_items_log)
+ // 0x400 - Log refined items (if their refine >= refine_items_log )
+ // 0x800 - Log rare items (if their drop chance <= rare_items_log )
+ // Examples: (log filters)
+ // log_filter: 1 = logs ANY items
+ // log_filter: 0x2 = logs only HEALING items
+ // log_filter: 0x4 = logs only Etc Items and Arrows
+ // log_filter: 0x40 = logs only Cards
+ // log_filter: 0x142 = logs only Healing items, Cards and those items which price is >= price_items_log
+ // log_filter: 0xff0 = logs all items (including all rare, big amount) except healing, etc, arrows and useble ones
+ log_filter: 1
+
+ // Log Items which Refine >= refine_items_log
+ refine_items_log: 5
+
+ // Log Items whith min drop rate <= rare_items_log
+ // 1 = 0.01%, 100 = 1% drop chance, etc
+ rare_items_log: 100
+
+ // don't log it if the current item buy price < price_items_log
+ price_items_log: 1000
+
+ // don't log it if the current item amount < amount_items_log
+ amount_items_log: 100
+ } // item
+
+ chat: {
+ // Log CHAT (Global, Whisper, Party, Guild, Main chat) (Note 3)
+ // LOGGING FILTERS
+ // =============================================================
+ // 0x00 = Don't log at all
+ // 0x01 - Log Global messages
+ // 0x02 - Log Whisper messages
+ // 0x04 - Log Party messages
+ // 0x08 - Log Guild messages
+ // 0x10 - Log Main chat messages
+ // 0x20 - Log Clan messages
+ // Example:
+ // log_chat: 0x5 = logs both Whisper & Party messages
+ // log_chat: 0x8 = logs only Guild messages
+ // log_chat: 0x2f = logs everything
+ // FIXME: This isn't fully functional, as of now it's only checking
+ // if the log is active or not [Panikon]
+ log_chat: 0x11
+
+ // Disable chat logging when WoE is running? (Note 1)
+ log_chat_woe_disable: false
+ } // chat
+ } // filter
+}
+
+import: "conf/import/logs.conf"
diff --git a/conf/map/map-server.conf b/conf/map/map-server.conf
new file mode 100644
index 00000000..be19a1cb
--- /dev/null
+++ b/conf/map/map-server.conf
@@ -0,0 +1,114 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Map Server Configuration File
+//=========================================================================
+
+map_configuration: {
+ @include "conf/global/console.conf"
+ @include "conf/import/sql_connection.conf"
+
+ // map_list and map_removed
+ @include "conf/map/maps.conf"
+
+ // When @help or @h is typed when you are a gm, this is displayed for helping new gms understand gm commands.
+ help_txt: "conf/map/help.txt"
+ charhelp_txt: "conf/map/charhelp.txt"
+
+ // Enable the @guildspy and @partyspy at commands?
+ // Note that enabling them decreases packet sending performance.
+ enable_spy: false
+
+ // Read map data from GATs and RSWs in GRF files or a data directory
+ // as referenced by grf-files.txt rather than from the mapcache?
+ use_grf: false
+
+ // When employing more than one language (see db/translations.conf),
+ // this setting is used as a fallback
+ default_language: "English"
+
+ // Information related to inter-server behavior
+ inter: {
+ // Interserver communication passwords, set in the login server database
+ userid: "s1"
+ passwd: "p1"
+
+ // Character Server IP
+ // The map server connects to the character server using this IP address.
+ // NOTE: This is useful when you are running behind a firewall or are on
+ // a machine with multiple interfaces.
+ //char_ip: "127.0.0.1"
+
+ // The map server listens on the interface with this IP address.
+ // NOTE: This allows you to run multiple servers on multiple interfaces
+ // while using the same ports for each server.
+ //bind_ip: "127.0.0.1"
+
+ // Map Server IP
+ // The IP address which clients will use to connect.
+ // Set this to what your server's public IP address is.
+ //map_ip: "127.0.0.1"
+
+ @include "conf/import/ports.conf"
+ }
+
+ database: {
+ // Where should all database data be read from?
+ db_path: "db"
+
+ // Database autosave time
+ // All characters are saved on this time in seconds (example:
+ // autosave of 60 secs with 60 characters online -> one char is
+ // saved every second)
+ autosave_time: 300
+
+ // Min database save intervals (in ms)
+ // Prevent saving characters faster than at this rate (prevents
+ // char-server save-load getting too high as character-count
+ // increases)
+ minsave_time: 100
+
+ // Apart from the autosave_time, players will also get saved
+ // when involved in the following (add as needed):
+ // 0x001: After every successful trade
+ // 0x002: After every vending transaction
+ // 0x004: After closing storage/guild storage.
+ // 0x008: After hatching/returning to egg a pet.
+ // 0x010: After successfully sending a mail with attachment
+ // 0x020: After successfully submitting an item for auction
+ // 0x040: After successfully get/delete/complete a quest
+ // 0x080: After every buying store transaction
+ // 0x100: After every bank transaction (deposit/withdraw)
+ // 0x200: After every allow party flag change
+ // NOTE: These settings decrease the chance of dupes/lost items
+ // when there's a server crash at the expense of increasing the
+ // map/char server lag. If your server rarely crashes, but
+ // experiences interserver lag, you may want to set these off.
+ save_settings: 0x1ff
+ }
+}
+
+import: "conf/import/map-server.conf"
diff --git a/conf/map/maps.conf b/conf/map/maps.conf
new file mode 100644
index 00000000..68d2bd20
--- /dev/null
+++ b/conf/map/maps.conf
@@ -0,0 +1,136 @@
+map_removed: (
+)
+map_list: (
+ "000-1",
+ "001-1",
+ "001-2",
+ "001-3",
+ "002-1",
+ "002-2",
+ "002-3",
+ "002-4",
+ "002-5",
+ "003-1",
+ "003-4",
+ "004-1",
+ "004-3",
+ "004-4",
+ "004-5",
+ "005-3",
+ "006-1",
+ "006-2",
+ "006-3",
+ "007-1",
+ "007-2",
+ "008-1",
+ "009-1",
+ "009-2",
+ "009-3",
+ "009-4",
+ "009-5",
+ "009-6",
+ "009-7",
+ "009-8",
+ "010-1",
+ "010-2",
+ "011-1",
+ "011-3",
+ "011-4",
+ "011-6",
+ "012-1",
+ "012-3",
+ "012-4",
+ "013-1",
+ "013-2",
+ "013-3",
+ "014-1",
+ "014-3",
+ "015-1",
+ "015-3",
+ "016-1",
+ "016-2",
+ "017-1",
+ "017-2",
+ "017-3",
+ "017-4",
+ "017-9",
+ "018-1",
+ "018-2",
+ "018-3",
+ "019-1",
+ "019-3",
+ "019-4",
+ "020-1",
+ "020-2",
+ "020-3",
+ "021-3",
+ "023-1",
+ "023-2",
+ "023-3",
+ "025-1",
+ "025-3",
+ "025-4",
+ "026-1",
+ "026-2",
+ "027-1",
+ "027-2",
+ "027-3",
+ "027-4",
+ "027-5",
+ "027-6",
+ "027-7",
+ "027-8",
+ "028-1",
+ "028-3",
+ "029-1",
+ "029-2",
+ "029-3",
+ "029-4",
+ "030-1",
+ "030-2",
+ "030-3",
+ "030-4",
+ "031-1",
+ "031-2",
+ "031-3",
+ "031-4",
+ "032-3",
+ "033-1",
+ "034-1",
+ "034-2",
+ "035-2",
+ "036-2",
+ "041-1",
+ "042-1",
+ "043-1",
+ "043-3",
+ "043-4",
+ "045-1",
+ "046-1",
+ "046-3",
+ "047-1",
+ "047-3",
+ "048-2",
+ "051-1",
+ "051-3",
+ "052-1",
+ "052-2",
+ "055-1",
+ "055-3",
+ "056-2",
+ "057-1",
+ "069-2",
+ "070-1",
+ "070-3",
+ "099-1",
+ "099-2",
+ "099-3",
+ "099-4",
+ "099-5",
+ "099-6",
+ "099-7",
+ "099-8",
+ "botcheck",
+ "fermi",
+ "sec_pri",
+)
diff --git a/conf/map/script.conf b/conf/map/script.conf
new file mode 100644
index 00000000..98a39f52
--- /dev/null
+++ b/conf/map/script.conf
@@ -0,0 +1,74 @@
+//================= Hercules Configuration ================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Hercules Script Configuration File.
+//=========================================================================
+
+script_configuration: {
+ // Specifies whether or not an error should be outputed when there's a
+ // mismatch between the number of provided arguments and of expected
+ // arguments
+ // Default: true
+ warn_func_mismatch_paramnum: true
+
+ // Specifies whether or not each built-in function's arguments are
+ // checked for correct type. When a function is given an argument
+ // different from what it expects, a warning is thrown before the
+ // function is ran anyway.
+ // Default: true
+ warn_func_mismatch_argtypes: true
+
+ // Maximum number of operations before considering a set of operations too intensive
+ // Defaults to 655360
+ check_cmdcount: 655360
+
+ // Maximum number of iterations before considering a loop infinite
+ // Defaults to 2048
+ check_gotocount: 2048
+
+ // Default value of the 'min' argument of the script command 'input'.
+ // When the 'min' argument isn't provided, this value is used instead.
+ // Defaults to 0.
+ input_min_value: 0
+
+ // Default value of the 'max' argument of the script command 'input'.
+ // When the 'max' argument isn't provided, this value is used instead.
+ // Defaults to INT_MAX.
+ //input_max_value: 2147483647
+ input_max_value: 10000000
+
+ // Specifies whether functions not explicitly marked with a "private" or
+ // "public" keyword should be treated as "private" by default.
+ // Default: true
+ functions_private_by_default: true
+
+ // Specifies whether public functions can be invoked as NPC events. This
+ // allows, for example, to use a `public function OnDeath { ... }` instead
+ // of a `OnDeath:` label for mob death events.
+ functions_as_events: true
+}
+
+import: "conf/import/script.conf"
diff --git a/conf/messages.conf b/conf/messages.conf
new file mode 100644
index 00000000..cdb4f1e7
--- /dev/null
+++ b/conf/messages.conf
@@ -0,0 +1,1649 @@
+//===== Hercules Message Configuration =======================
+//= Hercules messages.conf
+//===== Description: =========================================
+//= This file handles all messages set throughout the server.
+//============================================================
+// For translation, just change msg here (second line),
+// no need to modify source code or alternatively,
+// use conf/import/msg_conf.txt.
+//============================================================
+// Format:
+// // English message
+// msg_number: translated message
+//============================================================
+
+// 0-499: reserved for GM commands
+// 500-549: reserved for others
+// 550-699: reserved for job names (also loaded by char server)
+// 900-1500: @atcommand
+
+// To disable a string (%s) field, make its max length 0:
+// eg:
+// 270: *%s %s* (@me format)
+// 270: *%.0s%s* (remove the character's name from it)
+
+// Messages of GM commands
+// -----------------------
+
+0: Warped.
+1: Map not found.
+2: Invalid coordinates, using random target cell.
+3: Character not found.
+4: Jump to %s
+5: Jump to %d %d
+6: Your save point has been changed.
+7: Warping to save point.
+8: Speed changed.
+9: Options changed.
+10: Invisible: Off
+11: Invisible: On
+12: Your job has been changed.
+13: You've died.
+14: Character killed.
+15: Unknown
+16: You've been revived!
+17: HP, SP recovered.
+18: Item created.
+19: Invalid item ID or name.
+20: All of your items have been removed.
+21: Base level raised.
+22: Base level lowered.
+23: Job level can't go any higher.
+24: Job level raised.
+25: Job level lowered.
+26: [%d] seconds left until you can use
+27: Storage has been not loaded yet.
+28: No player found.
+29: 1 player found.
+30: %d players found.
+31: PvP: Off.
+32: PvP: On.
+33: GvG: Off.
+34: GvG: On.
+35: This job has no alternate body styles.
+36: Appearance changed.
+37: An invalid number was specified.
+38: Invalid location number, or name.
+39: All monsters summoned!
+40: Invalid monster ID or name.
+41: Unable to decrease the number/value.
+42: Stat changed.
+43: You're not in a guild.
+44: You're not the master of your guild.
+45: Guild level change failed.
+46: %s recalled!
+47: Base level can't go any higher.
+48: Any work in progress (NPC dialog, manufacturing ...) quit and try again.
+49: Unable to Teleport in this area
+50: This skill cannot be used within this area.
+51: This item cannot be used within this area.
+//52 FREE
+53: '%s' stats:
+54: No player found in map '%s'.
+55: 1 player found in map '%s'.
+56: %d players found in map '%s'.
+//57-58 FREE
+59: Night Mode Activated.
+60: Day Mode Activated.
+61: The holy messenger has given judgement.
+62: Judgement has passed.
+63: Mercy has been shown.
+64: Mercy has been granted.
+//65-69 FREE
+70: You have learned the skill.
+71: You have forgotten the skill.
+72: War of Emperium has been initiated.
+73: War of Emperium is currently in progress.
+74: War of Emperium has been ended.
+75: War of Emperium is currently not in progress.
+76: All skills have been added to your skill tree.
+77: Search results for '%s' (name: id):
+78: %s: %d
+79: %d results found.
+80: Please specify a display name or monster name/id.
+81: Your GM level doesn't authorize you to perform this action on the specified player.
+82: Roulette is disabled
+//83 FREE
+84: All stats changed!
+85: Invalid time for ban command.
+//86-87 FREE
+88: Sending request to login server...
+89: Night mode is already enabled.
+90: Day mode is already enabled.
+//91 FREE
+92: All characters recalled!
+93: All online characters of the %s guild have been recalled to your position.
+94: Incorrect name/ID, or no one from the specified guild is online.
+95: All online characters of the %s party have been recalled to your position.
+96: Incorrect name/ID, or no one from the specified party is online.
+97: Item database has been reloaded.
+98: Monster database has been reloaded.
+99: Skill database has been reloaded.
+100: Scripts have been reloaded.
+//101 FREE
+102: You have mounted a Peco Peco.
+103: No longer spying on the %s guild.
+104: Spying on the %s guild.
+105: No longer spying on the %s party.
+106: Spying on the %s party.
+107: All items have been repaired.
+108: No item need to be repaired.
+109: Player has been nuked!
+110: NPC Enabled.
+111: This NPC doesn't exist.
+112: NPC Disabled.
+113: %d item(s) removed by a GM.
+114: %d item(s) removed from the player.
+115: %d item(s) removed. Player had only %d on %d items.
+116: Character does not have the specified item.
+117: You have been jailed by a GM.
+118: Player warped to jail.
+119: This player is not in jail.
+120: A GM has discharged you from jail.
+121: Player unjailed.
+122: Disguise applied.
+123: Invalid Monster/NPC name/ID specified.
+124: Disguise removed.
+125: You're not disguised.
+//Clone Messages
+126: Cannot clone a player of higher GM level than yourself.
+127: You've reached your slave clones limit.
+128: Evil clone spawned.
+129: Unable to spawn evil clone.
+130: Clone spawned.
+131: Unable to spawn clone.
+132: Slave clone spawned.
+133: Unable to spawn slave clone.
+//134-136 FREE (possibly for other clone types)
+137: CvC: Off
+138: CvC: On
+139: CvC ON |
+140: You can't join in a clan if you're in a guild.
+141: CvC is already Off.
+142: CvC is already On.
+143: Commands are disabled in this map.
+144: Invalid e-mail. If your email hasn't been set, use a@a.com.
+145: Invalid new e-mail. Please enter a real e-mail address.
+146: New e-mail must be a real e-mail address.
+147: New e-mail must be different from the current e-mail address.
+148: Information sent to login-server via char-server.
+149: Impossible to increase the number/value.
+150: No GM found.
+151: 1 GM found.
+152: %d GMs found.
+153: %s is Unknown Command.
+154: %s failed.
+155: You are unable to change your job.
+156: HP or/and SP modified.
+157: HP and SP have already been recovered.
+158: Base level can't go any lower.
+159: Job level can't go any lower.
+160: PvP is already Off.
+161: PvP is already On.
+162: GvG is already Off.
+163: GvG is already On.
+//164 FREE
+165: All monsters killed!
+166: No item has been refined.
+167: 1 item has been refined.
+168: %d items have been refined.
+169: The item (%d: '%s') is not equippable.
+170: The item is not equippable.
+171: %d - void
+172: Speed returned to normal.
+173: Please enter a valid madogear type.
+174: Number of status points changed.
+175: Number of skill points changed.
+176: Current amount of zeny changed.
+177: You cannot decrease that stat anymore.
+178: You cannot increase that stat anymore.
+179: Guild level changed.
+180: The monster/egg name/ID doesn't exist.
+181: You already have a pet.
+182: Pet intimacy changed.
+183: Pet intimacy is already at maximum.
+184: Sorry, but you have no pet.
+185: Pet hunger changed.
+186: Pet hunger is already at maximum.
+187: You can now rename your pet.
+188: You can already rename your pet.
+//189-194 FREE
+195: All players have been kicked!
+196: You already have this quest skill.
+197: This skill number doesn't exist or isn't a quest skill.
+198: This skill number doesn't exist.
+//199-200 FREE
+201: You don't have this quest skill.
+//202-203 FREE
+204: You can't open a shop on this cell.
+205: Maybe you meant:
+206: '%s' skill points reset.
+207: '%s' stats points reset.
+208: '%s' skill and stat points have been reset.
+//209-211 FREE
+212: Cannot mount while in disguise.
+213: You need %s to mount!
+214: You have released your Peco Peco.
+215: Your class can't mount!
+//216-218 FREE
+219: %d day
+220: %d days
+221: %d hour
+222: %d hours
+223: %d minute
+224: %d minutes
+225: and %d second
+226: and %d seconds
+227: Party modification is disabled in this map.
+228: Guild modification is disabled in this map.
+229: Your effect has changed.
+230: Server time (normal time): %A, %B %d %Y %X.
+231: Game time: The game is in permanent daylight.
+232: Game time: The game is in permanent night.
+233: Game time: The game is in night for %s.
+//234 FREE
+235: Game time: The game is in daylight for %s.
+//236 FREE
+237: Game time: After, the game will be in night for %s.
+238: Game time: A day cycle has a normal duration of %s.
+239: Game time: After, the game will be in daylight for %s.
+240: %d monster(s) summoned!
+241: You can now attack and kill players freely.
+242: You can now be attacked and killed by players.
+243: Skills have been disabled in this map.
+244: Skills have been enabled in this map.
+245: Server Uptime: %ld days, %ld hours, %ld minutes, %ld seconds.
+246: Your GM level doesn't authorize you to perform this action.
+247: You are not authorized to warp to this map.
+248: You are not authorized to warp from your current map.
+249: You are not authorized to warp to your save map.
+250: You have already opened your storage. Close it first.
+251: You have already opened your guild storage. Close it first.
+252: You are not in a guild.
+253: You already are at your destination!
+254: GM command configuration has been reloaded.
+255: Battle configuration has been reloaded.
+256: Status database has been reloaded.
+257: Player database has been reloaded.
+258: Sent packet 0x%x (%d)
+259: Invalid packet
+260: This item cannot be traded.
+261: Script could not be loaded.
+262: Script loaded.
+263: This item cannot be dropped.
+264: This item cannot be stored.
+265: %s has bought your item(s).
+266: Some of your items cannot be vended and were removed from the shop.
+//267-268 FREE
+269: Displaying first %d out of %d matches
+//@me output format
+270: * :%s %s: *
+271: You can't drop items in this map
+272: You can't trade in this map
+273: Available commands:
+274: %d commands found.
+//275 FREE
+276: You can't open a shop in this map
+277: Usage: @request <petition/message to online GMs>.
+278: (@request): %s
+279: @request sent.
+280: Invalid name.
+281: You can't create chat rooms in this map
+//Party-related
+282: You need to be a party leader to use this command.
+283: Target character must be online and in your current party.
+284: Leadership transferred.
+285: You've become the party leader.
+286: There's been no change in the setting.
+287: You cannot change party leaders in this map.
+//Missing stuff for @killer related commands.
+288: You are no longer killable.
+//289-290 FREE
+291: Weather effects will disappear after teleporting or refreshing.
+292: Killer state reset.
+//Item Bind System
+293: This bound item cannot be traded to that character.
+294: This bound item cannot be stored there.
+295: Please enter an item name or ID (usage: @itembound <item name/ID> <quantity> <bound_type>).
+296: Please enter all parameters (usage: @itembound2 <item name/ID> <quantity>
+297: <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4> <bound_type>).
+298: Invalid bound type. Valid types are - 1:Account 2:Guild 3:Party 4:Character
+//299 FREE
+// Guild Castles Number
+// --------------------
+300: None Taken
+301: One Castle
+302: Two Castles
+303: Three Castles
+304: Four Castles
+305: Five Castles
+306: Six Castles
+307: Seven Castles
+308: Eight Castles
+309: Nine Castles
+310: Ten Castles
+311: Eleven Castles
+312: Twelve Castles
+313: Thirteen Castles
+314: Fourteen Castles
+315: Fifteen Castles
+316: Sixteen Castles
+317: Seventeen Castles
+318: Eighteen Castles
+319: Nineteen Castles
+320: Twenty Castles
+321: Twenty-One Castles
+322: Twenty-Two Castles
+323: Twenty-Three Castles
+324: Twenty-Four Castles
+325: Twenty-Five Castles
+326: Twenty-Six Castles
+327: Twenty-Seven Castles
+328: Twenty-Eight Castles
+329: Twenty-Nine Castles
+330: Thirty Castles
+331: Thirty-One Castles
+332: Thirty-Two Castles
+333: Thirty-Three Castles
+// 334: Thirty-Four Castles
+334: Total Domination
+
+//335-342 FREE
+
+// Templates for @who output
+343: Name: %s
+344: (%s)
+345: | Party: '%s'
+346: | Guild: '%s'
+//You may omit the last %s, then you won't see players job name
+347: | Lv:%d/%d | Job: %s
+//You may omit 2 last %d, then you won't see players coordinates, just map name
+348: | Location: %s %d %d
+//349 FREE
+
+// @duel
+350: Duel: You can't use @invite. You aren't a duelist.
+351: Duel: The limit of players has been reached.
+352: Duel: Player name not found.
+353: Duel: The Player is in the duel already.
+354: Duel: Invitation has been sent.
+355: Duel: You can't use @duel without @reject.
+356: Duel: You can take part in duel again after %d seconds.
+357: Duel: Invalid value.
+358: Duel: You can't use @leave. You aren't a duelist.
+359: Duel: You've left the duel.
+360: Duel: You can't use @accept without a duel invitation.
+361: Duel: The duel invitation has been accepted.
+362: Duel: You can't use @reject without a duel invitation.
+363: Duel: The duel invitation has been rejected.
+364: Duel: You can't invite %s because he/she isn't in the same map.
+365: Duel: Can't use %s in duel.
+// Stylist Shop
+366: Styling Shop
+367: <MSG>2949</MSG>
+368: <MSG>2950</MSG>
+//369 FREE
+370: -- Duels: %d/%d, Members: %d/%d, Max players: %d --
+371: -- Duels: %d/%d, Members: %d/%d --
+372: -- Duel has been created (Use @invite/@leave) --
+373: -- Player %s invites %s to duel --
+374: Blue -- Player %s invites you to PVP duel (Use @accept/@reject) --
+375: <- Player %s has left the duel --
+376: -> Player %s has accepted the duel --
+377: -- Player %s has rejected the duel --
+//378-385 FREE
+// Main chat
+386: %s :Main: %s
+//387-389 FREE
+//NoAsk
+390: Autorejecting is activated.
+391: Autorejecting is deactivated.
+392: You request has been rejected by autoreject option.
+393: Autorejected trade request from %s.
+394: Autorejected party invite from %s.
+395: Autorejected guild invite from %s.
+396: Autorejected alliance request from %s.
+397: Autorejected opposition request from %s.
+398: Autorejected friend request from %s.
+//399 FREE
+400: Usage: @jailfor <time> <character name>
+//401 FREE
+402: %s in jail for %d years, %d months, %d days, %d hours and %d minutes
+// WoE SE (@agitstart2)
+403: War of Emperium SE has been initiated.
+404: War of Emperium SE is currently in progress.
+405: War of Emperium SE has been ended.
+406: War of Emperium SE is currently not in progress.
+//407 FREE
+//chrif related
+408: Disconnecting to perform change-sex request...
+409: Your sex has been changed (disconnection required to complete the process)...
+//410-411 used by cash shop
+412: Your account is 'Unregistered'.
+413: Your account has an 'Incorrect Password'...
+414: Your account has expired.
+415: Your account has been rejected from server.
+416: Your account has been blocked by the GM Team.
+417: Your Game's EXE file is not the latest version.
+418: Your account has been prohibited to log in.
+419: Server is jammed due to overpopulation.
+420: Your account is no longer authorized.
+421: Your account has been totally erased.
+//422 FREE
+423: Your account has been banished until
+424: Login-server has been asked to %s the player '%.*s'.
+425: The player '%.*s' doesn't exist.
+426: Your GM level doesn't authorize you to %s the player '%.*s'.
+427: Login-server is offline. Impossible to %s the player '%.*s'.
+428: block
+429: ban
+430: unblock
+431: unban
+432: change the sex of
+433: This character has been banned until
+434: Char-server has been asked to %s the character '%.*s'.
+//435-448 FREE
+// Homunculus messages
+449: Homunculus Experience Gained Base:%u (%.2f%%)
+450: You already have a homunculus
+
+// Return pet to egg message
+451: You can't return your pet because your inventory is full.
+452: usage @camerainfo range rotation latitude
+
+// Refinary
+453: Refinery UI is not available
+
+// Battlegrounds
+454: Server : %s is leaving the battlefield...
+455: Server : %s has been afk-kicked from the battlefield...
+456: You are a deserter! Wait %u minute(s) before you can apply again
+457: You are a deserter! Wait %u seconds before you can apply again
+458: You can't reapply to this arena so fast. Apply to the different arena or wait %u minute(s)
+459: You can't reapply to this arena so fast. Apply to the different arena or wait %u seconds
+460: Can't apply: not enough members in your team/guild that have not entered the queue in individual mode, minimum is %d
+461: Can't apply: not enough members in your team/guild, minimum is %d
+462: Can't apply: not enough members in your team/party that have not entered the queue in individual mode, minimum is %d
+463: Can't apply: not enough members in your team/party, minimum is %d
+464: Server : %s has quit the game...
+// IRC
+465: [ #%s ] User IRC.%s left the channel. [Quit: %s]
+466: [ #%s ] User IRC.%s left the channel. [%s]
+467: [ #%s ] User IRC.%s is now known as IRC.%s
+468: [ #%s ] User IRC.%s joined the channel.
+// 469-497 FREE
+
+// Messages of others (not for GM commands)
+// ----------------------------------------
+
+// @itembound / @itembound2
+498: Cannot create bound pet eggs or pet armors.
+
+//499-500 FREE
+501: Your account time limit is: %d-%m-%Y %H:%M:%S.
+502: Day Mode is activated
+503: Night Mode is activated
+
+// Cash point change messages
+504: Used %d Kafra points and %d cash points. %d Kafra and %d cash points remaining.
+505: Gained %d cash points. Total %d points.
+506: Gained %d Kafra points. Total %d points.
+410: Removed %d cash points. Total %d points.
+411: Removed %d Kafra points. Total %d points.
+
+// Trade Spoof Messages
+507: This player has been banned for %d minute(s).
+508: This player hasn't been banned (Ban option is disabled).
+//509 FREE
+
+// mail system
+//----------------------
+510: You have %d new emails (%d unread)
+511: Inbox is full (Max %d). Delete some mails.
+// 512-537 FREE
+
+// Trade Spoof Messages
+538: Hack on trade: character '%s' (account: %d) try to trade more items that he has.
+539: This player has %d of a kind of item (id: %d), and tried to trade %d of them.
+540: This player has been definitively blocked.
+//541-543 FREE
+544: <MSG>3455</MSG>
+545: <MSG>3456,%d</MSG>
+// @showmobs
+546: Please enter a mob name/id (usage: @showmobs <mob name/id>)
+547: Invalid mob name %s!
+// @clearcart
+548: You can't clean a cart while vending!
+// @Autotrade
+549: You should have a shop open in order to use @autotrade.
+
+//550 -> 699: Job Names
+550: Novice
+551: Swordsman
+552: Magician
+553: Archer
+554: Acolyte
+555: Merchant
+556: Thief
+557: Knight
+558: Priest
+559: Wizard
+560: Blacksmith
+561: Hunter
+562: Assassin
+563: Crusader
+564: Monk
+565: Sage
+566: Rogue
+567: Alchemist
+568: Bard
+569: Dancer
+570: Wedding
+571: Super Novice
+572: Gunslinger
+573: Ninja
+574: Christmas
+575: High Novice
+576: High Swordsman
+577: High Magician
+578: High Archer
+579: High Acolyte
+580: High Merchant
+581: High Thief
+582: Lord Knight
+583: High Priest
+584: High Wizard
+585: Whitesmith
+//585: Mastersmith //iRO name
+586: Sniper
+587: Assassin Cross
+588: Paladin
+589: Champion
+590: Professor
+//590: Scholar //iRO name
+591: Stalker
+592: Creator
+//592: Biochemist //iRO Name
+593: Clown
+//593: Minstrel //iRO Name
+594: Gypsy
+595: Baby Novice
+596: Baby Swordsman
+597: Baby Magician
+598: Baby Archer
+599: Baby Acolyte
+600: Baby Merchant
+601: Baby Thief
+602: Baby Knight
+603: Baby Priest
+604: Baby Wizard
+605: Baby Blacksmith
+606: Baby Hunter
+607: Baby Assassin
+608: Baby Crusader
+609: Baby Monk
+610: Baby Sage
+611: Baby Rogue
+612: Baby Alchemist
+613: Baby Bard
+614: Baby Dancer
+615: Super Baby
+616: Taekwon
+617: Star Gladiator
+618: Soul Linker
+//619 FREE
+620: Unknown Job
+621: Summer
+622: Gangsi
+623: Death Knight
+624: Dark Collector
+625: Rune Knight
+626: Warlock
+627: Ranger
+628: Arch Bishop
+629: Mechanic
+630: Guillotine Cross
+631: Royal Guard
+632: Sorcerer
+633: Minstrel
+//633: Maestro //iRO Name
+634: Wanderer
+635: Sura
+636: Genetic
+//636: Geneticist //iRO Name
+637: Shadow Chaser
+638: Baby Rune Knight
+639: Baby Warlock
+640: Baby Ranger
+641: Baby Arch Bishop
+642: Baby Mechanic
+643: Baby Guillotine Cross
+644: Baby Royal Guard
+645: Baby Sorcerer
+646: Baby Minstrel
+647: Baby Wanderer
+648: Baby Sura
+649: Baby Genetic
+650: Baby Shadow Chaser
+651: Expanded Super Novice
+652: Expanded Super Baby
+653: Kagerou
+654: Oboro
+655: Rebellion
+
+656: Rune Knight T
+657: Warlock T
+658: Ranger T
+659: Arch Bishop T
+660: Mechanic T
+661: Guillotine Cross T
+662: Royal Guard T
+663: Sorcerer T
+664: Minstrel T
+665: Wanderer T
+666: Sura T
+667: Genetic T
+668: Shadow Chaser T
+669: Summoner
+
+//670-852 FREE (please start using from the top if you need, leave the 670+ range for new jobs)
+
+853: NoPet |
+// Mapflag to disable Autoloot Commands
+854: Auto loot item are disabled on this map.
+
+// MVP exp message issue clients 2013-12-23cRagexe and newer.
+855: Congratulations! You are the MVP! Your reward EXP Points are %u !!
+
+// MvP Tomb
+856: Tomb
+857: [ ^EE0000%s^000000 ]
+858: Has met its demise
+859: Time of death : ^EE0000%s^000000
+860: Defeated by
+861: [^EE0000%s^000000]
+
+// Etc messages from source
+862: You're too close to a NPC, you must be at least %d cells away from any NPC.
+863: Duel: Can't use this item in duel.
+864: You cannot use this command when dead.
+865: Can't create chat rooms in this area.
+866: Pets are disabled in this map.
+867: You're not dead.
+868: Your current memo positions are:
+869: You broke the target's weapon.
+870: You can't leave battleground guilds.
+871: Friend already exists.
+872: Name not found in list.
+873: This action can't be performed at the moment. Please try again later.
+874: Friend removed.
+875: Cannot send mails too fast!!
+876: Alliances cannot be made during Guild Wars!
+877: Alliances cannot be broken during Guild Wars!
+878: You are no longer the Guild Master.
+879: You have become the Guild Master!
+880: You have been recovered!
+881: Shop is out of stock! Come again later!
+
+// Frost Joker / Scream text for monster (MobName : SkillName !!)
+882: %s : %s !!
+// Cursed Circle
+883: You are too close to a stone or emperium to do this skill
+//
+884: Skill Failed. [%s] requires %dx %s.
+885: Removed %dz.
+886: Gained %dz.
+887: %s stole an Unknown Item (id: %i).
+888: %s stole %s.
+889: Experience Gained Base:%llu (%.2f%%) Job:%llu (%.2f%%)
+890: [KS Warning!! - Owner : %s]
+891: [Watch out! %s is trying to KS you!]
+892: Growth: hp:%d sp:%d str(%.2f) agi(%.2f) vit(%.2f) int(%.2f) dex(%.2f) luk(%.2f)
+893: [ Kill Steal Protection Disabled. KS is allowed in this map ]
+894: %s is in autotrade mode and cannot receive whispered messages.
+// 895 FREE
+896: Base EXP : %d%% | Base Drop: %d%% | Base Death Penalty: %d%%
+897: #%s '%s' joined
+898: #%s '%s' left
+// 899 FREE
+
+//------------------------------------
+// More atcommands message
+//------------------------------------
+
+// @send
+900: Usage:
+901: @send len <packet hex number>
+902: @send <packet hex number> {<value>}*
+903: Value: <type=B(default),W,L><number> or S<length>"<string>"
+904: Packet 0x%x length: %d
+905: Unknown packet: 0x%x
+906: Not a string:
+907: Not a hexadecimal digit:
+908: Unknown type of value in:
+
+// @rura
+909: Please enter a map (usage: @warp/@rura/@mapmove <mapname> <x> <y>).
+
+// @where
+910: Please enter a player name (usage: @where <char name>).
+
+// @jumpto
+911: Please enter a player name (usage: @jumpto/@warpto/@goto <char name/ID>).
+
+// @who
+912: (CID:%d/AID:%d)
+
+// @whogm
+913: Name: %s (GM)
+914: Name: %s (GM:%d) | Location: %s %d %d
+915: BLvl: %d | Job: %s (Lvl: %d)
+916: Party: '%s' | Guild: '%s'
+917: None
+
+// @speed
+918: Please enter a speed value (usage: @speed <%d-%d>).
+
+// @storage
+919: Storage opened.
+
+// @guildstorage
+920: Guild storage opened.
+
+// @option
+921: Please enter at least one option.
+
+//922 FREE
+
+// @jobchange
+923: You can not change to this job by command.
+
+// atcommand_setzone
+924: Usage: @setzone <zone name>
+925: The zone is already set to '%s'.
+926: Zone not found. Keep in mind that the names are CaSe SenSitiVe.
+927: Zone successfully changed from '%s' to '%s'.
+
+//928-978 FREE
+
+// @hatereset
+979: Reset 'Hatred' targets.
+
+// @kami
+980: Please enter a message (usage: @kami <message>).
+981: Please enter color and message (usage: @kamic <color> <message>).
+982: Invalid color.
+
+// @item
+983: Please enter an item name or ID (usage: @item <item name/ID> <quantity>).
+
+// @item2
+984: Please enter all parameters (usage: @item2 <item name/ID> <quantity>).
+985: <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4>).
+
+// @baselevelup
+986: Please enter a level adjustment (usage: @lvup/@blevel/@baselvlup <number of levels>).
+
+// @joblevelup
+987: Please enter a level adjustment (usage: @joblvup/@jlevel/@joblvlup <number of levels>).
+
+// @help
+988: There is no help for %c%s.
+989: Help for command %c%s:
+990: Available aliases:
+
+// @model
+991: Please enter at least one value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>).
+
+// @dye
+992: Please enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>).
+
+// @hairstyle
+993: Please enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>).
+
+// @haircolor
+994: Please enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>).
+
+//995 FREE
+
+// @refine - Part 1
+996: Please enter a position bitmask and an amount (usage: @refine <equip position> <+/- amount>).
+997: %d: Headgear (Low)
+998: %d: Hand (Right)
+999: %d: Garment
+1000: %d: Accessory (Left)
+1001: %d: Body Armor
+1002: %d: Hand (Left)
+1003: %d: Shoes
+1004: %d: Accessory (Right)
+1005: %d: Headgear (Top)
+1006: %d: Headgear (Mid)
+
+// @produce
+1007: Please enter at least one item name/ID (usage: @produce <equip name/ID> <element> <# of very's>).
+
+// @memo
+1008: Please enter a valid position (usage: @memo <memo_position:%d-%d>).
+
+// @displaystatus
+1009: Please enter a status type/flag (usage: @displaystatus <status type> <flag> <tick> {<val1> {<val2> {<val3>}}}).
+
+// @stpoint
+1010: Please enter a number (usage: @stpoint <number of points>).
+
+// @skpoint
+1011: Please enter a number (usage: @skpoint <number of points>).
+
+// @zeny
+1012: Please enter an amount (usage: @zeny <amount>).
+
+// @param
+1013: Please enter a valid value (usage: @str/@agi/@vit/@int/@dex/@luk <+/-adjustment>).
+
+// @guildlevelup
+1014: Please enter a valid level (usage: @guildlvup/@guildlvlup <# of levels>).
+
+// @makeeg
+1015: Please enter a monster/egg name/ID (usage: @makeegg <pet>).
+
+// @petfriendly
+1016: Please enter a valid value (usage: @petfriendly <0-1000>).
+
+// @pethungry
+1017: Please enter a valid number (usage: @pethungry <0-100>).
+
+// @recall
+1018: Please enter a player name (usage: @recall <char name/ID>).
+1019: You are not authorized to warp someone to this map.
+
+// @recall
+1020: You are not authorized to warp this player from their map.
+
+// @block
+1021: Please enter a player name (usage: @block <char name>).
+
+// @ban
+1022: Please enter ban time and a player name (usage: @ban <time> <char name>).
+1023: You are not allowed to reduce the length of a ban.
+
+// @unblock
+1024: Please enter a player name (usage: @unblock <char name>).
+
+// @unban
+1025: Please enter a player name (usage: @unban <char name>).
+
+// @kick
+1026: Please enter a player name (usage: @kick <char name/ID>).
+
+// @questskill / @lostskill
+1027: Please enter a quest skill ID.
+
+// @spiritball
+1028: Please enter an amount (usage: @spiritball <number: 0-%d>).
+
+// @party
+1029: Please enter a party name (usage: @party <party_name>).
+
+// @guild
+1030: Please enter a guild name (usage: @guild <guild_name>).
+
+// @idsearch
+1031: Please enter part of an item name (usage: @idsearch <part_of_item_name>).
+
+// @recallall / @guildrecall / @partyrecall
+1032: You are not authorized to warp someone to your current map.
+1033: Because you are not authorized to warp from some maps, %d player(s) have not been recalled.
+
+// @guildrecall
+1034: Please enter a guild name/ID (usage: @guildrecall <guild_name/ID>).
+
+// @partyrecall
+1035: Please enter a party name/ID (usage: @partyrecall <party_name/ID>).
+
+// @reloadatcommand
+1036: Error reading groups.conf, reload failed.
+1037: Error reading atcommand.conf, reload failed.
+
+// @mapinfo
+1038: Please enter at least one valid list number (usage: @mapinfo <0-3> <map>).
+1039: ------ Map Info ------
+1040: Map: %s (Zone:%s) | Players: %d | NPCs: %d | Chats: %d | Vendings: %d
+1041: ------ Map Flags ------
+1042: Town Map
+1043: Autotrade Enabled
+1044: Autotrade Disabled
+1045: Battlegrounds ON
+1046: PvP Flags:
+1047: Pvp ON |
+1048: NoGuild |
+1049: NoParty |
+1050: NightmareDrop |
+1051: NoCalcRank |
+1052: GvG Flags:
+1053: GvG ON |
+1054: GvG Dungeon |
+1055: GvG Castle |
+1056: NoParty |
+1057: Teleport Flags:
+1058: NoTeleport |
+1059: Monster NoTeleport |
+1060: NoWarp |
+1061: NoWarpTo |
+1062: NoReturn |
+1063: NoAutoloot |
+1064: NoMemo |
+1065: No Exp Penalty: %s | No Zeny Penalty: %s
+1066: On
+1067: Off
+1068: No Save (Return to last Save Point)
+1069: No Save, Save Point: %s,Random
+1070: No Save, Save Point: %s,%d,%d
+1071: Weather Flags:
+1072: Snow |
+1073: Fog |
+1074: Sakura |
+1075: Clouds |
+1076: Clouds2 |
+1077: Fireworks |
+1078: Leaves |
+1079: NoViewID |
+1080: Displays Night |
+1081: Other Flags:
+1082: NoBranch |
+1083: NoTrade |
+1084: NoVending |
+1085: NoDrop |
+1086: NoSkill |
+1087: NoIcewall |
+1088: AllowKS |
+1089: Reset |
+1090: Other Flags:
+1091: NoCommand |
+1092: NoBaseEXP |
+1093: NoJobEXP |
+1094: NoMobLoot |
+1095: NoMVPLoot |
+1096: PartyLock |
+1097: GuildLock |
+1098: ----- Players in Map -----
+1099: Player '%s' (session #%d) | Location: %d,%d
+1100: ----- NPCs in Map -----
+1101: North
+1102: North West
+1103: West
+1104: South West
+1105: South
+1106: South East
+1107: East
+1108: North East
+1109: North
+1110: Unknown
+1111: NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d
+1112: NPC %d: %s::%s | Direction: %s | Sprite: %d | Location: %d %d
+1113: ----- Chats in Map -----
+1114: Chat: %s | Player: %s | Location: %d %d
+1115: Users: %d/%d | Password: %s | Public: %s
+1116: Yes
+1117: No
+1118: Please enter at least one valid list number (usage: @mapinfo <0-3> <map>).
+
+// @mount
+1119: You have mounted your Dragon.
+1120: You have released your Dragon.
+1121: You have mounted your Warg.
+1122: You have released your Warg.
+1123: You have mounted your Mado Gear.
+1124: You have released your Mado Gear.
+
+// @guildspy
+1125: The mapserver has spy command support disabled.
+1126: Please enter a guild name/ID (usage: @guildspy <guild_name/ID>).
+
+// @partyspy
+1127: Please enter a party name/ID (usage: @partyspy <party_name/ID>).
+
+// @nuke
+1128: Please enter a player name (usage: @nuke <char name>).
+
+// @tonpc
+1129: Please enter a NPC name (usage: @tonpc <NPC_name>).
+
+// @enablenpc
+1130: Please enter a NPC name (usage: @enablenpc <NPC_name>).
+
+// @hidenpc
+1131: Please enter a NPC name (usage: @hidenpc <NPC_name>).
+
+// @loadnpc
+1132: Please enter a script file name (usage: @loadnpc <file name>).
+
+// @unloadnpc
+1133: Please enter a NPC name (Usage: @unloadnpc <NPC_name> {<flag>}).
+
+// @jail
+1134: Please enter a player name (usage: @jail <char_name>).
+
+// @unjail
+1135: Please enter a player name (usage: @unjail/@discharge <char_name>).
+
+// @jailfor
+1136: Invalid time for jail command.
+1137: You are now
+1138: This player is now
+
+// @jailtime
+1139: You are not in jail.
+1140: You have been jailed indefinitely.
+1141: You have been jailed for an unknown amount of time.
+1142: You will remain
+
+// @disguise
+1143: Please enter a Monster/NPC name/ID (usage: @disguise <name/ID>).
+1144: Character cannot be disguised while mounted.
+
+// @disguiseall
+1145: Please enter a Monster/NPC name/ID (usage: @disguiseall <name/ID>).
+
+// @disguiseguild
+1146: Please enter a mob name/ID and guild name/ID (usage: @disguiseguild <mob name/ID>, <guild name/ID>).
+
+// @undisguiseguild
+1147: Please enter guild name/ID (usage: @undisguiseguild <guild name/ID>).
+
+// @exp
+1148: Base Level: %d (%.3f%%) | Job Level: %d (%.3f%%)
+
+// @broadcast
+1149: Please enter a message (usage: @broadcast <message>).
+
+// @localbroadcast
+1150: Please enter a message (usage: @localbroadcast <message>).
+
+// @email
+1151: Please enter two e-mail addresses (usage: @email <current@email> <new@email>).
+
+// @effect
+1152: Please enter an effect number (usage: @effect <effect number>).
+
+// @npcmove
+1153: Usage: @npcmove <X> <Y> <npc_name>
+1154: NPC is not in this map.
+1155: NPC moved.
+
+// @addwarp
+1156: Usage: @addwarp <mapname> <X> <Y> <npc name>
+1157: Unknown map '%s'.
+1158: New warp NPC '%s' created.
+
+// @follow
+1159: Follow mode OFF.
+1160: Follow mode ON.
+
+// @storeall
+1161: You currently cannot open your storage.
+1162: All items stored.
+
+// @skillid
+1163: Please enter a skill name to look up (usage: @skillid <skill name>).
+1164: skill %d: %s (%s)
+
+// @useskill
+1165: Usage: @useskill <skill ID> <skill level> <target>
+
+// @displayskill
+1166: Usage: @displayskill <skill ID> {<skill level>}
+
+// @skilltree
+1167: Usage: @skilltree <skill ID> <target>
+1168: Player is using %s skill tree (%d basic points).
+1169: The player cannot use that skill.
+1170: Player requires level %d of skill %s.
+1171: The player meets all the requirements for that skill.
+
+// @marry
+1172: Usage: @marry <char name>
+1173: They are married... wish them well.
+1174: The two cannot wed because one is either a baby or already married.
+
+// @divorce
+1175: '%s' is not married.
+1176: '%s' and his/her partner are now divorced.
+
+// @changelook
+1177: Usage: @changelook {<position>} <view id>
+1178: Position: 1:Top 2:Middle 3:Bottom 4:Weapon 5:Shield 6:Shoes 7:Robe 8:Body
+
+// @autotrade
+1179: Autotrade is not allowed in this map.
+1180: You cannot autotrade when dead.
+
+// @changegm
+1181: You need to be a Guild Master to use this command.
+1182: You cannot change guild leaders in this map.
+1183: Usage: @changegm <guild_member_name>
+1184: Target character must be online and be a guild member.
+
+// @changeleader
+1185: Usage: @changeleader <party_member_name>
+
+// @partyoption
+1186: Usage: @partyoption <pickup share: yes/no> <item distribution: yes/no>
+
+// @autoloot
+1187: Autolooting items with drop rates of %0.02f%% and below.
+1188: Autoloot is now off.
+
+// @autolootitem
+1189: Item not found.
+1190: You're already autolooting this item.
+1191: Your autolootitem list is full. Remove some items first with @autolootid -<item name or ID>.
+1192: Autolooting item: '%s'/'%s' {%d}
+1193: You're currently not autolooting this item.
+1194: Removed item: '%s'/'%s' {%d} from your autolootitem list.
+1195: You can have %d items on your autolootitem list.
+1196: To add an item to the list, use "@alootid +<item name or ID>". To remove an item, use "@alootid -<item name or ID>".
+1197: "@alootid reset" will clear your autolootitem list.
+1198: Your autolootitem list is empty.
+1199: Items on your autolootitem list:
+1200: Your autolootitem list has been reset.
+
+// @guildstorage
+1201: Your guild's storage has already been opened by another member, try again later.
+
+//1202 FREE
+
+// @snow
+1203: Snow has stopped falling.
+1204: It has started to snow.
+
+// @sakura
+1205: Cherry tree leaves no longer fall.
+1206: Cherry tree leaves have begun to fall.
+
+// @clouds
+1207: Clouds have disappeared.
+1208: Clouds appeared.
+
+// @clouds2
+1209: Alternative clouds have disappeared.
+1210: Alternative clouds appeared.
+
+// @fog
+1211: The fog has gone.
+1212: Fog hangs over.
+
+// @leaves
+1213: Leaves have stopped falling.
+1214: Leaves started falling.
+
+// @fireworks
+1215: Fireworks have ended.
+1216: Fireworks are launched.
+
+// @sound
+1217: Please enter a sound filename (usage: @sound <filename>).
+
+// @mobsearch
+1218: Please enter a monster name (usage: @mobsearch <monster name>).
+1219: Invalid mob ID %s!
+1220: Mob Search... %s %s
+
+// @cleanmap
+1221: All dropped items have been cleaned up.
+
+// @npctalk
+1222: Please enter the correct parameters (usage: @npctalk <npc name>, <message>).
+1223: Please enter the correct parameters (usage: @npctalkc <color> <npc name>, <message>).
+
+// @pettalk
+1224: Please enter a message (usage: @pettalk <message>).
+
+// @summon
+1225: Please enter a monster name (usage: @summon <monster name> {duration}).
+
+// @adjgroup
+1226: Usage: @adjgroup <group_id>
+1227: Specified group does not exist.
+1228: Group changed successfully.
+1229: Your group has been changed.
+
+// @trade
+1230: Please enter a player name (usage: @trade <char name>).
+
+// @setbattleflag
+1231: Usage: @setbattleflag <flag> <value>
+1232: Unknown battle_config flag.
+1233: Set battle_config as requested.
+
+// @unmute
+1234: Please enter a player name (usage: @unmute <char name>).
+1235: Player is not muted.
+1236: Player unmuted.
+
+// @mute
+1237: Usage: @mute <time> <char name>
+
+// @identify
+1238: There are no items to appraise.
+
+// @mobinfo
+1239: Please enter a monster name/ID (usage: @mobinfo <monster_name_or_monster_ID>).
+1240: MVP Monster: '%s'/'%s'/'%s' (%d)
+1241: Monster: '%s'/'%s'/'%s' (%d)
+1242: Lv:%d HP:%d Base EXP:%u Job EXP:%u HIT:%d FLEE:%d
+1243: DEF:%d MDEF:%d STR:%d AGI:%d VIT:%d INT:%d DEX:%d LUK:%d
+1244: ATK:%d~%d Range:%d~%d~%d Size:%s Race: %s Element: %s (Lv:%d)
+1245: Drops:
+1246: This monster has no drops.
+1247: MVP Bonus EXP:%u
+1248: MVP Items:
+1249: This monster has no MVP prizes.
+
+// @showmobs
+1250: Invalid mob id %s!
+1251: Can't show boss mobs!
+1252: Mob Search... %s %s
+
+// @homlevel
+1253: Please enter a level adjustment (usage: @homlevel <number of levels>).
+
+// @homlevel / @homevolve / @homfriendly / @homhungry / @homtalk / @hominfo / @homstats
+1254: You do not have a homunculus.
+
+// @homevolve
+1255: Your homunculus doesn't evolve.
+
+// @makehomun
+1256: Please enter a homunculus ID (usage: @makehomun <homunculus id>).
+1257: Invalid Homunculus ID.
+
+// @homfriendly
+1258: Please enter an intimacy value (usage: @homfriendly <intimacy value [0-1000]>).
+
+// @homhungry
+1259: Please enter a hunger value (usage: @homhungry <hunger value [0-100]>).
+
+// @homtalk
+1260: Please enter a message (usage: @homtalk <message>).
+
+// @hominfo
+1261: Homunculus stats:
+1262: HP: %d/%d - SP: %d/%d
+1263: ATK: %d - MATK: %d~%d
+1264: Hungry: %d - Intimacy: %u
+1265: Stats: Str %d / Agi %d / Vit %d / Int %d / Dex %d / Luk %d
+
+// @homstats
+1266: Homunculus growth stats (Lv %d %s):
+1267: Max HP: %d (%d~%d)
+1268: Max SP: %d (%d~%d)
+1269: Str: %d (%d~%d)
+1270: Agi: %d (%d~%d)
+1271: Vit: %d (%d~%d)
+1272: Int: %d (%d~%d)
+1273: Dex: %d (%d~%d)
+1274: Luk: %d (%d~%d)
+
+// @homshuffle
+1275: Homunculus stats altered.
+
+// @iteminfo
+1276: Please enter an item name/ID (usage: @ii/@iteminfo <item name/ID>).
+1277: Item: '%s'/'%s'[%d] (%d) Type: %s | Extra Effect: %s
+1278: None
+1279: With script
+1280: NPC Buy:%dz, Sell:%dz | Weight: %.1f
+1281: - Available in shops only.
+1282: - Maximal monsters drop chance: %02.02f%%
+1283: - Monsters don't drop this item.
+
+// @whodrops
+1284: Please enter item name/ID (usage: @whodrops <item name/ID>).
+1285: Item: '%s'[%d]
+1286: - Item is not dropped by any mobs.
+1287: - Common mobs with highest drop chance (only max %d are listed):
+
+// @whereis
+1288: Please enter a monster name/ID (usage: @whereis <monster_name_or_monster_ID>).
+1289: %s spawns in:
+1290: This monster does not spawn normally.
+
+// @mobinfo ...
+1291: ATK:%d~%d MATK:%d~%d Range:%d~%d~%d Size:%s Race: %s Element: %s (Lv:%d)
+
+1292: PrivateAirshipStartable |
+1293: PrivateAirshipEndable |
+//1294 used by hercules chat feature
+
+// @version
+1295: %s revision '%s' (src) / '%s' (scripts)
+1296: Hercules %d-bit for %s
+
+// @mutearea
+1297: Please enter a time in minutes (usage: @mutearea/@stfu <time in minutes>).
+
+// @rates
+1298: Experience rates: Base %.2fx / Job %.2fx
+1299: Normal Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
+1300: Boss Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
+1301: Other Drop Rates: MvP %.2fx / Card-Based %.2fx / Treasure %.2fx
+
+// @me
+1302: Please enter a message (usage: @me <message>).
+
+// @size / @sizeall / @sizeguild
+1303: Size change applied.
+
+// @sizeguild
+1304: Please enter guild name/ID (usage: @sizeguild <size> <guild name/ID>).
+
+// @monsterignore
+1305: You are now immune to attacks.
+1306: Returned to normal state.
+
+// @fakename
+1307: Returned to real name.
+1308: You must enter a name.
+1309: Fake name must be at least two characters.
+1310: Fake name enabled.
+
+// @mapflag
+1311: Enabled Mapflags in this map:
+1312: Usage: "@mapflag monster_noteleport 1" (0=Off | 1=On)
+1313: Type "@mapflag available" to list the available mapflags.
+1314: Invalid flag name or flag.
+1315: Available Flags:
+
+// @showexp
+1316: Gained exp will not be shown.
+1317: Gained exp is now shown.
+
+// @showzeny
+1318: Gained zeny will not be shown.
+1319: Gained zeny is now shown.
+
+// @showdelay
+1320: Skill delay failures will not be shown.
+1321: Skill delay failures are now shown.
+
+// @cash
+1322: Please enter an amount.
+
+// @clone
+1323: You must enter a player name or ID.
+
+// @feelreset
+1324: Reset 'Feeling' maps.
+
+// @noks
+1325: [ K.S Protection Inactive ]
+1326: [ K.S Protection Active - Option: Party ]
+1327: [ K.S Protection Active - Option: Self ]
+1328: [ K.S Protection Active - Option: Guild ]
+1329: Usage: @noks <self|party|guild>
+
+// @allowks
+1330: [ Map K.S Protection Active ]
+1331: [ Map K.S Protection Inactive ]
+
+// @itemlist
+1332: ------ %s items list of '%s' ------
+1333: | equipped:
+1334: garment,
+1335: left accessory,
+1336: body/armor,
+1337: right hand,
+1338: left hand,
+1339: both hands,
+1340: feet,
+1341: right accessory,
+1342: lower head,
+1343: top head,
+1344: lower/top head,
+1345: mid head,
+1346: lower/mid head,
+1347: lower/mid/top head,
+1348: -> (pet egg, pet id: %u, named)
+1349: -> (pet egg, pet id: %u, unnamed)
+1350: -> (crafted item, creator id: %u, star crumbs %d, element %d)
+1351: -> (produced item, creator id: %u)
+1352: -> (card(s):
+1353: No item found in this player's %s.
+1354: %d item(s) found in %d %s slots.
+
+// @delitem
+1355: Please enter an item name/ID, a quantity, and a player name (usage: #delitem <player> <item_name_or_ID> <quantity>).
+
+// @font
+1356: Returning to normal font.
+1357: Use @font <1-9> to change your message font.
+1358: Use 0 or no parameter to return to normal font.
+1359: Invalid font. Use a value from 0 to 9.
+1360: Font changed.
+1361: Already using this font.
+
+// @new_mount
+1362: NOTICE: If you crash with mount your LUA is outdated.
+1363: You have mounted.
+1364: You have released your mount.
+
+// @accinfo
+1365: Usage: @accinfo/@accountinfo <account_id/char name>
+1366: You may search partial name by making use of '%' in the search, ex. "@accinfo %Mario%" lists all characters whose name contains "Mario".
+
+// @set
+1367: Usage: @set <variable name> <value>
+1368: Usage: ex. "@set PoringCharVar 50"
+1369: Usage: ex. "@set PoringCharVarSTR$ Super Duper String"
+1370: Usage: ex. "@set PoringCharVarSTR$" outputs its value, Super Duper String.
+1371: NPC variables may not be used with @set.
+1372: Instance variables may not be used with @set.
+1373: %s value is now :%d
+1374: %s value is now :%s
+1375: %s is empty
+1376: %s data type is not supported :%u
+
+// @reloadquestdb
+1377: Quest database has been reloaded.
+
+// @addperm
+1378: Usage: %s <permission_name>
+1379: -- Permission List
+1380: '%s' is not a known permission.
+1381: User '%s' already possesses the '%s' permission.
+1382: User '%s' doesn't possess the '%s' permission.
+1383: -- User '%s' Permissions
+1384: User '%s' permissions updated successfully. The changes are temporary.
+
+// @unloadnpcfile
+1385: Usage: @unloadnpcfile <path> {<flag>}
+1386: File unloaded. Be aware that some changes made by NPC are not reverted on unload. See doc/atcommands.txt for details.
+1387: File not found.
+
+// General command messages
+1388: Charcommand failed (usage: %c<command> <char name> <parameters>).
+1389: %s failed. Player not found.
+
+// @cart
+1390: Unknown Cart (usage: %s <0-%d>).
+1391: You do not possess a cart to be removed
+1392: Cart Added.
+
+// atcommand.c::is_atcommand
+1393: You can't use commands while dead.
+
+// @clearstorage
+1394: Your storage was cleaned.
+1395: Your guild storage was cleaned.
+
+// @clearcart
+1396: You do not have a cart to be cleaned.
+1397: Your cart was cleaned.
+
+// @skillid (extension)
+1398: -- Displaying first %d partial matches
+
+// @join
+1399: Unknown Channel (usage: %s <#channel_name>)
+1400: Unknown Channel '%s' (usage: %s <#channel_name>)
+1401: '%s' Channel is password protected (usage: %s <#channel_name> <password>)
+//1402 used by hercules chat feature
+1403: You're now in the '%s' channel
+
+// Hercules Chat Feature
+1402: You're not in that channel, type '@join <#channel_name>'
+1435: You're now in the '#%s' channel for '%s'
+1436: You're already in the '%s' channel
+1294: You're not allowed to talk on this channel
+
+// @channel
+1404: %s failed
+1405: Channel name must start with a '#'
+1406: Channel length must be between 3 and %d
+1407: Channel '%s' is not available
+1408: Channel password may not contain spaces
+1409: - #%s ( %d users )
+1410: -- Public Channels
+1411: Unknown color '%s'
+1412: You're not the owner of channel '%s'
+1413: '%s' channel color updated to '%s'
+1414: --- Available options:
+1415: -- %s create <channel name> <channel password>
+1416: - creates a new channel
+1417: -- %s list
+1418: - lists public channels
+1419: -- %s list colors
+1420: - lists colors available to select for custom channels
+1421: -- %s setcolor <channel name> <color name>
+1422: - changes <channel name> color to <color name>
+1423: -- %s leave <channel name>
+1424: - leaves <channel name>
+1425: You're not part of the '%s' channel
+1426: You've left the '%s' channel
+1427: -- %s bindto <channel name>
+1428: - binds your global chat to <channel name>, making anything you type in global be sent to the channel
+1429: -- %s unbind
+1430: - unbinds your global chat from its attached channel (if bound)
+1431: Your global chat is now bound to the '%s' channel
+1432: Your global chat is not bound to any channel
+1433: Your global chat is no longer bound to the '#%s' channel
+1434: Player '%s' was not found
+//1435-1436 used by hercules chat feature
+1437: Player '%s' has now been banned from the '%s' channel
+1438: You cannot join the '%s' channel because you've been banned from it
+1439: Channel '%s' has no banned players
+1440: Player '%s' is not banned from this channel
+1441: Player '%s' has now been unbanned from the '%s' channel
+1442: Removed all bans from the '%s' channel
+1443: -- '%s' ban list
+1444: - %s
+1445: - %s (%d)
+1446: You need to input a option
+1447: '%s' is not a known channel option
+1448: -- Available options
+1449: option '%s' is already enabled, if you'd like to disable it type '@channel opt %s 0'
+1450: option '%s' is now enabled for channel '%s'
+1451: value '%d' for option '%s' is out of range (limit is 0-%d)
+1452: option '%s' is now enabled for channel '%s' with %d seconds
+1453: option '%s' is now disabled for channel '%s'
+1454: option '%s' is not enabled on channel '%s'
+1455: You cannot send a message to this channel for another %d seconds.
+1456: -- %s ban <channel name> <character name>
+1457: - bans <character name> from <channel name> channel
+1458: -- %s banlist <channel name>
+1459: - lists all banned characters from <channel name> channel
+1460: -- %s unban <channel name> <character name>
+1461: - unbans <character name> from <channel name> channel
+1462: -- %s setopt <channel name> <option name> <option value>
+1463: - adds or removes <option name> with <option value> to <channel name> channel
+1464: Ban failed, it is not possible to ban this user.
+1465: Player '%s' is already banned from this channel
+1466: For '%s' you need the amount of seconds (from 0 to 10)
+1467: -- %s unbanall <channel name>
+1468: - unbans everyone from <channel name>
+
+// @costume
+1469: '%s' is not a known costume
+1470: You're already with a '%s' costume, type '@costume' to remove it.
+1471: -- %s
+1472: - Available Costumes
+1473: Costume '%s' removed.
+
+//src/map/pc.c::pc_isUseitem
+1474: You cannot use this item while sitting
+1475: You cannot use this item while your storage is open
+
+1476: You are already mounting something else
+
+//src/map/pc.c::pc_isUseitem
+1477: Item cannot be opened when inventory is full
+
+//@homlv
+1478: Homunculus reached its maximum level of '%d'
+
+//src/map/clif.c::clif_parse_GlobalMessage
+1479: Dear angel, can you hear my voice?
+1480: I am %s Super Novice~
+1481: Help me out~ Please~ T_T
+
+//Banking
+1482: You can't withdraw that much money
+1483: Banking is disabled
+
+//src/map/atcommand.c::ACMD(auction)
+1484: Auction is disabled
+
+//1485: FREE
+
+//Monster Transformation
+1486: Cannot transform into monster while in disguise.
+1487: Character cannot be disguised while in monster form.
+1488: Transforming into monster is not allowed in Guild Wars.
+
+//CashShop mapflag
+1489: Cash Shop is disabled in this map
+
+// @autoloottype
+1490: You're already autolooting this item type.
+1491: Item type not found.
+1492: Autolooting item type: '%s'
+1493: You're currently not autolooting this item type.
+1494: Removed item type: '%s' from your autoloottype list.
+1495: Your autoloottype list is empty.
+1496: Item types on your autoloottype list:
+1497: Your autoloottype list has been reset.
+
+//Item Bind
+1498: You can't add a party bound item to a character without party!
+1499: You can't add a guild bound item to a character without guild!
+
+// @dropall
+1500: Usage: @dropall {<type>}
+1501: Type List: (default) all = -1, healing = 0, usable = 2, etc = 3, weapon = 4, armor = 5, card = 6, petegg = 7, petarmor = 8, ammo = 10, delayed-consumable = 11, cash = 18
+1502: %d items are dropped (%d skipped)!
+
+// @refine - Part 2
+1503: %d: Costume Headgear (Top)
+1504: %d: Costume Headgear (Mid)
+1505: %d: Costume Headgear (Low)
+1506: %d: Costume Garment
+1507: %d: Shadow Armor
+1508: %d: Shadow Weapon
+1509: %d: Shadow Shield
+1510: %d: Shadow Shoes
+1511: %d: Shadow Accessory (Right)
+1512: %d: Shadow Accessory (Left)
+1513: %d: Refine All Equip (General)
+1514: %d: Refine All Equip (Costume)
+1515: %d: Refine All Equip (Shadow)
+
+// @reloadnpc
+1516: Usage: @reloadnpc <path> {<flag>}
+1517: Script could not be unloaded.
+
+// File name validation
+1518: Not a file.
+1519: Can't open file.
+
+//Custom translations
+import: conf/import/msg_conf.txt
diff --git a/conf/network.conf b/conf/network.conf
new file mode 100644
index 00000000..b355acb2
--- /dev/null
+++ b/conf/network.conf
@@ -0,0 +1,37 @@
+// Network configuration file
+
+/*
+ * List here any LAN subnets this server is in.
+ * Example:
+ * - char- (or map-) server's IP in LAN is 192.168.0.10
+ * - Public IP is 198.51.100.37
+ * If the list contains "192.168.0.10:255.255.255.0", any clients connecting
+ * from the same 192.168.0.0/24 network will be presented with the LAN IP
+ * (192.168.0.10) in the server list, rather than the public IP (198.51.100.37).
+ */
+lan_subnets: (
+ "127.0.0.1:255.0.0.0",
+ // "192.168.1.1:255.255.255.0",
+)
+
+/*
+ * List here any IP ranges a char- or map-server can connect from.
+ * A wildcard of "0.0.0.0:0.0.0.0" means that server connections are allowed
+ * from ANY IP. (not recommended).
+ */
+allowed: (
+ "0.0.0.0:0.0.0.0",
+ // "127.0.0.1:255.0.0.0",
+)
+
+/*
+ * List here any IP ranges a char- or map-server can connect from. These ranges
+ * will also be excluded from the automatic ipban in casee of password failure.
+ * Any entry present in this list is also automatically included in the
+ * allowed IP list.
+ * Note: This may be a security threat. Only edit this list if you know what
+ * you are doing.
+ */
+trusted: (
+ "127.0.0.1:255.0.0.0",
+)
diff --git a/conf/plugins.conf b/conf/plugins.conf
new file mode 100644
index 00000000..9084cfbb
--- /dev/null
+++ b/conf/plugins.conf
@@ -0,0 +1,41 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//====================================================
+//== Topic Discussion ================================
+//== http://herc.ws/board/topic/549-introducing-hercules-plugin-manager/
+//====================================================
+//== Description =====================================
+//The plugin system allows you to create customized scripts
+//outside of the source. These scripts won't conflict with any
+//future source updates - think of it as a /conf/import/ for the source.
+//====================================================
+
+/* --------------- Format ---------------
+After you have listed your plugin(s) in "quotations",
+you need to put in a comma, to separate the plugins.
+-----------------------------------------
+plugins_list: [
+ "example",
+ "other",
+]
+-----------------------------------------
+Please note that your scripts need to be saved
+in the .c (source code) extension and placed in the /src/plugin/ folder.
+-----------------------------------------
+*/
+plugins_list: [
+ /* Enable HPMHooking when plugins in use rely on Hooking */
+ "HPMHooking",
+ //"db2sql",
+ "libevol_char",
+ "libevol_login",
+ "libevol_map",
+ //"other",
+]
diff --git a/conf/readme.txt b/conf/readme.txt
new file mode 100644
index 00000000..3323b568
--- /dev/null
+++ b/conf/readme.txt
@@ -0,0 +1,22 @@
+What is the import folder for?
+-------------------------------------------------------------------------------
+
+The folder provides a way for you to change your config settings without having
+to update the files every time you update your server. You store your changes,
+and the rest is updated with Hercules (usually though GIT).
+
+How does this work?
+-------------------------------------------------------------------------------
+
+Place only the settings you have changed in the import files.
+For example, if you want to change a value in conf/battle/exp.conf:
+
+ // Rate at which exp. is given. (Note 2)
+ base_exp_rate: 700
+
+You could instead copy the setting into conf/import/battle_conf.txt,
+and you'll eliminate any problems updating in the future.
+
+Neat, isn't it?
+
+- Semi-guide by Ajarn / Euphy
diff --git a/db/.editorconfig b/db/.editorconfig
new file mode 100644
index 00000000..e189ab1b
--- /dev/null
+++ b/db/.editorconfig
@@ -0,0 +1,7 @@
+# editorconfig for the libconfig files
+
+[*.conf]
+end_of_line = lf
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = tab
diff --git a/db/GeoIP.dat b/db/GeoIP.dat
new file mode 100644
index 00000000..18e34837
--- /dev/null
+++ b/db/GeoIP.dat
Binary files differ
diff --git a/db/abra_db.txt b/db/abra_db.txt
new file mode 100644
index 00000000..92c0e83a
--- /dev/null
+++ b/db/abra_db.txt
@@ -0,0 +1,14 @@
+// Hocus-Pocus (Abrakadabra) Castable Skills Database
+//
+// Structure of Database:
+// SkillID,DummyName,RequiredHocusPocusLevel,Rate
+//
+// 01. SkillID Skill ID to be casted by hocus pocus.
+// 02. DummyName Name of the skill (informative, not used by server).
+// 03. RequiredHocusPocusLevel Minimum skill level of hocus pocus for the current skill to be selected.
+// 04. Rate Chance at which a skill is selected (1 = 0.01%, 10000 = 100%).
+//
+// NOTE: The skill is picked at random from the entire database and then tested for rate. If it
+// does not succeed at that rate, another skill is picked and tested. This continues
+// until a skill succeeds.
+//====================================================
diff --git a/db/achievement_rank_db.conf b/db/achievement_rank_db.conf
new file mode 100644
index 00000000..e19194fa
--- /dev/null
+++ b/db/achievement_rank_db.conf
@@ -0,0 +1,43 @@
+//================= Hercules Database ==========================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ====================================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//==============================================================================
+//= Achievement Rank Database
+//==============================================================================
+
+achievement_rank_db:
+{
+ Rank1: 18
+ Rank2: 31
+ Rank3: 49
+ Rank4: 73
+ Rank5: 135
+ Rank6: 104
+ Rank7: 140
+ Rank8: 214
+ Rank9: 305
+ Rank10: 257
+ Rank11: 300
+}
diff --git a/db/attendance_db.conf b/db/attendance_db.conf
new file mode 100644
index 00000000..683a1701
--- /dev/null
+++ b/db/attendance_db.conf
@@ -0,0 +1,119 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018 Hercules Dev Team
+//= Copyright (C) 2018 Asheraf
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+
+attendance_db:(
+/**************************************************************************
+************* Entry structure *********************************************
+***************************************************************************
+{
+ // ================ Mandatory fields ==============================
+ ItemID: Item Constant (string)
+ Amount: Item Amount (int)
+},
+**************************************************************************/
+{
+ ItemID: "Acorn"
+ Amount: 1
+},
+{
+ ItemID: "Acorn"
+ Amount: 2
+},
+{
+ ItemID: "Acorn"
+ Amount: 3
+},
+{
+ ItemID: "Acorn"
+ Amount: 4
+},
+{
+ ItemID: "Acorn"
+ Amount: 5
+},
+{
+ ItemID: "Acorn"
+ Amount: 6
+},
+{
+ ItemID: "Acorn"
+ Amount: 7
+},
+{
+ ItemID: "Acorn"
+ Amount: 8
+},
+{
+ ItemID: "Acorn"
+ Amount: 9
+},
+{
+ ItemID: "Acorn"
+ Amount: 10
+},
+{
+ ItemID: "Acorn"
+ Amount: 11
+},
+{
+ ItemID: "Acorn"
+ Amount: 12
+},
+{
+ ItemID: "Acorn"
+ Amount: 13
+},
+{
+ ItemID: "Acorn"
+ Amount: 14
+},
+{
+ ItemID: "Acorn"
+ Amount: 15
+},
+{
+ ItemID: "Acorn"
+ Amount: 16
+},
+{
+ ItemID: "Acorn"
+ Amount: 17
+},
+{
+ ItemID: "Acorn"
+ Amount: 18
+},
+{
+ ItemID: "Acorn"
+ Amount: 19
+},
+{
+ ItemID: "Acorn"
+ Amount: 20
+}
+)
diff --git a/db/cashshop_db.conf b/db/cashshop_db.conf
new file mode 100644
index 00000000..a47c5a5a
--- /dev/null
+++ b/db/cashshop_db.conf
@@ -0,0 +1,26 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//================= More Information =================
+//= http://herc.ws/board/topic/367-introducing-cash-shop-support/
+//====================================================
+// This file handles the entire Cashshop. You can simply
+// add in any amount of items you like within each category.
+// Please keep in mind that the Cashshop does not work
+// with ragexere clients.
+// Categories can be empty or even missing, but, if
+// present, their names must be kept as cat_<n>, where
+// <n> is a valid tab index, as descripbed in 'enum
+// CASH_SHOP_TABS' in clif.c (normally 0 through 7)
+//====================================================
+
+cash_shop: (
+{
+}
+)
diff --git a/db/castle_db.conf b/db/castle_db.conf
new file mode 100644
index 00000000..ce43ce68
--- /dev/null
+++ b/db/castle_db.conf
@@ -0,0 +1,53 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2019-2020 Hercules Dev Team
+//= Copyright (C) 2019 Asheraf
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Castle Database
+//=========================================================================
+
+castle_db: (
+/**************************************************************************
+************* Entry structure *********************************************
+***************************************************************************
+{
+ // ================ Mandatory fields ==============================
+ CastleID: (int) Unique ID of the castle. Must remain unique across all map-servers.
+ MapName: (string) Map name to be considered as the castle map.
+ CastleName: (string) Name of the castle (used by scripts and guardian name tags)
+ OnGuildBreakEventName: (string) NPC unique name to invoke ::OnGuildBreak on, when a occupied
+ castle is abandoned during guild break.
+ // ================ Optional fields ===============================
+ SiegeType: (string, default to SIEGE_TYPE_FE) define siege type
+ EnableClientWarp: (bool, default to false) enable or disable client teleport features
+ ClientWarp: {
+ Position: (int, int) x, y position of warp request
+ ZenyCost: (int) The zeny cost of warp
+ ZenyCostSiegeTime: (int) The zeny cost of warp durring woe
+ }
+},
+**************************************************************************/
+
+)
diff --git a/db/clans.conf b/db/clans.conf
new file mode 100644
index 00000000..cd7339a6
--- /dev/null
+++ b/db/clans.conf
@@ -0,0 +1,137 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2017 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Clan System Database File.
+//=========================================================================
+
+clans: (
+ /**************************************************************************
+ ************* Entry structure *********************************************
+ ***************************************************************************
+ {
+ Id: ID (int)
+ Const: "Const Name" (string)
+ Name: "Clan Name" (string)
+ Leader: "Leader Name" (string)
+ Map: "Map Name" (string)
+ MaxMembers: Max (int, optional, overrides MaxMembers on conf/clans.conf)
+ KickTime: Hours (int, optional, overrides InactivityKickTime)
+ CheckTime: Hours (int, optional, overrides InactivityCheckTime)
+ Buff: {
+ Icon: State Icon ID/Constant (int, you can find all ids on your lua folder: stateicon/efstids.lub or /src/map/constants.inc.h)
+ Script: <" (optional)
+ Script (it can be multi-line)
+ ">
+ }
+ Allies: [
+ "CLAN_NAME_CONSTANT", (string)
+ ]
+ Antagonists: [
+ "CLAN_NAME_CONSTANT", (string)
+ ]
+ },
+ **************************************************************************/
+ {
+ Id: 1
+ Const: "FACTION_LEGION"
+ Name: "Legion of Aemil"
+ Leader: "Q'Anon"
+ Map: "001-2-39"
+ Buff: {
+ Icon: "SI_SWORDCLAN"
+ Script: <"
+ bonus(bStr, 2);
+ bonus(bVit, 1);
+ bonus(bMaxHP, 30);
+ bonus(bMaxSP, 10);
+ ">
+ }
+ Antagonists: [
+ "FACTION_BROTHERHOOD",
+ ]
+ },
+ {
+ Id: 2
+ Const: "FACTION_BROTHERHOOD"
+ Name: "Brotherhood of Argaes"
+ Leader: "Jonatas"
+ Map: "001-1"
+ Buff: {
+ Icon: "SI_ARCWANDCLAN"
+ Script: <"
+ bonus(bDex, 2);
+ bonus(bAgi, 1);
+ bonus(bMaxHP, 30);
+ bonus(bMaxSP, 10);
+ ">
+ }
+ Antagonists: [
+ "FACTION_LEGION",
+ ]
+ },
+ {
+ Id: 3
+ Const: "FACTION_THIEF"
+ Name: "The Thieves"
+ Leader: "Tanveer"
+ Map: "001-1"
+ Buff: {
+ Icon: "SI_GOLDENMACECLAN"
+ Script: <"
+ bonus(bLuk, 2);
+ bonus(bDex, 1);
+ bonus(bMaxHP, 30);
+ bonus(bMaxSP, 10);
+ ">
+ }
+ Allies: [
+ "FACTION_LEGION",
+ "FACTION_BROTHERHOOD",
+ ]
+ Antagonists: [
+ "FACTION_MAGES",
+ ]
+ },
+ {
+ Id: 4
+ Const: "FACTION_MAGES"
+ Name: "The Magic Guild"
+ Leader: "Hocus Pocus Fidibus"
+ Map: "001-1"
+ Buff: {
+ Icon: "SI_CROSSBOWCLAN"
+ Script: <"
+ bonus(bInt, 2);
+ bonus(bAgi, 1);
+ bonus(bMaxHP, 30);
+ bonus(bMaxSP, 10);
+ ">
+ }
+ Antagonists: [
+ "FACTION_THIEF",
+ ]
+ },
+)
diff --git a/db/constants.conf b/db/constants.conf
new file mode 100644
index 00000000..075670e8
--- /dev/null
+++ b/db/constants.conf
@@ -0,0 +1,3800 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2016-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Script Constants Database
+//=========================================================================
+
+constants_db: {
+/************* Entry structure (short) ************************************
+ Identifier: value // (integer literal)
+************* Entry structure (full) **************************************
+ Identifier: {
+ Value: value // (integer literal)
+ Deprecated: true // (boolean) Defaults to false.
+ }
+************* Supported integer literals **********************************
+decimal: 1337 // no prefix
+hexadecimal: 0x1337 // prefix: 0x
+octal: 0o1337 // prefix: 0o
+binary: 0b101101 // prefix: 0b
+
+Underscores can also be used as visual separators for digit grouping purposes:
+ 2_147_483_647
+ 0x7FFF_FFFF
+
+Keep in mind that number literals cannot start or end with a separator and no
+more than one separator can be used in a row (so 12_3___456 is illegal).
+**************************************************************************/
+
+ comment__: "Weekdays"
+ SUNDAY: 0
+ MONDAY: 1
+ TUESDAY: 2
+ WEDNESDAY: 3
+ THURSDAY: 4
+ FRIDAY: 5
+ SATURDAY: 6
+
+ comment__: "Months"
+ JANUARY: 1
+ FEBRUARY: 2
+ MARCH: 3
+ APRIL: 4
+ MAY: 5
+ JUNE: 6
+ JULY: 7
+ AUGUST: 8
+ SEPTEMBER: 9
+ OCTOBER: 10
+ NOVEMBER: 11
+ DECEMBER: 12
+
+ comment__: "Job IDs"
+ Job_Novice: 0
+ Job_Swordman: 1
+ Job_Mage: 2
+ Job_Archer: 3
+ Job_Acolyte: 4
+ Job_Merchant: 5
+ Job_Thief: 6
+ Job_Knight: 7
+ Job_Priest: 8
+ Job_Wizard: 9
+ Job_Blacksmith: 10
+ Job_Hunter: 11
+ Job_Assassin: 12
+ Job_Knight2: 13
+ Job_Crusader: 14
+ Job_Monk: 15
+ Job_Sage: 16
+ Job_Rogue: 17
+
+ comment__: "Job masks / Job map_ids"
+ EAJL_2_1: 0x0100
+ EAJL_2_2: 0x0200
+ EAJL_2: 0x0300
+ EAJL_UPPER: 0x1000
+ EAJL_BABY: 0x2000
+ EAJL_THIRD: 0x4000
+
+ EAJ_BASEMASK: 0x00ff
+ EAJ_UPPERMASK: 0x0fff
+ EAJ_THIRDMASK: 0x4fff
+
+ EAJ_NOVICE: 0x0000
+ EAJ_SWORDMAN: 0x0001
+ EAJ_MAGE: 0x0002
+ EAJ_ARCHER: 0x0003
+ EAJ_ACOLYTE: 0x0004
+ EAJ_MERCHANT: 0x0005
+ EAJ_THIEF: 0x0006
+ EAJ_TAEKWON: 0x0007
+ EAJ_GUNSLINGER: 0x0009
+ EAJ_NINJA: 0x000A
+ EAJ_GANGSI: 0x000D
+ EAJ_SUMMONER: 0x000E
+
+ EAJ_SUPER_NOVICE: 0x0100
+ EAJ_KNIGHT: 0x0101
+ EAJ_WIZARD: 0x0102
+ EAJ_HUNTER: 0x0103
+ EAJ_PRIEST: 0x0104
+ EAJ_BLACKSMITH: 0x0105
+ EAJ_ASSASSIN: 0x0106
+ EAJ_STAR_GLADIATOR: 0x0107
+ EAJ_REBELLION: 0x0109
+ EAJ_KAGEROUOBORO: 0x010A
+ EAJ_DEATH_KNIGHT: 0x010D
+
+
+ comment__: "Broadcast flags"
+ bc_all: 0
+ bc_map: 1
+ bc_area: 2
+ bc_self: 3
+ bc_pc: 0
+ bc_npc: 8
+ bc_yellow: 0
+ bc_blue: 16
+ bc_woe: 32
+
+ comment__: "Mapflags"
+ mf_nomemo: 0
+ mf_noteleport: 1
+ mf_nosave: 2
+ mf_nobranch: 3
+ mf_nopenalty: 4
+ mf_nozenypenalty: 5
+ mf_pvp: 6
+ mf_pvp_noparty: 7
+ mf_pvp_noguild: 8
+ mf_gvg: 9
+ mf_gvg_noparty: 10
+ mf_notrade: 11
+ mf_noskill: 12
+ mf_nowarp: 13
+ mf_partylock: 14
+ mf_noicewall: 15
+ mf_snow: 16
+ mf_fog: 17
+ mf_sakura: 18
+ mf_leaves: 19
+ mf_clouds: 23
+ mf_clouds2: 24
+ mf_fireworks: 25
+ mf_gvg_castle: 26
+ mf_gvg_dungeon: 27
+ mf_nightenabled: 28
+ mf_nobaseexp: 29
+ mf_nojobexp: 30
+ mf_nomobloot: 31
+ mf_nomvploot: 32
+ mf_noreturn: 33
+ mf_nowarpto: 34
+ mf_nightmaredrop: 35
+ mf_zone: 36
+ mf_nocommand: 37
+ mf_nodrop: 38
+ mf_jexp: 39
+ mf_bexp: 40
+ mf_novending: 41
+ mf_loadevent: 42
+ mf_nochat: 43
+ mf_noexppenalty: 44
+ mf_guildlock: 45
+ mf_town: 46
+ mf_autotrade: 47
+ mf_allowks: 48
+ mf_monster_noteleport: 49
+ mf_pvp_nocalcrank: 50
+ mf_battleground: 51
+ mf_reset: 52
+ mf_notomb: 53
+ mf_nocashshop: 54
+ mf_noautoloot: 55
+ mf_noviewid: 56
+ mf_pairship_startable: 57
+ mf_pairship_endable: 58
+ mf_nostorage: 59
+ mf_nogstorage: 60
+ mf_nopet: 61
+
+ comment__: "Cell Properties"
+ cell_walkable: 0
+ cell_shootable: 1
+ cell_water: 2
+ cell_npc: 3
+ cell_basilica: 4
+ cell_landprotector: 5
+ cell_novending: 6
+ cell_nochat: 7
+ cell_icewall: 8
+ cell_noicewall: 9
+ cell_noskill: 10
+
+ comment__: "Cell checks"
+ cell_gettype: 0
+ cell_chkwall: 1
+ cell_chkwater: 2
+ cell_chkcliff: 3
+ cell_chkpass: 4
+ cell_chkreach: 5
+ cell_chknopass: 6
+ cell_chknoreach: 7
+ cell_chkstack: 8
+ cell_chknpc: 9
+ cell_chkbasilica: 10
+ cell_chklandprotector: 11
+ cell_chknovending: 12
+ cell_chknochat: 13
+ cell_chkicewall: 14
+ cell_chknoicewall: 15
+ cell_chknoskill: 16
+
+ comment__: "Bonuses / Parameter IDs"
+ bMaxHP: 6
+ bMaxSP: 8
+ bStr: 13
+ bAgi: 14
+ bVit: 15
+ bInt: 16
+ bDex: 17
+ bLuk: 18
+ bAtk: 41
+ bAtk2: 42
+ bDef: 45
+ bDef2: 46
+ bMdef: 47
+ bMdef2: 48
+ bHit: 49
+ bFlee: 50
+ bFlee2: 51
+ bCritical: 52
+ bAspd: 53
+ bFame: 59
+ bUnbreakable: 60
+
+ bAtkRange: 1000
+ bAtkEle: 1001
+ bDefEle: 1002
+ bCastrate: 1003
+ bMaxHPrate: 1004
+ bMaxSPrate: 1005
+ bUseSPrate: 1006
+ bAddEle: 1007
+ bAddRace: 1008
+ bAddSize: 1009
+ bSubEle: 1010
+ bSubRace: 1011
+ bAddEff: 1012
+ bResEff: 1013
+ bBaseAtk: 1014
+ bAspdRate: 1015
+ bHPrecovRate: 1016
+ bSPrecovRate: 1017
+ bSpeedRate: 1018
+ bCriticalDef: 1019
+ bNearAtkDef: 1020
+ bLongAtkDef: 1021
+ bDoubleRate: 1022
+ bDoubleAddRate: 1023
+ bSkillHeal: 1024
+ bMatkRate: 1025
+ bIgnoreDefEle: 1026
+ bIgnoreDefRace: 1027
+ bAtkRate: 1028
+ bSpeedAddRate: 1029
+ bSPRegenRate: 1030
+ bMagicAtkDef: 1031
+ bMiscAtkDef: 1032
+ bIgnoreMdefEle: 1033
+ bIgnoreMdefRace: 1034
+ bMagicAddEle: 1035
+ bMagicAddRace: 1036
+ bMagicAddSize: 1037
+ bPerfectHitRate: 1038
+ bPerfectHitAddRate: 1039
+ bCriticalRate: 1040
+ bGetZenyNum: 1041
+ bAddGetZenyNum: 1042
+ bAddDamageClass: 1043
+ bAddMagicDamageClass: 1044
+ bAddDefClass: 1045
+ bAddMdefClass: 1046
+ bAddMonsterDropItem: 1047
+ bDefRatioAtkEle: 1048
+ bDefRatioAtkRace: 1049
+ bUnbreakableGarment: 1050
+ bHitRate: 1051
+ bFleeRate: 1052
+ bFlee2Rate: 1053
+ bDefRate: 1054
+ bDef2Rate: 1055
+ bMdefRate: 1056
+ bMdef2Rate: 1057
+ bSplashRange: 1058
+ bSplashAddRange: 1059
+ bAutoSpell: 1060
+ bHPDrainRate: 1061
+ bSPDrainRate: 1062
+ bShortWeaponDamageReturn: 1063
+ bLongWeaponDamageReturn: 1064
+ bWeaponComaEle: 1065
+ bWeaponComaRace: 1066
+ bAddEff2: 1067
+ bBreakWeaponRate: 1068
+ bBreakArmorRate: 1069
+ bAddStealRate: 1070
+ bMagicDamageReturn: 1071
+ bAllStats: 1073
+ bAgiVit: 1074
+ bAgiDexStr: 1075
+ bPerfectHide: 1076
+ bNoKnockback: 1077
+ bClassChange: 1078
+ bHPDrainValue: 1079
+ bSPDrainValue: 1080
+ bWeaponAtk: 1081
+ bWeaponAtkRate: 1082
+ bDelayrate: 1083
+ bHPDrainRateRace: 1084
+ bSPDrainRateRace: 1085
+ bIgnoreMdefRate: 1086
+ bIgnoreDefRate: 1087
+ bSkillHeal2: 1088
+ bAddEffOnSkill: 1089
+ bHealPower: 1090
+ bHealPower2: 1091
+ bHPVanishRate: 1092
+
+ bRestartFullRecover: 2000
+ bNoCastCancel: 2001
+ bNoSizeFix: 2002
+ bNoMagicDamage: 2003
+ bNoWeaponDamage: 2004
+ bNoGemStone: 2005
+ bNoCastCancel2: 2006
+ bNoMiscDamage: 2007
+ bUnbreakableWeapon: 2008
+ bUnbreakableArmor: 2009
+ bUnbreakableHelm: 2010
+ bUnbreakableShield: 2011
+ bLongAtkRate: 2012
+ bCritAtkRate: 2013
+ bCriticalAddRace: 2014
+ bNoRegen: 2015
+ bAddEffWhenHit: 2016
+ bAutoSpellWhenHit: 2017
+ bSkillAtk: 2018
+ bUnstripable: 2019
+ bAutoSpellOnSkill: 2020
+
+ bSPGainValue: 2021
+ bHPRegenRate: 2022
+ bHPLossRate: 2023
+ bAddRace2: 2024
+ bHPGainValue: 2025
+ bSubSize: 2026
+ bHPDrainValueRace: 2027
+ bAddItemHealRate: 2028
+ bSPDrainValueRace: 2029
+ bExpAddRace: 2030
+ bSPGainRace: 2031
+ bSubRace2: 2032
+ bUnbreakableShoes: 2033
+ bUnstripableWeapon: 2034
+ bUnstripableArmor: 2035
+ bUnstripableHelm: 2036
+ bUnstripableShield: 2037
+ bIntravision: 2038
+ bAddMonsterDropChainItem: 2039
+ bSPLossRate: 2040
+ bAddSkillBlow: 2041
+ bSPVanishRate: 2042
+ bMagicSPGainValue: 2043
+ bMagicHPGainValue: 2044
+ bAddClassDropItem: 2045
+ //bMatk: 2046
+ bSPGainRaceAttack: 2047
+ bHPGainRaceAttack: 2048
+ bSkillUseSPrate: 2049
+ bSkillCooldown: 2050
+
+ bSkillFixedCast: 2051
+ bSkillVariableCast: 2052
+ bFixedCastrate: 2053
+ bVariableCastrate: 2054
+ bSkillUseSP: 2055
+ bMagicAtkEle: 2056
+ bFixedCast: 2057
+ bVariableCast: 2058
+ bSetDefRace: 2059
+ bSetMDefRace: 2060
+ bAddRaceTolerance: 2061
+ bAddMaxWeight: 2062
+ bSubDefEle: 2063
+ bMagicSubDefEle: 2064
+
+ comment__: "Equip index"
+ /* reference to script.c::script_defaults():equip[] array used for easy-conversion */
+ EQI_HEAD_TOP: 1
+ EQI_ARMOR: 2
+ EQI_HAND_L: 3
+ EQI_HAND_R: 4
+ EQI_GARMENT: 5
+ EQI_SHOES: 6
+ EQI_ACC_L: 7
+ EQI_ACC_R: 8
+ EQI_HEAD_MID: 9
+ EQI_HEAD_LOW: 10
+ EQI_COSTUME_HEAD_LOW: 11
+ EQI_COSTUME_HEAD_MID: 12
+ EQI_COSTUME_HEAD_TOP: 13
+ EQI_COSTUME_GARMENT: 14
+ EQI_SHADOW_ARMOR: 15
+ EQI_SHADOW_WEAPON: 16
+ EQI_SHADOW_SHIELD: 17
+ EQI_SHADOW_SHOES: 18
+ EQI_SHADOW_ACC_R: 19
+ EQI_SHADOW_ACC_L: 20
+
+ comment__: "Status effects"
+ Eff_Stone: 0
+ Eff_Freeze: 1
+ Eff_Stun: 2
+ Eff_Sleep: 3
+ Eff_Poison: 4
+ Eff_Curse: 5
+ Eff_Silence: 6
+ Eff_Confusion: 7
+ Eff_Blind: 8
+ Eff_Bleeding: 9
+ Eff_DPoison: 10
+ Eff_Fear: 11
+ Eff_Cold: 12
+ Eff_Burning: 13
+ Eff_Deepsleep: 14
+
+ comment__: "Elements"
+ Ele_Neutral: 0
+ Ele_Water: 1
+ Ele_Nature: 2
+ Ele_Fire: 3
+ Ele_Holy: 6
+ Ele_Dark: 7
+
+ // Kept for Compatibility
+ Ele_Earth: 2
+ Ele_Wind: 2 // 4
+ Ele_Poison: 2 // 5
+ Ele_Ghost: 7 // 8
+ Ele_Undead: 7 // 9
+ Ele_All: 255
+
+ comment__: "Attack Types"
+ HARM_PHYS: 1
+ HARM_MAGI: 2
+ HARM_MISC: 4
+
+ comment__: "Races"
+ RC_Formless: 0
+ RC_Undead: 1
+ RC_Brute: 2
+ RC_Plant: 3
+ RC_Insect: 4
+ RC_Fish: 5
+ RC_Demon: 6
+ RC_DemiHuman: 7
+ RC_Angel: 8
+ RC_Dragon: 9
+ RC_Player: 10
+ RC_Boss: 11
+ RC_NonBoss: 12
+ RC_NonDemiHuman: 14
+ RC_NonPlayer: 15
+ RC_DemiPlayer: 16
+ RC_NonDemiPlayer: 17
+ RC_All: 255
+
+ comment__: "Subraces"
+ RC2_None: 0
+ RC2_Goblin: 1
+ RC2_Kobold: 2
+ RC2_Orc: 3
+ RC2_Golem: 4
+ RC2_Guardian: 5
+ RC2_Ninja: 6
+ RC2_Scaraba: 7
+ RC2_Turtle: 8
+
+ comment__: "Sizes"
+ Size_Small: 0
+ Size_Medium: 1
+ Size_Large: 2
+
+ comment__: "Battle Flags"
+ BF_WEAPON: 0x0001
+ BF_MAGIC: 0x0002
+ BF_MISC: 0x0004
+ BF_SHORT: 0x0010
+ BF_LONG: 0x0040
+ BF_SKILL: 0x0100
+ BF_NORMAL: 0x0200
+
+ comment__: "Attack Flags"
+ ATF_SELF: 0x01
+ ATF_TARGET: 0x02
+ ATF_SHORT: 0x04
+ ATF_LONG: 0x08
+ ATF_WEAPON: 0x10
+ ATF_MAGIC: 0x20
+ ATF_MISC: 0x40
+ ATF_SKILL: 0x60
+
+ comment__: "Status Changes"
+ SC_ALL: -1
+ SC_STONE: 0
+ SC_FREEZE: 1
+ SC_STUN: 2
+ SC_SLEEP: 3
+ SC_POISON: 4
+ SC_CURSE: 5
+ SC_SILENCE: 6
+ SC_CONFUSION: 7
+ SC_BLIND: 8
+ SC_BLOODING: 9
+ SC_DPOISON: 10
+ SC_FEAR: 11
+ SC_COLD: 12
+ SC_BURNING: 13
+ SC_DEEP_SLEEP: 14
+ SC_PROVOKE: 20
+ SC_ENDURE: 21
+ SC_TWOHANDQUICKEN: 22
+ SC_CONCENTRATION: 23
+ SC_HIDING: 24
+ SC_CLOAKING: 25
+ SC_ENCHANTPOISON: 26
+ SC_POISONREACT: 27
+ SC_QUAGMIRE: 28
+ SC_ANGELUS: 29
+ SC_BLESSING: 30
+ SC_CRUCIS: 31
+ SC_INC_AGI: 32
+ SC_DEC_AGI: 33
+ SC_SLOWPOISON: 34
+ SC_IMPOSITIO: 35
+ SC_SUFFRAGIUM: 36
+ SC_ASPERSIO: 37
+ SC_BENEDICTIO: 38
+ SC_KYRIE: 39
+ SC_MAGNIFICAT: 40
+ SC_GLORIA: 41
+ SC_LEXAETERNA: 42
+ SC_ADRENALINE: 43
+ SC_WEAPONPERFECT: 44
+ SC_OVERTHRUST: 45
+ SC_MAXIMIZEPOWER: 46
+ SC_TRICKDEAD: 47
+ SC_SHOUT: 48
+ SC_ENERGYCOAT: 49
+ SC_BROKENARMOR: 50
+ SC_BROKENWEAPON: 51
+ SC_ILLUSION: 52
+ SC_WEIGHTOVER50: 53
+ SC_WEIGHTOVER90: 54
+ SC_ATTHASTE_POTION1: 55
+ SC_ATTHASTE_POTION2: 56
+ SC_ATTHASTE_POTION3: 57
+ SC_ATTHASTE_INFINITY: 58
+ SC_MOVHASTE_HORSE: 59
+ SC_MOVHASTE_INFINITY: 60
+ SC_PLUSATTACKPOWER: 61
+ SC_PLUSMAGICPOWER: 62
+ SC_WEDDING: 63
+ SC_SLOWDOWN: 64
+ SC_ANKLESNARE: 65
+ SC_KEEPING: 66
+ SC_BARRIER: 67
+ SC_NOEQUIPWEAPON: 68
+ SC_NOEQUIPSHIELD: 69
+ SC_NOEQUIPARMOR: 70
+ SC_NOEQUIPHELM: 71
+ SC_PROTECTWEAPON: 72
+ SC_PROTECTSHIELD: 73
+ SC_PROTECTARMOR: 74
+ SC_PROTECTHELM: 75
+ SC_AUTOGUARD: 76
+ SC_REFLECTSHIELD: 77
+ SC_SPLASHER: 78
+ SC_PROVIDENCE: 79
+ SC_DEFENDER: 80
+ SC_MAGICROD: 81
+ SC_SPELLBREAKER: 82
+ SC_AUTOSPELL: 83
+ SC_SIGHTTRASHER: 84
+ SC_AUTOBERSERK: 85
+ SC_SPEARQUICKEN: 86
+ SC_AUTOCOUNTER: 87
+ SC_SIGHT: 88
+ SC_SAFETYWALL: 89
+ SC_RUWACH: 90
+ SC_EXTREMITYFIST: 91
+ SC_EXPLOSIONSPIRITS: 92
+ SC_COMBOATTACK: 93
+ SC_BLADESTOP_WAIT: 94
+ SC_BLADESTOP: 95
+ SC_PROPERTYFIRE: 96
+ SC_PROPERTYWATER: 97
+ SC_PROPERTYWIND: 98
+ SC_PROPERTYGROUND: 99
+ SC_VOLCANO: 100
+ SC_DELUGE: 101
+ SC_VIOLENTGALE: 102
+ SC_SUB_WEAPONPROPERTY: 103
+ SC_ARMOR: 104
+ SC_ARMORPROPERTY: 105
+ SC_NOCHAT: 106
+ SC_BABY: 107
+ SC_AURABLADE: 108
+ SC_PARRYING: 109
+ SC_LKCONCENTRATION: 110
+ SC_TENSIONRELAX: 111
+ SC_BERSERK: 112
+ SC_FURY: 113
+ SC_GOSPEL: 114
+ SC_ASSUMPTIO: 115
+ SC_BASILICA: 116
+ SC_GUILDAURA: 117
+ SC_MAGICPOWER: 118
+ SC_EDP: 119
+ SC_TRUESIGHT: 120
+ SC_WINDWALK: 121
+ SC_MELTDOWN: 122
+ SC_CARTBOOST: 123
+ SC_CHASEWALK: 124
+ SC_SWORDREJECT: 125
+ SC_MARIONETTE_MASTER: 126
+ SC_MARIONETTE: 127
+ SC_PROPERTYUNDEAD: 128
+ SC_JOINTBEAT: 129
+ SC_MINDBREAKER: 130
+ SC_MEMORIZE: 131
+ SC_FOGWALL: 132
+ SC_SPIDERWEB: 133
+ SC_DEVOTION: 134
+ SC_SACRIFICE: 135
+ SC_STEELBODY: 136
+ SC_ORCISH: 137
+ SC_STORMKICK_READY: 138
+ SC_DOWNKICK_READY: 139
+ SC_TURNKICK_READY: 140
+ SC_COUNTERKICK_READY: 141
+ SC_DODGE_READY: 142
+ SC_RUN: 143
+ SC_PROPERTYDARK: 144
+ SC_ADRENALINE2: 145
+ SC_PROPERTYTELEKINESIS: 146
+ SC_KAIZEL: 147
+ SC_KAAHI: 148
+ SC_KAUPE: 149
+ SC_ONEHANDQUICKEN: 150
+ SC_PRESERVE: 151
+ SC_GDSKILL_BATTLEORDER: 152
+ SC_GDSKILL_REGENERATION: 153
+ SC_DOUBLECASTING: 154
+ SC_GRAVITATION: 155
+ SC_OVERTHRUSTMAX: 156
+ SC_LONGING: 157
+ SC_HERMODE: 158
+ SC_TAROTCARD: 159
+ SC_CR_SHRINK: 160
+ SC_WZ_SIGHTBLASTER: 161
+ SC_DC_WINKCHARM: 162
+ SC_RG_CCONFINE_M: 163
+ SC_RG_CCONFINE_S: 164
+ SC_DANCING: 165
+ SC_ARMOR_PROPERTY: 166
+ SC_RICHMANKIM: 167
+ SC_ETERNALCHAOS: 168
+ SC_DRUMBATTLE: 169
+ SC_NIBELUNGEN: 170
+ SC_ROKISWEIL: 171
+ SC_INTOABYSS: 172
+ SC_SIEGFRIED: 173
+ SC_WHISTLE: 174
+ SC_ASSNCROS: 175
+ SC_POEMBRAGI: 176
+ SC_APPLEIDUN: 177
+ SC_MODECHANGE: 178
+ SC_HUMMING: 179
+ SC_DONTFORGETME: 180
+ SC_FORTUNE: 181
+ SC_SERVICEFORYOU: 182
+ SC_STOP: 183
+ SC_STRUP: 184
+ SC_SOULLINK: 185
+ SC_COMA: 186
+ SC_CLAIRVOYANCE: 187
+ SC_INCALLSTATUS: 188
+ SC_CHASEWALK2: 189
+ SC_INCAGI: 190
+ SC_INCVIT: 191
+ SC_INCINT: 192
+ SC_INCDEX: 193
+ SC_INCLUK: 194
+ SC_INCHIT: 195
+ SC_INCHITRATE: 196
+ SC_INCFLEE: 197
+ SC_INCFLEERATE: 198
+ SC_INCMHPRATE: 199
+ SC_INCMSPRATE: 200
+ SC_INCATKRATE: 201
+ SC_INCMATKRATE: 202
+ SC_INCDEFRATE: 203
+ SC_FOOD_STR: 204
+ SC_FOOD_AGI: 205
+ SC_FOOD_VIT: 206
+ SC_FOOD_INT: 207
+ SC_FOOD_DEX: 208
+ SC_FOOD_LUK: 209
+ SC_FOOD_BASICHIT: 210
+ SC_FOOD_BASICAVOIDANCE: 211
+ SC_BATKFOOD: 212
+ SC_WATKFOOD: 213
+ SC_MATKFOOD: 214
+ SC_SCRESIST: 215
+ SC_XMAS: 216
+ SC_WARM: 217
+ SC_SUN_COMFORT: 218
+ SC_MOON_COMFORT: 219
+ SC_STAR_COMFORT: 220
+ SC_FUSION: 221
+ SC_SKILLRATE_UP: 222
+ SC_SKE: 223
+ SC_KAITE: 224
+ SC_SWOO: 225
+ SC_SKA: 226
+ SC_EARTHSCROLL: 227
+ SC_MIRACLE: 228
+ SC_GS_MADNESSCANCEL: 229
+ SC_GS_ADJUSTMENT: 230
+ SC_GS_ACCURACY: 231
+ SC_GS_GATLINGFEVER: 232
+ SC_NJ_TATAMIGAESHI: 233
+ SC_NJ_UTSUSEMI: 234
+ SC_NJ_BUNSINJYUTSU: 235
+ SC_NJ_KAENSIN: 236
+ SC_NJ_SUITON: 237
+ SC_NJ_NEN: 238
+ SC_KNOWLEDGE: 239
+ SC_SMA_READY: 240
+ SC_FLING: 241
+ SC_HLIF_AVOID: 242
+ SC_HLIF_CHANGE: 243
+ SC_HAMI_BLOODLUST: 244
+ SC_HLIF_FLEET: 245
+ SC_HLIF_SPEED: 246
+ SC_HAMI_DEFENCE: 247
+ SC_INCASPDRATE: 248
+ SC_PLUSAVOIDVALUE: 249
+ SC_JAILED: 250
+ SC_ENCHANTARMS: 251
+ SC_MAGICALATTACK: 252
+ SC_STONESKIN: 253
+ SC_CRITICALWOUND: 254
+ SC_MAGICMIRROR: 255
+ SC_SLOWCAST: 256
+ SC_SUMMER: 257
+ SC_CASH_PLUSEXP: 258
+ SC_CASH_RECEIVEITEM: 259
+ SC_CASH_BOSS_ALARM: 260
+ SC_CASH_DEATHPENALTY: 261
+ SC_CRITICALPERCENT: 262
+ SC_PROTECT_MDEF: 266
+ SC_HEALPLUS: 268
+ SC_PNEUMA: 269
+ SC_AUTOTRADE: 270
+ SC_KSPROTECTED: 271
+ SC_ARMOR_RESIST: 272
+ SC_ATKER_BLOOD: 273
+ SC_TARGET_BLOOD: 274
+ SC_TK_SEVENWIND: 275
+ SC_PROTECT_DEF: 276
+ SC_WALKSPEED: 278
+ SC_MER_FLEE: 279
+ SC_MER_ATK: 280
+ SC_MER_HP: 281
+ SC_MER_SP: 282
+ SC_MER_HIT: 283
+ SC_MER_QUICKEN: 284
+ SC_REBIRTH: 285
+ SC_S_LIFEPOTION: 291
+ SC_L_LIFEPOTION: 292
+ SC_CASH_PLUSONLYJOBEXP: 293
+ SC_HELLPOWER: 295
+ SC_INVINCIBLE: 296
+ SC_INVINCIBLEOFF: 297
+ SC_MANU_ATK: 298
+ SC_MANU_DEF: 299
+ SC_SPL_ATK: 300
+ SC_SPL_DEF: 301
+ SC_MANU_MATK: 302
+ SC_SPL_MATK: 303
+ SC_FOOD_STR_CASH: 304
+ SC_FOOD_AGI_CASH: 305
+ SC_FOOD_VIT_CASH: 306
+ SC_FOOD_DEX_CASH: 307
+ SC_FOOD_INT_CASH: 308
+ SC_FOOD_LUK_CASH: 309
+ SC_FROSTMISTY: 311
+ SC_ENCHANTBLADE: 312
+ SC_DEATHBOUND: 313
+ SC_MILLENNIUMSHIELD: 314
+ SC_CRUSHSTRIKE: 315
+ SC_REFRESH: 316
+ SC_REUSE_REFRESH: 317
+ SC_GIANTGROWTH: 318
+ SC_STONEHARDSKIN: 319
+ SC_VITALITYACTIVATION: 320
+ SC_STORMBLAST: 321
+ SC_FIGHTINGSPIRIT: 322
+ SC_ABUNDANCE: 323
+ SC_ADORAMUS: 324
+ SC_EPICLESIS: 325
+ SC_ORATIO: 326
+ SC_LAUDAAGNUS: 327
+ SC_LAUDARAMUS: 328
+ SC_RENOVATIO: 329
+ SC_EXPIATIO: 330
+ SC_DUPLELIGHT: 331
+ SC_SECRAMENT: 332
+ SC_WHITEIMPRISON: 333
+ SC_MARSHOFABYSS: 334
+ SC_RECOGNIZEDSPELL: 335
+ SC_STASIS: 336
+ SC_SUMMON1: 337
+ SC_SUMMON2: 338
+ SC_SUMMON3: 339
+ SC_SUMMON4: 340
+ SC_SUMMON5: 341
+ SC_READING_SB: 342
+ SC_FREEZINGSP: 343
+ SC_FEARBREEZE: 344
+ SC_ELECTRICSHOCKER: 345
+ SC_WUGDASH: 346
+ SC_WUGBITE: 347
+ SC_CAMOUFLAGE: 348
+ SC_ACCELERATION: 349
+ SC_HOVERING: 350
+ SC_SHAPESHIFT: 351
+ SC_INFRAREDSCAN: 352
+ SC_ANALYZE: 353
+ SC_MAGNETICFIELD: 354
+ SC_NEUTRALBARRIER: 355
+ SC_NEUTRALBARRIER_MASTER: 356
+ SC_STEALTHFIELD: 357
+ SC_STEALTHFIELD_MASTER: 358
+ SC_OVERHEAT: 359
+ SC_OVERHEAT_LIMITPOINT: 360
+ SC_VENOMIMPRESS: 361
+ SC_POISONINGWEAPON: 362
+ SC_WEAPONBLOCKING: 363
+ SC_CLOAKINGEXCEED: 364
+ SC_HALLUCINATIONWALK: 365
+ SC_HALLUCINATIONWALK_POSTDELAY: 366
+ SC_ROLLINGCUTTER: 367
+ SC_TOXIN: 368
+ SC_PARALYSE: 369
+ SC_VENOMBLEED: 370
+ SC_MAGICMUSHROOM: 371
+ SC_DEATHHURT: 372
+ SC_PYREXIA: 373
+ SC_OBLIVIONCURSE: 374
+ SC_LEECHESEND: 375
+ SC_LG_REFLECTDAMAGE: 376
+ SC_FORCEOFVANGUARD: 377
+ SC_SHIELDSPELL_DEF: 378
+ SC_SHIELDSPELL_MDEF: 379
+ SC_SHIELDSPELL_REF: 380
+ SC_EXEEDBREAK: 381
+ SC_PRESTIGE: 382
+ SC_BANDING: 383
+ SC_BANDING_DEFENCE: 384
+ SC_EARTHDRIVE: 385
+ SC_INSPIRATION: 386
+ SC_SPELLFIST: 387
+ SC_STRIKING: 389
+ SC_WARMER: 390
+ SC_VACUUM_EXTREME: 391
+ SC_PROPERTYWALK: 392
+ SC_SWING: 393
+ SC_SYMPHONY_LOVE: 394
+ SC_MOONLIT_SERENADE: 395
+ SC_RUSH_WINDMILL: 396
+ SC_ECHOSONG: 397
+ SC_HARMONIZE: 398
+ SC_SIREN: 399
+ SC_SIRCLEOFNATURE: 401
+ SC_GLOOMYDAY: 402
+ SC_GLOOMYDAY_SK: 403
+ SC_SONG_OF_MANA: 404
+ SC_DANCE_WITH_WUG: 405
+ SC_SATURDAY_NIGHT_FEVER: 406
+ SC_LERADS_DEW: 407
+ SC_MELODYOFSINK: 408
+ SC_BEYOND_OF_WARCRY: 409
+ SC_UNLIMITED_HUMMING_VOICE: 410
+ SC_SITDOWN_FORCE: 411
+ SC_NETHERWORLD: 412
+ SC_CRESCENTELBOW: 413
+ SC_CURSEDCIRCLE_ATKER: 414
+ SC_CURSEDCIRCLE_TARGET: 415
+ SC_LIGHTNINGWALK: 416
+ SC_RAISINGDRAGON: 417
+ SC_GENTLETOUCH_ENERGYGAIN: 418
+ SC_GENTLETOUCH_CHANGE: 419
+ SC_GENTLETOUCH_REVITALIZE: 420
+ SC_GN_CARTBOOST: 421
+ SC_THORNS_TRAP: 422
+ SC_BLOOD_SUCKER: 423
+ SC_FIRE_EXPANSION_SMOKE_POWDER: 424
+ SC_FIRE_EXPANSION_TEAR_GAS: 425
+ SC_MANDRAGORA: 426
+ SC_STOMACHACHE: 427
+ SC_MYSTERIOUS_POWDER: 428
+ SC_MELON_BOMB: 429
+ SC_BANANA_BOMB: 430
+ SC_BANANA_BOMB_SITDOWN_POSTDELAY: 431
+ SC_SAVAGE_STEAK: 432
+ SC_COCKTAIL_WARG_BLOOD: 433
+ SC_MINOR_BBQ: 434
+ SC_SIROMA_ICE_TEA: 435
+ SC_DROCERA_HERB_STEAMED: 436
+ SC_PUTTI_TAILS_NOODLES: 437
+ SC_BOOST500: 438
+ SC_FULL_SWING_K: 439
+ SC_MANA_PLUS: 440
+ SC_MUSTLE_M: 441
+ SC_LIFE_FORCE_F: 442
+ SC_EXTRACT_WHITE_POTION_Z: 443
+ SC_VITATA_500: 444
+ SC_EXTRACT_SALAMINE_JUICE: 445
+ SC__REPRODUCE: 446
+ SC__AUTOSHADOWSPELL: 447
+ SC__SHADOWFORM: 448
+ SC__BODYPAINT: 449
+ SC__INVISIBILITY: 450
+ SC__DEADLYINFECT: 451
+ SC__ENERVATION: 452
+ SC__GROOMY: 453
+ SC__IGNORANCE: 454
+ SC__LAZINESS: 455
+ SC__UNLUCKY: 456
+ SC__WEAKNESS: 457
+ SC__STRIPACCESSARY: 458
+ SC__MANHOLE: 459
+ SC__BLOODYLUST: 460
+ SC_CIRCLE_OF_FIRE: 461
+ SC_CIRCLE_OF_FIRE_OPTION: 462
+ SC_FIRE_CLOAK: 463
+ SC_FIRE_CLOAK_OPTION: 464
+ SC_WATER_SCREEN: 465
+ SC_WATER_SCREEN_OPTION: 466
+ SC_WATER_DROP: 467
+ SC_WATER_DROP_OPTION: 468
+ SC_WATER_BARRIER: 469
+ SC_WIND_STEP: 470
+ SC_WIND_STEP_OPTION: 471
+ SC_WIND_CURTAIN: 472
+ SC_WIND_CURTAIN_OPTION: 473
+ SC_ZEPHYR: 474
+ SC_SOLID_SKIN: 475
+ SC_SOLID_SKIN_OPTION: 476
+ SC_STONE_SHIELD: 477
+ SC_STONE_SHIELD_OPTION: 478
+ SC_POWER_OF_GAIA: 479
+ SC_PYROTECHNIC: 480
+ SC_PYROTECHNIC_OPTION: 481
+ SC_HEATER: 482
+ SC_HEATER_OPTION: 483
+ SC_TROPIC: 484
+ SC_TROPIC_OPTION: 485
+ SC_AQUAPLAY: 486
+ SC_AQUAPLAY_OPTION: 487
+ SC_COOLER: 488
+ SC_COOLER_OPTION: 489
+ SC_CHILLY_AIR: 490
+ SC_CHILLY_AIR_OPTION: 491
+ SC_GUST: 492
+ SC_GUST_OPTION: 493
+ SC_BLAST: 494
+ SC_BLAST_OPTION: 495
+ SC_WILD_STORM: 496
+ SC_WILD_STORM_OPTION: 497
+ SC_PETROLOGY: 498
+ SC_PETROLOGY_OPTION: 499
+ SC_CURSED_SOIL: 500
+ SC_CURSED_SOIL_OPTION: 501
+ SC_UPHEAVAL: 502
+ SC_UPHEAVAL_OPTION: 503
+ SC_TIDAL_WEAPON: 504
+ SC_TIDAL_WEAPON_OPTION: 505
+ SC_ROCK_CRUSHER: 506
+ SC_ROCK_CRUSHER_ATK: 507
+ SC_LEADERSHIP: 508
+ SC_GLORYWOUNDS: 509
+ SC_SOULCOLD: 510
+ SC_HAWKEYES: 511
+ SC_ODINS_POWER: 512
+ SC_FIRE_INSIGNIA: 513
+ SC_WATER_INSIGNIA: 514
+ SC_WIND_INSIGNIA: 515
+ SC_EARTH_INSIGNIA: 516
+ SC_PUSH_CART: 517
+ SC_SPELLBOOK1: 518
+ SC_SPELLBOOK2: 519
+ SC_SPELLBOOK3: 520
+ SC_SPELLBOOK4: 521
+ SC_SPELLBOOK5: 522
+ SC_SPELLBOOK6: 523
+ SC_SPELLBOOK7: 524
+ SC_INCMHP: 525
+ SC_INCMSP: 526
+ SC_PARTYFLEE: 527
+ SC_MEIKYOUSISUI: 528
+ SC_KO_JYUMONJIKIRI: 529
+ SC_KYOUGAKU: 530
+ SC_IZAYOI: 531
+ SC_ZENKAI: 532
+ SC_KG_KAGEHUMI: 533
+ SC_KYOMU: 534
+ SC_KAGEMUSYA: 535
+ SC_ZANGETSU: 536
+ SC_GENSOU: 537
+ SC_AKAITSUKI: 538
+ SC_STYLE_CHANGE: 539
+ SC_GOLDENE_FERSE: 540
+ SC_ANGRIFFS_MODUS: 541
+ SC_ERASER_CUTTER: 542
+ SC_OVERED_BOOST: 543
+ SC_LIGHT_OF_REGENE: 544
+ SC_VOLCANIC_ASH: 545
+ SC_GRANITIC_ARMOR: 546
+ SC_MAGMA_FLOW: 547
+ SC_PYROCLASTIC: 548
+ SC_NEEDLE_OF_PARALYZE: 549
+ SC_PAIN_KILLER: 550
+ SC_EXTREMITYFIST2: 551
+ SC_RAID: 552
+ SC_DARKCROW: 553
+ SC_FULL_THROTTLE: 554
+ SC_REBOUND: 555
+ SC_UNLIMIT: 556
+ SC_KINGS_GRACE: 557
+ SC_TELEKINESIS_INTENSE: 558
+ SC_OFFERTORIUM: 559
+ SC_FRIGG_SONG: 560
+ SC_ALL_RIDING: 561
+ SC_HANBOK: 562
+ SC_MONSTER_TRANSFORM: 563
+ SC_ANGEL_PROTECT: 564
+ SC_ILLUSIONDOPING: 565
+ SC_MTF_ASPD: 566
+ SC_MTF_RANGEATK: 567
+ SC_MTF_MATK: 568
+ SC_MTF_MLEATKED: 569
+ SC_MTF_CRIDAMAGE: 570
+ SC_MOONSTAR: 571
+ SC_SUPER_STAR: 572
+ SC_OKTOBERFEST: 573
+ SC_STRANGELIGHTS: 574
+ SC_DECORATION_OF_MUSIC: 575
+ SC__MAELSTROM: 576
+ SC__CHAOS: 577
+ SC__FEINTBOMB_MASTER: 578
+ SC_FALLENEMPIRE: 579
+ SC_FLASHCOMBO: 580
+ SC_DEFSET: 581
+ SC_MDEFSET: 582
+ SC_NO_SWITCH_EQUIP: 583
+
+ // 2014 Halloween Event
+ SC_MTF_MHP: 584
+ SC_MTF_MSP: 585
+ SC_MTF_PUMPKIN: 586
+ SC_MTF_HITFLEE: 587
+
+ SC_LJOSALFAR: 588
+ SC_MERMAID_LONGING: 589
+ SC_ACARAJE: 590
+ SC_TARGET_ASPD: 591
+
+ // Geffen Scrolls
+ SC_SKELSCROLL: 592
+ SC_DISTRUCTIONSCROLL: 593
+ SC_ROYALSCROLL: 594
+ SC_IMMUNITYSCROLL: 595
+ SC_MYSTICSCROLL: 596
+ SC_BATTLESCROLL: 597
+ SC_ARMORSCROLL: 598
+ SC_FREYJASCROLL: 599
+ SC_SOULSCROLL: 600
+
+ // Eden Crystal Synthesis
+ SC_QUEST_BUFF1: 601
+ SC_QUEST_BUFF2: 602
+ SC_QUEST_BUFF3: 603
+
+ // Geffen Magic Tournament
+ SC_GEFFEN_MAGIC1: 604
+ SC_GEFFEN_MAGIC2: 605
+ SC_GEFFEN_MAGIC3: 606
+ SC_FENRIR_CARD: 607
+
+ SC_ATKER_ASPD: 608
+ SC_ATKER_MOVESPEED: 609
+ SC_FOOD_CRITICALSUCCESSVALUE: 610
+ SC_CUP_OF_BOZA: 611
+ SC_OVERLAPEXPUP: 612
+ SC_MORA_BUFF: 613
+
+ // MVP Scrolls
+ SC_MVPCARD_TAOGUNKA: 614
+ SC_MVPCARD_MISTRESS: 615
+ SC_MVPCARD_ORCHERO: 616
+ SC_MVPCARD_ORCLORD: 617
+
+ SC_HAT_EFFECT: 618
+ SC_FLOWERSMOKE: 619
+ SC_FSTONE: 620
+ SC_HAPPINESS_STAR: 621
+ SC_MAPLE_FALLS: 622
+ SC_TIME_ACCESSORY: 623
+ SC_MAGICAL_FEATHER: 624
+ SC_BLOSSOM_FLUTTERING: 625
+ SC_GM_BATTLE: 626
+ SC_GM_BATTLE2: 627
+ SC_2011RWC: 628
+ SC_STR_SCROLL: 629
+ SC_INT_SCROLL: 630
+ SC_STEAMPACK: 631
+ SC_MOVHASTE_POTION: 632
+ SC_MOVESLOW_POTION: 633
+ SC_BUCHEDENOEL: 634
+ SC_PHI_DEMON: 635
+ SC_PROMOTE_HEALTH_RESERCH: 636
+ SC_ENERGY_DRINK_RESERCH: 637
+ SC_MAGIC_CANDY: 638
+ SC_M_LIFEPOTION: 639
+ SC_G_LIFEPOTION: 640
+ SC_MYSTICPOWDER: 641
+
+ // Summoner
+ SC_SUHIDE: 642
+ SC_SU_STOOP: 643
+ SC_SPRITEMABLE: 644
+ SC_CATNIPPOWDER: 645
+ SC_SV_ROOTTWIST: 646
+ SC_BITESCAR: 647
+ SC_ARCLOUSEDASH: 648
+ SC_TUNAPARTY: 649
+ SC_SHRIMP: 650
+ SC_FRESHSHRIMP: 651
+
+ SC_DAILYSENDMAILCNT: 653
+
+ // Summer 2 Costume
+ SC_DRESS_UP: 652
+
+ // Clan System
+ SC_CLAN_INFO: 654
+
+ SC_SIT: 655
+ SC_MOON: 656
+ SC_TING: 657
+ SC_DEVIL1: 658
+ SC_RIDING: 659
+ SC_FALCON: 660
+ SC_WUGRIDER: 661
+ SC_POSTDELAY: 662
+ SC_ON_PUSH_CART: 663
+ SC_RESIST_PROPERTY_WATER: 664
+ SC_RESIST_PROPERTY_GROUND: 665
+ SC_RESIST_PROPERTY_FIRE: 666
+ SC_RESIST_PROPERTY_WIND: 667
+ SC_CLIENT_ONLY_EQUIP_ARROW: 668
+ SC_MADOGEAR: 669
+ SC_POPECOOKIE: 670
+ SC_VITALIZE_POTION: 671
+ SC_SKF_MATK: 672
+ SC_SKF_ATK: 673
+ SC_SKF_ASPD: 674
+ SC_SKF_CAST: 675
+ SC_ALMIGHTY: 676
+
+ // Evol2 Custom Status Conditions
+ SC_PHYSICAL_SHIELD: 1000
+ SC_HALT_REGENERATION: 1001
+
+ comment__: "Emotes"
+ e_gasp: 0
+ e_what: 1
+ e_ho: 2
+ e_lv: 3
+ e_swt: 4
+ e_ic: 5
+ e_an: 6
+ e_ag: 7
+ e_cash: 8
+ e_dots: 9
+ e_scissors: 10
+ e_rock: 11
+ e_paper: 12
+ e_korea: 13
+ e_lv2: 14
+ e_thx: 15
+ e_wah: 16
+ e_sry: 17
+ e_heh: 18
+ e_swt2: 19
+ e_hmm: 20
+ e_no1: 21
+ e_no: 22
+ e_omg: 23
+ e_oh: 24
+ e_X: 25
+ e_hlp: 26
+ e_go: 27
+ e_sob: 28
+ e_gg: 29
+ e_kis: 30
+ e_kis2: 31
+ e_pif: 32
+ e_ok: 33
+ e_mute: 34
+ e_indonesia: 35
+ e_bzz: 36
+ e_rice: 37
+ e_awsm: 38
+ e_meh: 39
+ e_shy: 40
+ e_pat: 41
+ e_mp: 42
+ e_slur: 43
+ e_com: 44
+ e_yawn: 45
+ e_grat: 46
+ e_hp: 47
+ e_philippines: 48
+ e_malaysia: 49
+ e_singapore: 50
+ e_brazil: 51
+ e_flash: 52
+ e_spin: 53
+ e_sigh: 54
+ e_dum: 55
+ e_loud: 56
+ e_otl: 57
+ e_dice1: 58
+ e_dice2: 59
+ e_dice3: 60
+ e_dice4: 61
+ e_dice5: 62
+ e_dice6: 63
+ e_india: 64
+ e_luv: 65
+ e_russia: 66
+ e_virgin: 67
+ e_mobile: 68
+ e_mail: 69
+ e_chinese: 70
+ e_antenna1: 71
+ e_antenna2: 72
+ e_antenna3: 73
+ e_hum: 74
+ e_abs: 75
+ e_oops: 76
+ e_spit: 77
+ e_ene: 78
+ e_panic: 79
+ e_whisp: 80
+
+ comment__: "petstat - deprecated, use *getpetinfo"
+ PET_CLASS: {
+ Value: 1
+ Deprecated: true
+ }
+ PET_NAME: {
+ Value: 2
+ Deprecated: true
+ }
+ PET_LEVEL: {
+ Value: 3
+ Deprecated: true
+ }
+ PET_HUNGRY: {
+ Value: 4
+ Deprecated: true
+ }
+ PET_INTIMATE: {
+ Value: 5
+ Deprecated: true
+ }
+
+ comment__: "getmonsterinfo"
+ MOB_NAME: 0
+ MOB_LV: 1
+ MOB_MAXHP: 2
+ MOB_BASEEXP: 3
+ MOB_JOBEXP: 4
+ MOB_ATK1: 5
+ MOB_ATK2: 6
+ MOB_DEF: 7
+ MOB_MDEF: 8
+ MOB_STR: 9
+ MOB_AGI: 10
+ MOB_VIT: 11
+ MOB_INT: 12
+ MOB_DEX: 13
+ MOB_LUK: 14
+ MOB_RANGE: 15
+ MOB_RANGE2: 16
+ MOB_RANGE3: 17
+ MOB_SIZE: 18
+ MOB_RACE: 19
+ MOB_ELEMENT: 20
+ MOB_MODE: 21
+ MOB_MVPEXP: 22
+ MOB_DMG_TAKEN_RATE: 23
+
+ comment__: "mercenary guilds"
+ ARCH_MERC_GUILD: 0
+ SPEAR_MERC_GUILD: 1
+ SWORD_MERC_GUILD: 2
+
+ comment__: "Effects"
+ EF_NONE: -1
+ EF_HIT1: 0
+ EF_HIT2: 1
+ EF_HIT3: 2
+ EF_HIT4: 3
+ EF_HIT5: 4
+ EF_HIT6: 5
+ EF_ENTRY: 6
+ EF_EXIT: 7
+ EF_WARP: 8
+ EF_ENHANCE: 9
+ EF_COIN: 10
+ EF_ENDURE: 11
+ EF_BEGINSPELL: 12
+ EF_GLASSWALL: 13
+ EF_HEALSP: 14
+ EF_SOULSTRIKE: 15
+ EF_BASH: 16
+ EF_MAGNUMBREAK: 17
+ EF_STEAL: 18
+ EF_HIDING: 19
+ EF_PATTACK: 20
+ EF_DETOXICATION: 21
+ EF_SIGHT: 22
+ EF_STONECURSE: 23
+ EF_FIREBALL: 24
+ EF_FIREWALL: 25
+ EF_ICEARROW: 26
+ EF_FROSTDIVER: 27
+ EF_FROSTDIVER2: 28
+ EF_LIGHTBOLT: 29
+ EF_THUNDERSTORM: 30
+ EF_FIREARROW: 31
+ EF_NAPALMBEAT: 32
+ EF_RUWACH: 33
+ EF_TELEPORTATION: 34
+ EF_READYPORTAL: 35
+ EF_PORTAL: 36
+ EF_INCAGILITY: 37
+ EF_DECAGILITY: 38
+ EF_AQUA: 39
+ EF_SIGNUM: 40
+ EF_ANGELUS: 41
+ EF_BLESSING: 42
+ EF_INCAGIDEX: 43
+ EF_SMOKE: 44
+ EF_FIREFLY: 45
+ EF_SANDWIND: 46
+ EF_TORCH: 47
+ EF_SPRAYPOND: 48
+ EF_FIREHIT: 49
+ EF_FIRESPLASHHIT: 50
+ EF_COLDHIT: 51
+ EF_WINDHIT: 52
+ EF_POISONHIT: 53
+ EF_BEGINSPELL2: 54
+ EF_BEGINSPELL3: 55
+ EF_BEGINSPELL4: 56
+ EF_BEGINSPELL5: 57
+ EF_BEGINSPELL6: 58
+ EF_BEGINSPELL7: 59
+ EF_LOCKON: 60
+ EF_WARPZONE: 61
+ EF_SIGHTRASHER: 62
+ EF_BARRIER: 63
+ EF_ARROWSHOT: 64
+ EF_INVENOM: 65
+ EF_CURE: 66
+ EF_PROVOKE: 67
+ EF_MVP: 68
+ EF_SKIDTRAP: 69
+ EF_BRANDISHSPEAR: 70
+ EF_CONE: 71
+ EF_SPHERE: 72
+ EF_BOWLINGBASH: 73
+ EF_ICEWALL: 74
+ EF_GLORIA: 75
+ EF_MAGNIFICAT: 76
+ EF_RESURRECTION: 77
+ EF_RECOVERY: 78
+ EF_EARTHSPIKE: 79
+ EF_SPEARBMR: 80
+ EF_PIERCE: 81
+ EF_TURNUNDEAD: 82
+ EF_SANCTUARY: 83
+ EF_IMPOSITIO: 84
+ EF_LEXAETERNA: 85
+ EF_ASPERSIO: 86
+ EF_LEXDIVINA: 87
+ EF_SUFFRAGIUM: 88
+ EF_STORMGUST: 89
+ EF_LORD: 90
+ EF_BENEDICTIO: 91
+ EF_METEORSTORM: 92
+ EF_YUFITEL: 93
+ EF_YUFITELHIT: 94
+ EF_QUAGMIRE: 95
+ EF_FIREPILLAR: 96
+ EF_FIREPILLARBOMB: 97
+ EF_HASTEUP: 98
+ EF_FLASHER: 99
+ EF_REMOVETRAP: 100
+ EF_REPAIRWEAPON: 101
+ EF_CRASHEARTH: 102
+ EF_PERFECTION: 103
+ EF_MAXPOWER: 104
+ EF_BLASTMINE: 105
+ EF_BLASTMINEBOMB: 106
+ EF_CLAYMORE: 107
+ EF_FREEZING: 108
+ EF_BUBBLE: 109
+ EF_GASPUSH: 110
+ EF_SPRINGTRAP: 111
+ EF_KYRIE: 112
+ EF_MAGNUS: 113
+ EF_BOTTOM: 114
+ EF_BLITZBEAT: 115
+ EF_WATERBALL: 116
+ EF_WATERBALL2: 117
+ EF_FIREIVY: 118
+ EF_DETECTING: 119
+ EF_CLOAKING: 120
+ EF_SONICBLOW: 121
+ EF_SONICBLOWHIT: 122
+ EF_GRIMTOOTH: 123
+ EF_VENOMDUST: 124
+ EF_ENCHANTPOISON: 125
+ EF_POISONREACT: 126
+ EF_POISONREACT2: 127
+ EF_OVERTHRUST: 128
+ EF_SPLASHER: 129
+ EF_TWOHANDQUICKEN: 130
+ EF_AUTOCOUNTER: 131
+ EF_GRIMTOOTHATK: 132
+ EF_FREEZE: 133
+ EF_FREEZED: 134
+ EF_ICECRASH: 135
+ EF_SLOWPOISON: 136
+ EF_BOTTOM2: 137
+ EF_FIREPILLARON: 138
+ EF_SANDMAN: 139
+ EF_REVIVE: 140
+ EF_PNEUMA: 141
+ EF_HEAVENSDRIVE: 142
+ EF_SONICBLOW2: 143
+ EF_BRANDISH2: 144
+ EF_SHOCKWAVE: 145
+ EF_SHOCKWAVEHIT: 146
+ EF_EARTHHIT: 147
+ EF_PIERCESELF: 148
+ EF_BOWLINGSELF: 149
+ EF_SPEARSTABSELF: 150
+ EF_SPEARBMRSELF: 151
+ EF_HOLYHIT: 152
+ EF_CONCENTRATION: 153
+ EF_REFINEOK: 154
+ EF_REFINEFAIL: 155
+ EF_JOBCHANGE: 156
+ EF_LVUP: 157
+ EF_JOBLVUP: 158
+ EF_TOPRANK: 159
+ EF_PARTY: 160
+ EF_RAIN: 161
+ EF_SNOW: 162
+ EF_SAKURA: 163
+ EF_STATUS_STATE: 164
+ EF_BANJJAKII: 165
+ EF_MAKEBLUR: 166
+ EF_TAMINGSUCCESS: 167
+ EF_TAMINGFAILED: 168
+ EF_ENERGYCOAT: 169
+ EF_CARTREVOLUTION: 170
+ EF_VENOMDUST2: 171
+ EF_CHANGEDARK: 172
+ EF_CHANGEFIRE: 173
+ EF_CHANGECOLD: 174
+ EF_CHANGEWIND: 175
+ EF_CHANGEFLAME: 176
+ EF_CHANGEEARTH: 177
+ EF_CHAINGEHOLY: 178
+ EF_CHANGEPOISON: 179
+ EF_HITDARK: 180
+ EF_MENTALBREAK: 181
+ EF_MAGICALATTHIT: 182
+ EF_SUI_EXPLOSION: 183
+ EF_DARKATTACK: 184
+ EF_SUICIDE: 185
+ EF_COMBOATTACK1: 186
+ EF_COMBOATTACK2: 187
+ EF_COMBOATTACK3: 188
+ EF_COMBOATTACK4: 189
+ EF_COMBOATTACK5: 190
+ EF_GUIDEDATTACK: 191
+ EF_POISONATTACK: 192
+ EF_SILENCEATTACK: 193
+ EF_STUNATTACK: 194
+ EF_PETRIFYATTACK: 195
+ EF_CURSEATTACK: 196
+ EF_SLEEPATTACK: 197
+ EF_TELEKHIT: 198
+ EF_PONG: 199
+ EF_LEVEL99: 200
+ EF_LEVEL99_2: 201
+ EF_LEVEL99_3: 202
+ EF_GUMGANG: 203
+ EF_POTION1: 204
+ EF_POTION2: 205
+ EF_POTION3: 206
+ EF_POTION4: 207
+ EF_POTION5: 208
+ EF_POTION6: 209
+ EF_POTION7: 210
+ EF_POTION8: 211
+ EF_DARKBREATH: 212
+ EF_DEFFENDER: 213
+ EF_KEEPING: 214
+ EF_SUMMONSLAVE: 215
+ EF_BLOODDRAIN: 216
+ EF_ENERGYDRAIN: 217
+ EF_POTION_CON: 218
+ EF_POTION_: 219
+ EF_POTION_BERSERK: 220
+ EF_POTIONPILLAR: 221
+ EF_DEFENDER: 222
+ EF_GANBANTEIN: 223
+ EF_WIND: 224
+ EF_VOLCANO: 225
+ EF_GRANDCROSS: 226
+ EF_INTIMIDATE: 227
+ EF_CHOOKGI: 228
+ EF_CLOUD: 229
+ EF_CLOUD2: 230
+ EF_MAPPILLAR: 231
+ EF_LINELINK: 232
+ EF_CLOUD3: 233
+ EF_SPELLBREAKER: 234
+ EF_DISPELL: 235
+ EF_DELUGE: 236
+ EF_VIOLENTGALE: 237
+ EF_LANDPROTECTOR: 238
+ EF_BOTTOM_VO: 239
+ EF_BOTTOM_DE: 240
+ EF_BOTTOM_VI: 241
+ EF_BOTTOM_LA: 242
+ EF_FASTMOVE: 243
+ EF_MAGICROD: 244
+ EF_HOLYCROSS: 245
+ EF_SHIELDCHARGE: 246
+ EF_MAPPILLAR2: 247
+ EF_PROVIDENCE: 248
+ EF_SHIELDBOOMERANG: 249
+ EF_SPEARQUICKEN: 250
+ EF_DEVOTION: 251
+ EF_REFLECTSHIELD: 252
+ EF_ABSORBSPIRITS: 253
+ EF_STEELBODY: 254
+ EF_FLAMELAUNCHER: 255
+ EF_FROSTWEAPON: 256
+ EF_LIGHTNINGLOADER: 257
+ EF_SEISMICWEAPON: 258
+ EF_MAPPILLAR3: 259
+ EF_MAPPILLAR4: 260
+ EF_GUMGANG2: 261
+ EF_TEIHIT1: 262
+ EF_GUMGANG3: 263
+ EF_TEIHIT2: 264
+ EF_TANJI: 265
+ EF_TEIHIT1X: 266
+ EF_CHIMTO: 267
+ EF_STEALCOIN: 268
+ EF_STRIPWEAPON: 269
+ EF_STRIPSHIELD: 270
+ EF_STRIPARMOR: 271
+ EF_STRIPHELM: 272
+ EF_CHAINCOMBO: 273
+ EF_RG_COIN: 274
+ EF_BACKSTAP: 275
+ EF_TEIHIT3: 276
+ EF_BOTTOM_DISSONANCE: 277
+ EF_BOTTOM_LULLABY: 278
+ EF_BOTTOM_RICHMANKIM: 279
+ EF_BOTTOM_ETERNALCHAOS: 280
+ EF_BOTTOM_DRUMBATTLEFIELD: 281
+ EF_BOTTOM_RINGNIBELUNGEN: 282
+ EF_BOTTOM_ROKISWEIL: 283
+ EF_BOTTOM_INTOABYSS: 284
+ EF_BOTTOM_SIEGFRIED: 285
+ EF_BOTTOM_WHISTLE: 286
+ EF_BOTTOM_ASSASSINCROSS: 287
+ EF_BOTTOM_POEMBRAGI: 288
+ EF_BOTTOM_APPLEIDUN: 289
+ EF_BOTTOM_UGLYDANCE: 290
+ EF_BOTTOM_HUMMING: 291
+ EF_BOTTOM_DONTFORGETME: 292
+ EF_BOTTOM_FORTUNEKISS: 293
+ EF_BOTTOM_SERVICEFORYOU: 294
+ EF_TALK_FROSTJOKE: 295
+ EF_TALK_SCREAM: 296
+ EF_POKJUK: 297
+ EF_THROWITEM: 298
+ EF_THROWITEM2: 299
+ EF_CHEMICALPROTECTION: 300
+ EF_POKJUK_SOUND: 301
+ EF_DEMONSTRATION: 302
+ EF_CHEMICAL2: 303
+ EF_TELEPORTATION2: 304
+ EF_PHARMACY_OK: 305
+ EF_PHARMACY_FAIL: 306
+ EF_FORESTLIGHT: 307
+ EF_THROWITEM3: 308
+ EF_FIRSTAID: 309
+ EF_SPRINKLESAND: 310
+ EF_LOUD: 311
+ EF_HEAL: 312
+ EF_HEAL2: 313
+ EF_EXIT2: 314
+ EF_GLASSWALL2: 315
+ EF_READYPORTAL2: 316
+ EF_PORTAL2: 317
+ EF_BOTTOM_MAG: 318
+ EF_BOTTOM_SANC: 319
+ EF_HEAL3: 320
+ EF_WARPZONE2: 321
+ EF_FORESTLIGHT2: 322
+ EF_FORESTLIGHT3: 323
+ EF_FORESTLIGHT4: 324
+ EF_HEAL4: 325
+ EF_FOOT: 326
+ EF_FOOT2: 327
+ EF_BEGINASURA: 328
+ EF_TRIPLEATTACK: 329
+ EF_HITLINE: 330
+ EF_HPTIME: 331
+ EF_SPTIME: 332
+ EF_MAPLE: 333
+ EF_BLIND: 334
+ EF_POISON: 335
+ EF_GUARD: 336
+ EF_JOBLVUP50: 337
+ EF_ANGEL2: 338
+ EF_MAGNUM2: 339
+ EF_CALLZONE: 340
+ EF_PORTAL3: 341
+ EF_COUPLECASTING: 342
+ EF_HEARTCASTING: 343
+ EF_ENTRY2: 344
+ EF_SAINTWING: 345
+ EF_SPHEREWIND: 346
+ EF_COLORPAPER: 347
+ EF_LIGHTSPHERE: 348
+ EF_WATERFALL: 349
+ EF_WATERFALL_90: 350
+ EF_WATERFALL_SMALL: 351
+ EF_WATERFALL_SMALL_90: 352
+ EF_WATERFALL_T2: 353
+ EF_WATERFALL_T2_90: 354
+ EF_WATERFALL_SMALL_T2: 355
+ EF_WATERFALL_SMALL_T2_90: 356
+ EF_MINI_TETRIS: 357
+ EF_GHOST: 358
+ EF_BAT: 359
+ EF_BAT2: 360
+ EF_SOULBREAKER: 361
+ EF_LEVEL99_4: 362
+ EF_VALLENTINE: 363
+ EF_VALLENTINE2: 364
+ EF_PRESSURE: 365
+ EF_BASH3D: 366
+ EF_AURABLADE: 367
+ EF_REDBODY: 368
+ EF_LKCONCENTRATION: 369
+ EF_BOTTOM_GOSPEL: 370
+ EF_ANGEL: 371
+ EF_DEVIL: 372
+ EF_DRAGONSMOKE: 373
+ EF_BOTTOM_BASILICA: 374
+ EF_ASSUMPTIO: 375
+ EF_HITLINE2: 376
+ EF_BASH3D2: 377
+ EF_ENERGYDRAIN2: 378
+ EF_TRANSBLUEBODY: 379
+ EF_MAGICCRASHER: 380
+ EF_LIGHTSPHERE2: 381
+ EF_LIGHTBLADE: 382
+ EF_ENERGYDRAIN3: 383
+ EF_LINELINK2: 384
+ EF_LINKLIGHT: 385
+ EF_TRUESIGHT: 386
+ EF_FALCONASSAULT: 387
+ EF_TRIPLEATTACK2: 388
+ EF_PORTAL4: 389
+ EF_MELTDOWN: 390
+ EF_CARTBOOST: 391
+ EF_REJECTSWORD: 392
+ EF_TRIPLEATTACK3: 393
+ EF_SPHEREWIND2: 394
+ EF_LINELINK3: 395
+ EF_PINKBODY: 396
+ EF_LEVEL99_5: 397
+ EF_LEVEL99_6: 398
+ EF_BASH3D3: 399
+ EF_BASH3D4: 400
+ EF_NAPALMVALCAN: 401
+ EF_PORTAL5: 402
+ EF_MAGICCRASHER2: 403
+ EF_BOTTOM_SPIDER: 404
+ EF_BOTTOM_FOGWALL: 405
+ EF_SOULBURN: 406
+ EF_SOULCHANGE: 407
+ EF_BABY: 408
+ EF_SOULBREAKER2: 409
+ EF_RAINBOW: 410
+ EF_PEONG: 411
+ EF_TANJI2: 412
+ EF_PRESSEDBODY: 413
+ EF_SPINEDBODY: 414
+ EF_KICKEDBODY: 415
+ EF_AIRTEXTURE: 416
+ EF_HITBODY: 417
+ EF_DOUBLEGUMGANG: 418
+ EF_REFLECTBODY: 419
+ EF_BABYBODY: 420
+ EF_BABYBODY2: 421
+ EF_GIANTBODY: 422
+ EF_GIANTBODY2: 423
+ EF_ASURABODY: 424
+ EF_4WAYBODY: 425
+ EF_QUAKEBODY: 426
+ EF_ASURABODY_MONSTER: 427
+ EF_HITLINE3: 428
+ EF_HITLINE4: 429
+ EF_HITLINE5: 430
+ EF_HITLINE6: 431
+ EF_ELECTRIC: 432
+ EF_ELECTRIC2: 433
+ EF_HITLINE7: 434
+ EF_STORMKICK: 435
+ EF_HALFSPHERE: 436
+ EF_ATTACKENERGY: 437
+ EF_ATTACKENERGY2: 438
+ EF_CHEMICAL3: 439
+ EF_ASSUMPTIO2: 440
+ EF_BLUECASTING: 441
+ EF_RUN: 442
+ EF_STOPRUN: 443
+ EF_STOPEFFECT: 444
+ EF_JUMPBODY: 445
+ EF_LANDBODY: 446
+ EF_FOOT3: 447
+ EF_FOOT4: 448
+ EF_TAE_READY: 449
+ EF_GRANDCROSS2: 450
+ EF_SOULSTRIKE2: 451
+ EF_YUFITEL2: 452
+ EF_NPC_STOP: 453
+ EF_DARKCASTING: 454
+ EF_GUMGANGNPC: 455
+ EF_AGIUP: 456
+ EF_JUMPKICK: 457
+ EF_QUAKEBODY2: 458
+ EF_STORMKICK1: 459
+ EF_STORMKICK2: 460
+ EF_STORMKICK3: 461
+ EF_STORMKICK4: 462
+ EF_STORMKICK5: 463
+ EF_STORMKICK6: 464
+ EF_STORMKICK7: 465
+ EF_SPINEDBODY2: 466
+ EF_BEGINASURA1: 467
+ EF_BEGINASURA2: 468
+ EF_BEGINASURA3: 469
+ EF_BEGINASURA4: 470
+ EF_BEGINASURA5: 471
+ EF_BEGINASURA6: 472
+ EF_BEGINASURA7: 473
+ EF_AURABLADE2: 474
+ EF_DEVIL1: 475
+ EF_DEVIL2: 476
+ EF_DEVIL3: 477
+ EF_DEVIL4: 478
+ EF_DEVIL5: 479
+ EF_DEVIL6: 480
+ EF_DEVIL7: 481
+ EF_DEVIL8: 482
+ EF_DEVIL9: 483
+ EF_DEVIL10: 484
+ EF_DOUBLEGUMGANG2: 485
+ EF_DOUBLEGUMGANG3: 486
+ EF_BLACKDEVIL: 487
+ EF_FLOWERCAST: 488
+ EF_FLOWERCAST2: 489
+ EF_FLOWERCAST3: 490
+ EF_MOCHI: 491
+ EF_LAMADAN: 492
+ EF_EDP: 493
+ EF_SHIELDBOOMERANG2: 494
+ EF_RG_COIN2: 495
+ EF_GUARD2: 496
+ EF_SLIM: 497
+ EF_SLIM2: 498
+ EF_SLIM3: 499
+ EF_CHEMICALBODY: 500
+ EF_CASTSPIN: 501
+ EF_PIERCEBODY: 502
+ EF_SOULLINK: 503
+ EF_CHOOKGI2: 504
+ EF_MEMORIZE: 505
+ EF_SOULLIGHT: 506
+ EF_MAPAE: 507
+ EF_ITEMPOKJUK: 508
+ EF_05VAL: 509
+ EF_BEGINASURA11: 510
+ EF_NIGHT: 511
+ EF_CHEMICAL2DASH: 512
+ EF_GROUNDSAMPLE: 513
+ EF_GI_EXPLOSION: 514
+ EF_CLOUD4: 515
+ EF_CLOUD5: 516
+ EF_BOTTOM_HERMODE: 517
+ EF_CARTTER: 518
+ EF_ITEMFAST: 519
+ EF_SHIELDBOOMERANG3: 520
+ EF_DOUBLECASTBODY: 521
+ EF_GRAVITATION: 522
+ EF_TAROTCARD1: 523
+ EF_TAROTCARD2: 524
+ EF_TAROTCARD3: 525
+ EF_TAROTCARD4: 526
+ EF_TAROTCARD5: 527
+ EF_TAROTCARD6: 528
+ EF_TAROTCARD7: 529
+ EF_TAROTCARD8: 530
+ EF_TAROTCARD9: 531
+ EF_TAROTCARD10: 532
+ EF_TAROTCARD11: 533
+ EF_TAROTCARD12: 534
+ EF_TAROTCARD13: 535
+ EF_TAROTCARD14: 536
+ EF_ACIDDEMON: 537
+ EF_GREENBODY: 538
+ EF_THROWITEM4: 539
+ EF_BABYBODY_BACK: 540
+ EF_THROWITEM5: 541
+ EF_BLUEBODY: 542
+ EF_HATED: 543
+ EF_REDLIGHTBODY: 544
+ EF_RO2YEAR: 545
+ EF_SMA_READY: 546
+ EF_STIN: 547
+ EF_RED_HIT: 548
+ EF_BLUE_HIT: 549
+ EF_QUAKEBODY3: 550
+ EF_SMA: 551
+ EF_SMA2: 552
+ EF_STIN2: 553
+ EF_HITTEXTURE: 554
+ EF_STIN3: 555
+ EF_SMA3: 556
+ EF_BLUEFALL: 557
+ EF_BLUEFALL_90: 558
+ EF_FASTBLUEFALL: 559
+ EF_FASTBLUEFALL_90: 560
+ EF_BIG_PORTAL: 561
+ EF_BIG_PORTAL2: 562
+ EF_SCREEN_QUAKE: 563
+ EF_HOMUNCASTING: 564
+ EF_HFLIMOON1: 565
+ EF_HFLIMOON2: 566
+ EF_HFLIMOON3: 567
+ EF_HO_UP: 568
+ EF_HAMIDEFENCE: 569
+ EF_HAMICASTLE: 570
+ EF_HAMIBLOOD: 571
+ EF_HATED2: 572
+ EF_TWILIGHT1: 573
+ EF_TWILIGHT2: 574
+ EF_TWILIGHT3: 575
+ EF_ITEM_THUNDER: 576
+ EF_ITEM_CLOUD: 577
+ EF_ITEM_CURSE: 578
+ EF_ITEM_ZZZ: 579
+ EF_ITEM_RAIN: 580
+ EF_ITEM_LIGHT: 581
+ EF_ANGEL3: 582
+ EF_M01: 583
+ EF_M02: 584
+ EF_M03: 585
+ EF_M04: 586
+ EF_M05: 587
+ EF_M06: 588
+ EF_M07: 589
+ EF_KAIZEL: 590
+ EF_KAAHI: 591
+ EF_CLOUD6: 592
+ EF_FOOD01: 593
+ EF_FOOD02: 594
+ EF_FOOD03: 595
+ EF_FOOD04: 596
+ EF_FOOD05: 597
+ EF_FOOD06: 598
+ EF_SHRINK: 599
+ EF_THROWITEM6: 600
+ EF_SIGHT2: 601
+ EF_QUAKEBODY4: 602
+ EF_FIREHIT2: 603
+ EF_NPC_STOP2: 604
+ EF_NPC_STOP2_DEL: 605
+ EF_FVOICE: 606
+ EF_WINK: 607
+ EF_COOKING_OK: 608
+ EF_COOKING_FAIL: 609
+ EF_TEMP_OK: 610
+ EF_TEMP_FAIL: 611
+ EF_HAPGYEOK: 612
+ EF_THROWITEM7: 613
+ EF_THROWITEM8: 614
+ EF_THROWITEM9: 615
+ EF_THROWITEM10: 616
+ EF_BUNSINJYUTSU: 617
+ EF_KOUENKA: 618
+ EF_HYOUSENSOU: 619
+ EF_BOTTOM_SUITON: 620
+ EF_STIN4: 621
+ EF_THUNDERSTORM2: 622
+ EF_CHEMICAL4: 623
+ EF_STIN5: 624
+ EF_MADNESS_BLUE: 625
+ EF_MADNESS_RED: 626
+ EF_RG_COIN3: 627
+ EF_BASH3D5: 628
+ EF_CHOOKGI3: 629
+ EF_KIRIKAGE: 630
+ EF_TATAMI: 631
+ EF_KASUMIKIRI: 632
+ EF_ISSEN: 633
+ EF_KAEN: 634
+ EF_BAKU: 635
+ EF_HYOUSYOURAKU: 636
+ EF_DESPERADO: 637
+ EF_LIGHTNING_S: 638
+ EF_BLIND_S: 639
+ EF_POISON_S: 640
+ EF_FREEZING_S: 641
+ EF_FLARE_S: 642
+ EF_RAPIDSHOWER: 643
+ EF_MAGICALBULLET: 644
+ EF_SPREADATTACK: 645
+ EF_TRACKCASTING: 646
+ EF_TRACKING: 647
+ EF_TRIPLEACTION: 648
+ EF_BULLSEYE: 649
+ EF_MAP_MAGICZONE: 650
+ EF_MAP_MAGICZONE2: 651
+ EF_DAMAGE1: 652
+ EF_DAMAGE1_2: 653
+ EF_DAMAGE1_3: 654
+ EF_UNDEADBODY: 655
+ EF_UNDEADBODY_DEL: 656
+ EF_GREEN_NUMBER: 657
+ EF_BLUE_NUMBER: 658
+ EF_RED_NUMBER: 659
+ EF_PURPLE_NUMBER: 660
+ EF_BLACK_NUMBER: 661
+ EF_WHITE_NUMBER: 662
+ EF_YELLOW_NUMBER: 663
+ EF_PINK_NUMBER: 664
+ EF_BUBBLE_DROP: 665
+ EF_NPC_EARTHQUAKE: 666
+ EF_DA_SPACE: 667
+ EF_DRAGONFEAR: 668
+ EF_BLEEDING: 669
+ EF_WIDECONFUSE: 670
+ EF_BOTTOM_RUNNER: 671
+ EF_BOTTOM_TRANSFER: 672
+ EF_CRYSTAL_BLUE: 673
+ EF_BOTTOM_EVILLAND: 674
+ EF_GUARD3: 675
+ EF_NPC_SLOWCAST: 676
+ EF_CRITICALWOUND: 677
+ EF_GREEN99_3: 678
+ EF_GREEN99_5: 679
+ EF_GREEN99_6: 680
+ EF_MAPSPHERE: 681
+ EF_POK_LOVE: 682
+ EF_POK_WHITE: 683
+ EF_POK_VALEN: 684
+ EF_POK_BIRTH: 685
+ EF_POK_CHRISTMAS: 686
+ EF_MAP_MAGICZONE3: 687
+ EF_MAP_MAGICZONE4: 688
+ EF_DUST: 689
+ EF_TORCH_RED: 690
+ EF_TORCH_GREEN: 691
+ EF_MAP_GHOST: 692
+ EF_GLOW1: 693
+ EF_GLOW2: 694
+ EF_GLOW4: 695
+ EF_TORCH_PURPLE: 696
+ EF_CLOUD7: 697
+ EF_CLOUD8: 698
+ EF_FLOWERLEAF: 699
+ EF_MAPSPHERE2: 700
+ EF_GLOW11: 701
+ EF_GLOW12: 702
+ EF_CIRCLELIGHT: 703
+ EF_ITEM315: 704
+ EF_ITEM316: 705
+ EF_ITEM317: 706
+ EF_ITEM318: 707
+ EF_STORM_MIN: 708
+ EF_POK_JAP: 709
+ EF_MAP_GREENLIGHT: 710
+ EF_MAP_MAGICWALL: 711
+ EF_MAP_GREENLIGHT2: 712
+ EF_YELLOWFLY1: 713
+ EF_YELLOWFLY2: 714
+ EF_BOTTOM_BLUE: 715
+ EF_BOTTOM_BLUE2: 716
+ EF_WEWISH: 717
+ EF_FIREPILLARON2: 718
+ EF_FORESTLIGHT5: 719
+ EF_SOULBREAKER3: 720
+ EF_ADO_STR: 721
+ EF_IGN_STR: 722
+ EF_CHIMTO2: 723
+ EF_WINDCUTTER: 724
+ EF_DETECT2: 725
+ EF_FROSTMYSTY: 726
+ EF_CRIMSON_STR: 727
+ EF_HELL_STR: 728
+ EF_SPR_MASH: 729
+ EF_SPR_SOULE: 730
+ EF_DHOWL_STR: 731
+ EF_EARTHWALL: 732
+ EF_SOULBREAKER4: 733
+ EF_CHAINL_STR: 734
+ EF_CHOOKGI_FIRE: 735
+ EF_CHOOKGI_WIND: 736
+ EF_CHOOKGI_WATER: 737
+ EF_CHOOKGI_GROUND: 738
+ EF_MAGENTA_TRAP: 739
+ EF_COBALT_TRAP: 740
+ EF_MAIZE_TRAP: 741
+ EF_VERDURE_TRAP: 742
+ EF_NORMAL_TRAP: 743
+ EF_CLOAKING2: 744
+ EF_AIMED_STR: 745
+ EF_ARROWSTORM_STR: 746
+ EF_LAULAMUS_STR: 747
+ EF_LAUAGNUS_STR: 748
+ EF_MILSHIELD_STR: 749
+ EF_CONCENTRATION2: 750
+ EF_FIREBALL2: 751
+ EF_BUNSINJYUTSU2: 752
+ EF_CLEARTIME: 753
+ EF_GLASSWALL3: 754
+ EF_ORATIO: 755
+ EF_POTION_BERSERK2: 756
+ EF_CIRCLEPOWER: 757
+ EF_ROLLING1: 758
+ EF_ROLLING2: 759
+ EF_ROLLING3: 760
+ EF_ROLLING4: 761
+ EF_ROLLING5: 762
+ EF_ROLLING6: 763
+ EF_ROLLING7: 764
+ EF_ROLLING8: 765
+ EF_ROLLING9: 766
+ EF_ROLLING10: 767
+ EF_PURPLEBODY: 768
+ EF_STIN6: 769
+ EF_RG_COIN4: 770
+ EF_POISONWAV: 771
+ EF_POISONSMOKE: 772
+ EF_GUMGANG4: 773
+ EF_SHIELDBOOMERANG4: 774
+ EF_CASTSPIN2: 775
+ EF_VULCANWAV: 776
+ EF_AGIUP2: 777
+ EF_DETECT3: 778
+ EF_AGIUP3: 779
+ EF_DETECT4: 780
+ EF_ELECTRIC3: 781
+ EF_GUARD4: 782
+ EF_BOTTOM_BARRIER: 783
+ EF_BOTTOM_STEALTH: 784
+ EF_REPAIRTIME: 785
+ EF_NC_ANAL: 786
+ EF_FIRETHROW: 787
+ EF_VENOMIMPRESS: 788
+ EF_FROSTMISTY: 789
+ EF_BURNING: 790
+ EF_COLDTHROW: 791
+ EF_MAKEHALLU: 792
+ EF_HALLUTIME: 793
+ EF_INFRAREDSCAN: 794
+ EF_CRASHAXE: 795
+ EF_GTHUNDER: 796
+ EF_STONERING: 797
+ EF_INTIMIDATE2: 798
+ EF_STASIS: 799
+ EF_REDLINE: 800
+ EF_FROSTDIVER3: 801
+ EF_BOTTOM_BASILICA2: 802
+ EF_RECOGNIZED: 803
+ EF_TETRA: 804
+ EF_TETRACASTING: 805
+ EF_FIREBALL3: 806
+ EF_INTIMIDATE3: 807
+ EF_RECOGNIZED2: 808
+ EF_CLOAKING3: 809
+ EF_INTIMIDATE4: 810
+ EF_STRETCH: 811
+ EF_BLACKBODY: 812
+ EF_ENERVATION: 813
+ EF_ENERVATION2: 814
+ EF_ENERVATION3: 815
+ EF_ENERVATION4: 816
+ EF_ENERVATION5: 817
+ EF_ENERVATION6: 818
+ EF_LINELINK4: 819
+ EF_RG_COIN5: 820
+ EF_WATERFALL_ANI: 821
+ EF_BOTTOM_MANHOLE: 822
+ EF_MANHOLE: 823
+ EF_MAKEFEINT: 824
+ EF_FORESTLIGHT6: 825
+ EF_DARKCASTING2: 826
+ EF_BOTTOM_ANI: 827
+ EF_BOTTOM_MAELSTROM: 828
+ EF_BOTTOM_BLOODYLUST: 829
+ EF_BEGINSPELL_N1: 830
+ EF_BEGINSPELL_N2: 831
+ EF_HEAL_N: 832
+ EF_CHOOKGI_N: 833
+ EF_JOBLVUP50_2: 834
+ EF_CHEMICAL2DASH2: 835
+ EF_CHEMICAL2DASH3: 836
+ EF_ROLLINGCAST: 837
+ EF_WATER_BELOW: 838
+ EF_WATER_FADE: 839
+ EF_BEGINSPELL_N3: 840
+ EF_BEGINSPELL_N4: 841
+ EF_BEGINSPELL_N5: 842
+ EF_BEGINSPELL_N6: 843
+ EF_BEGINSPELL_N7: 844
+ EF_BEGINSPELL_N8: 845
+ EF_WATER_SMOKE: 846
+ EF_DANCE1: 847
+ EF_DANCE2: 848
+ EF_LINKPARTICLE: 849
+ EF_SOULLIGHT2: 850
+ EF_SPR_PARTICLE: 851
+ EF_SPR_PARTICLE2: 852
+ EF_SPR_PLANT: 853
+ EF_CHEMICAL_V: 854
+ EF_SHOOTPARTICLE: 855
+ EF_BOT_REVERB: 856
+ EF_RAIN_PARTICLE: 857
+ EF_CHEMICAL_V2: 858
+ EF_SECRA: 859
+ EF_BOT_REVERB2: 860
+ EF_CIRCLEPOWER2: 861
+ EF_SECRA2: 862
+ EF_CHEMICAL_V3: 863
+ EF_ENERVATION7: 864
+ EF_CIRCLEPOWER3: 865
+ EF_SPR_PLANT2: 866
+ EF_CIRCLEPOWER4: 867
+ EF_SPR_PLANT3: 868
+ EF_RG_COIN6: 869
+ EF_SPR_PLANT4: 870
+ EF_CIRCLEPOWER5: 871
+ EF_SPR_PLANT5: 872
+ EF_CIRCLEPOWER6: 873
+ EF_SPR_PLANT6: 874
+ EF_CIRCLEPOWER7: 875
+ EF_SPR_PLANT7: 876
+ EF_CIRCLEPOWER8: 877
+ EF_SPR_PLANT8: 878
+ EF_HEARTASURA: 879
+ EF_BEGINSPELL_150: 880
+ EF_LEVEL99_150: 881
+ EF_PRIMECHARGE: 882
+ EF_GLASSWALL4: 883
+ EF_GRADIUS_LASER: 884
+ EF_BASH3D6: 885
+ EF_GUMGANG5: 886
+ EF_HITLINE8: 887
+ EF_ELECTRIC4: 888
+ EF_TEIHIT1T: 889
+ EF_SPINMOVE: 890
+ EF_FIREBALL4: 891
+ EF_TRIPLEATTACK4: 892
+ EF_CHEMICAL3S: 893
+ EF_GROUNDSHAKE: 894
+ EF_DQ9_CHARGE: 895
+ EF_DQ9_CHARGE2: 896
+ EF_DQ9_CHARGE3: 897
+ EF_DQ9_CHARGE4: 898
+ EF_BLUELINE: 899
+ EF_SELFSCROLL: 900
+ EF_SPR_LIGHTPRINT: 901
+ EF_PNG_TEST: 902
+ EF_BEGINSPELL_YB: 903
+ EF_CHEMICAL2DASH4: 904
+ EF_GROUNDSHAKE2: 905
+ EF_PRESSURE2: 906
+ EF_RG_COIN7: 907
+ EF_PRIMECHARGE2: 908
+ EF_PRIMECHARGE3: 909
+ EF_PRIMECHARGE4: 910
+ EF_GREENCASTING: 911
+ EF_WALLOFTHORN: 912
+ EF_FIREBALL5: 913
+ EF_THROWITEM11: 914
+ EF_SPR_PLANT9: 915
+ EF_DEMONICFIRE: 916
+ EF_DEMONICFIRE2: 917
+ EF_DEMONICFIRE3: 918
+ EF_HELLSPLANT: 919
+ EF_FIREWALL2: 920
+ EF_VACUUM: 921
+ EF_SPR_PLANT10: 922
+ EF_SPR_LIGHTPRINT2: 923
+ EF_POISONSMOKE2: 924
+ EF_MAKEHALLU2: 925
+ EF_SHOCKWAVE2: 926
+ EF_SPR_PLANT11: 927
+ EF_COLDTHROW2: 928
+ EF_DEMONICFIRE4: 929
+ EF_PRESSURE3: 930
+ EF_LINKPARTICLE2: 931
+ EF_SOULLIGHT3: 932
+ EF_CHAREFFECT: 933
+ EF_GUMGANG6: 934
+ EF_FIREBALL6: 935
+ EF_GUMGANG7: 936
+ EF_GUMGANG8: 937
+ EF_GUMGANG9: 938
+ EF_BOTTOM_DE2: 939
+ EF_COLDSTATUS: 940
+ EF_SPR_LIGHTPRINT3: 941
+ EF_WATERBALL3: 942
+ EF_HEAL_N2: 943
+ EF_RAIN_PARTICLE2: 944
+ EF_CLOUD9: 945
+ EF_YELLOWFLY3: 946
+ EF_EL_GUST: 947
+ EF_EL_BLAST: 948
+ EF_EL_AQUAPLAY: 949
+ EF_EL_UPHEAVAL: 950
+ EF_EL_WILD_STORM: 951
+ EF_EL_CHILLY_AIR: 952
+ EF_EL_CURSED_SOIL: 953
+ EF_EL_COOLER: 954
+ EF_EL_TROPIC: 955
+ EF_EL_PYROTECHNIC: 956
+ EF_EL_PETROLOGY: 957
+ EF_EL_HEATER: 958
+ EF_POISON_MIST: 959
+ EF_ERASER_CUTTER: 960
+ EF_SILENT_BREEZE: 961
+ EF_MAGMA_FLOW: 962
+ EF_GRAYBODY: 963
+ EF_LAVA_SLIDE: 964
+ EF_SONIC_CLAW: 965
+ EF_TINDER_BREAKER: 966
+ EF_MIDNIGHT_FRENZY: 967
+ EF_MACRO: 968
+ EF_CHEMICAL_ALLRANGE: 969
+ EF_TETRA_FIRE: 970
+ EF_TETRA_WATER: 971
+ EF_TETRA_WIND: 972
+ EF_TETRA_GROUND: 973
+ EF_EMITTER: 974
+ EF_VOLCANIC_ASH: 975
+ EF_LEVEL99_ORB1: 976
+ EF_LEVEL99_ORB2: 977
+ EF_LEVEL150: 978
+ EF_LEVEL150_SUB: 979
+ EF_THROWITEM4_1: 980
+ EF_THROW_HAPPOKUNAI: 981
+ EF_THROW_MULTIPLE_COIN: 982
+ EF_THROW_BAKURETSU: 983
+ EF_ROTATE_HUUMARANKA: 984
+ EF_ROTATE_BG: 985
+ EF_ROTATE_LINE_GRAY: 986
+ EF_2011RWC: 987
+ EF_2011RWC2: 988
+ EF_KAIHOU: 989
+ EF_GROUND_EXPLOSION: 990
+ EF_KG_KAGEHUMI: 991
+ EF_KO_ZENKAI_WATER: 992
+ EF_KO_ZENKAI_LAND: 993
+ EF_KO_ZENKAI_FIRE: 994
+ EF_KO_ZENKAI_WIND: 995
+ EF_KO_JYUMONJIKIRI: 996
+ EF_KO_SETSUDAN: 997
+ EF_RED_CROSS: 998
+ EF_KO_IZAYOI: 999
+ EF_ROTATE_LINE_BLUE: 1000
+ EF_KG_KYOMU: 1001
+ EF_KO_HUUMARANKA: 1002
+ EF_BLUELIGHTBODY: 1003
+ EF_KAGEMUSYA: 1004
+ EF_OB_GENSOU: 1005
+ EF_NO100_FIRECRACKER: 1006
+ EF_KO_MAKIBISHI: 1007
+ EF_KAIHOU1: 1008
+ EF_AKAITSUKI: 1009
+ EF_ZANGETSU: 1010
+ EF_GENSOU: 1011
+ EF_HAT_EFFECT: 1012
+ EF_CHERRYBLOSSOM: 1013
+ EF_EVENT_CLOUD: 1014
+ EF_RUN_MAKE_OK: 1015
+ EF_RUN_MAKE_FAILURE: 1016
+ EF_MIRESULT_MAKE_OK: 1017
+ EF_MIRESULT_MAKE_FAIL: 1018
+ EF_ALL_RAY_OF_PROTECTION: 1019
+ EF_VENOMFOG: 1020
+ EF_DUSTSTORM: 1021
+ EF_LEVEL160: 1022
+ EF_LEVEL160_SUB: 1023
+ EF_MAPCHAIN: 1024
+ EF_MAGIC_FLOOR: 1025
+ EF_ICEMINE: 1026
+ EF_FLAMECORSS: 1027
+ EF_ICEMINE_1: 1028
+ EF_DANCE_BLADE_ATK: 1029
+ EF_DARKPIERCING: 1030
+ EF_INVINCIBLEOFF2: 1031
+ EF_MAXPAIN: 1032
+ EF_DEATHSUMMON: 1033
+ EF_MOONSTAR: 1034
+ EF_STRANGELIGHTS: 1035
+ EF_SUPER_STAR: 1036
+ EF_YELLOBODY: 1037
+ EF_COLORPAPER2: 1038
+ EF_EVILS_PAW: 1039
+ EF_GC_DARKCROW: 1040
+ EF_RK_DRAGONBREATH_WATER: 1041
+ EF_ALL_FULL_THROTTLE: 1042
+ EF_SR_FLASHCOMBO: 1043
+ EF_RK_LUXANIMA: 1044
+ EF_CLOUD10: 1045
+ EF_SO_ELEMENTAL_SHIELD: 1046
+ EF_AB_OFFERTORIUM: 1047
+ EF_WL_TELEKINESIS_INTENSE: 1048
+ EF_GN_ILLUSIONDOPING: 1049
+ EF_NC_MAGMA_ERUPTION: 1050
+ EF_LG_KINGS_GRACE: 1051
+ EF_BLOODDRAIN2: 1052
+ EF_NPC_WIDEWEB: 1053
+ EF_NPC_BURNT: 1054
+ EF_NPC_CHILL: 1055
+ EF_RA_UNLIMIT: 1056
+ EF_AB_OFFERTORIUM_RING: 1057
+ EF_SC_ESCAPE: 1058
+ EF_WM_FRIGG_SONG: 1059
+ EF_FLICKER: 1060
+ EF_C_MAKER: 1061
+ EF_HAMMER_OF_GOD: 1062
+ EF_MASS_SPIRAL: 1063
+ EF_FIRE_RAIN: 1064
+ EF_WHITEBODY: 1065
+ EF_BANISHING_BUSTER: 1066
+ EF_SLUGSHOT: 1067
+ EF_D_TAIL: 1068
+ EF_BIND_TRAP1: 1069
+ EF_BIND_TRAP2: 1070
+ EF_BIND_TRAP3: 1071
+ EF_JUMPBODY1: 1072
+ EF_ANIMATED_EMITTER: 1073
+ EF_RL_EXPLOSION: 1074
+ EF_C_MAKER_1: 1075
+ EF_QD_SHOT: 1076
+ EF_P_ALTER: 1077
+ EF_S_STORM: 1078
+ EF_MUSIC_HAT: 1079
+ EF_CLOUD_KILL: 1080
+ EF_ESCAPE: 1081
+ EF_XENO_SLASHER: 1082
+ EF_FLOWERSMOKE: 1083
+ EF_FSTONE: 1084
+ EF_QSCARABA: 1085
+ EF_LJOSALFAR: 1086
+ EF_HAPPINESSSTAR: 1087
+ EF_POWER_OF_GAIA: 1088
+ EF_MAPLE_FALLS: 1089
+ EF_MARKING_USE_CHANGEMONSTER: 1090
+ EF_MAGICAL_FEATHER: 1091
+ EF_MERMAID_LONGING: 1092
+ EF_GIFT_OF_SNOW: 1093
+ EF_ACH_COMPLETE: 1094
+ EF_TIME_ACCESSORY: 1095
+ EF_SPRITEMABLE: 1096
+ EF_TUNAPARTY: 1097
+
+ comment__: "NPC sprite IDs"
+ FAKE_NPC: -1
+ WARPNPC: 45
+ HIDDEN_WARP_NPC: 139
+ MOB_TOMB: 565
+ GUILD_FLAG: 722
+ 1_SHADOW_NPC: 723
+ TW_TOWER: 812
+ CLEAR_NPC: 844
+ PORTAL: 10007
+ 4_NPC_TRAP: 10150
+ WARPEFFECTNPC: 10284
+
+ comment__: "Mercenary IDs"
+ MER_LIF: 6001
+ MER_AMISTR: 6002
+ MER_FILIR: 6003
+ MER_VANILMIRTH: 6004
+ MER_LIF2: 6005
+ MER_AMISTR2: 6006
+ MER_FILIR2: 6007
+ MER_VANILMIRTH2: 6008
+ MER_LIF_H: 6009
+ MER_AMISTR_H: 6010
+ MER_FILIR_H: 6011
+ MER_VANILMIRTH_H: 6012
+ MER_LIF_H2: 6013
+ MER_AMISTR_H2: 6014
+ MER_FILIR_H2: 6015
+ MER_VANILMIRTH_H2: 6016
+ MER_ARCHER01: 6017
+ MER_ARCHER02: 6018
+ MER_ARCHER03: 6019
+ MER_ARCHER04: 6020
+ MER_ARCHER05: 6021
+ MER_ARCHER06: 6022
+ MER_ARCHER07: 6023
+ MER_ARCHER08: 6024
+ MER_ARCHER09: 6025
+ MER_ARCHER10: 6026
+ MER_LANCER01: 6027
+ MER_LANCER02: 6028
+ MER_LANCER03: 6029
+ MER_LANCER04: 6030
+ MER_LANCER05: 6031
+ MER_LANCER06: 6032
+ MER_LANCER07: 6033
+ MER_LANCER08: 6034
+ MER_LANCER09: 6035
+ MER_LANCER10: 6036
+ MER_SWORDMAN01: 6037
+ MER_SWORDMAN02: 6038
+ MER_SWORDMAN03: 6039
+ MER_SWORDMAN04: 6040
+ MER_SWORDMAN05: 6041
+ MER_SWORDMAN06: 6042
+ MER_SWORDMAN07: 6043
+ MER_SWORDMAN08: 6044
+ MER_SWORDMAN09: 6045
+ MER_SWORDMAN10: 6046
+
+ comment__: "questprogress"
+ HAVEQUEST: 0
+ PLAYTIME: 1
+ HUNTING: 2
+
+ comment__: "questinfo"
+ QTYPE_NONE: 0x270f
+ QTYPE_QUEST: 0x00
+ QTYPE_QUEST2: 0x01
+ QTYPE_JOB: 0x02
+ QTYPE_JOB2: 0x03
+ QTYPE_EVENT: 0x04
+ QTYPE_EVENT2: 0x05
+ QTYPE_WARG: 0x06
+ QTYPE_CLICKME: 0x06
+ QTYPE_DAILYQUEST: 0x07
+ QTYPE_WARG2: 0x08
+ QTYPE_EVENT3: 0x08
+ QTYPE_JOBQUEST: 0x09
+ QTYPE_JUMPING_PORING: 0xA
+
+ comment__: "Font weight"
+ FW_DONTCARE: 0
+ FW_THIN: 100
+ FW_EXTRALIGHT: 200
+ FW_LIGHT: 300
+ FW_NORMAL: 400
+ FW_MEDIUM: 500
+ FW_SEMIBOLD: 600
+ FW_BOLD: 700
+ FW_EXTRABOLD: 800
+ FW_HEAVY: 900
+
+ comment__: "old setlook (use LOOK_* constants instead)"
+ VAR_HEAD: {
+ Value: 1
+ Deprecated: true // Use LOOK_HAIR
+ }
+ VAR_WEAPON: {
+ Value: 2
+ Deprecated: true // Use LOOK_WEAPON
+ }
+ VAR_HEAD_TOP: {
+ Value: 3
+ Deprecated: true // Use LOOK_HEAD_TOP
+ }
+ VAR_HEAD_MID: {
+ Value: 4
+ Deprecated: true // Use LOOK_HEAD_MID
+ }
+ VAR_HEAD_BOTTOM: {
+ Value: 5
+ Deprecated: true // Use LOOK_HEAD_BOTTOM
+ }
+ VAR_HEADPALETTE: {
+ Value: 6
+ Deprecated: true // Use LOOK_HAIR_COLOR
+ }
+ VAR_BODYPALETTE: {
+ Value: 7
+ Deprecated: true // Use LOOK_CLOTHES_COLOR
+ }
+ VAR_SHIELD: {
+ Value: 8
+ Deprecated: true // Use LOOK_SHIELD
+ }
+ VAR_SHOES: {
+ Value: 9
+ Deprecated: true // Use LOOK_SHOES
+ }
+
+ comment__: "Directions"
+ DIR_NORTH: 0
+ DIR_NORTHWEST: 1
+ DIR_WEST: 2
+ DIR_SOUTHWEST: 3
+ DIR_SOUTH: 4
+ DIR_SOUTHEAST: 5
+ DIR_EAST: 6
+ DIR_NORTHEAST: 7
+
+ comment__: "Item types"
+ IT_HEALING: 0
+ IT_USABLE: 2
+ IT_ETC: 3
+ IT_WEAPON: 4
+ IT_ARMOR: 5
+ IT_CARD: 6
+ IT_PETEGG: 7
+ IT_PETARMOR: 8
+ IT_AMMO: 10
+ IT_DELAYCONSUME: 11
+ IT_CASH: 18
+
+ comment__: "queueopt"
+ QUEUEOPT_LOGOUT: 1
+ QUEUEOPT_DEATH: 2
+ QUEUEOPT_MAPCHANGE: 3
+
+ comment__: "Instance owner type"
+ IOT_NONE: 0
+ IOT_CHAR: 1
+ IOT_PARTY: 2
+ IOT_GUILD: 3
+
+ comment__: "strcharinfo"
+ PC_NAME: 0
+ PC_PARTY: 1
+ PC_GUILD: 2
+ PC_MAP: 3
+ PC_CLAN: 4
+
+ comment__: "strnpcinfo"
+ NPC_NAME: 0
+ NPC_NAME_VISIBLE: 1
+ NPC_NAME_HIDDEN: 2
+ NPC_NAME_UNIQUE: 3
+ NPC_MAP: 4
+
+ comment__: "getcharid"
+ CHAR_ID_CHAR: 0
+ CHAR_ID_PARTY: 1
+ CHAR_ID_GUILD: 2
+ CHAR_ID_ACCOUNT: 3
+ CHAR_ID_BG: 4
+ CHAR_ID_CLAN: 5
+
+ comment__: "sc_start"
+ SCFLAG_NONE: 0x00
+ SCFLAG_NOAVOID: 0x01
+ SCFLAG_FIXEDTICK: 0x02
+ SCFLAG_LOADED: 0x04
+ SCFLAG_FIXEDRATE: 0x08
+ SCFLAG_NOICON: 0x10
+
+ comment__: "Mount types"
+ MOUNT_NONE: 0
+ MOUNT_PECO: 1
+ MOUNT_WUG: 2
+ MOUNT_MADO: 3
+ MOUNT_DRAGON: 4
+ MOUNT_DRAGON_GREEN: 4
+ MOUNT_DRAGON_BROWN: 5
+ MOUNT_DRAGON_GRAY: 6
+ MOUNT_DRAGON_BLUE: 7
+ MOUNT_DRAGON_RED: 8
+
+ comment__: "Gettime Types"
+ GETTIME_SECOND: 1
+ GETTIME_MINUTE: 2
+ GETTIME_HOUR: 3
+ GETTIME_WEEKDAY: 4
+ GETTIME_DAYOFMONTH: 5
+ GETTIME_MONTH: 6
+ GETTIME_YEAR: 7
+ GETTIME_DAYOFYEAR: 8
+
+ comment__: "gettimer"
+ TIMER_COUNT: 0
+ TIMER_TICK_NEXT: 1
+ TIMER_TICK_LAST: 2
+
+ comment__: "unit types"
+ UNITTYPE_PC: 0
+ UNITTYPE_NPC: 1
+ UNITTYPE_PET: 2
+ UNITTYPE_MOB: 3
+ UNITTYPE_HOM: 4
+ UNITTYPE_MER: 5
+ UNITTYPE_ELEM: 6
+
+ comment__: "Unit AI Types"
+ AI_NONE: 0 //0: Normal mob.
+ AI_ATTACK: 1 //1: Standard summon, attacks mobs.
+ AI_SPHERE: 2 //2: Alchemist Marine Sphere
+ AI_FLORA: 3 //3: Alchemist Summon Flora
+ AI_ZANZOU: 4 //4: Summon Zanzou
+
+ comment__: "Colors"
+ C_AQUA: 0x00FFFF
+ C_BLACK: 0x000000
+ C_BLUE: 0x0000FF
+ C_GRAY: 0x808080
+ C_GREEN: 0x008000
+ C_LIME: 0x00FF00
+ C_MAROON: 0x800000
+ C_NAVY: 0x000080
+ C_OLIVE: 0x808000
+ C_ORANGE: 0xFFA500
+ C_PURPLE: 0x800080
+ C_RED: 0xFF0000
+ C_SILVER: 0xC0C0C0
+ C_SPRINGGREEN: 0x00FF99
+ C_TEAL: 0x008080
+ C_WHITE: 0xFFFFFF
+ C_YELLOW: 0xFFFF00
+ C_PINK: 0xFFC0CB
+ C_CHOCOLATE: 0xD2691E
+ C_GOLD: 0xFFD700
+ C_VIOLET: 0xEE82EE
+
+ comment__: "Genders"
+ SEX_FEMALE: 0
+ SEX_MALE: 1
+ SEX_ANY: 2
+
+
+ comment__: "HatEffect Constants"
+ HAT_EF_BLOSSOM_FLUTTERING: 1
+ HAT_EF_MERMAID_LONGING: 2
+ HAT_EF_RL_BANISHING_BUSTER: 3
+ HAT_EF_LJOSALFAR: 4
+ HAT_EF_CLOCKING: 5
+ HAT_EF_SNOW: 6
+ HAT_EF_MAKEBLUR: 7
+ HAT_EF_SLEEPATTACK: 8
+ HAT_EF_GUMGANG: 9
+ HAT_EF_TALK_FROSTJOKE: 10
+ HAT_EF_DEMONSTRATION: 11
+ HAT_EF_FLUTTER_BUTTERFLY: 12
+ HAT_EF_ANGEL_FLUTTERING: 13
+ HAT_EF_BLESSING_OF_ANGELS: 14
+ HAT_EF_ELECTRIC: 15
+ HAT_EF_GREEN_FLOOR: 16
+ HAT_EF_SHRINK: 17
+ HAT_EF_VALHALLA_IDOL: 18
+ HAT_EF_ANGEL_STAIRS: 19
+ HAT_EF_GLOW_OF_NEW_YEAR: 20
+ HAT_EF_BOTTOM_FORTUNEKISS: 21
+ HAT_EF_PINKBODY: 22
+ HAT_EF_DOUBLEGUMGANG: 23
+ HAT_EF_GIANTBODY: 24
+ HAT_EF_GREEN99_6: 25
+ HAT_EF_CIRCLEPOWER: 26
+ HAT_EF_BOTTOM_BLOODYLUST: 27
+ HAT_EF_WATER_BELOW: 28
+ HAT_EF_LEVEL99_150: 29
+ HAT_EF_YELLOWFLY3: 30
+ HAT_EF_KAGEMUSYA: 31
+ HAT_EF_CHERRYBLOSSOM: 32
+ HAT_EF_STRANGELIGHTS: 33
+ HAT_EF_WL_TELEKINESIS_INTENSE: 34
+ HAT_EF_AB_OFFERTORIUM_RING: 35
+ HAT_EF_WHITEBODY2: 36
+ HAT_EF_SAKURA: 37
+ HAT_EF_CLOUD2: 38
+ HAT_EF_FEATHER_FLUTTERING: 39
+ HAT_EF_CAMELLIA_HAIR_PIN: 40
+ HAT_EF_JP_EV_EFFECT01: 41
+ HAT_EF_JP_EV_EFFECT02: 42
+ HAT_EF_JP_EV_EFFECT03: 43
+ HAT_EF_FLORAL_WALTZ: 44
+ HAT_EF_MAGICAL_FEATHER: 45
+ HAT_EF_HAT_EFFECT: 46
+ HAT_EF_BAKURETSU_HADOU: 47
+ HAT_EF_GOLD_SHOWER: 48
+ HAT_EF_WHITEBODY: 49
+ HAT_EF_WATER_BELOW2: 50
+ HAT_EF_FIREWORK: 51
+ HAT_EF_RETURN_TW_1ST_HAT: 52
+ HAT_EF_C_FLUTTERBUTTERFLY_BL: 53
+ HAT_EF_QSCARABA: 54
+ HAT_EF_FSTONE: 55
+ HAT_EF_MAGICCIRCLE: 56
+ HAT_EF_BRYSINGGAMEN: 57
+ HAT_EF_MAGINGIORDE: 58
+ HAT_EF_LEVEL99_RED: 59
+ HAT_EF_LEVEL99_ULTRAMARINE: 60
+ HAT_EF_LEVEL99_CYAN: 61
+ HAT_EF_LEVEL99_LIME: 62
+ HAT_EF_LEVEL99_VIOLET: 63
+ HAT_EF_LEVEL99_LILAC: 64
+ HAT_EF_LEVEL99_SUN_ORANGE: 65
+ HAT_EF_LEVEL99_DEEP_PINK: 66
+ HAT_EF_LEVEL99_BLACK: 67
+ HAT_EF_LEVEL99_WHITE: 68
+ HAT_EF_LEVEL160_RED: 69
+ HAT_EF_LEVEL160_ULTRAMARINE: 70
+ HAT_EF_LEVEL160_CYAN: 71
+ HAT_EF_LEVEL160_LIME: 72
+ HAT_EF_LEVEL160_VIOLET: 73
+ HAT_EF_LEVEL160_LILAC: 74
+ HAT_EF_LEVEL160_SUN_ORANGE: 75
+ HAT_EF_LEVEL160_DEEP_PINK: 76
+ HAT_EF_LEVEL160_BLACK: 77
+ HAT_EF_LEVEL160_WHITE: 78
+ HAT_EF_FULL_BLOOMCHERRY_TREE: 79
+ HAT_EF_C_BLESSINGS_OF_SOUL: 80
+ HAT_EF_MANYSTARS: 81
+ HAT_EF_SUBJECT_AURA_GOLD: 82
+ HAT_EF_SUBJECT_AURA_WHITE: 83
+ HAT_EF_SUBJECT_AURA_RED: 84
+ HAT_EF_C_SHINING_ANGEL_WING: 85
+ HAT_EF_MAGIC_STAR_TW: 86
+ HAT_DIGITAL_SPACE: 87
+ HAT_EF_SLEIPNIR: 88
+
+ comment__: "Achievement Types"
+ ACH_QUEST: 0
+ ACH_KILL_PC_TOTAL: 1
+ ACH_KILL_PC_JOB: 2
+ ACH_KILL_PC_JOBTYPE: 3
+ ACH_KILL_MOB_CLASS: 4
+ ACH_DAMAGE_PC_MAX: 5
+ ACH_DAMAGE_PC_TOTAL: 6
+ ACH_DAMAGE_PC_REC_MAX: 7
+ ACH_DAMAGE_PC_REC_TOTAL: 8
+ ACH_DAMAGE_MOB_MAX: 9
+ ACH_DAMAGE_MOB_TOTAL: 10
+ ACH_DAMAGE_MOB_REC_MAX: 11
+ ACH_DAMAGE_MOB_REC_TOTAL: 12
+ ACH_JOB_CHANGE: 13
+ ACH_STATUS: 14
+ ACH_STATUS_BY_JOB: 15
+ ACH_STATUS_BY_JOBTYPE: 16
+ ACH_CHATROOM_CREATE_DEAD: 17
+ ACH_CHATROOM_CREATE: 18
+ ACH_CHATROOM_MEMBERS: 19
+ ACH_FRIEND_ADD: 20
+ ACH_PARTY_CREATE: 21
+ ACH_PARTY_JOIN: 22
+ ACH_MARRY: 23
+ ACH_ADOPT_BABY: 24
+ ACH_ADOPT_PARENT: 25
+ ACH_ZENY_HOLD: 26
+ ACH_ZENY_GET_ONCE: 27
+ ACH_ZENY_GET_TOTAL: 28
+ ACH_ZENY_SPEND_ONCE: 29
+ ACH_ZENY_SPEND_TOTAL: 30
+ ACH_EQUIP_REFINE_SUCCESS: 31
+ ACH_EQUIP_REFINE_FAILURE: 32
+ ACH_EQUIP_REFINE_SUCCESS_TOTAL: 33
+ ACH_EQUIP_REFINE_FAILURE_TOTAL: 34
+ ACH_EQUIP_REFINE_SUCCESS_WLV: 35
+ ACH_EQUIP_REFINE_FAILURE_WLV: 36
+ ACH_EQUIP_REFINE_SUCCESS_ID: 37
+ ACH_EQUIP_REFINE_FAILURE_ID: 38
+ ACH_ITEM_GET_COUNT: 39
+ ACH_ITEM_GET_COUNT_ITEMTYPE: 40
+ ACH_ITEM_GET_WORTH: 41
+ ACH_ITEM_SELL_WORTH: 42
+ ACH_PET_CREATE: 43
+ ACH_ACHIEVE: 44
+ ACH_ACHIEVEMENT_RANK: 45
+
+ comment__: "inventory expansion"
+ INVENTORY_INCREASE_STEP: 10
+
+
+/* ==================================================== */
+ /** evol constants **/
+
+ comment__: "API codes"
+ API_DISCORD: 301
+ API_PINCODE: 302
+ API_SENDMAIL: 501
+ API_FLUSHVAULT: 607
+
+ comment__: "outdated constants. must be removed"
+ // >>>
+ equip_head: 1
+ equip_shield: 2
+ equip_hand2: 3
+ equip_hand1: 4
+ equip_gloves: 5
+ equip_shoes: 6
+ equip_misc1: 7
+ equip_misc2: 8
+ equip_torso: 9
+ equip_legs: 10
+ // <<<
+
+ comment__: "genders"
+ G_FEMALE: 0
+ G_MALE: 1
+ G_OTHER: 3
+
+ comment__: "races"
+ Talpan: 0
+ //Unused: 1
+ NoRace: 1
+ Tritan: 2
+ Ifriton: 3
+ Gispaan: 4
+ Sparron: 5
+ Skellie: 6
+
+ // DEPRECATED: Kept for compatibility
+ Human: 0
+ Ukar: 3
+ Raijin: 7
+ Kralog: 8
+
+ comment__: "getraceflags"
+ GETRACE_RACE: 0
+ GETRACE_SKIN: 1
+ GETRACE_FULL: 2
+
+ comment__: "directions"
+ DOWN: 0
+ DOWNLEFT: 1
+ LEFT: 2
+ UPLEFT: 3
+ UP: 4
+ UPRIGHT: 5
+ RIGHT: 6
+ DOWNRIGHT: 7
+
+ comment__: "seasons"
+ WINTER: 0
+ SPRING: 1
+ SUMMER: 2
+ AUTUMN: 3
+
+ comment__: "CRAFT enum"
+ CRAFT_COOKING: 4
+ CRAFT_ALCHEMY: 8
+ CRAFT_SMITHERY: 16
+ CRAFT_TAILORING: 32
+ CRAFT_JEWELERY: 64
+
+ comment__: "speechflags"
+ S_FIRST_BLANK_LINE: 0b00000001
+ S_LAST_BLANK_LINE: 0b00000010
+ S_LAST_NEXT: 0b00000100
+ S_NO_NPC_NAME: 0b00001000
+ S_LAST_CLOSE: 0b00010000
+
+ comment__: "npcs"
+ NPC45:45
+ NPC100:100
+ NPC101:101
+ NPC102:102
+ NPC103:103
+ NPC104:104
+ NPC105:105
+ NPC106:106
+ NPC107:107
+ NPC108:108
+ NPC109:109
+ NPC110:110
+ NPC111:111
+ NPC112:112
+ NPC113:113
+ NPC114:114
+ NPC115:115
+ NPC116:116
+ NPC117:117
+ NPC118:118
+ NPC119:119
+ NPC120:120
+ NPC121:121
+ NPC122:122
+ NPC123:123
+ NPC124:124
+ NPC125:125
+ NPC126:126
+ NPC127:127
+ NPC128:128
+ NPC129:129
+ NPC130:130
+ NPC132:132
+ NPC133:133
+ NPC134:134
+ NPC135:135
+ NPC136:136
+ NPC137:137
+ NPC138:138
+ NPC139:139
+ NPC140:140
+ NPC141:141
+ NPC142:142
+ NPC143:143
+ NPC144:144
+ NPC146:146
+ NPC147:147
+ NPC148:148
+ NPC149:149
+ NPC150:150
+ NPC151:151
+ NPC152:152
+ NPC153:153
+ NPC154:154
+ NPC155:155
+ NPC156:156
+ NPC157:157
+ NPC158:158
+ NPC159:159
+ NPC160:160
+ NPC161:161
+ NPC162:162
+ NPC163:163
+ NPC164:164
+ NPC165:165
+ NPC166:166
+ NPC167:167
+ NPC168:168
+ NPC169:169
+ NPC171:171
+ NPC172:172
+ NPC174:174
+ NPC175:175
+ NPC177:177
+ NPC178:178
+ NPC179:179
+ NPC180:180
+ NPC181:181
+ NPC182:182
+ NPC183:183
+ NPC185:185
+ NPC186:186
+ NPC187:187
+ NPC189:189
+ NPC190:190
+ NPC191:191
+ NPC192:192
+ NPC193:193
+ NPC195:195
+ NPC196:196
+ NPC197:197
+ NPC198:198
+ NPC201:201
+ NPC204:204
+ NPC205:205
+ NPC206:206
+ NPC207:207
+ NPC208:208
+ NPC209:209
+ NPC210:210
+ NPC211:211
+ NPC212:212
+ NPC213:213
+ NPC214:214
+ NPC215:215
+ NPC216:216
+ NPC217:217
+ NPC218:218
+ NPC258:258
+ NPC259:259
+ NPC260:260
+ NPC262:262
+ NPC263:263
+ NPC265:265
+ NPC300:300
+ NPC301:301
+ NPC302:302
+ NPC303:303
+ NPC304:304
+ NPC305:305
+ NPC306:306
+ NPC307:307
+ NPC308:308
+ NPC309:309
+ NPC310:310
+ NPC311:311
+ NPC312:312
+ NPC313:313
+ NPC314:314
+ NPC315:315
+ NPC316:316
+ NPC317:317
+ NPC318:318
+ NPC319:319
+ NPC320:320
+ NPC321:321
+ NPC322:322
+ NPC324:324
+ NPC325:325
+ NPC326:326
+ NPC327:327
+ NPC328:328
+ NPC329:329
+ NPC330:330
+ NPC334:334
+ NPC340:340
+ NPC344:344
+ NPC345:345
+ NPC346:346
+ NPC351:351
+ NPC354:354
+ NPC355:355
+ NPC356:356
+ NPC357:357
+ NPC358:358
+ NPC359:359
+ NPC360:360
+ NPC361:361
+ NPC362:362
+ NPC363:363
+ NPC365:365
+ NPC366:366
+ NPC367:367
+ NPC368:368
+ NPC369:369
+ NPC370:370
+ NPC371:371
+ NPC372:372
+ NPC374:374
+ NPC376:376
+ NPC377:377
+ NPC378:378
+ NPC379:379
+ NPC380:380
+ NPC381:381
+ NPC383:383
+ NPC384:384
+ NPC385:385
+ NPC386:386
+ NPC393:393
+ NPC394:394
+ NPC395:395
+ NPC400:400
+ NPC401:401
+ NPC402:402
+ NPC403:403
+ NPC404:404
+ NPC405:405
+ NPC406:406
+ NPC407:407
+ NPC409:409
+ NPC410:410
+ NPC411:411
+ NPC412:412
+ NPC413:413
+ NPC414:414
+ NPC415:415
+ NPC416:416
+ NPC417:417
+ NPC418:418
+ NPC419:419
+ NPC429:429
+ NPC430:430
+ NPC32767:32767
+
+ // NPCs decently named
+ NPC_OFFSET_NO_SPRITE: 998
+
+ // Avatars (1000+)
+ AVATAR_CARDA: 1000
+ AVATAR_CARD2: 1001
+ AVATAR_CARD3: 1002
+ AVATAR_CARD4: 1003
+ AVATAR_CARD5: 1004
+ AVATAR_CARD6: 1005
+ AVATAR_CARD7: 1006
+ AVATAR_CARD8: 1007
+ AVATAR_CARD9: 1008
+ AVATAR_CARD10: 1009
+ AVATAR_CARDJ: 1010
+ AVATAR_CARDQ: 1011
+ AVATAR_CARDK: 1012
+ AVATAR_CARD_JOKER: 1013
+ AVATAR_CARD_COVER: 1015
+
+ comment__: "special npcs"
+ NPC_EMPTY: -1
+ NPC_WARP: 45
+ NPC_WARP_HIDDEN: 139
+ NPC_UNUSED__MOBTOMB: 565
+ NPC_WARP_DEBUG: 722
+ NPC_UNUSED__FLAG: 722
+ NPC_NO_SPRITE: 999
+ NPC_HIDDEN: 32767
+
+ comment__: "Walk masks"
+ WALK_DEFAULT: 0
+ WALK_WALL: 1
+ WALK_WATER: 2
+ WALK_AIR: 4
+
+ comment__: "Cell masks"
+ CELLS_WALKABLE : 0
+ CELLS_WALL : 1
+ CELLS_AIR : 2
+ CELLS_WATER : 3
+ CELLS_NOPLAYER : 5
+ CELLS_NOMONSTER : 6
+
+ comment__: "map masks"
+ MASK_NONE: 1
+ MASK_UNUSED1: 2
+ MASK_UNUSED2: 4
+ MASK_NIGHT: 8
+ MASK_RAIN: 16
+ MASK_SANDSTORM: 32
+ MASK_SNOW: 64
+ MASK_CHRISTMAS: 128
+ MASK_UNUSED3: 256
+ MASK_UNUSED4: 512
+ MASK_SPECIAL: 1024 // Usually a warning sign
+ MASK_SPECIAL2: 2048
+ MASK_SPECIAL3: 4096
+
+ comment__: "map climate"
+ CLIMATE_NONE: 0
+ CLIMATE_DESERT: 1
+ CLIMATE_MODERATE: 2
+ CLIMATE_ICELAND: 3
+ CLIMATE_SPECIAL: 4
+
+ comment__: "Being actions"
+ ACTION_STAND: 0
+ ACTION_MOVE: 1
+ ACTION_ATTACK: 2
+ ACTION_CAST: 3
+ ACTION_SIT: 4
+ ACTION_DEAD: 5
+ ACTION_HURT: 6
+ ACTION_SPAWN: 7
+
+ comment__: "Ask constants"
+ ASK_YES: 1
+ ASK_NO: 2
+ ASK_EXIT: 255
+
+ comment__: "Emotes"
+ E_DISGUST: 1
+ E_SURPRISE: 2
+ E_HAPPY: 3
+ E_SAD: 4
+ E_EVIL: 5
+ E_WINK: 6
+ E_ANGEL: 7
+ E_BLUSH: 8
+ E_TONGUE: 9
+ E_GRIN: 10
+ E_UPSET: 11
+ E_PERTURBED: 12
+ E_SPEECH: 13
+ E_BLAH: 14
+ E_KITTY: 101
+ E_XD: 102
+ E_JOY: 103
+ E_HEARTEYE: 104
+ E_GOLD: 105
+ E_SLEEPY: 106
+ E_ANNOY: 107
+ E_JADED: 108
+ E_SURPRISED: 109
+ E_DEAD: 110
+ E_LOOKAWAY: 111
+ E_TIRED: 112
+ E_PALMHEAD: 113
+ E_EVILCROC: 114
+ E_ANGRY: 115
+ E_PURPLESAD: 116
+ E_INSULTBUBBLE: 117
+ E_HEART: 118
+ E_EMOTE: 119
+ E_PUMPKIN: 120
+ E_EVILFACELESS: 121
+ E_EPIC: 122
+ E_BADGEEK: 123
+ E_MIMI: 124
+ E_ALIEN: 125
+ E_TROLL: 126
+ E_METAL: 127
+ E_CRYING: 128
+
+ comment__: "Language function constants"
+ LANG_ON_SEA: 1
+ LANG_IN_SHIP: 2
+
+ comment__: "Language constants"
+ LANG_EN: 0
+ LANG_PTBR: 1
+ LANG_FR: 2
+ LANG_DE: 3
+ LANG_ES: 4
+ MAX_LANG: 4
+
+ comment__: "Daily Constants"
+ DAILY_LOWLEVEL: 0
+ DAILY_IGNORED: 1
+ DAILY_NOPTS: 2
+ DAILY_NOITEMS: 3
+ DAILY_OK: 4
+
+ comment__: "Misc settings"
+ CHEST_WAITTIME: 900 // 15 minutes
+ ROSSY_INSTIME: 1200 // 20 minutes
+
+ comment__: "Mirror Lake settings"
+ WORLD_ID: 3 // Vault WID Identifier
+ MLP_MOUBOOTAUR: 1 // MLP code for Moubootaur Legends
+
+ comment__: "Mirror Lake Quest Constants"
+ MLP_TMW_CELESTIA: 1
+ MLP_TMW_YETIKING: 2
+ //MLP_................ 4
+
+ comment__: "Report Bug Flags"
+ RB_NONE: 0
+ RB_DISPBOTTOM: 1
+ RB_DEBUGMES: 2
+ RB_SPEECH: 4
+ RB_ISFATAL: 8
+ RB_PLEASEREPORT: 16
+ RB_IRCBROADCAST: 32
+ RB_GLOBALANNOUNCE: 64
+ RB_DEFAULT: 19 // dispbottom + debugmes + pleasereport
+
+ comment__: "Location Constants"
+ TP_NONE: 0
+ TP_CANDOR: 1
+ TP_TULIM: 2
+ TP_HURNS: 4
+ TP_NIVAL: 8
+
+ comment__: "Rossy Quest Constants"
+ ROSSY_PROLOGUE: 1
+ ROSSY_CAVE1: 2
+ ROSSY_CAVE2: 4
+ ROSSY_CAVE3: 8
+ ROSSY_CAVE4: 16
+ ROSSY_CAVE5: 32
+ ROSSY_CAVE6: 64
+ ROSSY_CAVE7: 128
+ ROSSY_CAVE8: 256
+ ROSSY_CAVE9: 512
+ ROSSY_READY: 1023
+ ROSSY_BOSSCAVE: 1024
+
+ comment__: "Focus Constants"
+ FSKILL_MALLARDS_EYE: 1
+ FSKILL_BRAWLING: 2
+ FSKILL_SPEED: 4
+ FSKILL_RESIST_POISON: 8
+ FSKILL_ASTRAL_SOUL: 16
+ FSKILL_RAGING: 32
+ FSKILL_TOTAL: 6
+
+ comment__: "TMW Constants"
+ SC_SHEARED:194 // FIXME
+ bDeaf:70
+ equip_arrow:11
+ LOOK_HAIR_STYLE:1
+ LOOK_LEGS:3
+ LOOK_HELMET:4
+ LOOK_CHEST:5
+ LOOK_GLOVES:10
+ LOOK_CAPE:11
+ LOOK_MISC1:12
+ LOOK_MISC2:13
+ HS_Bald:0
+ HS_BaldTwo:1
+ HS_FlatPonytail:2
+ HS_BowlCut:3
+ HS_CombedBack:4
+ HS_Emo:5
+ HS_Mohawk:6
+ HS_Pompadour:7
+ HS_CenterParting:8
+ HS_LongAndSlick:9
+ HS_ShortAndCurly:10
+ HS_Pigtails:11
+ HS_LongAndCurly:12
+ HS_Parted:13
+ HS_PerkyPonytail:14
+ HS_Wave:15
+ HS_Mane:16
+ HS_Bun:17
+ HS_ShoulderLengthFlick:18
+ HS_Fizzy:19
+ HS_LongAndClipped:20
+ HC_LIGHT_BROWN:0
+ HC_GREEN:1
+ HC_RED:2
+ HC_PURPLE:3
+ HC_GRAY:4
+ HC_YELLOW:5
+ HC_BLUE:6
+ HC_BROWN:7
+ HC_LIGHT_BLUE:8
+ HC_DARK_PURPLE:9
+ HC_BLACK:10
+ HC_PINK:11
+ HC_BROWN_TWO:12
+ HC_WHITE:127
+ cNone:11
+ cWhite:10
+ cRed:0
+ cGreen:1
+ cDarkBlue:2
+ cYellow:3
+ cLightBlue:4
+ cPink:5
+ cBlack:6
+ cOrange:7
+ cPurple:8
+ cDarkGreen:9
+ EMOTE_DISGUST:1
+ EMOTE_SURPRISE:2
+ EMOTE_HAPPY:3
+ EMOTE_SAD:4
+ EMOTE_EVIL:5
+ EMOTE_WINK:6
+ EMOTE_ANGEL:7
+ EMOTE_BLUSH:8
+ EMOTE_TONGUE:9
+ EMOTE_GRIN:10
+ EMOTE_UPSET:11
+ EMOTE_PERTURBED:12
+ EMOTE_SPEECH:13
+ EMOTE_BLAH:14
+ EMOTE_MEOW:101
+ EMOTE_LAUGH:102
+ EMOTE_CHEERFUL:103
+ EMOTE_LOVE:104
+ EMOTE_MONEY:105
+ EMOTE_SLEEP:106
+ EMOTE_REST:107
+ EMOTE_BOTHERED:108
+ EMOTE_AFRAID:109
+ EMOTE_DEAD:110
+ EMOTE_SUSPICIOUS:111
+ EMOTE_MELANCHOLY:112
+ EMOTE_FACEPALM:113
+ EMOTE_ANGRY:114
+ EMOTE_HEADACHE:115
+ EMOTE_BORED:116
+ EMOTE_SWEAR:117
+ EMOTE_HEART:118
+ EMOTE_EMPTY:119
+ EMOTE_HALLOWEEN:120
+ EMOTE_VICIOUS:121
+ EMOTE_JOYFUL:122
+ EMOTE_CLEVER:123
+ EMOTE_SHY:124
+ EMOTE_ALIEN:125
+ EMOTE_TROLL:126
+ EMOTE_PAIN:127
+ EMOTE_TEARS:128
+ sfx_skillup:1
+ sfx_magic_generic:2
+ sfx_magic_life:3
+ sfx_magic_war:4
+ sfx_magic_transmute:5
+ sfx_magic_nature:6
+ sfx_magic_astral:7
+ sfx_magic_dark:8
+ FX_LEVELUP:0
+ FX_SKILLUP:1
+ FX_MAGIC:2
+ FX_ATTACK:5
+ FX_BUFF:6
+ FX_MAGIC_GENERIC:2
+ FX_MAGIC_WHITE:3
+ FX_MAGIC_BLACK:4
+ FX_MAGIC_RED:5
+ FX_MAGIC_GREEN:6
+ FX_MAGIC_BLUE:7
+ FX_MAGIC_DARKRED:8
+ FX_MAGIC_DEFAULT:10
+ FX_MAGIC_SHIELD:11
+ FX_MAGIC_HIT:13
+ FX_MAGIC_HIT_EVIL:14
+ FX_FIRE_BURST:15
+ FX_FIRE_EXPLOSION:16
+ FX_LIGHTNING1:17
+ FX_LIGHTNING2:18
+ FX_LIGHTNING3:19
+ FX_MAGIC_TELEPORT:20
+ FX_PENTAGRAM_BUILDUP:21
+ FX_PENTAGRAM_BURST:22
+ FX_MAGIC_TELEPORT2:24
+ FX_RAIN:25
+ FX_HIT:26
+ FX_ARROW_HAIL:27
+ FX_CRITICAL:28
+ FX_LARGE_EXPLOSION:30
+ FX_MEDIUM_EXPLOSION:31
+ FX_MEDIUM_SMOKE:32
+ FX_MEDIUM_BLINDINGLIGHT:33
+ FX_CHANNELLING_RAISE:34
+ FX_CHANNELLING_CAST:35
+ FX_ENCHANTED_DOOR_BROKEN:36
+ FX_DARK_TELEPORT:37
+ FX_EVIL_SUMMON:38
+ FX_GROUND_SPAWN:39
+ FX_BLUE_MAGIC_CAST:40
+ 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
+ FX_GATE_OPENING:300
+ FX_CASKET_LID:301
+ FX_CASKET_MONSTER:302
+ FX_MAGIC_DISCHARGE: 500 // 15
+ FX_MAGIC_WAND_CAST: 501 // 2
+ //FX_MAGIC_WAND_ATK: 502 // 5
+ FX_MAGIC_AGGRAVATE_CAST: 503 // 6
+ FX_MAGIC_AGGRAVATE_HIT: 504 // 10
+ FX_MAGIC_DETECT_CAST: 505 // 2
+ FX_MAGIC_DETECT_HIT: 506 // 10
+ FX_MAGIC_EXP_CAST: 507 // 10
+ FX_MAGIC_DART_CAST: 508 // 10
+ //FX_MAGIC_DART_ATK: 509 // 4
+ FX_MAGIC_GROW_CAST: 510 // 6, 21
+ FX_MAGIC_GROW_SPAWN: 511 // 22
+ FX_MAGIC_HEAL_CAST: 512 // 3
+ FX_MAGIC_HEAL_HIT: 513 // 3
+ FX_MAGIC_BLADE_CAST: 514 // 4
+ //FX_MAGIC_BLADE_HIT: 515 // 4
+ FX_MAGIC_SULPHUR_CAST: 516 // 5
+ FX_MAGIC_MAGGOT_CAST: 517 // 7, 21
+ FX_MAGIC_MAGGOT_SPAWN: 518 // 22
+ FX_MAGIC_WOOD_CAST: 519 // 5
+ FX_MAGIC_AHAIL_CAST: 520 // 4
+ FX_MAGIC_BARRIER_CAST: 521 // 7
+ FX_MAGIC_BARRIER_HIT: 522 // 10
+ FX_MAGIC_BARRIER_END: 523 // 10
+ FX_MAGIC_WHO_CAST: 524 // 2
+ FX_MAGIC_STONE_CAST: 525 // 2
+ FX_MAGIC_FLYING_CAST: 526 // 6
+ FX_MAGIC_FLYING_HIT: 527 // 2
+ FX_MAGIC_FLYING_END: 528 // 2
+ FX_MAGIC_JOY_CAST: 529 // 6
+ FX_MAGIC_HIDE_CAST: 530 // 7
+ FX_MAGIC_HIDE_HIT: 531 // 10
+ FX_MAGIC_HIDE_END: 532 // 2
+ FX_MAGIC_LAY_CAST: 533 // 3
+ FX_MAGIC_LAY_HIT: 534 // 3
+ FX_MAGIC_BOLT_CAST: 535 // 4
+ FX_MAGIC_KNUCKLE_CAST: 536 // 4
+ FX_MAGIC_ARROW_CAST: 537 // 5
+ FX_MAGIC_IRONP_CAST: 538 // 5
+ FX_MAGIC_SHIRT_CAST: 539 // 5
+ FX_MAGIC_SHIELD_CAST: 540 // 6
+ FX_MAGIC_RAIN_CAST: 541 // 6
+ FX_MAGIC_SHEAR_CAST: 542 // 6
+ FX_MAGIC_FLUFFY_CAST: 543 // 7, 21
+ FX_MAGIC_FLUFFY_SPAWN: 544 // 22
+ FX_MAGIC_MOUBOO_CAST: 545 // 7, 21
+ FX_MAGIC_MOUBOO_SPAWN: 546 // 22
+ FX_MAGIC_PINKY_CAST: 547 // 7, 21
+ FX_MAGIC_PINKY_SPAWN: 548 // 22
+ FX_MAGIC_SNAKE_CAST: 549 // 8, 21
+ FX_MAGIC_SNAKE_SPAWN: 550 // 22
+ FX_MAGIC_SPIKY_CAST: 551 // 7, 21
+ FX_MAGIC_SPIKY_SPAWN: 552 // 22
+ FX_MAGIC_WICKED_CAST: 553 // 8, 21
+ FX_MAGIC_WICKED_SPAWN: 554 // 22
+ FX_MAGIC_TDART_CAST: 555 // 8
+ FX_EMOTE_DISGUST:10000
+ FX_EMOTE_SURPRISE:10001
+ FX_EMOTE_HAPPY:10002
+ FX_EMOTE_SAD:10003
+ FX_EMOTE_EVIL:10004
+ FX_EMOTE_WINK:10005
+ FX_EMOTE_ANGEL:10006
+ FX_EMOTE_BLUSH:10007
+ FX_EMOTE_TONGUE:10008
+ FX_EMOTE_GRIN:10009
+ FX_EMOTE_UPSET:10010
+ FX_EMOTE_PERTURBED:10011
+ FX_EMOTE_SPEECH:10012
+ FX_EMOTE_BLAH:10013
+ FX_EMOTE_SWEAR:10014
+ FX_EMOTE_MEOW:10015
+ FX_EMOTE_LAUGH:10016
+ FX_EMOTE_CHEERFUL:10017
+ FX_EMOTE_LOVE:10018
+ FX_EMOTE_MONEY:10019
+ FX_EMOTE_SLEEP:10020
+ FX_EMOTE_REST:10021
+ FX_EMOTE_BOTHERED:10022
+ FX_EMOTE_AFRAID:10023
+ FX_EMOTE_DEAD:10024
+ FX_EMOTE_SUSPICIOUS:10025
+ FX_EMOTE_MELANCHOLY:10026
+ FX_EMOTE_FACEPALM:10027
+ FX_EMOTE_ANGRY:10028
+ FX_EMOTE_HEADACHE:10029
+ FX_EMOTE_BORED:10030
+ FX_EMOTE_HEART:10031
+ FX_EMOTE_EMPTY:10032
+ FX_EMOTE_HALLOWEEN:10033
+ FX_EMOTE_VICIOUS:10034
+ FX_EMOTE_JOYFUL:10035
+ FX_EMOTE_CLEVER:10036
+ FX_EMOTE_SHY:10037
+ FX_EMOTE_ALIEN:10038
+ FX_EMOTE_CURIOUS:10039
+ FX_EMOTE_PAIN:10040
+ FX_EMOTE_TEARS:10041
+ SKILL_LUCKY_COUNTER:351
+ G_PLAYER:0
+ G_BOT:1
+ G_TESTER:20
+ G_DEV:40
+ G_EVENT:50
+ G_GM:60
+ G_ADMIN:80
+ G_SYSOP:99
+ 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
+ MIN_CASTTIME:200
+ 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
+ SO_GMHIDE:64
+ SO_GMINVISIBLE:4096
+ 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
+ MIN_MARRY_LEVEL:32
+ MAX_RAIN_SPELL_RADIUS:15
+ MAX_MAGIC_LEVEL:2
+ MFLAG_MADE_CONC_POTION_SHIFT:14
+ 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
+ TWOBIT_0_SHIFT:0
+ TWOBIT_0_MASK:3
+ TWOBIT_1_SHIFT:2
+ TWOBIT_1_MASK:12
+ TWOBIT_2_SHIFT:4
+ TWOBIT_2_MASK:48
+ TWOBIT_3_SHIFT:6
+ TWOBIT_3_MASK:192
+ TWOBIT_4_SHIFT:8
+ TWOBIT_4_MASK:768
+ TWOBIT_5_SHIFT:10
+ TWOBIT_5_MASK:3072
+ TWOBIT_6_SHIFT:12
+ TWOBIT_6_MASK:12288
+ TWOBIT_7_SHIFT:14
+ TWOBIT_7_MASK:49152
+ TWOBIT_8_SHIFT:16
+ TWOBIT_8_MASK:196608
+ TWOBIT_9_SHIFT:18
+ TWOBIT_9_MASK:786432
+ TWOBIT_10_SHIFT:20
+ TWOBIT_10_MASK:3145728
+ TWOBIT_11_SHIFT:22
+ TWOBIT_11_MASK:12582912
+ TWOBIT_12_SHIFT:24
+ TWOBIT_12_MASK:50331648
+ TWOBIT_13_SHIFT:26
+ TWOBIT_13_MASK:201326592
+ TWOBIT_14_SHIFT:28
+ TWOBIT_14_MASK:805306368
+ NIBBLE_0_SHIFT:0
+ NIBBLE_0_MASK:15
+ NIBBLE_1_SHIFT:4
+ NIBBLE_1_MASK:240
+ NIBBLE_2_SHIFT:8
+ NIBBLE_2_MASK:3840
+ NIBBLE_3_SHIFT:12
+ NIBBLE_3_MASK:61440
+ NIBBLE_4_SHIFT:16
+ NIBBLE_4_MASK:983040
+ NIBBLE_5_SHIFT:20
+ NIBBLE_5_MASK:15728640
+ NIBBLE_6_SHIFT:24
+ NIBBLE_6_MASK:251658240
+ BYTE_0_SHIFT:0
+ BYTE_0_MASK:255
+ BYTE_1_SHIFT:8
+ BYTE_1_MASK:65280
+ BYTE_2_SHIFT:16
+ BYTE_2_MASK:16711680
+ WEDDING_FEE:100
+ DIVORCE_FEE_PER_LEVEL:500
+ WEDDING_MIN_LEVEL:32
+ // Flags for the magic quests.
+ MFLAG_DRANK_POTION: 1 // Character drank at least one magic potion as prerequisite for the Mana Seed quest.
+ MFLAG_KNOWS_MANASEED: 2 // Character has found the Mana Seed.
+ MFLAG_TOUCHED_MANASEED: 4 // Character has touched the Mana Seed.
+ MFLAG_MANASEED_MAXEDOUT: 8 // Character has touched the Mana Seed while maxed out on magic.
+
+ MFLAG_KNOWS_AULDSBEL: 16 // Character has met Auldsbel.
+ MFLAG_KNOWS_WYARA: 32 // Character has met Wyara.
+ MFLAG_KNOWS_SAGATHA: 64 // Character has met Sagatha.
+ MFLAG_KNOWS_MANAPOTION: 128 // Has heard about the Mana Potion.
+
+ MFLAG_MANASEED_RUMOUR: 256 // Has heard rumour about Mana Seed.
+ MFLAG_KNOWS_CUTTREE: 512 // Knows about the 'cut the tree' quest.
+ MFLAG_DID_CUTTREE: 1024 // Did cut off a branch from the druid tree.
+ MFLAG_KNOWS_DRUIDTREE: 2048 // Knows about the druid tree quest.
+
+ MFLAG_KNOWS_IMP: 4096 // Knows about the imprisoned forest spirit.
+ MFLAG_KNOWS_OLD_WIZARD: 8192 // Knows Bjorn's old wizard.
+ MFLAG_MADE_CONC_POTION: 16384 // Made a concentration potion with T15 and/or T16.
+ MFLAG_ELANORE_OMAR: 32768 // Told Omar about Elanore's involvement.
+
+ MFLAG_KNOWS_UNFOCUS_RECIPE: 65536 // Has been told about unfocus by Luca.
+
+ // Flags set in the FLAGS variable:
+ FLAG_HAS_BOWLER_BURNSDAY: 1 // every year's poem at burns day, shannon gives you a bowler hat
+ FLAG_OPENED_UNDERGROUND: 2 // this flag is a replacement for variable Open_Underground_Palace_Barrier, which was used only as bool
+ FLAG_GOT_NAEM_GLOVES: 4 // this replaces Naem_Quest_Done, which was used as a bool variable
+ FLAG_GOT_GRADUATIONCAP: 8 // this is a bit which was to be found in Tut_var second bit
+ FLAG_TOWEL_HELPED: 16 // gave the towel npc the stuff he wants
+ FLAG_TOWEL_COMPLETED: 32 // got the towel from the towel npc
+ FLAG_ANDRA_HELPED: 64 // Knows Andra and agreed to help her
+ FLAG_ROSSI_COMPLETED: 128 // Completed the Rossi Quest
+ FLAG_TUTORIAL_DONE: 256 // player completed tutorial (or entered the tutorial area from outside after it was added)
+ FLAG_SNOWMAN: 512 // player gave candy to the snowman
+ FLAG_SANTAS_HELPER: 1024 // player gave presents to Santa's helper
+ FLAG_HURNSMINE_CHEST: 2048 // player opened the chest with the short sword in Hurnscald mines
+ FLAG_GOT_BEANIEHAT: 4096 // player got Beanie Copter Hat from Milly
+ FLAG_DECLINED_BEANIEHAT: 8192 // player declined Beanie Copter Hat from Milly
+ FLAG_KESHLAM_FLAWEDLENS: 16384 // player got the Flawed Lens from Keshlam's Chest
+ FLAG_KESHLAM_RAREDROP: 32768 // player got the super rare from Keshlam's Chest
+ FLAG_BEHEADER_MASK: 65536 // traded with The Beheader
+ FLAG_GOT_BEHEADER_SWORD: 131072 // Obtained the Beheader Sword
+ BATTLE_CAVE1:1
+ BATTLE_CAVE2:2
+ BATTLE_CAVE3:4
+ BATTLE_CAVE4:8
+ BATTLE_CAVE5:16
+ BATTLE_CAVE6:32
+ BATTLE_CAVE7:64
+ BATTLE_CAVE8:128
+ BATTLE_CAVE9:256
+ MAX_HIGH_SCORES: 4
+ // Command Permission
+ CMD_ZENY:80
+ CMD_CHARZENY:98
+ CMD_DEBUG:80
+ CMD_CHANGESEX:40
+ CMD_CHARCHANGESEX:60
+ CMD_CLASS:40
+ CMD_CHARCLASS:50
+ CMD_DESTROYNPC:98
+ CMD_REMOTECMD:40
+ CMD_WARP:40
+ CMD_CHARWARP:60
+ CMD_MUTE:60
+ CMD_NPCTALK:40
+ CMD_MUSIC:40
+ CMD_AUTOMOD:60
+ CMD_DIVORCE:40
+ CMD_CHARDIVORCE:60
+
+ // Special Permission
+ MAP_LOUNGE:20 // GM Lounge & Numa
+ EVT_KILLTHEGM:50 // Pull the Rabit magic
+ DBG_HOLIDAY:40 // Holiday Debug (xmas, easter...)
+ EVT_DEBUG:50 // Event Debug (open portals, disguise...)
+ DBG_SCHEDULED:40 // Scheduled Broadcasts
+ DBG_MOTD:40 // Message of the Day
+ DBG_VALIA:40 // Iilia quest debug info
+
+ @include "db/si_config.conf"
+ @include "conf/import/constants.conf"
+}
diff --git a/db/craft_db.conf b/db/craft_db.conf
new file mode 100644
index 00000000..d3cf96cc
--- /dev/null
+++ b/db/craft_db.conf
@@ -0,0 +1,1921 @@
+craft_db: (
+// craft Database
+/******************************************************************************
+************* Entry structure *************************************************
+*******************************************************************************
+{
+ Id: craft id [int]
+ Name: craft name [string]
+ Priority: craft priority [int]
+ Price: craft price [int]
+ Lv: base level [int]
+ Flag: flag from craft object [string/int]
+ ReturnCode: return code for scripts [int]
+
+ SourceItems: ({ craft inventory source (will be deleted after crafting)
+ Name: amount [int]
+ ...
+ },
+ ...
+ )
+ CreateItems: ( // items what will be created in crafting
+ {
+ Name: amount
+ ...
+ },
+ {
+ Name:
+ {
+ Amount: amount
+ Cards: ["card0", ...]
+ },
+ },
+ ...
+ )
+ DeleteItems: { additional items what will be deleted from inventory
+ Name: amount [int]
+ ...
+ }
+ RequiredItems: { required additional items. will be unchanged
+ Name: amount [int]
+ ...
+ }
+ RequiredSkills: { required skills and levels
+ Name: level [int]
+ ...
+ }
+ RequiredQuests: {
+ Name: level [int]
+ ...
+ }
+ RequiredEquips: {
+ Name: true
+ }
+},
+******************************************************************************/
+
+/*
+VSCode Regex to convert a ReturnCode to string:
+Name: "Craft([^"]+)"\n\tFlag: "([^"]+)"\n\tReturnCode: [0-9]+
+Name: "Craft$1"\n\tFlag: "$2"\n\tReturnCode: "$1"
+*/
+
+/**************
+Cooking: 000 --> 099
+Chest Armor: 100 --> 199
+Pants: 200 --> 299
+Gloves: 300 --> 399
+Weapons: 400 --> 499
+Shields: 500 --> 599
+Hats: 600 --> 699
+Boots: 700 --> 799
+Alchemy: 800 --> 899
+**************/
+
+/****************************** COOKING ****************************************
+********************************************************************************
+**** Reserved range for <Id>: 000 --> 099
+**** Valid <Flag> parameters: CRAFT_COOKING
+*******************************************************************************/
+/*
+{
+ Id: 0
+ Name: "CraftCarpSandwich"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ Bread: 1
+ LettuceLeaf: 3
+ Cheese: 2
+ CommonCarp: 1
+ },
+ {
+ Bread: 1
+ LettuceLeaf: 3
+ Cheese: 2
+ GrassCarp: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ CarpSandwich: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 1
+ Name: "CraftPioulegSandwich"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ Bread: 1
+ LettuceLeaf: 3
+ Cheese: 2
+ PiouLegs: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ PioulegSandwich: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 2
+ Name: "CraftMananaSandwich"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ Bread: 1
+ LettuceLeaf: 3
+ Cheese: 2
+ Manana: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ MananaSandwich: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 3
+ Name: "CraftSailorStew"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ CommonCarp: 3
+ Carrot: 3
+ Manana: 3
+ RoastedAcorn: 5
+ },
+ {
+ GrassCarp: 1
+ Carrot: 3
+ Manana: 3
+ RoastedAcorn: 5
+ },
+ )
+ CreateItems:
+ (
+ {
+ SailorStew: 1
+ },
+ )
+ DeleteItems: {
+ EmptyBowl: 1
+ }
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 4
+ Name: "CraftSquirrelStew"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ SquirrelMeat: 2
+ Carrot: 2
+ Manana: 4
+ RoastedAcorn: 5
+ },
+ )
+ CreateItems:
+ (
+ {
+ SquirrelStew: 1
+ },
+ )
+ DeleteItems: {
+ EmptyBowl: 1
+ }
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 5
+ Name: "CraftMoubooStew"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ MoubooSteak: 1
+ Carrot: 4
+ Manana: 2
+ RoastedAcorn: 5
+ },
+ )
+ CreateItems:
+ (
+ {
+ MoubooStew: 1
+ },
+ )
+ DeleteItems: {
+ EmptyBowl: 1
+ }
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 6
+ Name: "CraftSeafoodPlate"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ CommonCarp: 2
+ Salmon: 1
+ UrchinMeat: 2
+ Moss: 5
+ },
+ {
+ GrassCarp: 1
+ Tuna: 1
+ Tentacles: 3
+ Moss: 5
+ },
+ )
+ CreateItems:
+ (
+ {
+ SeafoodPlate: 1
+ },
+ )
+ DeleteItems: {
+ EmptyPlate: 1
+ }
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 7
+ Name: "CraftBarbecuePlate"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ CommonCarp: 1
+ MoubooSteak: 1
+ SquirrelMeat: 2
+ Carrot: 2
+ },
+ )
+ CreateItems:
+ (
+ {
+ BarbecuePlate: 1
+ },
+ )
+ DeleteItems: {
+ EmptyPlate: 1
+ }
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 8
+ Name: "CraftVeggiePlate"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ RoastedAcorn: 3
+ Carrot: 3
+ Manana: 3
+ Piberries: 5
+ },
+ )
+ CreateItems:
+ (
+ {
+ VeggiePlate: 1
+ },
+ )
+ DeleteItems: {
+ EmptyPlate: 1
+ }
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 9
+ Name: "CraftDonut"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ AcornFlour: 3
+ MoubooMilk: 1
+ ChocolateBar: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ Donut: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 10
+ Name: "CraftBlueberryCake"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ AcornFlour: 4
+ MoubooMilk: 1
+ Blueberries: 3
+ },
+ )
+ CreateItems:
+ (
+ {
+ BlueberryCake: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 11
+ Name: "CraftCarrotCake"
+ Flag: "CRAFT_COOKING"
+ SourceItems:
+ (
+ {
+ AcornFlour: 5
+ MoubooMilk: 1
+ Carrot: 2
+ },
+ )
+ CreateItems:
+ (
+ {
+ CarrotCake: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+
+/************************ CHEST ARMOR (SHIRTS) *********************************
+********************************************************************************
+**** Reserved range for <Id>: 100 --> 199
+**** Valid <Flag> parameters: CRAFT_SMITHERY, CRAFT_TAILORING
+*******************************************************************************/
+
+/*
+{
+ Id: 100
+ Name: "CraftCreasedShirt"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "CreasedShirt"
+ SourceItems:
+ (
+ {
+ CottonCloth: 5
+ PiouFeathers: 15
+ RattoTail: 5
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ CreasedShirt: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 101
+ Name: "CraftArtisTankTop"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "ArtisTankTop"
+ SourceItems:
+ (
+ {
+ CottonCloth: 10
+ PiouFeathers: 5
+ Moss: 5
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ ArtisTankTop: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 11
+},
+{
+ Id: 102
+ Name: "CraftVneckJumper"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "VneckJumper"
+ SourceItems:
+ (
+ {
+ CottonCloth: 15
+ PiouFeathers: 5
+ Moss: 7
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ VneckJumper: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 20
+},
+{
+ Id: 103
+ Name: "CraftSailorShirt"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "SailorShirt"
+ SourceItems:
+ (
+ {
+ CottonCloth: 15
+ LeatherPatch: 5
+ Coal: 5
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ SailorShirt: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 21
+},
+{
+ Id: 104
+ Name: "CraftFineDress"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "FineDress"
+ SourceItems:
+ (
+ {
+ CottonCloth: 23
+ FluffyFur: 5
+ SilkCocoon: 10
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ FineDress: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 22
+},
+{
+ Id: 105
+ Name: "CraftSilkRobe"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "SilkRobe"
+ SourceItems:
+ (
+ {
+ SilkCocoon: 40
+ CottonCloth: 10
+ FluffyFur: 3
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ SilkRobe: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 30
+},
+{
+ Id: 106
+ Name: "CraftLegionTrainingShirt"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "LegionTrainingShirt"
+ SourceItems:
+ (
+ {
+ IronIngot: 5
+ CopperIngot: 1
+ Coal: 5
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ LegionTrainingShirt: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 31
+},
+{
+ Id: 107
+ Name: "CraftForestArmor"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "ForestArmor"
+ SourceItems:
+ (
+ {
+ LeatherPatch: 10
+ Moss: 20
+ TortugaShellFragment: 3
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ ForestArmor: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 32
+},
+{
+ Id: 108
+ Name: "CraftLegionCopperArmor"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "LegionCopperArmor"
+ SourceItems:
+ (
+ {
+ CopperIngot: 10
+ IronIngot: 3
+ Coal: 10
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ LegionCopperArmor: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 40
+},
+{
+ Id: 109
+ Name: "CraftApprenticeRobe"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "ApprenticeRobe"
+ SourceItems:
+ (
+ {
+ CottonCloth: 10
+ SilkCocoon: 70
+ FluffyFur: 10
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ ApprenticeRobe: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 41
+},
+{
+ Id: 110
+ Name: "CraftPeltJacket"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "PeltJacket"
+ SourceItems:
+ (
+ {
+ SquirrelPelt: 25
+ LeatherPatch: 10
+ Moss: 15
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ PeltJacket: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 42
+},
+{
+ Id: 111
+ Name: "CraftChainmail"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "Chainmail"
+ SourceItems:
+ (
+ {
+ IronIngot: 18
+ SilverIngot: 3
+ Coal: 20
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ Chainmail: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 50
+},
+{
+ Id: 112
+ Name: "CraftSnakeplate"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "Snakeplate"
+ SourceItems:
+ (
+ {
+ SnakeScale: 55
+ IronIngot: 3
+ Moss: 15
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ Snakeplate: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 51
+},
+{
+ Id: 113
+ Name: "CraftLightPlatemail"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "LightPlatemail"
+ SourceItems:
+ (
+ {
+ IronIngot: 25
+ SilverIngot: 5
+ Coal: 25
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ LightPlatemail: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 52
+},
+{
+ Id: 114
+ Name: "CraftJustifierChest"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "JustifierChest"
+ SourceItems:
+ (
+ {
+ RotoniumIngot: 3
+ CottonCloth: 40
+ Coal: 20
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ JustifierChest: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 53
+},
+{
+ Id: 115
+ Name: "CraftSorcererRobe"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "SorcererRobe"
+ SourceItems:
+ (
+ {
+ CottonCloth: 60
+ FluffyFur: 40
+ SilkCocoon: 20
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ SorcererRobe: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 60
+},
+{
+ Id: 116
+ Name: "CraftLegionIronArmor"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "LegionIronArmor"
+ SourceItems:
+ (
+ {
+ IronIngot: 30
+ RotoniumIngot: 6
+ Coal: 40
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ LegionIronArmor: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 61
+},
+{
+ Id: 117
+ Name: "CraftWarlordPlate"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "WarlordPlate"
+ SourceItems:
+ (
+ {
+ RotoniumIngot: 11
+ SilverIngot: 20
+ Coal: 50
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ WarlordPlate: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 70
+},
+{
+ Id: 118
+ Name: "CraftWizardRobe"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "WizardRobe"
+ SourceItems:
+ (
+ {
+ SquirrelPelt: 30
+ SilkCocoon: 60
+ LeatherPatch: 5
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ WizardRobe: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 71
+},
+{
+ Id: 119
+ Name: "CraftTerraniteArmor"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "TerraniteArmor"
+ SourceItems:
+ (
+ {
+ TerraniteIngot: 15
+ TerraniteOre: 5
+ Coal: 35
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ TerraniteArmor: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 72
+},
+{
+ Id: 120
+ Name: "CraftAssassinChest"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "AssassinChest"
+ SourceItems:
+ (
+ {
+ RotoniumIngot: 6
+ CottonCloth: 50
+ Coal: 30
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ AssassinChest: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 73
+},
+{
+ Id: 121
+ Name: "CraftBlackArmor"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "BlackArmor"
+ SourceItems:
+ (
+ {
+ ZealiteIngot: 1
+ CottonCloth: 50
+ BlackScorpionStinger: 70
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ BlackArmor: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 80
+},
+{
+ Id: 122
+ Name: "CraftGoldenWarlordPlate"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "GoldenWarlordPlate"
+ SourceItems:
+ (
+ {
+ GoldIngot: 30
+ WarlordPlate: 1
+ TopazShard: 5
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ GoldenWarlordPlate: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 81
+},
+{
+ Id: 123
+ Name: "CraftEvocatorRobe"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "EvocatorRobe"
+ SourceItems:
+ (
+ {
+ CottonCloth: 60
+ RotoniumIngot: 5
+ BlackPearl: 1
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ EvocatorRobe: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 82
+},
+*/
+
+/************************* LEG ARMOR (PANTS) ***********************************
+********************************************************************************
+**** Reserved range for <Id>: 200 --> 299
+**** Valid <Flag> parameters: CRAFT_SMITHERY, CRAFT_TAILORING
+*******************************************************************************/
+
+/*
+{
+ Id: 200
+ Name: "CraftCreasedShorts"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "CreasedShorts"
+ SourceItems:
+ (
+ {
+ CottonCloth: 10
+ PiouFeathers: 10
+ RattoTail: 5
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ CreasedShorts: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 201
+ Name: "CraftCottonSkirt"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "CottonSkirt"
+ SourceItems:
+ (
+ {
+ CottonCloth: 15
+ PiouFeathers: 5
+ Moss: 10
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ CottonSkirt: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 20
+},
+{
+ Id: 202
+ Name: "CraftPirateShorts"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "PirateShorts"
+ SourceItems:
+ (
+ {
+ CottonCloth: 20
+ LeatherPatch: 10
+ Coal: 10
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ PirateShorts: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 25
+},
+{
+ Id: 203
+ Name: "CraftSilkPants"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "SilkPants"
+ SourceItems:
+ (
+ {
+ SilkCocoon: 40
+ CottonCloth: 15
+ FluffyFur: 10
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ SilkPants: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 33
+},
+{
+ Id: 204
+ Name: "CraftBrownTrousers"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "BrownTrousers"
+ SourceItems:
+ (
+ {
+ LeatherPatch: 35
+ SquirrelPelt: 25
+ CottonCloth: 10
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ BrownTrousers: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 37
+},
+{
+ Id: 205
+ Name: "CraftBanditTrousers"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "BanditTrousers"
+ SourceItems:
+ (
+ {
+ Moss: 40
+ CottonCloth: 35
+ LeatherPatch: 30
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ BanditTrousers: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 41
+},
+{
+ Id: 206
+ Name: "CraftJeansChaps"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "JeansChaps"
+ SourceItems:
+ (
+ {
+ SnakeSkin: 40
+ LeatherPatch: 25
+ SnakeScale: 10
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ JeansChaps: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 49
+},
+{
+ Id: 207
+ Name: "CraftLeatherTrousers"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "LeatherTrousers"
+ SourceItems:
+ (
+ {
+ LeatherPatch: 45
+ SquirrelPelt: 35
+ CottonCloth: 5
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ LeatherTrousers: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 49
+},
+{
+ Id: 208
+ Name: "CraftChainmailSkirt"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "ChainmailSkirt"
+ SourceItems:
+ (
+ {
+ IronIngot: 12
+ SilverIngot: 5
+ Coal: 15
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ ChainmailSkirt: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 56
+},
+{
+ Id: 209
+ Name: "CraftTerranitePants"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "TerranitePants"
+ SourceItems:
+ (
+ {
+ TerraniteIngot: 12
+ TerraniteOre: 6
+ Coal: 30
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ TerranitePants: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 66
+},
+{
+ Id: 210
+ Name: "CraftAssassinPants"
+ Flag: "CRAFT_SMITHERY"
+ ReturnCode: "AssassinPants"
+ SourceItems:
+ (
+ {
+ RotoniumIngot: 5
+ CottonCloth: 43
+ Coal: 25
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ AssassinPants: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 71
+},
+*/
+
+/****************************** GLOVES *****************************************
+********************************************************************************
+**** Reserved range for <Id>: 300 --> 399
+**** Valid <Flag> parameters: CRAFT_SMITHERY, CRAFT_TAILORING
+*******************************************************************************/
+
+/*
+{
+ Id: 300
+ Name: "CraftShortGloves"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "ShortGloves"
+ SourceItems:
+ (
+ {
+ CottonCloth: 4
+ PiouFeathers: 8
+ FluffyFur: 6
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ ShortGloves: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 12
+},
+{
+ Id: 301
+ Name: "CraftArmbands"
+ Flag: "CRAFT_TAILORING"
+ // TODO: maybe add a WOODWORKING category?
+ ReturnCode: "Armbands"
+ SourceItems:
+ (
+ {
+ RawLog: 20
+ // May need to be changed at a later date to Hardwood/Softwood/RefinedWood
+ LeatherPatch: 10
+ Coal: 15
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ Armbands: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 21
+},
+{
+ Id: 302
+ Name: "CraftCottonGloves"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "CottonGloves"
+ SourceItems:
+ (
+ {
+ CottonCloth: 20
+ FluffyFur: 18
+ PiouFeathers: 17
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ CottonGloves: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 24
+},
+{
+ Id: 303
+ Name: "CraftBanditGloves"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "BanditGloves"
+ SourceItems:
+ (
+ {
+ Moss: 30
+ CottonCloth: 22
+ LeatherPatch: 13
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ BanditGloves: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 31
+},
+{
+ Id: 304
+ Name: "CraftSilkGloves"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "SilkGloves"
+ SourceItems:
+ (
+ {
+ SilkCocoon: 55
+ CottonCloth: 15
+ FluffyFur: 7
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ SilkGloves: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 39
+},
+{
+ Id: 305
+ Name: "CraftCopperArmbands"
+ Flag: "CRAFT_SMITHING"
+ ReturnCode: "CopperArmbands"
+ SourceItems:
+ (
+ {
+ CopperIngot: 4
+ IronIngot: 3
+ Coal: 30
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ CopperArmbands: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 43
+},
+{
+ Id: 307
+ Name: "CraftLeatherGloves"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "LeatherGloves"
+ SourceItems:
+ (
+ {
+ LeatherPatch: 40
+ CottonCloth: 30
+ SquirrelPelt: 16
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ LeatherGloves: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 52
+},
+{
+ Id: 309
+ Name: "CraftBromenalGloves"
+ Flag: "CRAFT_SMITHING"
+ ReturnCode: "BromenalGloves"
+ SourceItems:
+ (
+ {
+ CopperIngot: 8
+ LeatherPatch: 30
+ Coal: 25
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ BromenalGloves: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 63
+},
+{
+ Id: 310
+ Name: "CraftIronArmbands"
+ Flag: "CRAFT_SMITHING"
+ ReturnCode: "IronArmbands"
+ SourceItems:
+ (
+ {
+ IronIngot: 9
+ SilverIngot: 4
+ Coal: 40
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ IronArmbands: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 67
+},
+{
+ Id: 311
+ Name: "CraftAssassinGloves"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "AssassinGloves"
+ SourceItems:
+ (
+ {
+ RotoniumIngot: 3
+ CottonCloth: 30
+ Coal: 20
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ AssassinGloves: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 71
+},
+*/
+
+/************************** WEAPONS & TOOLS ************************************
+********************************************************************************
+**** Reserved range for <Id>: 400 --> 499
+**** Valid <Flag> parameters: CRAFT_SMITHERY
+*******************************************************************************/
+
+/****************************** SHIELDS ****************************************
+********************************************************************************
+**** Reserved range for <Id>: 500 --> 599
+**** Valid <Flag> parameters: CRAFT_SMITHERY
+*******************************************************************************/
+
+/************************* HEAD ARMOR (HATS) ***********************************
+********************************************************************************
+**** Reserved range for <Id>: 600 --> 699
+**** Valid <Flag> parameters: CRAFT_SMITHERY, CRAFT_TAILORING
+*******************************************************************************/
+
+/******************************* BOOTS *****************************************
+********************************************************************************
+**** Reserved range for <Id>: 700 --> 799
+**** Valid <Flag> parameters: CRAFT_SMITHERY, CRAFT_TAILORING
+*******************************************************************************/
+
+/*
+{
+ Id: 700
+ Name: "CraftLousyMoccasins"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "LousyMoccasins"
+ SourceItems:
+ (
+ {
+ PiouFeathers: 26
+ RattoTail: 4
+ Moss: 10
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ LousyMoccasins: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 10
+},
+{
+ Id: 701
+ Name: "CraftSlippers"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "Slippers"
+ SourceItems:
+ (
+ {
+ FluffyFur: 16
+ SilkCocoon: 20
+ TortugaShell: 6
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ Slippers: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 11
+},
+{
+ Id: 702
+ Name: "CraftCottonBoots"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "CottonBoots"
+ SourceItems:
+ (
+ {
+ CottonCloth: 20
+ SilkCocoon: 18
+ TortugaShell: 10
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ CottonBoots: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 20
+},
+{
+ Id: 703
+ Name: "CraftBanditBoots"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "BanditBoots"
+ SourceItems:
+ (
+ {
+ CottonCloth: 20
+ RattoTail: 8
+ TortugaShell: 12
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ BanditBoots: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 30
+},
+{
+ Id: 704
+ Name: "CraftManaSlippers"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "ManaSlippers"
+ SourceItems:
+ (
+ {
+ FluffyFur: 28
+ Pearl: 2
+ TortugaShell: 10
+ Knife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ ManaSlippers: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 31
+},
+{
+ Id: 705
+ Name: "CraftSquirrelBoots"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "SquirrelBoots"
+ SourceItems:
+ (
+ {
+ SquirrelPelt: 36
+ CottonCloth: 10
+ TortugaShell: 18
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ SquirrelBoots: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 40
+},
+{
+ Id: 706
+ Name: "CraftLeatherBoots"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "LeatherBoots"
+ SourceItems:
+ (
+ {
+ LeatherPatch: 40
+ RattoTail: 16
+ TortugaShell: 22
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ LeatherBoots: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 50
+},
+{
+ Id: 707
+ Name: "CraftBromenalBoots"
+ Flag: "CRAFT_SMITHING"
+ ReturnCode: "BromenalBoots"
+ SourceItems:
+ (
+ {
+ CopperIngot: 4
+ LeatherPatch: 24
+ TortugaShell: 26
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ BromenalBoots: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 60
+},
+{
+ Id: 708
+ Name: "CraftRidingBoots"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "RidingBoots"
+ SourceItems:
+ (
+ {
+ LeatherPatch: 60
+ WaxChunk: 45
+ TortugaShell: 30
+ SharpKnife: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ RidingBoots: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 61
+},
+{
+ Id: 709
+ Name: "CraftAssassinBoots"
+ Flag: "CRAFT_TAILORING"
+ ReturnCode: "AssassinBoots"
+ SourceItems:
+ (
+ {
+ RotoniumIngot: 4
+ CottonCloth: 20
+ TortugaShell: 34
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ AssassinBoots: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 70
+},
+{
+ Id: 710
+ Name: "CraftWarlordBoots"
+ Flag: "CRAFT_SMITHING"
+ ReturnCode: "WarlordBoots"
+ SourceItems:
+ (
+ {
+ RotoniumIngot: 4
+ SilverIngot: 10
+ Coal: 20
+ Dagger: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ WarlordBoots: 1
+ },
+ )
+ RequiredItems: {
+ RecipeBook: 1
+ }
+ Priority: 71
+},
+*/
+
+/****************************** ALCHEMY ****************************************
+********************************************************************************
+**** Reserved range for <Id>: 700 --> 799
+**** Valid <Flag> parameters: CRAFT_ALCHEMY
+*******************************************************************************/
+{
+ Id: 700
+ Name: "CraftConcentrationPotion"
+ Flag: "CRAFT_ALCHEMY"
+ SourceItems:
+ (
+ {
+ PinkPetal: 1
+ BottleOfWater: 1
+ },
+ {
+ BottleOfWater: 1
+ PinkPetal: 1
+ },
+ {
+ DilutedConcentrationPot: 1
+ DarkConcentrationPotion: 1
+ },
+ {
+ DarkConcentrationPotion: 1
+ DilutedConcentrationPot: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ ConcentrationPotion: 1
+ },
+ )
+ Priority: 10
+},
+{
+ Id: 701
+ Name: "CraftCactusPotion"
+ Flag: "CRAFT_ALCHEMY"
+ SourceItems:
+ (
+ {
+ CactusDrink: 1
+ CactusDrink: 1
+ },
+ {
+ CactusDrink: 1
+ CactusDrink: 1
+ },
+ {
+ CactusDrink: 2
+ },
+ )
+ CreateItems:
+ (
+ {
+ CactusPotion: 1
+ },
+ )
+ Priority: 10
+},
+)
diff --git a/db/create_arrow_db.txt b/db/create_arrow_db.txt
new file mode 100644
index 00000000..f0f5f8e7
--- /dev/null
+++ b/db/create_arrow_db.txt
@@ -0,0 +1,11 @@
+// Arrow Crafting Database
+//
+// Structure of Database:
+// SourceID,MakeID1,MakeAmount1,...,MakeID5,MakeAmount5
+//
+// 01. SourceID ID of the item, that is consumed by Arrow Crafting.
+// 02. MakeID ID of the item received from Arrow Crafting.
+// 03. MakeAmount Amount of MakeID item received from Arrow Crafting.
+// ...
+//
+// NOTE: Up to MAX_ARROW_RESOURCE (typically 5) ID/Amount pairs can be specified.
diff --git a/db/elemental_db.txt b/db/elemental_db.txt
new file mode 100644
index 00000000..633ebcdc
--- /dev/null
+++ b/db/elemental_db.txt
@@ -0,0 +1,24 @@
+// Elemental Summons Database
+//
+// Structure of Database:
+// ID,Sprite_Name,Name,LV,HP,SP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Speed,aDelay,aMotion,dMotion
+// NOTE
+// Summoned Elemental’s STATs are affected by the Caster’s Base Level and STATs.
+// So all value added here will be added and will not override the calculated STATs of the summoned elemental.
+
+// Monster Elementals
+2114,EL_AGNI_S,Agni,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,0,0,83,200,504,1020,360
+2115,EL_AGNI_M,Agni,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,1,0,83,200,504,1020,360
+2116,EL_AGNI_L,Agni,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,2,0,83,200,504,1020,360
+
+2117,EL_AQUA_S,Aqua,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,0,0,81,200,504,1020,360
+2118,EL_AQUA_M,Aqua,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,1,0,81,200,504,1020,360
+2119,EL_AQUA_L,Aqua,100,0,1,1,0,0,0,0,1,1,1,1,1,1,5,12,2,0,81,200,504,1020,360
+
+2120,EL_VENTUS_S,Ventus,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,0,0,84,200,504,1020,360
+2121,EL_VENTUS_M,Ventus,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,1,0,84,200,504,1020,360
+2122,EL_VENTUS_L,Ventus,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,2,0,84,200,504,1020,360
+
+2123,EL_TERA_S,Tera,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,0,0,82,200,504,1020,360
+2124,EL_TERA_M,Tera,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,1,0,82,200,504,1020,360
+2125,EL_TERA_L,Tera,100,0,1,1,0,0,0,0,0,0,0,0,0,0,5,12,2,0,82,200,504,1020,360
diff --git a/db/elemental_skill_db.txt b/db/elemental_skill_db.txt
new file mode 100644
index 00000000..aa0a428e
--- /dev/null
+++ b/db/elemental_skill_db.txt
@@ -0,0 +1,91 @@
+// Elemental Summons Skill Database
+//
+// Structure of Database:
+// ElementalID,SkillID,SkillLevel,ReqMode
+//
+// Spirit Modes: 1 = Passive, 2 = Defensive, 4 = Aggressive
+//====================================================
+
+//================
+// EL_AGNI_S
+//================
+2114,8413,1,1 //EL_PYROTECHNIC,Pyrotechnic
+2114,8401,1,2 //EL_CIRCLE_OF_FIRE,Circle of Fire
+2114,8425,1,4 //EL_FIRE_ARROW,Fire Arrow
+
+//================
+// EL_AGNI_M
+//================
+2115,8414,1,1 //EL_HEATER,Heater
+2115,8402,1,2 //EL_FIRE_CLOAK,Fire Cloak
+2115,8426,1,4 //EL_FIRE_BOMB,Fire Bomb
+
+//================
+// EL_AGNI_L
+//================
+2116,8415,1,1 //EL_TROPIC,Tropic
+2116,8403,1,2 //EL_FIRE_MANTLE,Fire Mantle
+2116,8428,1,4 //EL_FIRE_WAVE,Fire Wave
+
+//================
+// EL_AQUA_S
+//================
+2117,8416,1,1 //EL_AQUAPLAY,Aqua Play
+2117,8404,1,2 //EL_WATER_SCREEN,Water Screen
+2117,8430,1,4 //EL_ICE_NEEDLE,Ice Needle
+
+//================
+// EL_AQUA_M
+//================
+2118,8417,1,1 //EL_COOLER,Cooler
+2118,8405,1,2 //EL_WATER_DROP,Water Drop
+2118,8431,1,4 //EL_WATER_SCREW,Water Screw
+
+//================
+// EL_AQUA_L
+//================
+2119,8418,1,1 //EL_CHILLY_AIR,Cool Air
+2119,8406,1,2 //EL_WATER_BARRIER,Water Barrier
+2119,8433,1,4 //EL_TIDAL_WEAPON,Tidal Weapon
+
+//================
+// EL_VENTUS_S
+//================
+2120,8419,1,1 //EL_GUST,Gust
+2120,8407,1,2 //EL_WIND_STEP,Wind Step
+2120,8434,1,4 //EL_WIND_SLASH,Wind Slasher
+
+//================
+// EL_VENTUS_M
+//================
+2121,8420,1,1 //EL_BLAST,Blast
+2121,8408,1,2 //EL_WIND_CURTAIN,Wind Curtain
+2121,8435,1,4 //EL_HURRICANE,Hurricane Rage
+
+//================
+// EL_VENTUS_L
+//================
+2122,8421,1,1 //EL_WILD_STORM,Wild Storm
+2122,8409,1,2 //EL_ZEPHYR,Zephyr
+2122,8437,1,4 //EL_TYPOON_MIS,Typhoon Missile
+
+//================
+// EL_TERA_S
+//================
+2123,8422,1,1 //EL_PETROLOGY,Petrology
+2123,8410,1,2 //EL_SOLID_SKIN,Solid Skin
+2123,8439,1,4 //EL_STONE_HAMMER,Stone Hammer
+
+//================
+// EL_TERA_M
+//================
+2124,8423,1,1 //EL_CURSED_SOIL,Cursed Soil
+2124,8411,1,2 //EL_STONE_SHIELD,Stone Shield
+2124,8440,1,4 //EL_ROCK_CRUSHER,Rock Launcher
+
+//================
+// EL_TERA_L
+//================
+2125,8424,1,1 //EL_UPHEAVAL,Upheaval
+2125,8412,1,2 //EL_POWER_OF_GAIA,Power of Gaia
+2125,8442,1,4 //EL_STONE_RAIN,Stone Rain
diff --git a/db/guild_skill_tree.txt b/db/guild_skill_tree.txt
new file mode 100644
index 00000000..9c5d06c1
--- /dev/null
+++ b/db/guild_skill_tree.txt
@@ -0,0 +1,28 @@
+// Guild Skill Tree Database
+//
+// Structure of Database:
+// SkillID,MaxLv,Prerequisite SkillID1,Prerequisite SkillLv1,PrereqSkillID2,PrereqSkillLv2,PrereqSkillID3,PrereqSkillLv3,PrereqSkillID4,PrereqSkillLv4,PrereqSkillID5,PrereqSkillLv5 //GUILD SKILLNAME#Skill Name#
+//
+// 01. SkillID Skill ID of the guild skill.
+// 02. MaxLv Maximum level of the guild skill.
+// 03. Prerequisite SkillID Guild skill required for the skill to become available.
+// 04. Prerequisite SkillLv Level of the required guild skill.
+// ...
+//
+// NOTE: MAX_GUILD_SKILL_REQUIRE (typically 5) ID/Lv pairs must be specified.
+
+10000,1,0,0,0,0,0,0,0,0,0,0 //GD_APPROVAL#Official Guild Approval#
+10001,1,10000,1,0,0,0,0,0,0,0,0 //GD_KAFRACONTRACT#Contract with Kafra#
+10002,1,10000,1,0,0,0,0,0,0,0,0 //GD_GUARDRESEARCH#Guardian Research#
+10003,3,0,0,0,0,0,0,0,0,0,0 //GD_GUARDUP#Strengthen Guardians#
+10004,10,0,0,0,0,0,0,0,0,0,0 //GD_EXTENSION#Guild Extension#
+10005,0,0,0,0,0,0,0,0,0,0,0 //GD_GLORYGUILD#Guilds Glory#
+10006,5,0,0,0,0,0,0,0,0,0,0 //GD_LEADERSHIP#Great Leadership#
+10007,5,0,0,0,0,0,0,0,0,0,0 //GD_GLORYWOUNDS#Glorious Wounds#
+10008,5,10007,1,0,0,0,0,0,0,0,0 //GD_SOULCOLD#Cold Heart#
+10009,5,10006,1,0,0,0,0,0,0,0,0 //GD_HAWKEYES#Sharp Gaze#
+10010,1,10000,1,10004,2,0,0,0,0,0,0 //GD_BATTLEORDER#Battle Command#
+10011,3,10000,1,10004,5,10010,1,0,0,0,0 //GD_REGENERATION#Regeneration#
+10012,1,10011,1,0,0,0,0,0,0,0,0 //GD_RESTORE#Restoration#
+10013,1,10000,1,10002,1,10004,5,10010,1,10011,1 //GD_EMERGENCYCALL#Urgent Call#
+10014,1,0,0,0,0,0,0,0,0,0,0 //GD_DEVELOPMENT#Permanent Development#
diff --git a/db/homun_skill_tree.txt b/db/homun_skill_tree.txt
new file mode 100644
index 00000000..3966e03d
--- /dev/null
+++ b/db/homun_skill_tree.txt
@@ -0,0 +1,15 @@
+// Homunculus Skill Tree Database
+//
+// Structure of Database:
+// Class,SkillID,MaxLv[,JobLevel],Prerequisite SkillID1,Prerequisite SkillLv1,PrereqSkillID2,PrereqSkillLv2,PrereqSkillID3,PrereqSkillLv3,PrereqSkillID4,PrereqSkillLv4,PrereqSkillID5,PrereqSkillLv5,IntimacyLvReq //SKILLNAME#Skill Name#
+//
+// 01. Class Homunculus ID.
+// 02. SkillID Skill ID of the homunuculus skill.
+// 03. MaxLv Maximum level of the homunuculus skill.
+// 04. JobLevel Job level required for the skill to become available (optional, reserved, not used by server).
+// 05. Prerequisite SkillID Homunculus skill required for the skill to become available.
+// 06. Prerequisite SkillLv Level of the required homunculus skill.
+// ...
+// 15. IntimacyLvReq Minimum level of intimacy to unlock skill.
+//
+// NOTE: MAX_PC_SKILL_REQUIRE (typically 5) ID/Lv pairs must be specified.
diff --git a/db/item_db2.conf b/db/item_db2.conf
new file mode 100644
index 00000000..d499c10d
--- /dev/null
+++ b/db/item_db2.conf
@@ -0,0 +1,3 @@
+item_db: (
+
+)
diff --git a/db/item_options.conf b/db/item_options.conf
new file mode 100644
index 00000000..9a827dca
--- /dev/null
+++ b/db/item_options.conf
@@ -0,0 +1,1116 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2017 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Items Options Database
+//=========================================================================
+
+item_options_db: (
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ Id: (int) This value must be unique, with an index
+ that is represented client-side in
+ data/luafiles514/lua files/datainfo/addrandomoptionnametable.lub
+ Name: (string) Must be a unique string since it is used
+ as a constant.
+ Script: <""> Script effect of the option. Utilizes getequippedoptioninfo
+ for a variable bonus effect.
+},
+*/
+{
+ Id: 1
+ Name: "VAR_MAXHPAMOUNT"
+ Script: <" bonus(bMaxHP, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 2
+ Name: "VAR_MAXSPAMOUNT"
+ Script: <" bonus(bMaxSP, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 3
+ Name: "VAR_STRAMOUNT"
+ Script: <" bonus(bStr, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 4
+ Name: "VAR_AGIAMOUNT"
+ Script: <" bonus(bAgi, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 5
+ Name: "VAR_VITAMOUNT"
+ Script: <" bonus(bVit, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 6
+ Name: "VAR_INTAMOUNT"
+ Script: <" bonus(bInt, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 7
+ Name: "VAR_DEXAMOUNT"
+ Script: <" bonus(bDex, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 8
+ Name: "VAR_LUKAMOUNT"
+ Script: <" bonus(bLuk, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 9
+ Name: "VAR_MAXHPPERCENT"
+ Script: <" bonus(bMaxHPrate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 10
+ Name: "VAR_MAXSPPERCENT"
+ Script: <" bonus(bMaxSPrate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 11
+ Name: "VAR_HPACCELERATION"
+ Script: <" bonus(bHPrecovRate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 12
+ Name: "VAR_SPACCELERATION"
+ Script: <" bonus(bSPrecovRate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 13
+ Name: "VAR_ATKPERCENT"
+ Script: <" bonus(bAtkRate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 14
+ Name: "VAR_MAGICATKPERCENT"
+ Script: <" bonus(bMatkRate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 15
+ Name: "VAR_PLUSASPD"
+ Script: <" bonus(bAspd, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 16
+ Name: "VAR_PLUSASPDPERCENT"
+ Script: <" bonus(bAspdRate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 17
+ Name: "VAR_ATTPOWER"
+ Script: <" bonus(bAtk, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 18
+ Name: "VAR_HITSUCCESSVALUE"
+ Script: <" bonus(bHit, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 19
+ Name: "VAR_ATTMPOWER"
+ Script: <" bonus(bMatk, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 20
+ Name: "VAR_ITEMDEFPOWER"
+ Script: <" bonus(bDef, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 21
+ Name: "VAR_MDEFPOWER"
+ Script: <" bonus(bMdef, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 22
+ Name: "VAR_AVOIDSUCCESSVALUE"
+ Script: <" bonus(bFlee, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 23
+ Name: "VAR_PLUSAVOIDSUCCESSVALUE"
+ Script: <" bonus(bFlee2, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 24
+ Name: "VAR_CRITICALSUCCESSVALUE"
+ Script: <" bonus(bCritical, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 25
+ Name: "ATTR_TOLERACE_NOTHING"
+ Script: <" bonus2(bSubEle, Ele_Neutral, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 26
+ Name: "ATTR_TOLERACE_WATER"
+ Script: <" bonus2(bSubEle, Ele_Water, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 27
+ Name: "ATTR_TOLERACE_GROUND"
+ Script: <" bonus2(bSubEle, Ele_Earth, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 28
+ Name: "ATTR_TOLERACE_FIRE"
+ Script: <" bonus2(bSubEle, Ele_Fire, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 29
+ Name: "ATTR_TOLERACE_WIND"
+ Script: <" bonus2(bSubEle, Ele_Wind, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 30
+ Name: "ATTR_TOLERACE_POISON"
+ Script: <" bonus2(bSubEle, Ele_Poison, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 31
+ Name: "ATTR_TOLERACE_SAINT"
+ Script: <" bonus2(bSubEle, Ele_Holy, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 32
+ Name: "ATTR_TOLERACE_DARKNESS"
+ Script: <" bonus2(bSubEle, Ele_Dark, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 33
+ Name: "ATTR_TOLERACE_TELEKINESIS"
+ Script: <" bonus2(bSubEle, Ele_Ghost, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 34
+ Name: "ATTR_TOLERACE_UNDEAD"
+ Script: <" bonus2(bSubEle, Ele_Undead, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 35
+ Name: "ATTR_TOLERACE_ALL"
+ Script: <" bonus2(bSubEle, Ele_All, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+// TODO: Confirm if damage reduction is implemented correctly.
+// kRO desc : <ELEMENT> 몬스터로부터 받는 물리 ë°ë¯¸ì§€ %d%% ê°ì†Œ.
+{
+ Id: 36
+ Name: "DAMAGE_PROPERTY_NOTHING_USER"
+ Script: <" bonus3(bSubEle, Ele_Neutral, getequippedoptioninfo(IT_OPT_VALUE), BF_NORMAL); ">
+},
+{
+ Id: 37
+ Name: "DAMAGE_PROPERTY_NOTHING_TARGET"
+ Script: <" bonus2(bAddEle, Ele_Neutral, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 38
+ Name: "DAMAGE_PROPERTY_WATER_USER"
+ Script: <" bonus3(bSubEle, Ele_Water, getequippedoptioninfo(IT_OPT_VALUE), BF_NORMAL); ">
+},
+{
+ Id: 39
+ Name: "DAMAGE_PROPERTY_WATER_TARGET"
+ Script: <" bonus2(bAddEle, Ele_Water, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 40
+ Name: "DAMAGE_PROPERTY_GROUND_USER"
+ Script: <" bonus3(bSubEle, Ele_Earth, getequippedoptioninfo(IT_OPT_VALUE), BF_NORMAL); ">
+},
+{
+ Id: 41
+ Name: "DAMAGE_PROPERTY_GROUND_TARGET"
+ Script: <" bonus2(bAddEle, Ele_Earth, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 42
+ Name: "DAMAGE_PROPERTY_FIRE_USER"
+ Script: <" bonus3(bSubEle, Ele_Fire, getequippedoptioninfo(IT_OPT_VALUE), BF_NORMAL); ">
+},
+{
+ Id: 43
+ Name: "DAMAGE_PROPERTY_FIRE_TARGET"
+ Script: <" bonus2(bAddEle, Ele_Fire, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 44
+ Name: "DAMAGE_PROPERTY_WIND_USER"
+ Script: <" bonus3(bSubEle, Ele_Wind, getequippedoptioninfo(IT_OPT_VALUE), BF_NORMAL); ">
+},
+{
+ Id: 45
+ Name: "DAMAGE_PROPERTY_WIND_TARGET"
+ Script: <" bonus2(bAddEle, Ele_Wind, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 46
+ Name: "DAMAGE_PROPERTY_POISON_USER"
+ Script: <" bonus3(bSubEle, Ele_Poison, getequippedoptioninfo(IT_OPT_VALUE), BF_NORMAL); ">
+},
+{
+ Id: 47
+ Name: "DAMAGE_PROPERTY_POISON_TARGET"
+ Script: <" bonus2(bAddEle, Ele_Poison, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 48
+ Name: "DAMAGE_PROPERTY_SAINT_USER"
+ Script: <" bonus3(bSubEle, Ele_Holy, getequippedoptioninfo(IT_OPT_VALUE), BF_NORMAL); ">
+},
+{
+ Id: 49
+ Name: "DAMAGE_PROPERTY_SAINT_TARGET"
+ Script: <" bonus2(bAddEle, Ele_Holy, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 50
+ Name: "DAMAGE_PROPERTY_DARKNESS_USER"
+ Script: <" bonus3(bSubEle, Ele_Dark, getequippedoptioninfo(IT_OPT_VALUE), BF_NORMAL); ">
+},
+{
+ Id: 51
+ Name: "DAMAGE_PROPERTY_DARKNESS_TARGET"
+ Script: <" bonus2(bAddEle, Ele_Dark, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 52
+ Name: "DAMAGE_PROPERTY_TELEKINESIS_USER"
+ Script: <" bonus3(bSubEle, Ele_Ghost, getequippedoptioninfo(IT_OPT_VALUE), BF_NORMAL); ">
+},
+{
+ Id: 53
+ Name: "DAMAGE_PROPERTY_TELEKINESIS_TARGET"
+ Script: <" bonus2(bAddEle, Ele_Ghost, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 54
+ Name: "DAMAGE_PROPERTY_UNDEAD_USER"
+ Script: <" bonus3(bSubEle, Ele_Undead, getequippedoptioninfo(IT_OPT_VALUE), BF_NORMAL); ">
+},
+{
+ Id: 55
+ Name: "DAMAGE_PROPERTY_UNDEAD_TARGET"
+ Script: <" bonus2(bAddEle, Ele_Undead, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 56
+ Name: "MDAMAGE_PROPERTY_NOTHING_USER"
+ Script: <" bonus3(bSubEle, Ele_Neutral, getequippedoptioninfo(IT_OPT_VALUE), BF_MAGIC); ">
+},
+{
+ Id: 57
+ Name: "MDAMAGE_PROPERTY_NOTHING_TARGET"
+ Script: <" bonus2(bMagicAddEle, Ele_Neutral, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 58
+ Name: "MDAMAGE_PROPERTY_WATER_USER"
+ Script: <" bonus3(bSubEle, Ele_Water, getequippedoptioninfo(IT_OPT_VALUE), BF_MAGIC); ">
+},
+{
+ Id: 59
+ Name: "MDAMAGE_PROPERTY_WATER_TARGET"
+ Script: <" bonus2(bMagicAddEle, Ele_Water, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 60
+ Name: "MDAMAGE_PROPERTY_GROUND_USER"
+ Script: <" bonus3(bSubEle, Ele_Earth, getequippedoptioninfo(IT_OPT_VALUE), BF_MAGIC); ">
+},
+{
+ Id: 61
+ Name: "MDAMAGE_PROPERTY_GROUND_TARGET"
+ Script: <" bonus2(bMagicAddEle, Ele_Earth, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 62
+ Name: "MDAMAGE_PROPERTY_FIRE_USER"
+ Script: <" bonus3(bSubEle, Ele_Fire, getequippedoptioninfo(IT_OPT_VALUE), BF_MAGIC); ">
+},
+{
+ Id: 63
+ Name: "MDAMAGE_PROPERTY_FIRE_TARGET"
+ Script: <" bonus2(bMagicAddEle, Ele_Fire, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 64
+ Name: "MDAMAGE_PROPERTY_WIND_USER"
+ Script: <" bonus3(bSubEle, Ele_Wind, getequippedoptioninfo(IT_OPT_VALUE), BF_MAGIC); ">
+},
+{
+ Id: 65
+ Name: "MDAMAGE_PROPERTY_WIND_TARGET"
+ Script: <" bonus2(bMagicAddEle, Ele_Wind, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 66
+ Name: "MDAMAGE_PROPERTY_POISON_USER"
+ Script: <" bonus3(bSubEle, Ele_Poison, getequippedoptioninfo(IT_OPT_VALUE), BF_MAGIC); ">
+},
+{
+ Id: 67
+ Name: "MDAMAGE_PROPERTY_POISON_TARGET"
+ Script: <" bonus2(bMagicAddEle, Ele_Poison, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 68
+ Name: "MDAMAGE_PROPERTY_SAINT_USER"
+ Script: <" bonus3(bSubEle, Ele_Holy, getequippedoptioninfo(IT_OPT_VALUE), BF_MAGIC); ">
+},
+{
+ Id: 69
+ Name: "MDAMAGE_PROPERTY_SAINT_TARGET"
+ Script: <" bonus2(bMagicAddEle, Ele_Holy, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 70
+ Name: "MDAMAGE_PROPERTY_DARKNESS_USER"
+ Script: <" bonus3(bSubEle, Ele_Dark, getequippedoptioninfo(IT_OPT_VALUE), BF_MAGIC); ">
+},
+{
+ Id: 71
+ Name: "MDAMAGE_PROPERTY_DARKNESS_TARGET"
+ Script: <" bonus2(bMagicAddEle, Ele_Dark, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 72
+ Name: "MDAMAGE_PROPERTY_TELEKINESIS_USER"
+ Script: <" bonus3(bSubEle, Ele_Ghost, getequippedoptioninfo(IT_OPT_VALUE), BF_MAGIC); ">
+},
+{
+ Id: 73
+ Name: "MDAMAGE_PROPERTY_TELEKINESIS_TARGET"
+ Script: <" bonus2(bMagicAddEle, Ele_Ghost, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 74
+ Name: "MDAMAGE_PROPERTY_UNDEAD_USER"
+ Script: <" bonus3(bSubEle, Ele_Undead, getequippedoptioninfo(IT_OPT_VALUE), BF_MAGIC); ">
+},
+{
+ Id: 75
+ Name: "MDAMAGE_PROPERTY_UNDEAD_TARGET"
+ Script: <" bonus2(bMagicAddEle, Ele_Undead, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 76
+ Name: "BODY_ATTR_NOTHING"
+ Script: <" bonus(bDefEle, Ele_Neutral); ">
+},
+{
+ Id: 77
+ Name: "BODY_ATTR_WATER"
+ Script: <" bonus(bDefEle, Ele_Water); ">
+},
+{
+ Id: 78
+ Name: "BODY_ATTR_GROUND"
+ Script: <" bonus(bDefEle, Ele_Earth); ">
+},
+{
+ Id: 79
+ Name: "BODY_ATTR_FIRE"
+ Script: <" bonus(bDefEle, Ele_Fire); ">
+},
+{
+ Id: 80
+ Name: "BODY_ATTR_WIND"
+ Script: <" bonus(bDefEle, Ele_Wind); ">
+},
+{
+ Id: 81
+ Name: "BODY_ATTR_POISON"
+ Script: <" bonus(bDefEle, Ele_Poison); ">
+},
+{
+ Id: 82
+ Name: "BODY_ATTR_SAINT"
+ Script: <" bonus(bDefEle, Ele_Holy); ">
+},
+{
+ Id: 83
+ Name: "BODY_ATTR_DARKNESS"
+ Script: <" bonus(bDefEle, Ele_Dark); ">
+},
+{
+ Id: 84
+ Name: "BODY_ATTR_TELEKINESIS"
+ Script: <" bonus(bDefEle, Ele_Ghost); ">
+},
+{
+ Id: 85
+ Name: "BODY_ATTR_UNDEAD"
+ Script: <" bonus(bDefEle, Ele_Undead); ">
+},
+{
+ Id: 86
+ Name: "BODY_ATTR_ALL"
+ Script: <" /* Needs more info */ ">
+},
+{
+ Id: 87
+ Name: "RACE_TOLERACE_NOTHING"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_Formless, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace, RC_Formless, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 88
+ Name: "RACE_TOLERACE_UNDEAD"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_Undead, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace, RC_Undead, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 89
+ Name: "RACE_TOLERACE_ANIMAL"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_Brute, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace, RC_Brute, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 90
+ Name: "RACE_TOLERACE_PLANT"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_Plant, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace, RC_Plant, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 91
+ Name: "RACE_TOLERACE_INSECT"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 92
+ Name: "RACE_TOLERACE_FISHS"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 93
+ Name: "RACE_TOLERACE_DEVIL"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_Demon, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace, RC_Demon, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 94
+ Name: "RACE_TOLERACE_HUMAN"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_DemiPlayer, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace, RC_DemiPlayer, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 95
+ Name: "RACE_TOLERACE_ANGEL"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_Angel, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace, RC_Angel, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 96
+ Name: "RACE_TOLERACE_DRAGON"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_Dragon, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace, RC_Dragon, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 97
+ Name: "RACE_DAMAGE_NOTHING"
+ Script: <" bonus2(bAddRace, RC_Formless, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 98
+ Name: "RACE_DAMAGE_UNDEAD"
+ Script: <" bonus2(bAddRace, RC_Undead, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 99
+ Name: "RACE_DAMAGE_ANIMAL"
+ Script: <" bonus2(bAddRace, RC_Brute, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 100
+ Name: "RACE_DAMAGE_PLANT"
+ Script: <" bonus2(bAddRace, RC_Plant, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 101
+ Name: "RACE_DAMAGE_INSECT"
+ Script: <" bonus2(bAddRace, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 102
+ Name: "RACE_DAMAGE_FISHS"
+ Script: <" bonus2(bAddRace, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 103
+ Name: "RACE_DAMAGE_DEVIL"
+ Script: <" bonus2(bAddRace, RC_Demon, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 104
+ Name: "RACE_DAMAGE_HUMAN"
+ Script: <" bonus2(bAddRace, RC_DemiPlayer, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 105
+ Name: "RACE_DAMAGE_ANGEL"
+ Script: <" bonus2(bAddRace, RC_Angel, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 106
+ Name: "RACE_DAMAGE_DRAGON"
+ Script: <" bonus2(bAddRace, RC_Dragon, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 107
+ Name: "RACE_MDAMAGE_NOTHING"
+ Script: <" bonus2(bMagicAddRace, RC_Formless, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 108
+ Name: "RACE_MDAMAGE_UNDEAD"
+ Script: <" bonus2(bMagicAddRace, RC_Undead, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 109
+ Name: "RACE_MDAMAGE_ANIMAL"
+ Script: <" bonus2(bMagicAddRace, RC_Brute, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 110
+ Name: "RACE_MDAMAGE_PLANT"
+ Script: <" bonus2(bMagicAddRace, RC_Plant, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 111
+ Name: "RACE_MDAMAGE_INSECT"
+ Script: <" bonus2(bMagicAddRace, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 112
+ Name: "RACE_MDAMAGE_FISHS"
+ Script: <" bonus2(bMagicAddRace, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 113
+ Name: "RACE_MDAMAGE_DEVIL"
+ Script: <" bonus2(bMagicAddRace, RC_Demon, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 114
+ Name: "RACE_MDAMAGE_HUMAN"
+ Script: <" bonus2(bMagicAddRace, RC_DemiPlayer, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 115
+ Name: "RACE_MDAMAGE_ANGEL"
+ Script: <" bonus2(bMagicAddRace, RC_Angel, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 116
+ Name: "RACE_MDAMAGE_DRAGON"
+ Script: <" bonus2(bMagicAddRace, RC_Dragon, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 117
+ Name: "RACE_CRI_PERCENT_NOTHING"
+ Script: <" bonus2(bCriticalAddRace, RC_Formless, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+},
+{
+ Id: 118
+ Name: "RACE_CRI_PERCENT_UNDEAD"
+ Script: <" bonus2(bCriticalAddRace, RC_Undead, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+},
+{
+ Id: 119
+ Name: "RACE_CRI_PERCENT_ANIMAL"
+ Script: <" bonus2(bCriticalAddRace, RC_Brute, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+},
+{
+ Id: 120
+ Name: "RACE_CRI_PERCENT_PLANT"
+ Script: <" bonus2(bCriticalAddRace, RC_Plant, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+},
+{
+ Id: 121
+ Name: "RACE_CRI_PERCENT_INSECT"
+ Script: <" bonus2(bCriticalAddRace, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+},
+{
+ Id: 122
+ Name: "RACE_CRI_PERCENT_FISHS"
+ Script: <" bonus2(bCriticalAddRace, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+},
+{
+ Id: 123
+ Name: "RACE_CRI_PERCENT_DEVIL"
+ Script: <" bonus2(bCriticalAddRace, RC_Demon, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+},
+{
+ Id: 124
+ Name: "RACE_CRI_PERCENT_HUMAN"
+ Script: <" bonus2(bCriticalAddRace, RC_DemiPlayer, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+},
+{
+ Id: 125
+ Name: "RACE_CRI_PERCENT_ANGEL"
+ Script: <" bonus2(bCriticalAddRace, RC_Angel, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+},
+{
+ Id: 126
+ Name: "RACE_CRI_PERCENT_DRAGON"
+ Script: <" bonus2(bCriticalAddRace, RC_Dragon, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+},
+{
+ Id: 127
+ Name: "RACE_IGNORE_DEF_PERCENT_NOTHING"
+ Script: <" bonus2(bIgnoreDefRate, RC_Formless, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 128
+ Name: "RACE_IGNORE_DEF_PERCENT_UNDEAD"
+ Script: <" bonus2(bIgnoreDefRate, RC_Undead, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 129
+ Name: "RACE_IGNORE_DEF_PERCENT_ANIMAL"
+ Script: <" bonus2(bIgnoreDefRate, RC_Brute, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 130
+ Name: "RACE_IGNORE_DEF_PERCENT_PLANT"
+ Script: <" bonus2(bIgnoreDefRate, RC_Plant, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 131
+ Name: "RACE_IGNORE_DEF_PERCENT_INSECT"
+ Script: <" bonus2(bIgnoreDefRate, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 132
+ Name: "RACE_IGNORE_DEF_PERCENT_FISHS"
+ Script: <" bonus2(bIgnoreDefRate, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 133
+ Name: "RACE_IGNORE_DEF_PERCENT_DEVIL"
+ Script: <" bonus2(bIgnoreDefRate, RC_Demon, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 134
+ Name: "RACE_IGNORE_DEF_PERCENT_HUMAN"
+ Script: <" bonus2(bIgnoreDefRate, RC_DemiPlayer, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 135
+ Name: "RACE_IGNORE_DEF_PERCENT_ANGEL"
+ Script: <" bonus2(bIgnoreDefRate, RC_Angel, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 136
+ Name: "RACE_IGNORE_DEF_PERCENT_DRAGON"
+ Script: <" bonus2(bIgnoreDefRate, RC_Dragon, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 137
+ Name: "RACE_IGNORE_MDEF_PERCENT_NOTHING"
+ Script: <" bonus2(bIgnoreMdefRate, RC_Formless, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 138
+ Name: "RACE_IGNORE_MDEF_PERCENT_UNDEAD"
+ Script: <" bonus2(bIgnoreMdefRate, RC_Undead, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 139
+ Name: "RACE_IGNORE_MDEF_PERCENT_ANIMAL"
+ Script: <" bonus2(bIgnoreMdefRate, RC_Brute, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 140
+ Name: "RACE_IGNORE_MDEF_PERCENT_PLANT"
+ Script: <" bonus2(bIgnoreMdefRate, RC_Plant, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 141
+ Name: "RACE_IGNORE_MDEF_PERCENT_INSECT"
+ Script: <" bonus2(bIgnoreMdefRate, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 142
+ Name: "RACE_IGNORE_MDEF_PERCENT_FISHS"
+ Script: <" bonus2(bIgnoreMdefRate, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 143
+ Name: "RACE_IGNORE_MDEF_PERCENT_DEVIL"
+ Script: <" bonus2(bIgnoreMdefRate, RC_Demon, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 144
+ Name: "RACE_IGNORE_MDEF_PERCENT_HUMAN"
+ Script: <" bonus2(bIgnoreMdefRate, RC_DemiPlayer, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 145
+ Name: "RACE_IGNORE_MDEF_PERCENT_ANGEL"
+ Script: <" bonus2(bIgnoreMdefRate, RC_Angel, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 146
+ Name: "RACE_IGNORE_MDEF_PERCENT_DRAGON"
+ Script: <" bonus2(bIgnoreMdefRate, RC_Dragon, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 147
+ Name: "CLASS_DAMAGE_NORMAL_TARGET"
+ Script: <" bonus2(bAddRace2, RC_NonBoss, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 148
+ Name: "CLASS_DAMAGE_BOSS_TARGET"
+ Script: <" bonus2(bAddRace2, RC_Boss, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 149
+ Name: "CLASS_DAMAGE_NORMAL_USER"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_NonBoss, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace2, RC_NonBoss, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 150
+ Name: "CLASS_DAMAGE_BOSS_USER"
+ Script: <"
+ if (RENEWAL)
+ bonus2(bAddRaceTolerance, RC_Boss, getequippedoptioninfo(IT_OPT_VALUE));
+ else
+ bonus2(bSubRace2, RC_Boss, getequippedoptioninfo(IT_OPT_VALUE));
+ ">
+},
+{
+ Id: 151
+ Name: "CLASS_MDAMAGE_NORMAL"
+ Script: <" bonus2(bMagicAddRace2, RC_NonBoss, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 152
+ Name: "CLASS_MDAMAGE_BOSS"
+ Script: <" bonus2(bMagicAddRace2, RC_Boss, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 153
+ Name: "CLASS_IGNORE_DEF_PERCENT_NORMAL"
+ Script: <" bonus2(bIgnoreDefRate, Class_Normal, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 154
+ Name: "CLASS_IGNORE_DEF_PERCENT_BOSS"
+ Script: <" bonus2(bIgnoreDefClassRate, Class_Boss, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 155
+ Name: "CLASS_IGNORE_MDEF_PERCENT_NORMAL"
+ Script: <" bonus2(bIgnoreMdefClassRate, Class_Normal, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 156
+ Name: "CLASS_IGNORE_MDEF_PERCENT_BOSS"
+ Script: <" bonus2(bIgnoreMdefClassRate, Class_Boss, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 157
+ Name: "DAMAGE_SIZE_SMALL_TARGET"
+ Script: <" bonus2(bAddSize, Size_Small, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 158
+ Name: "DAMAGE_SIZE_MIDIUM_TARGET"
+ Script: <" bonus2(bAddSize, Size_Medium, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 159
+ Name: "DAMAGE_SIZE_LARGE_TARGET"
+ Script: <" bonus2(bAddSize, Size_Large, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 160
+ Name: "DAMAGE_SIZE_SMALL_USER"
+ Script: <" bonus2(bSubSize, Size_Small, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 161
+ Name: "DAMAGE_SIZE_MIDIUM_USER"
+ Script: <" bonus2(bSubSize, Size_Medium, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 162
+ Name: "DAMAGE_SIZE_LARGE_USER"
+ Script: <" bonus2(bSubSize, Size_Large, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 163
+ Name: "DAMAGE_SIZE_PERFECT"
+ Script: <" bonus(bNoSizeFix, 1); ">
+},
+{
+ Id: 164
+ Name: "DAMAGE_CRI_TARGET"
+ Script: <" bonus(bCritAtkRate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 165
+ Name: "DAMAGE_CRI_USER"
+ Script: <" bonus(bCriticalDef, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 166
+ Name: "RANGE_ATTACK_DAMAGE_TARGET"
+ Script: <" bonus(bLongAtkRate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 167
+ Name: "RANGE_ATTACK_DAMAGE_USER"
+ Script: <" bonus(bLongAtkDef, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 168
+ Name: "HEAL_VALUE"
+ Script: <" bonus(bHealPower, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 169
+ Name: "HEAL_MODIFY_PERCENT"
+ Script: <" bonus(bHealPower2, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 170
+ Name: "DEC_SPELL_CAST_TIME"
+ Script: <" bonus(bVariableCastrate, -(getequippedoptioninfo(IT_OPT_VALUE))); ">
+},
+{
+ Id: 171
+ Name: "DEC_SPELL_DELAY_TIME"
+ Script: <" bonus(bDelayrate, -(getequippedoptioninfo(IT_OPT_VALUE))); ">
+},
+{
+ Id: 172
+ Name: "DEC_SP_CONSUMPTION"
+ Script: <" bonus(bUseSPrate, -(getequippedoptioninfo(IT_OPT_VALUE))); ">
+},
+{
+ Id: 173
+ Name: "HP_DRAIN"
+ Script: <" /* Needs more info */ ">
+},
+{
+ Id: 174
+ Name: "SP_DRAIN"
+ Script: <" /* Needs more info */ ">
+},
+{
+ Id: 175
+ Name: "WEAPON_ATTR_NOTHING"
+ Script: <" bonus(bAtkEle, Ele_Neutral); ">
+},
+{
+ Id: 176
+ Name: "WEAPON_ATTR_WATER"
+ Script: <" bonus(bAtkEle, Ele_Water); ">
+},
+{
+ Id: 177
+ Name: "WEAPON_ATTR_GROUND"
+ Script: <" bonus(bAtkEle, Ele_Earth); ">
+},
+{
+ Id: 178
+ Name: "WEAPON_ATTR_FIRE"
+ Script: <" bonus(bAtkEle, Ele_Fire); ">
+},
+{
+ Id: 179
+ Name: "WEAPON_ATTR_WIND"
+ Script: <" bonus(bAtkEle, Ele_Wind); ">
+},
+{
+ Id: 180
+ Name: "WEAPON_ATTR_POISON"
+ Script: <" bonus(bAtkEle, Ele_Poison); ">
+},
+{
+ Id: 181
+ Name: "WEAPON_ATTR_SAINT"
+ Script: <" bonus(bAtkEle, Ele_Holy); ">
+},
+{
+ Id: 182
+ Name: "WEAPON_ATTR_DARKNESS"
+ Script: <" bonus(bAtkEle, Ele_Dark); ">
+},
+{
+ Id: 183
+ Name: "WEAPON_ATTR_TELEKINESIS"
+ Script: <" bonus(bAtkEle, Ele_Ghost); ">
+},
+{
+ Id: 184
+ Name: "WEAPON_ATTR_UNDEAD"
+ Script: <" bonus(bAtkEle, Ele_Undead); ">
+},
+{
+ Id: 185
+ Name: "WEAPON_INDESTRUCTIBLE"
+ Script: <" bonus(bUnbreakableWeapon, 1); ">
+},
+{
+ Id: 186
+ Name: "BODY_INDESTRUCTIBLE"
+ Script: <" bonus(bUnbreakableArmor, 1); ">
+},
+{
+ Id: 187
+ Name: "IOPT_SPLASHDAMAGE"
+ Script: <" bonus(bSplashAddRange, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 188
+ Name: "IOPT_WALKSPEED"
+ Script: <" bonus(bSpeedAddRate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 189
+ Name: "IOPT_EXPGAIN"
+ Script: <" bonus2(bExpAddRace, RC_All, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 190
+ Name: "IOPT_DOUBLEATTACK"
+ Script: <" bonus(bDoubleAddRate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 191
+ Name: "IOPT_SCRESIST_POISON"
+ Script: <" bonus2(bResEff,Eff_Poison, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 192
+ Name: "IOPT_SCRESIST_SILENCE"
+ Script: <" bonus2(bResEff,Eff_Silence, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 193
+ Name: "IOPT_SCRESIST_CURSE"
+ Script: <" bonus2(bResEff,Eff_Curse, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 194
+ Name: "IOPT_SCRESIST_BLIND"
+ Script: <" bonus2(bResEff,Eff_Blind, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 195
+ Name: "IOPT_SCPROVOKE_POISON"
+ Script: <" bonus2(bAddEff,Eff_Poison, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 196
+ Name: "IOPT_SCPROVOKE_SILENCE"
+ Script: <" bonus2(bAddEff,Eff_Silence, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 197
+ Name: "IOPT_SCPROVOKE_CURSE"
+ Script: <" bonus2(bAddEff,Eff_Curse, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 198
+ Name: "IOPT_SCPROVOKE_BLIND"
+ Script: <" bonus2(bAddEff,Eff_Blind, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 199
+ Name: "IOPT_CRITDMG"
+ Script: <" bonus(bCritAtkRate, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 200
+ Name: "IOPT_RICHNESS"
+ Script: <" bonus2(bAddGetZenyNum, -2, getequippedoptioninfo(IT_OPT_VALUE)); ">
+},
+{
+ Id: 201
+ Name: "VINTAGE_WPN"
+ Script: <" bonus2(bAddRace2, RC_All, -50); ">
+},
+{
+ Id: 202
+ Name: "VINTAGE_ARM"
+ Script: <" bonus2(bAddDefClass, RC_All, -20); ">
+}
+)
diff --git a/db/job_db2.txt b/db/job_db2.txt
new file mode 100644
index 00000000..52dc0798
--- /dev/null
+++ b/db/job_db2.txt
@@ -0,0 +1,38 @@
+// Job-specific Stat Bonuses Database
+//
+// Structure of Database:
+// JobID,JobLv1,JobLv2,JobLv3,...
+//
+// Legend for 'JobLvN' fields:
+// 0 = No stat bonus at this job level
+// 1 = STR increased by 1 at this job level
+// 2 = AGI increased by 1 at this job level
+// 3 = VIT increased by 1 at this job level
+// 4 = INT increased by 1 at this job level
+// 5 = DEX increased by 1 at this job level
+// 6 = LUK increased by 1 at this job level
+//
+// See also: https://gitlab.com/evol/evol-all/issues/67
+//
+
+// .:: HUMANS ::.
+// Talpan
+0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
+// Unused Talpan
+1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
+
+// Tritan
+2,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
+
+// Ifriton
+3,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
+
+// Gispaan
+4,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
+
+// Sparron
+5,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
+
+// Skellie
+6,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
+
diff --git a/db/magicmushroom_db.txt b/db/magicmushroom_db.txt
new file mode 100644
index 00000000..5705e537
--- /dev/null
+++ b/db/magicmushroom_db.txt
@@ -0,0 +1,27 @@
+// Magic Mushroom DB.
+// Database for skills that are randomly used through Magic Mushroom status change.
+// Format: SkillID
+
+7 //SM_MAGNUM
+8 //SM_ENDURE
+10 //MG_SIGHT
+24 //AL_RUWACH
+32 //AL_CRUCIS
+33 //AL_ANGELUS
+45 //AC_CONCENTRATION
+61 //KN_AUTOCOUNTER
+74 //PR_MAGNIFICAT
+110 //BS_HAMMERFALL
+114 //BS_MAXIMIZE
+142 //NV_FIRSTAID
+150 //TF_BACKSLIDING
+151 //TF_PICKSTONE
+157 //MG_ENERGYCOAT
+249 //CR_AUTOGUARD
+256 //CR_PROVIDENCE
+261 //MO_CALLSPIRITS
+270 //MO_EXPLOSIONSPIRITS
+326 //DC_SCREAM
+500 //GS_GLITTERING
+527 //NJ_TATAMIGAESHI
+531 //NJ_UTSUSEMI
diff --git a/db/map_index.txt b/db/map_index.txt
new file mode 100644
index 00000000..354f427b
--- /dev/null
+++ b/db/map_index.txt
@@ -0,0 +1,132 @@
+000-1 1
+001-1 2
+001-2 3
+001-3 4
+002-1 5
+002-2 6
+002-3 7
+002-4 8
+002-5 9
+003-1 10
+003-4 11
+004-1 12
+004-3 13
+004-4 14
+004-5 15
+005-3 16
+006-1 17
+006-2 18
+006-3 19
+007-1 20
+007-2 21
+008-1 22
+009-1 23
+009-2 24
+009-3 25
+009-4 26
+009-5 27
+009-6 28
+009-7 29
+009-8 30
+010-1 31
+010-2 32
+011-1 33
+011-3 34
+011-4 35
+011-6 36
+012-1 37
+012-3 38
+012-4 39
+013-1 40
+013-2 41
+013-3 42
+014-1 43
+014-3 44
+015-1 45
+015-3 46
+016-1 47
+016-2 48
+017-1 49
+017-2 50
+017-3 51
+017-4 52
+017-9 53
+018-1 54
+018-2 55
+018-3 56
+019-1 57
+019-3 58
+019-4 59
+020-1 60
+020-2 61
+020-3 62
+021-3 63
+023-1 64
+023-2 65
+023-3 66
+025-1 67
+025-3 68
+025-4 69
+026-1 70
+026-2 71
+027-1 72
+027-2 73
+027-3 74
+027-4 75
+027-5 76
+027-6 77
+027-7 78
+027-8 79
+028-1 80
+028-3 81
+029-1 82
+029-2 83
+029-3 84
+029-4 85
+030-1 86
+030-2 87
+030-3 88
+030-4 89
+031-1 90
+031-2 91
+031-3 92
+031-4 93
+032-3 94
+033-1 95
+034-1 96
+034-2 97
+035-2 98
+036-2 99
+041-1 100
+042-1 101
+043-1 102
+043-3 103
+043-4 104
+045-1 105
+046-1 106
+046-3 107
+047-1 108
+047-3 109
+048-2 110
+051-1 111
+051-3 112
+052-1 113
+052-2 114
+055-1 115
+055-3 116
+056-2 117
+057-1 118
+069-2 119
+070-1 120
+070-3 121
+099-1 122
+099-2 123
+099-3 124
+099-4 125
+099-5 126
+099-6 127
+099-7 128
+099-8 129
+botcheck 130
+fermi 131
+sec_pri 132
diff --git a/db/mercenary_db.txt b/db/mercenary_db.txt
new file mode 100644
index 00000000..460e3ccc
--- /dev/null
+++ b/db/mercenary_db.txt
@@ -0,0 +1,6 @@
+// Mercenary Database
+//
+// Structure of Database:
+// ID,Sprite_Name,Name,LV,HP,SP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Speed,aDelay,aMotion,dMotion
+
+1191,Merc,Merc,51,6120,187,2,150,900,10,40,44,121,1,60,75,110,10,12,1,0,60,100,972,500,288
diff --git a/db/mercenary_skill_db.txt b/db/mercenary_skill_db.txt
new file mode 100644
index 00000000..dceb55b8
--- /dev/null
+++ b/db/mercenary_skill_db.txt
@@ -0,0 +1,5 @@
+// Mercenary Skill Database
+//
+// Structure of Database:
+// MercenryID,SkillID,SkillLevel
+
diff --git a/db/mob_chat_db.txt b/db/mob_chat_db.txt
new file mode 100644
index 00000000..75ec7400
--- /dev/null
+++ b/db/mob_chat_db.txt
@@ -0,0 +1,4 @@
+// Monster Chat Database
+//
+// Structure of Database:
+// Line_ID,Color_Code,Dialog
diff --git a/db/mob_classchange.txt b/db/mob_classchange.txt
new file mode 100644
index 00000000..44b097d4
--- /dev/null
+++ b/db/mob_classchange.txt
@@ -0,0 +1,5 @@
+// SA_CLASSCHANGE Summonable Monsters Database
+//
+// Structure of Database:
+// MobID,DummyName,Rate
+
diff --git a/db/mob_db2.conf b/db/mob_db2.conf
new file mode 100644
index 00000000..f0c059fc
--- /dev/null
+++ b/db/mob_db2.conf
@@ -0,0 +1,101 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2015-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Mobs Database
+//=========================================================================
+
+mob_db: (
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ // ================ Mandatory fields ==============================
+ Id: ID (int)
+ SpriteName: "SPRITE_NAME" (string)
+ Name: "Mob name" (string)
+ // ================ Optional fields ===============================
+ JName: "Mob name" (string)
+ Lv: level (int, defaults to 1)
+ Hp: health (int, defaults to 1)
+ Sp: mana (int, defaults to 0)
+ Exp: basic experience (int, defaults to 0)
+ JExp: job experience (int, defaults to 0)
+ AttackRange: attack range (int, defaults to 1)
+ Attack: [attack1, attack2] (int, defaults to 0)
+ Def: defence (int, defaults to 0)
+ Mdef: magic defence (int, defaults to 0)
+ Stats: {
+ Str: strength (int, defaults to 0)
+ Agi: agility (int, defaults to 0)
+ Vit: vitality (int, defaults to 0)
+ Int: intelligence (int, defaults to 0)
+ Dex: dexterity (int, defaults to 0)
+ Luk: luck (int, defaults to 0)
+ }
+ ViewRange: view range (int, defaults to 1)
+ ChaseRange: chase range (int, defaults to 1)
+ Size: size (string, defaults to "Size_Small")
+ Race: race (string, defaults to "RC_Formless")
+ Element: (type, level) (string/int, defaults to "Ele_Neutral"/1)
+ Mode: {
+ CanMove: true/false (bool, defaults to false)
+ Looter: true/false (bool, defaults to false)
+ Aggressive: true/false (bool, defaults to false)
+ Assist: true/false (bool, defaults to false)
+ CastSensorIdle:true/false (bool, defaults to false)
+ Boss: true/false (bool, defaults to false)
+ Plant: true/false (bool, defaults to false)
+ CanAttack: true/false (bool, defaults to false)
+ Detector: true/false (bool, defaults to false)
+ CastSensorChase: true/false (bool, defaults to false)
+ ChangeChase: true/false (bool, defaults to false)
+ Angry: true/false (bool, defaults to false)
+ ChangeTargetMelee: true/false (bool, defaults to false)
+ ChangeTargetChase: true/false (bool, defaults to false)
+ TargetWeak: true/false (bool, defaults to false)
+ NoKnockback: true/false (bool, defaults to false)
+ }
+ MoveSpeed: move speed (int, defaults to 0)
+ AttackDelay: attack delay (int, defaults to 4000)
+ AttackMotion: attack motion (int, defaults to 2000)
+ DamageMotion: damage motion (int, defaults to 0)
+ MvpExp: mvp experience (int, defaults to 0)
+ MvpDrops: {
+ AegisName: chance (string: int)
+ // ...
+ }
+ Drops: {
+ AegisName: chance (string: int)
+ // or
+ AegisName: (chance, "Option Drop Group")
+ // ...
+ }
+ DamageTakenRate: damage taken rate (int, defaults to 100)
+},
+**************************************************************************/
+
+
+)
diff --git a/db/mob_item_ratio.txt b/db/mob_item_ratio.txt
new file mode 100644
index 00000000..226460a8
--- /dev/null
+++ b/db/mob_item_ratio.txt
@@ -0,0 +1,30 @@
+// Specific Item Drop Ratio Database
+// Overrides for global item_rate* values from conf/battle/drops.conf
+//
+// Structure of Database:
+// ItemID,Ratio{,MonsterID}
+//
+// Result:
+// ItemID base drop rates defined in mob_db will not get multiplied
+// by global item_rate* values (aka drop rates) from
+// conf/battle/drops.conf. Instead Ratio will be used (100 = 1x).
+// If no MonsterID is specified, all monsters will be affected,
+// otherwise only listed ones.
+//
+// Examples:
+// 909,100 // Jellopies from monsters will drop with 1x drop rate regardless of global drop rate
+// 909,1000 // Jellopies from monsters will drop with 10x drop rate regardless of global drop rate
+// 909,100,1002 // Jellopies from Porings will drop with 1x drop rate. Other monsters that drop Jellopies are unaffected (use global drop rate).
+//
+// Notes:
+// - By default you can list up to 10 MonsterIDs per ItemID.
+// It can be changed in src/map/mob.c by adjusting MAX_ITEMRATIO_MOBS.
+// - Only ItemIDs up to MAX_ITEMDB are supported (default: 32768).
+// - Does not override item_drop_*_min/max settings.
+// - Does not affect card/item-granted drops. To adjust card/item-granted
+// drops, edit them in item_db.
+// - Does affect MVP prizes and Treasure Boxes.
+// - You can add only ONE line per ItemID. If you need various ratios
+// for different monsters, override drop rate with Ratio=100 and edit
+// base drop rates in mob_db.
+// - This file is reloaded by @reloadmobdb.
diff --git a/db/mob_pouch.txt b/db/mob_pouch.txt
new file mode 100644
index 00000000..bd0a4d32
--- /dev/null
+++ b/db/mob_pouch.txt
@@ -0,0 +1,5 @@
+// Red Pouch of Surprise Summonable Monsters Database
+//
+// Structure of Database:
+// MobID,DummyName,Rate
+
diff --git a/db/mob_skill_db2.conf b/db/mob_skill_db2.conf
new file mode 100644
index 00000000..de4b014f
--- /dev/null
+++ b/db/mob_skill_db2.conf
@@ -0,0 +1,59 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Monster Skill Database
+//=========================================================================
+
+mob_skill_db:(
+{
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+ <Monster_Constant>: {
+ <Skill_Constant>: {
+ ClearSkills: (boolean, defaults to false) allows cleaning all previous defined skills for the mob.
+ SkillLevel: (int, defaults to 1)
+ SkillState: (string, defaults to "MSS_ANY")
+ SkillTarget: (string, defaults to "MST_TARGET")
+ Rate: (int, defaults to 1)
+ CastTime: (int, defaults to 0)
+ Delay: (int, defaults to 0)
+ Cancelable: (boolean, defaults to false)
+ CastCondition: (string, defaults to "MSC_ALWAYS")
+ ConditionData: (int, defaults to 0)
+ val0: (int, defaults to 0)
+ val1: (int, defaults to 0)
+ val2: (int, defaults to 0)
+ val3: (int, defaults to 0)
+ val4: (int, defaults to 0)
+ Emotion: (int, defaults to -1)
+ ChatMsgID: (int, defaults to 0)
+ }
+ }
+**************************************************************************/
+ // entries in this file will override the ones in /(pre-)re/mob_skill_db.conf
+}
+)
diff --git a/db/option_drop_groups.conf b/db/option_drop_groups.conf
new file mode 100644
index 00000000..ccd88867
--- /dev/null
+++ b/db/option_drop_groups.conf
@@ -0,0 +1,65 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Random Option Drop Group Database
+//=========================================================================
+
+option_drop_group_db: (
+{
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+ <Group Name Constant>: (
+ { // Option Slot 1
+ Rate: (int) chance of filling option slot 1 (100 = 1%)
+
+ // Possible options for slot 1
+ // min/max value : int, defaults to 0
+ // chance : int, 100 = 1% if not set, will be 100%/number of possibiltiies
+ OptionName: value
+ // or
+ OptionName: [min value, max value]
+ // or
+ OptionName: [min value, max value, chance]
+ // ... (as many as you want)
+ },
+ // ... (up to MAX_ITEM_OPTION)
+ ),
+**************************************************************************/
+ ODG_BASICSTAT: (
+ { // Option Slot 1
+ Rate: 100
+
+ VAR_STRAMOUNT: 1
+ VAR_AGIAMOUNT: 1
+ VAR_VITAMOUNT: 1
+ VAR_INTAMOUNT: 1
+ VAR_DEXAMOUNT: 1
+ VAR_LUKAMOUNT: 1
+ },
+ ),
+}
+)
diff --git a/db/pet_db2.conf b/db/pet_db2.conf
new file mode 100644
index 00000000..235e41c0
--- /dev/null
+++ b/db/pet_db2.conf
@@ -0,0 +1,73 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Pets Database
+//=========================================================================
+
+pet_db:(
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ // ================ Mandatory fields ==============================
+ Id: ID (int)
+ Name: "Pet Name" (string)
+ EggItem: "Egg Item Constant" (string)
+ // ================ Optional fields ===============================
+ TamingItem: "Taming Item Constant" (string, defaults to 0)
+ FoodItem: "Food Item Constant" (string, defaults to "Pet_Food" (ID=537))
+ AccessoryItem: "Equipment Item Constant" (string, defaults to 0)
+ FoodEffectiveness: hunger points (int, defaults to 80)
+ HungerDelay: hunger time (int, defaults to 60)
+ HungerDecrement: hunger points (int, defaults to 1)
+ Intimacy: {
+ Initial: start intimacy (int, defaults to 250)
+ FeedIncrement: feeding intimacy (int, defaults to 10)
+ OverFeedDecrement: overfeeding intimacy (int, defaults to 100)
+ OwnerDeathDecrement: owner die intimacy (int, defaults to 20)
+ StarvingDelay: starving time (int, defaults to 20)
+ StarvingDecrement: starving intimacy (int, defaults to 20)
+ }
+ CaptureRate: capture rate (int, defaults to 1000)
+ Speed: speed (int, defaults to 150)
+ SpecialPerformance: true/false (boolean, defaults to false)
+ TalkWithEmotes: convert talk (boolean, defaults to false)
+ AttackRate: attack rate (int, defaults to 300)
+ DefendRate: Defence attack (int, defaults to 300)
+ ChangeTargetRate: change target (int, defaults to 800)
+ AutoFeed: true/false (boolean, defaults to false)
+ PetScript: <" Pet Script (can also be multi-line) ">
+ EquipScript: <" Equip Script (can also be multi-line) ">
+ Evolve: {
+ EggID: { (string, Evolved Pet EggID)
+ Name: Amount (items required to perform evolution)
+ ...
+ }
+ }
+},
+**************************************************************************/
+ // entries in this file will override the ones in /(pre-)re/pet_db.conf
+)
diff --git a/db/pre-re/achievement_db.conf b/db/pre-re/achievement_db.conf
new file mode 100644
index 00000000..dee92f5c
--- /dev/null
+++ b/db/pre-re/achievement_db.conf
@@ -0,0 +1,134 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Achievement Database
+//=========================================================================
+
+achievement_db: (
+/*****************************************************************
+* Entry Structure
+*****************************************************************
+{
+ Id: (int) Unique ID of the achievement representing it's client-side equivalent.
+ Name: (string) Name/Title of the Achievement.
+ Type: (string) Validation type for the achievement.
+ [Type] [Validation Description] (Trigger)
+ ACH_QUEST: Specific achievement objective update (Script).
+ ACH_KILL_PC_TOTAL: (Accumulative) Total kill count. (Player kill)
+ ACH_KILL_PC_JOB: Kill a player of the specified job. (Player Kill)
+ ACH_KILL_PC_JOBTYPE: Kill a player of the specified job type. (Player Kill)
+ ACH_KILL_MOB_CLASS: Kill a particular mob class. (Mob Kill)
+ ACH_DAMAGE_PC_MAX: Maximum damage caused on a player. (Player Damage)
+ ACH_DAMAGE_PC_TOTAL: (Accumulative) Damage on players. (Player Damage)
+ ACH_DAMAGE_PC_REC_MAX: Maximum damage received by a player. (Receive Player Damage)
+ ACH_DAMAGE_PC_REC_TOTAL: (Accumulative) Damage received by players. (Receive Player Damage)
+ ACH_DAMAGE_MOB_MAX: Maximum damage caused on a monster. (Monster Damage)
+ ACH_DAMAGE_MOB_TOTAL: (Accumulative) Damage caused on monsters. (Monster Damage)
+ ACH_DAMAGE_MOB_REC_MAX: Maximum damage received by a monster. (Receive Monster Damage)
+ ACH_DAMAGE_MOB_REC_TOTAL: (Accumulative) Damage received by monsters. (Receive Monster Damage)
+ ACH_JOB_CHANGE: Change to a specific job. (Job Change)
+ ACH_STATUS: Acquire a specific amount of a particular status type. (Stat Change)
+ ACH_STATUS_BY_JOB: Acquire a specific amount of a status type as a job class. (Stat Change)
+ ACH_STATUS_BY_JOBTYPE: Acquire a specific amount of a status type as a job type. (Stat Change)
+ ACH_CHATROOM_CREATE_DEAD: (Accumulative) Create a chatroom when dead. (Chatroom Creation)
+ ACH_CHATROOM_CREATE: (Accumulative) Create a chatroom. (Chatroom Creation)
+ ACH_CHATROOM_MEMBERS: Gather 'n' members in a chatroom. (Chatroom Join)
+ ACH_FRIEND_ADD: Add a specific number of friends. (Friend Addition)
+ ACH_PARTY_CREATE: (Accumulative) Create a specific number of parties. (Party Creation)
+ ACH_PARTY_JOIN: (Accumulative) Join a specific number of parties. (Party Join)
+ ACH_MARRY: (Accumulative) Marry a specified number of times. (Marriage)
+ ACH_ADOPT_BABY: (Accumulative) Get Adopted. (Adoption)
+ ACH_ADOPT_PARENT: (Accumulative) Adopt a Baby. (Adoption)
+ ACH_ZENY_HOLD: Hold a specific amount of zeny in your inventory. (Gain Zeny)
+ ACH_ZENY_GET_ONCE: Gain a specific amount of zeny in one transaction. (Gain Zeny)
+ ACH_ZENY_GET_TOTAL: (Accumulative) Gain a specific amount of zeny in total. (Gain Zeny)
+ ACH_ZENY_SPEND_ONCE: Spend a specific amount of zeny in one transaction. (Pay Zeny)
+ ACH_ZENY_SPEND_TOTAL: (Accumulative) Spend a specific amount of zeny in total. (Pay Zeny)
+ ACH_EQUIP_REFINE_SUCCESS: Refine an item to +N. (Successful Refine)
+ ACH_EQUIP_REFINE_FAILURE: Fail to refine an item of +N refine. (Failed Refine)
+ ACH_EQUIP_REFINE_SUCCESS_TOTAL: (Accumulative) Refine an item successfully N times. (Success Refine)
+ ACH_EQUIP_REFINE_FAILURE_TOTAL: (Accumulative) Fail to refine an item N times. (Failed Refine)
+ ACH_EQUIP_REFINE_SUCCESS_WLV: Refine a Weapon of a particular Level to +N. (Success Refine)
+ ACH_EQUIP_REFINE_FAILURE_WLV: Fail to refine a Weapon of a particular level from +N. (Failed Refine)
+ ACH_EQUIP_REFINE_SUCCESS_ID: Refine a particular Item successfully to +N. (Success Refine)
+ ACH_EQUIP_REFINE_FAILURE_ID: Fail to refine a particular item successfully from +N. (Failed Refine)
+ ACH_ITEM_GET_COUNT: Acquire N amount of an item of a particular ID. (Acquire Item)
+ ACH_ITEM_GET_COUNT_ITEMTYPE: Acquire N amount of items of a particular type mask. (Acquire Item)
+ ACH_ITEM_GET_WORTH: Acquire an item of buy value N. (Acquire Item)
+ ACH_ITEM_SELL_WORTH: Sell an item of sell value N. (NPC Sell Item)
+ ACH_PET_CREATE: Successfully tame a pet of a particular mob class. (Successful Pet Tame)
+ ACH_ACHIEVE: Achieve an Achievement. (Achievement Completion)
+ ACH_ACHIEVEMENT_RANK: Achieve an Achievement Rank. (Achievement Rank Increase)
+ Objectives: { [Mandatory Field] Objectives of an achievement. Up to 10 objectives per achievement.
+ To comply with the client's order of objectives, this list must be in order.
+ *1: {
+ Description: (string) [Mandatory Field] Description of a particular objective.
+ Criteria: { This is a field for achievements whose objectives must meet
+ certain criteria before evaluating the player's progress for it.
+ MobId: (mixed) MonsterId required for an objective.
+ For types such as ACH_KILL_MOB_CLASS and ACH_PET_CREATE. Can be either int or string constant.
+ JobId: (mixed) Array or Single entry of JobIds.
+ For types - ACH_KILL_PC_JOBTYPE, ACH_JOB_CHANGE or ACH_STATUS_BY_JOBTYPE.
+ Can be either a numeric or string constant.
+ ItemId: (mixed) ItemId required for an objective.
+ For Types such as ACH_ITEM_GET_COUNT. Can be either int or string constant.
+ StatusType: (mixed) Status Type required for an objective.
+ For Types such as ACH_STATUS, ACH_STATUS_BY_JOB, ACH_STATUS_BY_JOBTYPE.
+ Types -
+ "SP_STR" - Strength
+ "SP_AGI" - Agility
+ "SP_VIT" - Vitality
+ "SP_INT" - Intelligence
+ "SP_DEX" - Dexterity
+ "SP_LUK" - Luck
+ "SP_BASELEVEL" - Base Level
+ "SP_JOBLEVEL" - Job Level
+ Can be either int or string constant.
+ ItemType: (mixed) Item type that is required for this achievement.
+ For Types such as ACH_ITEM_GET_COUNT_ITEMTYPE.
+ Can be either int, string or list.
+ Refer "Item types" Constants from constants.conf
+ WeaponLevel: (int) Weapon Level that is required for this achievement. (Eg. 0, 1, 2, 3 or 4).
+ For Types such as ACH_EQUIP_REFINE_SUCCESS_WLV and ACH_EQUIP_REFINE_FAILURE_WLV.
+ Achieve: (int) AchievementID to be achieved.
+ For Type - ACH_ACHIEVE.
+ }
+ Goal: (int) Target amount to be met for the completion of the objective. Default is 1.
+ }
+ ...
+ *10: {...}
+ }
+ Rewards: {
+ Bonus: <""> (script) Script code bonus to be given as a reward for an achievement.
+ Items: { Item rewards per achievement. With a maximum defined in mmo.h as MAX_ACHEIVEMENT_ITEM_REWARDS.
+ Apple: 1 (int) Item ID (int or string constant) : Amount (int)
+ }
+ TitleId: (int) ID of the Title (from the Title System) awarded.
+ }
+ Points: (int) Points per achievement given on it's successful completion.
+}
+*****************************************************************/
+)
diff --git a/db/pre-re/attr_fix.txt b/db/pre-re/attr_fix.txt
new file mode 100644
index 00000000..37e7bd44
--- /dev/null
+++ b/db/pre-re/attr_fix.txt
@@ -0,0 +1,56 @@
+// Elemental attribute damage adjustment tables
+//
+// Row: attacker's weapon element
+// Column: target's defense element
+
+1,10 // lv1 Attribute table
+//Neut Watr Natr Fire NYI NYI Holy Shdw NYI NYI
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, // Neutral
+ 100, 90, 80, 120, 100, 100, 100, 100, 100, 100, // Water
+ 100, 120, 90, 80, 100, 100, 100, 100, 100, 100, // Nature
+ 100, 80, 120, 90, 100, 100, 100, 100, 100, 100, // Fire
+ 100, 100, 100, 100, 90, 100, 100, 100, 100, 100, // UNUSED
+ 100, 100, 100, 100, 100, 90, 100, 100, 100, 100, // UNUSED
+ 100, 100, 100, 100, 100, 100, 90, 120, 100, 100, // Holy
+ 100, 100, 100, 100, 100, 100, 120, 90, 100, 100, // Shadow
+ 100, 100, 100, 100, 100, 100, 100, 100, 90, 100, // UNUSED
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, // UNUSED
+
+2,10 // lv2 Attribute table
+//Neut Watr Natr Fire NYI NYI Holy Shdw NYI NYI
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, // Neutral
+ 100, 90, 70, 130, 100, 100, 100, 100, 100, 100, // Water
+ 100, 130, 90, 70, 100, 100, 100, 100, 100, 100, // Nature
+ 100, 70, 130, 90, 100, 100, 100, 100, 100, 100, // Fire
+ 100, 100, 100, 100, 90, 100, 100, 100, 100, 100, // UNUSED
+ 100, 100, 100, 100, 100, 90, 100, 100, 100, 100, // UNUSED
+ 100, 100, 100, 100, 100, 100, 90, 130, 100, 100, // Holy
+ 100, 100, 100, 100, 100, 100, 130, 90, 100, 100, // Shadow
+ 100, 100, 100, 100, 100, 100, 100, 100, 90, 100, // UNUSED
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, // UNUSED
+
+3,10 // lv3 Attribute table
+//Neut Watr Natr Fire NYI NYI Holy Shdw NYI NYI
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, // Neutral
+ 100, 90, 60, 140, 100, 100, 100, 100, 100, 100, // Water
+ 100, 140, 90, 60, 100, 100, 100, 100, 100, 100, // Nature
+ 100, 60, 140, 90, 100, 100, 100, 100, 100, 100, // Fire
+ 100, 100, 100, 100, 90, 100, 100, 100, 100, 100, // UNUSED
+ 100, 100, 100, 100, 100, 90, 100, 100, 100, 100, // UNUSED
+ 100, 100, 100, 100, 100, 100, 90, 140, 100, 100, // Holy
+ 100, 100, 100, 100, 100, 100, 140, 90, 100, 100, // Shadow
+ 100, 100, 100, 100, 100, 100, 100, 100, 90, 100, // UNUSED
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, // UNUSED
+
+4,10 // lv4 Attribute table
+//Neut Watr Natr Fire NYI NYI Holy Shdw NYI NYI
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, // Neutral
+ 100, 90, 50, 150, 100, 100, 100, 100, 100, 100, // Water
+ 100, 150, 90, 50, 100, 100, 100, 100, 100, 100, // Nature
+ 100, 50, 150, 90, 100, 100, 100, 100, 100, 100, // Fire
+ 100, 100, 100, 100, 90, 100, 100, 100, 100, 100, // UNUSED
+ 100, 100, 100, 100, 100, 90, 100, 100, 100, 100, // UNUSED
+ 100, 100, 100, 100, 100, 100, 90, 150, 100, 100, // Holy
+ 100, 100, 100, 100, 100, 100, 150, 90, 100, 100, // Shadow
+ 100, 100, 100, 100, 100, 100, 100, 100, 90, 100, // UNUSED
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, // UNUSED
diff --git a/db/pre-re/exp_group_db.conf b/db/pre-re/exp_group_db.conf
new file mode 100644
index 00000000..e3f091ba
--- /dev/null
+++ b/db/pre-re/exp_group_db.conf
@@ -0,0 +1,73 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Exp Groups Database File.
+//=========================================================================
+
+base_exp_group_db: {
+ EvolClasses: {
+ MaxLevel: 140
+ Exp: [
+ 9,16,25,36,77,112,153,200,253,320,
+ 385,490,585,700,830,970,1120,1260,1420,1620,
+ 1860,1990,2240,2504,2950,3426,3934,4474,6889,7995,
+ 9174,10425,11748,13967,15775,17678,19677,21773,30543,34212,
+ 38065,42102,46323,53026,58419,64041,69892,75973,102468,115254,
+ 128692,142784,157528,178184,196300,215198,234879,255341,330188,365914,
+ 403224,442116,482590,536948,585191,635278,687211,740988,925400,1473746,
+ 1594058,1718928,1848355,1982340,2230113,2386162,2547417,2713878,3206160,3681024,
+ 4022472,4377024,4744680,5125440,5767272,6204000,6655464,7121664,7602600,9738720,
+ 11649960,13643520,18339300,23836800,35658000,48687000,58135000,99999999,103000000,
+ 107000000, 112000000, 116000000, 121000000, 125000000, 130000000, 134000000, 139000000, 145000000, 152200000,
+ 160840000, 171200000, 191930000, 202290000, 214720000, 229640000, 247550000, 283370000, 301280000, 322770000,
+ 348560000, 379500000, 417450000, 459195000, 505114500, 555625950, 622301064, 696977191, 780614454, 880533104,
+980451754, 1080370404, 1180289054, 1280207704, 1380126354, 1480045004, 1579963654, 1679882304, 1779800954, 1879719604,
+ ]
+ }
+}
+
+job_exp_group_db: {
+ EvolClasses: {
+ MaxLevel: 150
+ Exp: [
+ 20000, 20302, 20666, 21058, 21469, 21894, 22332, 22780, 23237, 23703,
+ 24175, 24655, 25140, 25631, 26128, 26629, 27135, 27646, 28161, 28680,
+ 29202, 29729, 30259, 30792, 31328, 31868, 32411, 32956, 33505, 34056,
+ 34610, 35166, 35725, 36287, 36851, 37417, 37985, 38556, 39129, 39704,
+ 40281, 40860, 41441, 42024, 42608, 43195, 43784, 44374, 44966, 45560,
+ 46155, 46753, 47351, 47952, 48554, 49157, 49763, 50369, 50977, 51587,
+ 52198, 52811, 53424, 54040, 54656, 55274, 55894, 56514, 57136, 57760,
+ 58384, 59010, 59637, 60265, 60894, 61525, 62157, 62790, 63424, 64059,
+ 64695, 65333, 65971, 66611, 67252, 67894, 68536, 69180, 69825, 70471,
+ 71118, 71766, 72415, 73065, 73716, 74368, 75021, 75675, 76330, 76985,
+ 77642, 78300, 78958, 79618, 80278, 80939, 81601, 82264, 82928, 83593,
+ 84258, 84925, 85592, 86260, 86929, 87598, 88269, 88940, 89612, 90285,
+ 90959, 91634, 92309, 92985, 93662, 94339, 95018, 95697, 96377, 97057,
+ 97739, 98421, 99103, 99787,100471,101156,101842,102528,103215,103903,
+ 104592, 105281, 105971, 106661, 107352, 108044, 108737, 109430, 110124,
+ ]
+ }
+}
diff --git a/db/pre-re/exp_guild.txt b/db/pre-re/exp_guild.txt
new file mode 100644
index 00000000..92804760
--- /dev/null
+++ b/db/pre-re/exp_guild.txt
@@ -0,0 +1,51 @@
+// Guild LvUp experience value table
+100000
+400000
+900000
+1600000
+2500000
+3600000
+4900000
+6400000
+8100000
+10000000
+12100000
+14400000
+16900000
+19600000
+22500000
+25600000
+28900000
+32400000
+36100000
+40000000
+44100000
+48400000
+52900000
+57600000
+62500000
+67600000
+72900000
+78400000
+84100000
+90000000
+96100000
+102400000
+108900000
+115600000
+122500000
+129600000
+136900000
+144400000
+152100000
+160000000
+168100000
+176400000
+184900000
+193600000
+202500000
+211600000
+220900000
+230400000
+240100000
+250000000
diff --git a/db/pre-re/exp_homun.txt b/db/pre-re/exp_homun.txt
new file mode 100644
index 00000000..33547c3d
--- /dev/null
+++ b/db/pre-re/exp_homun.txt
@@ -0,0 +1,154 @@
+//Homunculus LvUp experience value table
+347
+545
+891
+1485
+2178
+3168
+3762
+4158
+4505
+4900
+5390
+5880
+5978
+6223
+6566
+7203
+7840
+8232
+11050
+13660
+16900
+20900
+25810
+31870
+39310
+48500
+59820
+73760
+90920
+112100
+138170
+153390
+170270
+189020
+209820
+232910
+258550
+287000
+318580
+353630
+392540
+435740
+483690
+536910
+595990
+661550
+734330
+815110
+904780
+1004320
+1114810
+1237460
+1373600
+1524710
+1692440
+1878620
+2085280
+2314670
+2569290
+2851920
+3165640
+3513870
+3900400
+4329460
+4805710
+5334350
+5921140
+6572470
+7295450
+8097950
+8988730
+9977510
+11075040
+12293300
+13645570
+15146600
+16812740
+18662160
+20715000
+22993660
+25522970
+28330510
+31446880
+34906050
+38745730
+43007770
+47738640
+52989890
+58818790
+65288870
+72470660
+76094200
+79898920
+83893880
+88088590
+92493030
+97117690
+101973590
+107072280
+112425900
+118047200
+123949580
+130147070
+136654430
+143487170
+150661530
+158194620
+166104360
+174409590
+183130080
+192286600
+201900940
+211995990
+222595800
+233725600
+245411890
+257682500
+270566640
+284094980
+298299740
+313214730
+322611180
+332289520
+342258210
+352525970
+363101750
+373994820
+385214670
+396771130
+408674270
+420934510
+433562560
+446569450
+459966540
+473765550
+487978530
+502617900
+517696450
+533227350
+549224190
+565700920
+582671950
+600152110
+618156680
+636701390
+655802440
+675476520
+695740830
+716613060
+738111460
+760254820
+767857380
+0
diff --git a/db/pre-re/homunculus_db.txt b/db/pre-re/homunculus_db.txt
new file mode 100644
index 00000000..f0d005cc
--- /dev/null
+++ b/db/pre-re/homunculus_db.txt
@@ -0,0 +1,30 @@
+// Homunculus Database
+//
+// Structure of Database:
+// Class,EvoClass,Name,FoodID,HungryDelay,BaseSize,EvoSize,Race,Element,bASPD,bHP,bSP,bSTR,bAGI,bVIT,bINT,bDEX,bLUK,gnHP,gxHP,gnSP,gxSP,gnSTR,gxSTR,gnAGI,gxAGI,gnVIT,gxVIT,gnINT,gxINT,gnDEX,gxDEX,gnLUK,gxLUK,enHP,exHP,enSP,exSP,enSTR,exSTR,enAGI,exAGI,enVIT,exVIT,enINT,exINT,enDEX,exDEX,enLUK,exLUK
+//
+// 01. Class Homunculus ID.
+// 02. EvoClass Homunculus ID of the evolved version.
+// 03. Name Name of the homunculus.
+// 04. FoodID Item ID of the homunuclus food.
+// 05. HungryDelay Time interval in milliseconds after which the homunculus' hunger value is altered.
+// 06. BaseSize Size of the base homunculus class (0 = small, 1 = normal, 2 = large).
+// 07. EvoSize Size of the evolved homunculus class (0 = small, 1 = normal, 2 = large).
+// 08. Race Race of the homunculus (0 = formless, 1 = undead, 2 = brute, 3 = plant, 4 = insect, 5 = fish, 6 = demon, 7 = demi-human, 8 = angel, 9 = dragon).
+// 09. Element Element of the homunculus (0 = neutral, 1 = water, 2 = earth, 3 = fire, 4 = wind, 5 = poison, 6 = holy, 7 = dark, 8 = ghost, 9 = undead).
+// The element level is always 1.
+// ...
+//
+// Legend: b: base, gn: growth min, gx: growth max, en: evolution min, ex: evolution max
+// NOTE: Only the growth values are in a 1/10 scale, the other stats are 1/1 (eg: 5 gmAGI means 0.5 agi)
+
+// Class,EvoClass,Name,FoodID,HungryDelay,BaseSize,EvoSize,Race,Element,bASPD,bHP,bSP,bSTR,bAGI,bVIT,bINT,bDEX,bLUK,gnHP,gxHP,gnSP,gxSP,gnSTR,gxSTR,gnAGI,gxAGI,gnVIT,gxVIT,gnINT,gxINT,gnDEX,gxDEX,gnLUK,gxLUK,enHP,exHP,enSP,exSP,enSTR,exSTR,enAGI,exAGI,enVIT,exVIT,enINT,exINT,enDEX,exDEX,enLUK,exLUK
+6001,6031,Mage,502,300000,2,1,7,0,700,300,45,12,20,15,35,24,14,40,55,7,9,10,20,4,15,5,14,15,25,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6002,6032,Tanker,502,300000,0,1,7,0,700,350,40,20,15,35,24,14,12,45,60,6,9,10,20,4,15,15,25,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6003,6033,Agile,502,300000,0,1,7,0,700,300,40,15,35,24,14,12,20,40,60,6,9,10,20,14,25,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6004,6034,Strong,502,300000,0,1,7,0,620,320,40,35,24,14,12,20,15,40,60,6,9,20,30,4,15,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6005,6035,Lucky,502,300000,0,1,7,0,700,320,40,24,14,12,20,15,35,40,60,6,9,10,20,4,15,5,15,5,15,5,15,15,25,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6006,6036,Accurate,502,300000,0,1,7,0,670,320,40,14,12,20,15,35,24,40,60,6,9,10,20,4,15,5,15,5,15,15,25,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6007,6037,All Rounder,502,300000,0,1,7,0,720,300,40,20,20,20,20,20,20,40,60,6,9,15,20,8,15,10,15,10,15,10,15,10,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6008,6038,Superior Machine,502,300000,0,1,7,0,720,300,40,15,10,30,20,30,10,40,60,6,9,10,25,4,20,5,20,5,20,5,20,5,20,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+
diff --git a/db/pre-re/item_chain.conf b/db/pre-re/item_chain.conf
new file mode 100644
index 00000000..2461684c
--- /dev/null
+++ b/db/pre-re/item_chain.conf
@@ -0,0 +1,42 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2013-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//================= More Information ======================================
+// http://herc.ws/board/topic/1244-official-item-grouppackagechain
+//=========================================================================
+
+/**************************************************************************
+************* Entry structure ********************************************
+**************************************************************************
+ITMCHAIN_<Name>: {
+ <Item_Name>: <chance>
+ // ...
+}
+**************************************************************************/
+
+// Hercules expects those 3 to always exist:
+ITMCHAIN_ORE: {}
+ITMCHAIN_SIEGFRIED: {}
+ITMCHAIN_NEO_INSURANCE: {}
diff --git a/db/pre-re/item_combo_db.conf b/db/pre-re/item_combo_db.conf
new file mode 100644
index 00000000..5f045600
--- /dev/null
+++ b/db/pre-re/item_combo_db.conf
@@ -0,0 +1,43 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//================= Description ===========================================
+// Configurations file for status effects
+//=========================================================================
+
+combo_db: (
+/**************************************************************************
+************* Entry structure ********************************************
+**************************************************************************
+{
+ // ================ Mandatory fields ===============================
+ Items: ["item_list"] (string, array) list of items
+ Script: <"
+ Script
+ (it can be multi-line)
+ ">
+}
+**************************************************************************/
+)
diff --git a/db/pre-re/item_db.conf b/db/pre-re/item_db.conf
new file mode 100644
index 00000000..ccdf7535
--- /dev/null
+++ b/db/pre-re/item_db.conf
@@ -0,0 +1,14819 @@
+//=========================================================================
+//= Items Database
+//=========================================================================
+
+item_db: (
+// Items Database
+//
+/******************************************************************************
+ ************* Entry structure ************************************************
+ ******************************************************************************
+{
+ // =================== Mandatory fields ===============================
+ Id: ID (int)
+ AegisName: "Aegis_Name" (string)
+ Name: "Item Name" (string)
+ // =================== Optional fields ================================
+ Type: Item Type (string, defaults to "IT_ETC")
+ Buy: Buy Price (int, defaults to Sell * 2)
+ Sell: Sell Price (int, defaults to Buy / 2)
+ Weight: Item Weight (int, defaults to 0)
+ Atk: Attack (int, defaults to 0)
+ Matk: Magical Attack (int, defaults to 0, ignored in pre-re)
+ Def: Defense (int, defaults to 0)
+ Range: Attack Range (int, defaults to 0)
+ MinRange: Minimal Attack Range (int, defaults to 0)
+ Slots: Slots (int, defaults to 0)
+ Job: Job mask (int, defaults to all jobs = 0xFFFFFFFF)
+ Upper: Upper mask (bitmask array, string or int, defaults to "ITEMUPPER_ALL")
+ Gender: Gender (string, defaults to "SEX_ANY")
+ Loc: Equip location (bitmask array, string or int, required value for equipment)
+ WeaponLv: Weapon Level (int, defaults to 0)
+ EquipLv: Equip required level (int, defaults to 0)
+ EquipLv: [min, max] (alternative syntax with min / max level)
+ Refine: Refineable (boolean, defaults to true)
+ DisableOptions: true/false (boolean, defaults to false !!for equipments only!!) [Smokexyz]
+ Subtype: Item Subtype (int, defaults to 0)
+ W_FIST, ///< Bare hands
+ W_DAGGER, //1
+ W_1HSWORD, //2
+ W_2HSWORD, //3
+ W_1HSPEAR, //4
+ W_2HSPEAR, //5
+ W_1HAXE, //6
+ W_2HAXE, //7
+ W_MACE, //8
+ W_2HMACE, //9
+ W_STAFF, //10
+ W_BOW, //11
+ W_KNUCKLE, //12
+ W_MUSICAL, //13
+ W_WHIP, //14
+ W_BOOK, //15
+ W_KATAR, //16
+ W_REVOLVER, //17
+ W_RIFLE, //18
+ W_GATLING, //19
+ W_SHOTGUN, //20
+ W_GRENADE, //21
+ W_HUUMA, //22
+ W_2HSTAFF, //23
+ ViewSprite: Sprite view ID (int, defaults to 0)
+ BindOnEquip: true/false (boolean, defaults to false)
+ ForceSerial: true/false (boolean, defaults to false)
+ BuyingStore: true/false (boolean, defaults to false)
+ Delay: Delay to use item (int, defaults to 0)
+ FloorLifeTime: Delay to remove item from ground (int, default flooritem_lifetime)
+ KeepAfterUse: true/false (boolean, defaults to false)
+ DropAnnounce: true/false (boolean, defaults to false)
+ AllowPickup: true/false (boolean, defaults to true)
+ Charm: true/false (boolean, defaults to false)
+ MaxFloorOffset: [x, y] (int, defaults to 8)
+ MaxFloorOffset: offset (int, defaults to 8)
+ Identified: true/false (boolean, default to true)
+ RequiredStr: required strength (int, default to 0)
+ RequiredAgi: required agility (int, default to 0)
+ RequiredVit: required vitality (int, default to 0)
+ RequiredInt: required intellect (int, default to 0)
+ RequiredDex: required dexterity (int, default to 0)
+ RequiredLuk: required luck (int, default to 0)
+ RequiredMaxHp: required max hp (int, default to 0)
+ RequiredMaxSp: required max sp (int, default to 0)
+ RequiredAtk: required attack (int, default to 0)
+ RequiredMAtkMin: required minimal magic attack (int, default to 0)
+ RequiredMAtkMax: required maximum magic attack (int, default to 0)
+ RequiredDef: required defence (int, default to 0)
+ RequiredMDef: required magic defence (int, default to 0)
+ RequiredSkill: required skill (int, default to 0)
+ UseEffect: effect if use/equip item success (int, default to -1)
+ UseFailEffect: effect if use/equip item failed (int, default to -1)
+ UnequipEffect: effect if unequip item success (int, default to -1)
+ UnequipFailEffect: effect if unequip item failed (int, default to -1)
+ Trade: { (defaults to no restrictions)
+ override: GroupID (int, defaults to 100)
+ nodrop: true/false (boolean, defaults to false)
+ notrade: true/false (boolean, defaults to false)
+ partneroverride: true/false (boolean, defaults to false)
+ noselltonpc: true/false (boolean, defaults to false)
+ nocart: true/false (boolean, defaults to false)
+ nostorage: true/false (boolean, defaults to false)
+ nogstorage: true/false (boolean, defaults to false)
+ nomail: true/false (boolean, defaults to false)
+ noauction: true/false (boolean, defaults to false)
+ }
+ Nouse: { (defaults to no restrictions)
+ override: GroupID (int, defaults to 100)
+ sitting: true/false (boolean, defaults to false)
+ }
+ Stack: [amount, type] (int, defaults to 0)
+ Sprite: SpriteID (int, defaults to 0)
+ Script: <"
+ Script
+ (it can be multi-line)
+ ">
+ OnEquipScript: <" OnEquip Script (can also be multi-line) ">
+ OnUnequipScript: <" OnUnequip Script (can also be multi-line) ">
+ OnDropScript: <" OnDrop Script (can also be multi-line) ">
+ OnTakeScript: <" OnTake Script (can also be multi-line) ">
+ OnInsertCardScript: <" OnInsert card Script (can also be multi-line) ">
+ AllowCards: {
+ idNUM: amount (NUM is id number, amount is amount)
+ }
+ AllowAmmo: {
+ idNUM: something (NUM is id number)
+ }
+},
+******************************************************************************/
+{
+ Id: 521
+ AegisName: "Dagger"
+ Name: "Dagger"
+ Type: "IT_WEAPON"
+ Buy: 1000
+ Sell: 500
+ Weight: 200
+ Atk: 15
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_DAGGER"
+},
+{
+ Id: 522
+ AegisName: "SharpKnife"
+ Name: "SharpKnife"
+ Type: "IT_WEAPON"
+ Buy: 100
+ Sell: 50
+ Weight: 150
+ Atk: 10
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_DAGGER"
+},
+{
+ Id: 529
+ AegisName: "IronArrow"
+ Name: "IronArrow"
+ Type: "IT_AMMO"
+ Buy: 4
+ Sell: 2
+ Weight: 1
+ Atk: 40
+ Slots: 0
+ Loc: "EQP_AMMO"
+ Refine: false
+ ViewSprite: 529
+ Subtype: "A_ARROW"
+},
+{
+ Id: 530
+ AegisName: "ShortBow"
+ Name: "ShortBow"
+ Type: "IT_WEAPON"
+ Buy: 2500
+ Sell: 1000
+ Weight: 600
+ Atk: 50
+ Range: 5
+ Slots: 0
+ Loc: ["EQP_HAND_L", "EQP_HAND_R"]
+ WeaponLv: 1
+ EquipLv: 4
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_BOW"
+ AllowAmmo: {
+ Id529: 1
+ Id762: 1
+ Id1199: 1
+ Id1282: 1
+ }
+ Script: <"
+ bonus bMatkRate, -5;
+ ">
+},
+{
+ Id: 536
+ AegisName: "ShortSword"
+ Name: "ShortSword"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 2000
+ Atk: 90
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+},
+{
+ Id: 545
+ AegisName: "ForestBow"
+ Name: "ForestBow"
+ Type: "IT_WEAPON"
+ Buy: 20000
+ Sell: 5000
+ Weight: 1200
+ Atk: 70
+ Range: 5
+ Slots: 0
+ Loc: ["EQP_HAND_L", "EQP_HAND_R"]
+ WeaponLv: 1
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_BOW"
+ AllowAmmo: {
+ Id529: 1
+ Id762: 1
+ Id1199: 1
+ Id1282: 1
+ }
+ Script: <"
+ bonus bMatkRate, -7;
+ ">
+},
+{
+ Id: 547
+ AegisName: "Bardiche"
+ Name: "Bardiche"
+ Type: "IT_WEAPON"
+ Buy: 20
+ Sell: 10
+ Weight: 10
+ Def: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSPEAR"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 548
+ AegisName: "Halberd"
+ Name: "Halberd"
+ Type: "IT_WEAPON"
+ Buy: 20
+ Sell: 10
+ Weight: 1400
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSPEAR"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 549
+ AegisName: "Axe"
+ Name: "Axe"
+ Type: "IT_WEAPON"
+ Buy: 20
+ Sell: 10
+ Weight: 1200
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HAXE"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 550
+ AegisName: "BlacksmithsAxe"
+ Name: "BlacksmithsAxe"
+ Type: "IT_WEAPON"
+ Buy: 20
+ Sell: 10
+ Weight: 1200
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 0
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HAXE"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 561
+ AegisName: "Sabre"
+ Name: "Sabre"
+ Type: "IT_WEAPON"
+ Buy: 10000
+ Sell: 5000
+ Weight: 300
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+},
+{
+ Id: 570
+ AegisName: "BoneKnife"
+ Name: "BoneKnife"
+ Type: "IT_WEAPON"
+ Buy: 10000
+ Sell: 6000
+ Weight: 450
+ Atk: 115
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_DAGGER"
+},
+{
+ Id: 571
+ AegisName: "Setzer"
+ Name: "Setzer"
+ Type: "IT_WEAPON"
+ Buy: 20000
+ Sell: 8000
+ Weight: 900
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_DAGGER"
+},
+{
+ Id: 572
+ AegisName: "Scimitar"
+ Name: "Scimitar"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 200
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 573
+ AegisName: "Falchion"
+ Name: "Falchion"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 300
+ Atk: 270
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ bonus bDoubleAddRate, 40;
+ bonus bHit, -25;
+ bonus bCritical, -25;
+ ">
+},
+{
+ Id: 574
+ AegisName: "ScorpionKing"
+ Name: "Scorpion King"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 600
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSPEAR"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 575
+ AegisName: "DesertBow"
+ Name: "DesertBow"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 1200
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: ["EQP_HAND_L", "EQP_HAND_R"]
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_BOW"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+ AllowAmmo: {
+ Id529: 1
+ Id762: 1
+ Id1199: 1
+ Id1282: 1
+ }
+ Script: <"
+ bonus bMatkRate, -10;
+ ">
+},
+{
+ Id: 576
+ AegisName: "Beheader"
+ Name: "Beheader"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 2000
+ Atk: 999
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+ Script: <"
+ callfunc "NoBowItem";
+ set @bStat, Int;
+ set @maxbStatVal, 1;
+ callfunc "RequireMaxStat";
+ bonus bDoubleAddRate, 50;
+ bonus bSpeedAddRate, 10;
+ bonus bHit, -20;
+ bonus bCritical, -25;
+ ">
+},
+{
+ Id: 577
+ AegisName: "BoneDarts"
+ Name: "BoneDarts"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 300
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_HUUMA"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 578
+ AegisName: "SandCutter"
+ Name: "SandCutter"
+ Type: "IT_WEAPON"
+ Buy: 30000
+ Sell: 15000
+ Weight: 1500
+ Atk: 140
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 2
+ EquipLv: 80
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+ Script: <"
+ bonus bDoubleAddRate, 5;
+ ">
+},
+{
+ Id: 579
+ AegisName: "RockKnife"
+ Name: "RockKnife"
+ Type: "IT_WEAPON"
+ Buy: 15000
+ Sell: 7500
+ Weight: 500
+ Atk: 110
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_DAGGER"
+ Script: <"
+ bonus bVit, 3;
+ ">
+},
+{
+ Id: 580
+ AegisName: "StaffOfLife"
+ Name: "StaffOfLife"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 1500
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_STAFF"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 581
+ AegisName: "CrescentRod"
+ Name: "CrescentRod"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 1500
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_STAFF"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 582
+ AegisName: "StaffOfFire"
+ Name: "StaffOfFire"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 1500
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_STAFF"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 583
+ AegisName: "StaffOfIce"
+ Name: "StaffOfIce"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 1500
+ Atk: 100
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_STAFF"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 584
+ AegisName: "Jackal"
+ Name: "Jackal"
+ Type: "IT_WEAPON"
+ Buy: 8000
+ Sell: 4000
+ Weight: 100
+ Atk: 120
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ bonus bDoubleAddRate, 30;
+ ">
+},
+{
+ Id: 587
+ AegisName: "Sword"
+ Name: "Sword"
+ Type: "IT_WEAPON"
+ Buy: 1000
+ Sell: 500
+ Weight: 200
+ Atk: 15
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 588
+ AegisName: "BastardSword"
+ Name: "BastardSword"
+ Type: "IT_WEAPON"
+ Buy: 1000
+ Sell: 500
+ Weight: 200
+ Atk: 15
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 591
+ AegisName: "LongSword"
+ Name: "LongSword"
+ Type: "IT_WEAPON"
+ Buy: 1000
+ Sell: 500
+ Weight: 200
+ Atk: 15
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 594
+ AegisName: "Spear"
+ Name: "Spear"
+ Type: "IT_WEAPON"
+ Buy: 1000
+ Sell: 500
+ Weight: 200
+ Atk: 15
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSPEAR"
+ Script: <"
+ callfunc "UnreleasedItem", EQI_HAND_R;
+ ">
+},
+{
+ Id: 623
+ AegisName: "Scythe"
+ Name: "Scythe"
+ Type: "IT_WEAPON"
+ Buy: 100
+ Sell: 50
+ Weight: 1200
+ Atk: 75
+ Range: 1
+ Slots: 0
+ Loc: ["EQP_HAND_L", "EQP_HAND_R"]
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_2HSWORD"
+},
+{
+ Id: 758
+ AegisName: "WoodenStaff"
+ Name: "WoodenStaff"
+ Type: "IT_WEAPON"
+ Buy: 4000
+ Sell: 2000
+ Weight: 1000
+ Atk: 50
+ Range: 1
+ Slots: 0
+ Loc: ["EQP_HAND_L", "EQP_HAND_R"]
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_2HSTAFF"
+ OnEquipScript: <"
+ callfunc "RequireStat", bInt, 60, EQI_HAND_R;
+ ">
+ Script: <"
+ bonus bMatkRate, 10;
+ if (getskilllv(SKILL_CONFRINGO))
+ addtoskill(SKILL_CONFRINGO, 1, 2);
+ ">
+},
+{
+ Id: 1171
+ AegisName: "Wand"
+ Name: "Wand"
+ Type: "IT_WEAPON"
+ Buy: 400
+ Sell: 200
+ Weight: 100
+ Atk: 1
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_STAFF"
+ OnEquipScript: <"
+ callfunc "RequireStat", bInt, 5, EQI_HAND_R;
+ ">
+ Script: <"
+ bonus bMatkRate, 5;
+ ">
+},
+{
+ Id: 762
+ AegisName: "TerraniteArrow"
+ Name: "TerraniteArrow"
+ Type: "IT_AMMO"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Atk: 50
+ Slots: 0
+ Loc: "EQP_AMMO"
+ Refine: false
+ ViewSprite: 762
+ Subtype: "A_ARROW"
+ Script: <"
+ bonus bCritical, 20;
+ ">
+},
+{
+ Id: 867
+ AegisName: "IceGladius"
+ Name: "IceGladius"
+ Type: "IT_WEAPON"
+ Buy: 2000
+ Sell: 1000
+ Weight: 1000
+ Atk: 110
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+ Script: <"
+ bonus bLuk, 1;
+ ">
+},
+{
+ Id: 878
+ AegisName: "BansheeBow"
+ Name: "BansheeBow"
+ Type: "IT_WEAPON"
+ Buy: 101000
+ Sell: 40000
+ Weight: 900
+ Atk: 140
+ Range: 6
+ Slots: 0
+ Loc: ["EQP_HAND_L", "EQP_HAND_R"]
+ WeaponLv: 1
+ EquipLv: 90
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_BOW"
+ AllowAmmo: {
+ Id529: 1
+ Id762: 1
+ Id1199: 1
+ Id1282: 1
+ }
+ OnEquipScript: <"
+ callfunc "RequireStat", bDex, 80, EQI_HAND_R;
+ ">
+ Script: <"
+ bonus2 bHPDrainRate, 100, -2;
+ bonus bAspdRate, 20;
+ bonus bMaxHP, -150;
+ bonus bSpeedAddRate, 10;
+ bonus bDefRate, -40;
+ bonus bDef2Rate, -35;
+ bonus bMatkRate, -9;
+ ">
+},
+{
+ Id: 903
+ AegisName: "SlingShot"
+ Name: "SlingShot"
+ Type: "IT_WEAPON"
+ Buy: 500
+ Sell: 50
+ Weight: 10
+ Atk: 5
+ Range: 4
+ Slots: 0
+ Loc: ["EQP_HAND_L", "EQP_HAND_R"]
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_BOW"
+ AllowAmmo: {
+ Id904: 1
+ }
+},
+{
+ Id: 904
+ AegisName: "SlingBullet"
+ Name: "SlingBullet"
+ Type: "IT_AMMO"
+ Buy: 1
+ Sell: 0
+ Weight: 1
+ Atk: 3
+ Slots: 0
+ Loc: "EQP_AMMO"
+ Refine: false
+ ViewSprite: 904
+ Subtype: "A_ARROW"
+},
+{
+ Id: 906
+ AegisName: "KidBook"
+ Name: "KidBook"
+ Type: "IT_WEAPON"
+ Buy: 10000
+ Sell: 5000
+ Weight: 100
+ Atk: 1
+ Range: 3
+ Slots: 0
+ Loc: ["EQP_HAND_L", "EQP_HAND_R"]
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ Subtype: "W_HUUMA"
+},
+{
+ Id: 1199
+ AegisName: "Arrow"
+ Name: "Arrow"
+ Type: "IT_AMMO"
+ Buy: 1
+ Sell: 0
+ Weight: 1
+ Atk: 20
+ Slots: 0
+ Loc: "EQP_AMMO"
+ Refine: false
+ ViewSprite: 1199
+ Subtype: "A_ARROW"
+},
+{
+ Id: 1200
+ AegisName: "Bow"
+ Name: "Bow"
+ Type: "IT_WEAPON"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Atk: 20
+ Range: 5
+ Slots: 0
+ Loc: ["EQP_HAND_L", "EQP_HAND_R"]
+ WeaponLv: 1
+ EquipLv: 4
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_BOW"
+ AllowAmmo: {
+ Id529: 1
+ Id762: 1
+ Id1199: 1
+ Id1282: 1
+ }
+ Script: <"
+ bonus bMatkRate, -2;
+ ">
+},
+{
+ Id: 1201
+ AegisName: "Knife"
+ Name: "Knife"
+ Type: "IT_WEAPON"
+ Buy: 50
+ Sell: 25
+ Weight: 120
+ Atk: 5
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_DAGGER"
+},
+{
+ Id: 1215
+ AegisName: "ToySabre"
+ Name: "ToySabre"
+ Type: "IT_WEAPON"
+ Buy: 2000000
+ Sell: 25
+ Weight: 1
+ Atk: 1
+ Range: 1
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_1HSWORD"
+},
+{
+ Id: 1282
+ AegisName: "BoneArrows"
+ Name: "BoneArrows"
+ Type: "IT_AMMO"
+ Buy: 50
+ Sell: 20
+ Weight: 0
+ Atk: 55
+ Slots: 0
+ Loc: "EQP_AMMO"
+ Refine: false
+ ViewSprite: 1282
+ Subtype: "A_ARROW"
+ Script: <"
+ bonus bCritical, 1;
+ ">
+},
+{
+ Id: 5260
+ AegisName: "Snowball"
+ Name: "Snowball"
+ Type: "IT_AMMO"
+ Buy: 1
+ Sell: 0
+ Weight: 1
+ Atk: 20
+ Slots: 0
+ Loc: "EQP_AMMO"
+ Refine: false
+ ViewSprite: 5260
+ Subtype: "A_SHELL"
+},
+{
+ Id: 5261
+ AegisName: "SnowLauncher"
+ Name: "SnowLauncher"
+ Type: "IT_WEAPON"
+ Buy: 500
+ Sell: 50
+ Weight: 10
+ Atk: 20
+ Range: 3
+ Slots: 0
+ Loc: "EQP_HAND_R"
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1
+ Subtype: "W_BOW"
+ AllowAmmo: {
+ Id5260: 1
+ }
+},
+{
+ Id: 702
+ AegisName: "WeddingRing"
+ Name: "WeddingRing"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ARMOR"
+ Refine: false
+ ViewSprite: 702
+},
+{
+ Id: 742
+ AegisName: "FourLeafClover"
+ Name: "FourLeafClover"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_L"
+ Refine: false
+ ViewSprite: 742
+ Script: <"
+ bonus bLuk, 1;
+ ">
+},
+{
+ Id: 749
+ AegisName: "Towel"
+ Name: "Towel"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 250
+ Weight: 50
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_L"
+ Refine: false
+ ViewSprite: 749
+},
+{
+ Id: 829
+ AegisName: "CrozeniteFourLeafAmulet"
+ Name: "CrozeniteFourLeafAmulet"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 1000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_L"
+ Refine: false
+ ViewSprite: 829
+ Script: <"
+ bonus bLuk, 1;
+ ">
+},
+{
+ Id: 830
+ AegisName: "BromenalFourLeafAmulet"
+ Name: "BromenalFourLeafAmulet"
+ Type: "IT_ARMOR"
+ Buy: 20000
+ Sell: 2000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_L"
+ Refine: false
+ ViewSprite: 830
+ Script: <"
+ bonus bLuk, 2;
+ ">
+},
+{
+ Id: 831
+ AegisName: "SilverFourLeafAmulet"
+ Name: "SilverFourLeafAmulet"
+ Type: "IT_ARMOR"
+ Buy: 30000
+ Sell: 3000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_L"
+ Refine: false
+ ViewSprite: 831
+ Script: <"
+ bonus bLuk, 3;
+ ">
+},
+{
+ Id: 832
+ AegisName: "GoldenFourLeafAmulet"
+ Name: "GoldenFourLeafAmulet"
+ Type: "IT_ARMOR"
+ Buy: 40000
+ Sell: 4000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_L"
+ Refine: false
+ ViewSprite: 832
+ Script: <"
+ bonus bLuk, 4;
+ ">
+},
+{
+ Id: 865
+ AegisName: "Grimoire"
+ Name: "Grimoire"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 100
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_L"
+ Refine: false
+ ViewSprite: 865
+ Script: <"
+ bonus bMaxSP, 30;
+ ">
+},
+{
+ Id: 879
+ AegisName: "HeartOfIsis"
+ Name: "HeartOfIsis"
+ Type: "IT_ARMOR"
+ Buy: 70000
+ Sell: 35000
+ Weight: 40
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_L"
+ WeaponLv: 0
+ EquipLv: 85
+ Refine: false
+ ViewSprite: 879
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bHPrecovRate, 65;
+ ">
+},
+{
+ Id: 1227
+ AegisName: "EnchantersAmulet"
+ Name: "EnchantersAmulet"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ARMOR"
+ Refine: false
+ ViewSprite: 1227
+ Script: <"
+ bonus bHit, 22;
+ ">
+},
+{
+ Id: 1244
+ AegisName: "DarkTalisman"
+ Name: "DarkTalisman"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 0
+ Slots: 0
+ Loc: "EQP_ACC_L"
+ Refine: false
+ ViewSprite: 1244
+ Script: <"
+ bonus bMatkRate, 10;
+ bonus bMdef, 30;
+ ">
+},
+{
+ Id: 4008
+ AegisName: "DiamondRing"
+ Name: "DiamondRing"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_R"
+ Refine: false
+ ViewSprite: 4008
+ Script: <"
+ bonus bVit, 1;
+ ">
+},
+{
+ Id: 4009
+ AegisName: "RubyRing"
+ Name: "RubyRing"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_R"
+ Refine: false
+ ViewSprite: 4009
+ Script: <"
+ bonus bStr, 1;
+ ">
+},
+{
+ Id: 4010
+ AegisName: "EmeraldRing"
+ Name: "EmeraldRing"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_R"
+ Refine: false
+ ViewSprite: 4010
+ Script: <"
+ bonus bLuk, 1;
+ ">
+},
+{
+ Id: 4011
+ AegisName: "SapphireRing"
+ Name: "SapphireRing"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_R"
+ Refine: false
+ ViewSprite: 4011
+ Script: <"
+ bonus bInt, 1;
+ ">
+},
+{
+ Id: 4012
+ AegisName: "TopazRing"
+ Name: "TopazRing"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_R"
+ Refine: false
+ ViewSprite: 4012
+ Script: <"
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 4013
+ AegisName: "AmethystRing"
+ Name: "AmethystRing"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_R"
+ Refine: false
+ ViewSprite: 4013
+ Script: <"
+ bonus bDex, 1;
+ ">
+},
+{
+ Id: 4014
+ AegisName: "SimpleRing"
+ Name: "SimpleRing"
+ Type: "IT_ARMOR"
+ Buy: 100000
+ Sell: 2500
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_R"
+ Refine: false
+ ViewSprite: 4014
+},
+{
+ Id: 677
+ AegisName: "HeartNecklace"
+ Name: "HeartNecklace"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_L"
+ Refine: false
+ ViewSprite: 677
+},
+{
+ Id: 5252
+ AegisName: "GuardianWings"
+ Name: "GuardianWings"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ARMOR"
+ Refine: false
+ ViewSprite: 5252
+},
+{
+ Id: 5253
+ AegisName: "MageRing"
+ Name: "MageRing"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Loc: "EQP_ACC_R"
+ Refine: false
+ ViewSprite: 5253
+ Script: <"
+ bonus bInt, 1;
+ ">
+},
+{
+ Id: 528
+ AegisName: "Boots"
+ Name: "Boots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 80
+ Def: 2
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 528
+},
+{
+ Id: 655
+ AegisName: "FurBoots"
+ Name: "FurBoots"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 600
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 655
+},
+{
+ Id: 734
+ AegisName: "BlackBoots"
+ Name: "BlackBoots"
+ Type: "IT_ARMOR"
+ Buy: 20000
+ Sell: 3000
+ Weight: 25
+ Def: 3
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 734
+},
+{
+ Id: 735
+ AegisName: "CottonBoots"
+ Name: "CottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 10
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 735
+},
+{
+ Id: 757
+ AegisName: "AssassinBoots"
+ Name: "AssassinBoots"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 2000
+ Weight: 10
+ Def: 3
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 757
+ Script: <"
+ callfunc "BrawlingItem", EQI_SHOES;
+ bonus bAgi, 4;
+ bonus bMatkRate, -1;
+ ">
+},
+{
+ Id: 792
+ AegisName: "BromenalBoots"
+ Name: "BromenalBoots"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 792
+},
+{
+ Id: 876
+ AegisName: "WarlordBoots"
+ Name: "WarlordBoots"
+ Type: "IT_ARMOR"
+ Buy: 19000
+ Sell: 2000
+ Weight: 550
+ Def: 5
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 876
+ Script: <"
+ bonus bMatkRate, -4;
+ ">
+},
+{
+ Id: 2150
+ AegisName: "RedCottonBoots"
+ Name: "RedCottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 2150
+},
+{
+ Id: 2151
+ AegisName: "GreenCottonBoots"
+ Name: "GreenCottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 2151
+},
+{
+ Id: 2152
+ AegisName: "DarkBlueCottonBoots"
+ Name: "DarkBlueCottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 2152
+},
+{
+ Id: 2153
+ AegisName: "YellowCottonBoots"
+ Name: "YellowCottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 2153
+},
+{
+ Id: 2154
+ AegisName: "LightBlueCottonBoots"
+ Name: "LightBlueCottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 2154
+},
+{
+ Id: 2155
+ AegisName: "PinkCottonBoots"
+ Name: "PinkCottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 2155
+},
+{
+ Id: 2156
+ AegisName: "BlackCottonBoots"
+ Name: "BlackCottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 2156
+},
+{
+ Id: 2157
+ AegisName: "OrangeCottonBoots"
+ Name: "OrangeCottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 2157
+},
+{
+ Id: 2158
+ AegisName: "PurpleCottonBoots"
+ Name: "PurpleCottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 2158
+},
+{
+ Id: 2159
+ AegisName: "DarkGreenCottonBoots"
+ Name: "DarkGreenCottonBoots"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 30
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 2159
+},
+{
+ Id: 1188
+ AegisName: "RedStockings"
+ Name: "RedStockings"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 2000
+ Weight: 10
+ Def: 1
+ Slots: 0
+ Loc: "EQP_SHOES"
+ Refine: false
+ ViewSprite: 1188
+},
+{
+ Id: 503
+ AegisName: "CasinoCoins"
+ Name: "CasinoCoins"
+ Type: "IT_ETC"
+ Buy: 10
+ Sell: 5
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 503
+},
+{
+ Id: 504
+ AegisName: "DecorCandy"
+ Name: "DecorCandy"
+ Type: "IT_ETC"
+ Buy: 25
+ Sell: 10
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 504
+},
+{
+ Id: 505
+ AegisName: "MaggotSlime"
+ Name: "MaggotSlime"
+ Type: "IT_ETC"
+ Buy: 8
+ Sell: 4
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 505
+},
+{
+ Id: 507
+ AegisName: "ScorpionStinger"
+ Name: "ScorpionStinger"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 507
+},
+{
+ Id: 515
+ AegisName: "PurplePresentBox"
+ Name: "PurplePresentBox"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 515
+},
+{
+ Id: 516
+ AegisName: "BluePresentBox"
+ Name: "BluePresentBox"
+ Type: "IT_ETC"
+ Buy: 60
+ Sell: 30
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 516
+},
+{
+ Id: 517
+ AegisName: "RedScorpionStinger"
+ Name: "RedScorpionStinger"
+ Type: "IT_ETC"
+ Buy: 170
+ Sell: 85
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 517
+},
+{
+ Id: 518
+ AegisName: "BugLeg"
+ Name: "BugLeg"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 25
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 518
+},
+{
+ Id: 526
+ AegisName: "CoinBag"
+ Name: "CoinBag"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 500
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 526
+},
+{
+ Id: 537
+ AegisName: "TreasureKey"
+ Name: "TreasureKey"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 50
+ Weight: 2
+ Def: 0
+ Refine: false
+ ViewSprite: 537
+},
+{
+ Id: 538
+ AegisName: "GreenPresentBox"
+ Name: "GreenPresentBox"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 538
+},
+{
+ Id: 540
+ AegisName: "EmptyBottle"
+ Name: "EmptyBottle"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 540
+},
+{
+ Id: 542
+ AegisName: "BottleOfSand"
+ Name: "BottleOfSand"
+ Type: "IT_ETC"
+ Buy: 70
+ Sell: 35
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 542
+},
+{
+ Id: 551
+ AegisName: "AquaHint"
+ Name: "AquaHint"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 551
+},
+{
+ Id: 552
+ AegisName: "MagentaHint"
+ Name: "MagentaHint"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 552
+},
+{
+ Id: 553
+ AegisName: "YellowHint"
+ Name: "YellowHint"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 553
+},
+{
+ Id: 554
+ AegisName: "GreenHint"
+ Name: "GreenHint"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 554
+},
+{
+ Id: 555
+ AegisName: "TealHint"
+ Name: "TealHint"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 555
+},
+{
+ Id: 556
+ AegisName: "PurpleHint"
+ Name: "PurpleHint"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 556
+},
+{
+ Id: 557
+ AegisName: "RedHint"
+ Name: "RedHint"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 557
+},
+{
+ Id: 558
+ AegisName: "BlueHint"
+ Name: "BlueHint"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 558
+},
+{
+ Id: 559
+ AegisName: "OrangeHint"
+ Name: "OrangeHint"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 559
+},
+{
+ Id: 560
+ AegisName: "GrayHint"
+ Name: "GrayHint"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 560
+},
+{
+ Id: 569
+ AegisName: "RawLog"
+ Name: "RawLog"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 569
+},
+{
+ Id: 589
+ AegisName: "Toothbrush"
+ Name: "Toothbrush"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 589
+},
+{
+ Id: 611
+ AegisName: "WhiteFur"
+ Name: "WhiteFur"
+ Type: "IT_ETC"
+ Buy: 8
+ Sell: 4
+ Weight: 8
+ Def: 0
+ Refine: false
+ ViewSprite: 611
+},
+{
+ Id: 612
+ AegisName: "CaveSnakeLamp"
+ Name: "CaveSnakeLamp"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 40
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 612
+},
+{
+ Id: 613
+ AegisName: "HardSpike"
+ Name: "HardSpike"
+ Type: "IT_ETC"
+ Buy: 40
+ Sell: 10
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 613
+},
+{
+ Id: 614
+ AegisName: "PinkAntenna"
+ Name: "PinkAntenna"
+ Type: "IT_ETC"
+ Buy: 10
+ Sell: 5
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 614
+},
+{
+ Id: 631
+ AegisName: "DarkCrystal"
+ Name: "DarkCrystal"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 250
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 631
+},
+{
+ Id: 635
+ AegisName: "SantaCookie"
+ Name: "SantaCookie"
+ Type: "IT_ETC"
+ Buy: 1
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 635
+},
+{
+ Id: 640
+ AegisName: "IronOre"
+ Name: "IronOre"
+ Type: "IT_ETC"
+ Buy: 250
+ Sell: 100
+ Weight: 40
+ Def: 0
+ Refine: false
+ ViewSprite: 640
+},
+{
+ Id: 641
+ AegisName: "SnakeSkin"
+ Name: "SnakeSkin"
+ Type: "IT_ETC"
+ Buy: 250
+ Sell: 100
+ Weight: 15
+ Def: 0
+ Refine: false
+ ViewSprite: 641
+},
+{
+ Id: 660
+ AegisName: "CottonCloth"
+ Name: "CottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 660
+},
+{
+ Id: 661
+ AegisName: "RedRose"
+ Name: "RedRose"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 661
+},
+{
+ Id: 662
+ AegisName: "WhiteRose"
+ Name: "WhiteRose"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 662
+},
+{
+ Id: 663
+ AegisName: "DarkRedRose"
+ Name: "DarkRedRose"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 663
+},
+{
+ Id: 664
+ AegisName: "PinkRose"
+ Name: "PinkRose"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 664
+},
+{
+ Id: 665
+ AegisName: "YellowRose"
+ Name: "YellowRose"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 665
+},
+{
+ Id: 666
+ AegisName: "BlackRose"
+ Name: "BlackRose"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 666
+},
+{
+ Id: 667
+ AegisName: "OrangeRose"
+ Name: "OrangeRose"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 667
+},
+{
+ Id: 668
+ AegisName: "BlueRose"
+ Name: "BlueRose"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 668
+},
+{
+ Id: 669
+ AegisName: "YellowTulip"
+ Name: "YellowTulip"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 669
+},
+{
+ Id: 670
+ AegisName: "PurpleTulip"
+ Name: "PurpleTulip"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 670
+},
+{
+ Id: 671
+ AegisName: "RedTulip"
+ Name: "RedTulip"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 671
+},
+{
+ Id: 672
+ AegisName: "WhiteTulip"
+ Name: "WhiteTulip"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 672
+},
+{
+ Id: 673
+ AegisName: "PinkTulip"
+ Name: "PinkTulip"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 673
+},
+{
+ Id: 674
+ AegisName: "OrangeTulip"
+ Name: "OrangeTulip"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 674
+},
+{
+ Id: 680
+ AegisName: "MauveHerb"
+ Name: "MauveHerb"
+ Type: "IT_ETC"
+ Buy: 2
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 680
+},
+{
+ Id: 681
+ AegisName: "CobaltHerb"
+ Name: "CobaltHerb"
+ Type: "IT_ETC"
+ Buy: 2
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 681
+},
+{
+ Id: 682
+ AegisName: "GambogeHerb"
+ Name: "GambogeHerb"
+ Type: "IT_ETC"
+ Buy: 2
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 682
+},
+{
+ Id: 683
+ AegisName: "AlizarinHerb"
+ Name: "AlizarinHerb"
+ Type: "IT_ETC"
+ Buy: 2
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 683
+},
+{
+ Id: 690
+ AegisName: "RedDye"
+ Name: "RedDye"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 20
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 690
+},
+{
+ Id: 691
+ AegisName: "GreenDye"
+ Name: "GreenDye"
+ Type: "IT_ETC"
+ Buy: 2500
+ Sell: 1000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 691
+},
+{
+ Id: 692
+ AegisName: "DarkBlueDye"
+ Name: "DarkBlueDye"
+ Type: "IT_ETC"
+ Buy: 40000
+ Sell: 15000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 692
+},
+{
+ Id: 693
+ AegisName: "YellowDye"
+ Name: "YellowDye"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 20
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 693
+},
+{
+ Id: 694
+ AegisName: "LightBlueDye"
+ Name: "LightBlueDye"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 20
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 694
+},
+{
+ Id: 695
+ AegisName: "PinkDye"
+ Name: "PinkDye"
+ Type: "IT_ETC"
+ Buy: 2500
+ Sell: 1000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 695
+},
+{
+ Id: 696
+ AegisName: "BlackDye"
+ Name: "BlackDye"
+ Type: "IT_ETC"
+ Buy: 30000
+ Sell: 15000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 696
+},
+{
+ Id: 697
+ AegisName: "OrangeDye"
+ Name: "OrangeDye"
+ Type: "IT_ETC"
+ Buy: 2500
+ Sell: 1000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 697
+},
+{
+ Id: 698
+ AegisName: "PurpleDye"
+ Name: "PurpleDye"
+ Type: "IT_ETC"
+ Buy: 70000
+ Sell: 35000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 698
+},
+{
+ Id: 699
+ AegisName: "DarkGreenDye"
+ Name: "DarkGreenDye"
+ Type: "IT_ETC"
+ Buy: 2000
+ Sell: 1000
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 699
+},
+{
+ Id: 700
+ AegisName: "Pearl"
+ Name: "Pearl"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 3000
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 700
+},
+{
+ Id: 701
+ AegisName: "PileOfAsh"
+ Name: "PileOfAsh"
+ Type: "IT_ETC"
+ Buy: 3000
+ Sell: 100
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 701
+},
+{
+ Id: 703
+ AegisName: "SulphurPowder"
+ Name: "SulphurPowder"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 25
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 703
+},
+{
+ Id: 704
+ AegisName: "IronPowder"
+ Name: "IronPowder"
+ Type: "IT_ETC"
+ Buy: 800
+ Sell: 80
+ Weight: 3
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 704
+},
+{
+ Id: 706
+ AegisName: "GoldenScorpionStinger"
+ Name: "GoldenScorpionStinger"
+ Type: "IT_ETC"
+ Buy: 2000
+ Sell: 500
+ Weight: 2
+ Def: 0
+ Refine: false
+ ViewSprite: 706
+},
+{
+ Id: 707
+ AegisName: "MonsterOilPotion"
+ Name: "MonsterOilPotion"
+ Type: "IT_ETC"
+ Buy: 10000
+ Sell: 2000
+ Weight: 50
+ Def: 0
+ Refine: false
+ ViewSprite: 707
+},
+{
+ Id: 708
+ AegisName: "LeatherPatch"
+ Name: "LeatherPatch"
+ Type: "IT_ETC"
+ Buy: 300
+ Sell: 150
+ Weight: 18
+ Def: 0
+ Refine: false
+ ViewSprite: 708
+},
+{
+ Id: 709
+ AegisName: "BlackScorpionStinger"
+ Name: "BlackScorpionStinger"
+ Type: "IT_ETC"
+ Buy: 250
+ Sell: 100
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 709
+},
+{
+ Id: 710
+ AegisName: "SnakeTongue"
+ Name: "SnakeTongue"
+ Type: "IT_ETC"
+ Buy: 60
+ Sell: 30
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 710
+},
+{
+ Id: 711
+ AegisName: "MountainSnakeTongue"
+ Name: "MountainSnakeTongue"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 40
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 711
+},
+{
+ Id: 712
+ AegisName: "GrassSnakeTongue"
+ Name: "GrassSnakeTongue"
+ Type: "IT_ETC"
+ Buy: 160
+ Sell: 80
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 712
+},
+{
+ Id: 713
+ AegisName: "CaveSnakeTongue"
+ Name: "CaveSnakeTongue"
+ Type: "IT_ETC"
+ Buy: 120
+ Sell: 60
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 713
+},
+{
+ Id: 718
+ AegisName: "SilkCocoon"
+ Name: "SilkCocoon"
+ Type: "IT_ETC"
+ Buy: 200
+ Sell: 3
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 718
+},
+{
+ Id: 727
+ AegisName: "Iten"
+ Name: "Iten"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 8000
+ Def: 0
+ Refine: false
+ ViewSprite: 727
+},
+{
+ Id: 728
+ AegisName: "MoubooFigurine"
+ Name: "MoubooFigurine"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 9
+ Def: 0
+ Refine: false
+ ViewSprite: 728
+},
+{
+ Id: 729
+ AegisName: "WarpedLog"
+ Name: "WarpedLog"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 8
+ Def: 0
+ Refine: false
+ ViewSprite: 729
+},
+{
+ Id: 730
+ AegisName: "Lifestone"
+ Name: "Lifestone"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 730
+},
+{
+ Id: 732
+ AegisName: "DruidTreeBranch"
+ Name: "DruidTreeBranch"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 2
+ Def: 0
+ Refine: false
+ ViewSprite: 732
+},
+{
+ Id: 740
+ AegisName: "Root"
+ Name: "Root"
+ Type: "IT_ETC"
+ Buy: 500
+ Sell: 200
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 740
+},
+{
+ Id: 746
+ AegisName: "MopoxCurePotion"
+ Name: "MopoxCurePotion"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 746
+},
+{
+ Id: 753
+ AegisName: "BatWing"
+ Name: "BatWing"
+ Type: "IT_ETC"
+ Buy: 500
+ Sell: 10
+ Weight: 3
+ Def: 0
+ Refine: false
+ ViewSprite: 753
+},
+{
+ Id: 754
+ AegisName: "BatTeeth"
+ Name: "BatTeeth"
+ Type: "IT_ETC"
+ Buy: 600
+ Sell: 12
+ Weight: 2
+ Def: 0
+ Refine: false
+ ViewSprite: 754
+},
+{
+ Id: 763
+ AegisName: "TerraniteOre"
+ Name: "TerraniteOre"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 500
+ Weight: 40
+ Def: 0
+ Refine: false
+ ViewSprite: 763
+},
+{
+ Id: 772
+ AegisName: "WispPowder"
+ Name: "WispPowder"
+ Type: "IT_ETC"
+ Buy: 700
+ Sell: 350
+ Weight: 3
+ Def: 0
+ Refine: false
+ ViewSprite: 772
+},
+{
+ Id: 773
+ AegisName: "SpectrePowder"
+ Name: "SpectrePowder"
+ Type: "IT_ETC"
+ Buy: 700
+ Sell: 350
+ Weight: 3
+ Def: 0
+ Refine: false
+ ViewSprite: 773
+},
+{
+ Id: 774
+ AegisName: "PoltergeistPowder"
+ Name: "PoltergeistPowder"
+ Type: "IT_ETC"
+ Buy: 700
+ Sell: 350
+ Weight: 3
+ Def: 0
+ Refine: false
+ ViewSprite: 774
+},
+{
+ Id: 775
+ AegisName: "Bone"
+ Name: "Bone"
+ Type: "IT_ETC"
+ Buy: 140
+ Sell: 70
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 775
+},
+{
+ Id: 776
+ AegisName: "Skull"
+ Name: "Skull"
+ Type: "IT_ETC"
+ Buy: 900
+ Sell: 450
+ Weight: 30
+ Def: 0
+ Refine: false
+ ViewSprite: 776
+},
+{
+ Id: 777
+ AegisName: "RottenRags"
+ Name: "RottenRags"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 50
+ Weight: 15
+ Def: 0
+ Refine: false
+ ViewSprite: 777
+},
+{
+ Id: 778
+ AegisName: "DiseasedHeart"
+ Name: "DiseasedHeart"
+ Type: "IT_ETC"
+ Buy: 180
+ Sell: 90
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 778
+},
+{
+ Id: 779
+ AegisName: "UndeadEar"
+ Name: "UndeadEar"
+ Type: "IT_ETC"
+ Buy: 30
+ Sell: 15
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 779
+},
+{
+ Id: 780
+ AegisName: "UndeadEye"
+ Name: "UndeadEye"
+ Type: "IT_ETC"
+ Buy: 30
+ Sell: 15
+ Weight: 3
+ Def: 0
+ Refine: false
+ ViewSprite: 780
+},
+{
+ Id: 799
+ AegisName: "MylarinDust"
+ Name: "MylarinDust"
+ Type: "IT_ETC"
+ Buy: 10000
+ Sell: 5000
+ Weight: 3
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 799
+},
+{
+ Id: 802
+ AegisName: "EasterBasket"
+ Name: "EasterBasket"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 802
+},
+{
+ Id: 803
+ AegisName: "GrassLiner"
+ Name: "GrassLiner"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 803
+},
+{
+ Id: 804
+ AegisName: "JellyBeans"
+ Name: "JellyBeans"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 2
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 804
+},
+{
+ Id: 805
+ AegisName: "ChocolateMouboo"
+ Name: "ChocolateMouboo"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 3
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 805
+},
+{
+ Id: 806
+ AegisName: "ReedBundle"
+ Name: "ReedBundle"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 7
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 806
+},
+{
+ Id: 807
+ AegisName: "GrassSeed"
+ Name: "GrassSeed"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 807
+},
+{
+ Id: 819
+ AegisName: "DiamondPowder"
+ Name: "DiamondPowder"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 500
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 819
+},
+{
+ Id: 820
+ AegisName: "RubyPowder"
+ Name: "RubyPowder"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 500
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 820
+},
+{
+ Id: 821
+ AegisName: "EmeraldPowder"
+ Name: "EmeraldPowder"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 500
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 821
+},
+{
+ Id: 822
+ AegisName: "SapphirePowder"
+ Name: "SapphirePowder"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 500
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 822
+},
+{
+ Id: 823
+ AegisName: "TopazPowder"
+ Name: "TopazPowder"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 500
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 823
+},
+{
+ Id: 824
+ AegisName: "AmethystPowder"
+ Name: "AmethystPowder"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 500
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 824
+},
+{
+ Id: 833
+ AegisName: "BrokenFourLeafAmulet"
+ Name: "BrokenFourLeafAmulet"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 1
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 833
+},
+{
+ Id: 834
+ AegisName: "BrokenDoll"
+ Name: "BrokenDoll"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 5
+ Weight: 15
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 834
+},
+{
+ Id: 835
+ AegisName: "HyvernStinger"
+ Name: "HyvernStinger"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 25
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 835
+},
+{
+ Id: 836
+ AegisName: "GrubSlime"
+ Name: "GrubSlime"
+ Type: "IT_ETC"
+ Buy: 40
+ Sell: 10
+ Weight: 2
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 836
+},
+{
+ Id: 841
+ AegisName: "RedDottedWrap"
+ Name: "RedDottedWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 500
+ Def: 0
+ Refine: false
+ ViewSprite: 841
+},
+{
+ Id: 842
+ AegisName: "YellowDottedWrap"
+ Name: "YellowDottedWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 500
+ Def: 0
+ Refine: false
+ ViewSprite: 842
+},
+{
+ Id: 843
+ AegisName: "BlueDottedWrap"
+ Name: "BlueDottedWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 500
+ Def: 0
+ Refine: false
+ ViewSprite: 843
+},
+{
+ Id: 844
+ AegisName: "PurpleStripedWrap"
+ Name: "PurpleStripedWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 500
+ Def: 0
+ Refine: false
+ ViewSprite: 844
+},
+{
+ Id: 845
+ AegisName: "RedGoldenStripedWrap"
+ Name: "RedGoldenStripedWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 500
+ Def: 0
+ Refine: false
+ ViewSprite: 845
+},
+{
+ Id: 846
+ AegisName: "GreenRedStripedWrap"
+ Name: "GreenRedStripedWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 500
+ Def: 0
+ Refine: false
+ ViewSprite: 846
+},
+{
+ Id: 847
+ AegisName: "PlushMouboo"
+ Name: "PlushMouboo"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 200
+ Def: 0
+ Refine: false
+ ViewSprite: 847
+},
+{
+ Id: 849
+ AegisName: "OpenPresentBox"
+ Name: "OpenPresentBox"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 20
+ Def: 0
+ Refine: false
+ ViewSprite: 849
+},
+{
+ Id: 850
+ AegisName: "ClosedChristmasBox"
+ Name: "ClosedChristmasBox"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 200
+ Def: 0
+ Refine: false
+ ViewSprite: 850
+},
+{
+ Id: 851
+ AegisName: "StickReinboo"
+ Name: "StickReinboo"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 50
+ Def: 0
+ Refine: false
+ ViewSprite: 851
+},
+{
+ Id: 852
+ AegisName: "LeatherBall"
+ Name: "LeatherBall"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 20
+ Def: 0
+ Refine: false
+ ViewSprite: 852
+},
+{
+ Id: 853
+ AegisName: "Doll"
+ Name: "Doll"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 30
+ Def: 0
+ Refine: false
+ ViewSprite: 853
+},
+{
+ Id: 858
+ AegisName: "WolvernTooth"
+ Name: "WolvernTooth"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 858
+},
+{
+ Id: 859
+ AegisName: "WolvernPelt"
+ Name: "WolvernPelt"
+ Type: "IT_ETC"
+ Buy: 500
+ Sell: 250
+ Weight: 50
+ Def: 0
+ Refine: false
+ ViewSprite: 859
+},
+{
+ Id: 860
+ AegisName: "SquirrelPelt"
+ Name: "SquirrelPelt"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 20
+ Def: 0
+ Refine: false
+ ViewSprite: 860
+},
+{
+ Id: 861
+ AegisName: "WhiteBellTuber"
+ Name: "WhiteBellTuber"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 3
+ Def: 0
+ Refine: false
+ ViewSprite: 861
+},
+{
+ Id: 862
+ AegisName: "IcedWater"
+ Name: "IcedWater"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 50
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 862
+},
+{
+ Id: 863
+ AegisName: "SilverMirror"
+ Name: "SilverMirror"
+ Type: "IT_ETC"
+ Buy: 500
+ Sell: 250
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 863
+},
+{
+ Id: 864
+ AegisName: "BookPage"
+ Name: "BookPage"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 864
+},
+{
+ Id: 866
+ AegisName: "LeatherSuitcase"
+ Name: "LeatherSuitcase"
+ Type: "IT_ETC"
+ Buy: 4000
+ Sell: 2000
+ Weight: 12000
+ Def: 0
+ Refine: false
+ ViewSprite: 866
+},
+{
+ Id: 869
+ AegisName: "Antlers"
+ Name: "Antlers"
+ Type: "IT_ETC"
+ Buy: 4000
+ Sell: 2000
+ Weight: 3000
+ Def: 0
+ Refine: false
+ ViewSprite: 869
+},
+{
+ Id: 871
+ AegisName: "SealedSoul"
+ Name: "SealedSoul"
+ Type: "IT_ETC"
+ Buy: 12000
+ Sell: 1000
+ Weight: 75
+ Def: 0
+ Refine: false
+ ViewSprite: 871
+},
+{
+ Id: 872
+ AegisName: "LockPicks"
+ Name: "LockPicks"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 1500
+ Weight: 150
+ Def: 0
+ Refine: false
+ ViewSprite: 872
+},
+{
+ Id: 873
+ AegisName: "LazuriteShard"
+ Name: "LazuriteShard"
+ Type: "IT_ETC"
+ Buy: 500
+ Sell: 50
+ Weight: 2
+ Def: 0
+ Refine: false
+ ViewSprite: 873
+},
+{
+ Id: 874
+ AegisName: "LazuriteCrystal"
+ Name: "LazuriteCrystal"
+ Type: "IT_ETC"
+ Buy: 3000
+ Sell: 200
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 874
+},
+{
+ Id: 875
+ AegisName: "HeartOfLazurite"
+ Name: "HeartOfLazurite"
+ Type: "IT_ETC"
+ Buy: 10000
+ Sell: 400
+ Weight: 15
+ Def: 0
+ Refine: false
+ ViewSprite: 875
+},
+{
+ Id: 891
+ AegisName: "SilkSheet"
+ Name: "SilkSheet"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 250
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 891
+},
+{
+ Id: 892
+ AegisName: "OrangeSummonFlower"
+ Name: "OrangeSummonFlower"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 892
+},
+{
+ Id: 893
+ AegisName: "PurpleSummonFlower"
+ Name: "PurpleSummonFlower"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 893
+},
+{
+ Id: 894
+ AegisName: "WhiteSummonFlower"
+ Name: "WhiteSummonFlower"
+ Type: "IT_ETC"
+ Buy: 200
+ Sell: 100
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 894
+},
+{
+ Id: 895
+ AegisName: "YellowSummonFlower"
+ Name: "YellowSummonFlower"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 200
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 895
+},
+{
+ Id: 896
+ AegisName: "RedSummonFlower"
+ Name: "RedSummonFlower"
+ Type: "IT_ETC"
+ Buy: 600
+ Sell: 300
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 896
+},
+{
+ Id: 1191
+ AegisName: "WhiteWrap"
+ Name: "WhiteWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 1191
+},
+{
+ Id: 1192
+ AegisName: "YellowWrap"
+ Name: "YellowWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 1192
+},
+{
+ Id: 1193
+ AegisName: "BlueWrap"
+ Name: "BlueWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 1193
+},
+{
+ Id: 1194
+ AegisName: "PurpleWrap"
+ Name: "PurpleWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 1194
+},
+{
+ Id: 1195
+ AegisName: "GreenWrap"
+ Name: "GreenWrap"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 1195
+},
+{
+ Id: 1198
+ AegisName: "Soul"
+ Name: "Soul"
+ Type: "IT_ETC"
+ Buy: 100000
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 1198
+},
+{
+ Id: 1207
+ AegisName: "RedChristmasStocking"
+ Name: "RedChristmasStocking"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 40
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 1207
+},
+{
+ Id: 1208
+ AegisName: "RedEasterEgg"
+ Name: "RedEasterEgg"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 40
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 1208
+},
+{
+ Id: 1209
+ AegisName: "GreenEasterEgg"
+ Name: "GreenEasterEgg"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 40
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 1209
+},
+{
+ Id: 1210
+ AegisName: "BlueEasterEgg"
+ Name: "BlueEasterEgg"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 40
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 1210
+},
+{
+ Id: 1211
+ AegisName: "YellowEasterEgg"
+ Name: "YellowEasterEgg"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 40
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 1211
+},
+{
+ Id: 1212
+ AegisName: "PinkEasterEgg"
+ Name: "PinkEasterEgg"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 40
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 1212
+},
+{
+ Id: 1213
+ AegisName: "TealEasterEgg"
+ Name: "TealEasterEgg"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 40
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 1213
+},
+{
+ Id: 1228
+ AegisName: "LightCrystal"
+ Name: "LightCrystal"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 250
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 1228
+},
+{
+ Id: 1233
+ AegisName: "FakeFangs"
+ Name: "FakeFangs"
+ Type: "IT_ETC"
+ Buy: 20000
+ Sell: 10000
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1233
+},
+{
+ Id: 1234
+ AegisName: "RedOrnament"
+ Name: "RedOrnament"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1234
+},
+{
+ Id: 1235
+ AegisName: "YellowOrnament"
+ Name: "YellowOrnament"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1235
+},
+{
+ Id: 1236
+ AegisName: "GreenOrnament"
+ Name: "GreenOrnament"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1236
+},
+{
+ Id: 1237
+ AegisName: "AquaOrnament"
+ Name: "AquaOrnament"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1237
+},
+{
+ Id: 1238
+ AegisName: "BlueOrnament"
+ Name: "BlueOrnament"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1238
+},
+{
+ Id: 1239
+ AegisName: "MagentaOrnament"
+ Name: "MagentaOrnament"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1239
+},
+{
+ Id: 1240
+ AegisName: "SantaSnowGlobe"
+ Name: "SantaSnowGlobe"
+ Type: "IT_ETC"
+ Buy: 7500
+ Sell: 3750
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1240
+},
+{
+ Id: 1241
+ AegisName: "SnowmanSnowGlobe"
+ Name: "SnowmanSnowGlobe"
+ Type: "IT_ETC"
+ Buy: 7500
+ Sell: 3750
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1241
+},
+{
+ Id: 1245
+ AegisName: "BentNeedle"
+ Name: "BentNeedle"
+ Type: "IT_ETC"
+ Buy: 700
+ Sell: 1
+ Weight: 3
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1245
+},
+{
+ Id: 1246
+ AegisName: "DarkEasterEgg"
+ Name: "DarkEasterEgg"
+ Type: "IT_ETC"
+ Buy: 700
+ Sell: 50
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1246
+},
+{
+ Id: 1249
+ AegisName: "StrangeCoin"
+ Name: "StrangeCoin"
+ Type: "IT_ETC"
+ Buy: 7000
+ Sell: 3500
+ Weight: 3
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1249
+},
+{
+ Id: 1254
+ AegisName: "DarkPetal"
+ Name: "DarkPetal"
+ Type: "IT_ETC"
+ Buy: 15000
+ Sell: 8000
+ Weight: 250
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1254
+},
+{
+ Id: 1257
+ AegisName: "FlawedLens"
+ Name: "FlawedLens"
+ Type: "IT_ETC"
+ Buy: 10000
+ Sell: 5000
+ Weight: 3
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1257
+},
+{
+ Id: 2250
+ AegisName: "RedCottonCloth"
+ Name: "RedCottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 2250
+},
+{
+ Id: 2251
+ AegisName: "GreenCottonCloth"
+ Name: "GreenCottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 2251
+},
+{
+ Id: 2252
+ AegisName: "DarkBlueCottonCloth"
+ Name: "DarkBlueCottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 2252
+},
+{
+ Id: 2253
+ AegisName: "YellowCottonCloth"
+ Name: "YellowCottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 2253
+},
+{
+ Id: 2254
+ AegisName: "LightBlueCottonCloth"
+ Name: "LightBlueCottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 2254
+},
+{
+ Id: 2255
+ AegisName: "PinkCottonCloth"
+ Name: "PinkCottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 2255
+},
+{
+ Id: 2256
+ AegisName: "BlackCottonCloth"
+ Name: "BlackCottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 2256
+},
+{
+ Id: 2257
+ AegisName: "OrangeCottonCloth"
+ Name: "OrangeCottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 2257
+},
+{
+ Id: 2258
+ AegisName: "PurpleCottonCloth"
+ Name: "PurpleCottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 2258
+},
+{
+ Id: 2259
+ AegisName: "DarkGreenCottonCloth"
+ Name: "DarkGreenCottonCloth"
+ Type: "IT_ETC"
+ Buy: 400
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 2259
+},
+{
+ Id: 3000
+ AegisName: "JackOLantern"
+ Name: "JackOLantern"
+ Type: "IT_ETC"
+ Buy: 200
+ Sell: 100
+ Weight: 1000
+ Def: 0
+ Refine: false
+ ViewSprite: 3000
+},
+{
+ Id: 3002
+ AegisName: "RealisticBrain"
+ Name: "RealisticBrain"
+ Type: "IT_ETC"
+ Buy: 200
+ Sell: 100
+ Weight: 50
+ Def: 0
+ Refine: false
+ ViewSprite: 3002
+},
+{
+ Id: 3003
+ AegisName: "JarofBlood"
+ Name: "JarofBlood"
+ Type: "IT_ETC"
+ Buy: 200
+ Sell: 100
+ Weight: 375
+ Def: 0
+ Refine: false
+ ViewSprite: 3003
+},
+{
+ Id: 3004
+ AegisName: "Tongue"
+ Name: "Tongue"
+ Type: "IT_ETC"
+ Buy: 5
+ Sell: 1
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 3004
+},
+{
+ Id: 3011
+ AegisName: "PumpkinSeeds"
+ Name: "PumpkinSeeds"
+ Type: "IT_ETC"
+ Buy: 5
+ Sell: 1
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 3011
+},
+{
+ Id: 3012
+ AegisName: "BossMedal"
+ Name: "Boss Medal"
+ Type: "IT_ETC"
+ Buy: 10
+ Sell: 5
+ Weight: 1
+ ViewSprite: 3012
+ Trade: {
+ override: 60
+ nodrop: true
+ notrade: true
+ noselltonpc: true
+ nogstorage: true
+ nomail: true
+ noauction: true
+ }
+},
+{
+ Id: 4000
+ AegisName: "AngryScorpionStinger"
+ Name: "AngryScorpionStinger"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 4000
+},
+{
+ Id: 4001
+ AegisName: "Coal"
+ Name: "Coal"
+ Type: "IT_ETC"
+ Buy: 250
+ Sell: 100
+ Weight: 20
+ Def: 0
+ Refine: false
+ ViewSprite: 4001
+},
+{
+ Id: 4002
+ AegisName: "Diamond"
+ Name: "Diamond"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 0
+ Refine: false
+ ViewSprite: 4002
+},
+{
+ Id: 4003
+ AegisName: "Ruby"
+ Name: "Ruby"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 0
+ Refine: false
+ ViewSprite: 4003
+},
+{
+ Id: 4004
+ AegisName: "Emerald"
+ Name: "Emerald"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 0
+ Refine: false
+ ViewSprite: 4004
+},
+{
+ Id: 4005
+ AegisName: "Sapphire"
+ Name: "Sapphire"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 0
+ Refine: false
+ ViewSprite: 4005
+},
+{
+ Id: 4006
+ AegisName: "Topaz"
+ Name: "Topaz"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 0
+ Refine: false
+ ViewSprite: 4006
+},
+{
+ Id: 4007
+ AegisName: "Amethyst"
+ Name: "Amethyst"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 0
+ Refine: false
+ ViewSprite: 4007
+},
+{
+ Id: 4015
+ AegisName: "IronIngot"
+ Name: "IronIngot"
+ Type: "IT_ETC"
+ Buy: 500
+ Sell: 250
+ Weight: 200
+ Def: 0
+ Refine: false
+ ViewSprite: 4015
+},
+{
+ Id: 4016
+ AegisName: "BanditHood"
+ Name: "BanditHood"
+ Type: "IT_ETC"
+ Buy: 100
+ Sell: 50
+ Weight: 50
+ Def: 0
+ Refine: false
+ ViewSprite: 4016
+},
+{
+ Id: 4017
+ AegisName: "RedPowder"
+ Name: "RedPowder"
+ Type: "IT_ETC"
+ Buy: 3000
+ Sell: 5
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 4017
+},
+{
+ Id: 4018
+ AegisName: "YellowPowder"
+ Name: "YellowPowder"
+ Type: "IT_ETC"
+ Buy: 3000
+ Sell: 5
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 4018
+},
+{
+ Id: 4019
+ AegisName: "BluePowder"
+ Name: "BluePowder"
+ Type: "IT_ETC"
+ Buy: 3000
+ Sell: 5
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 4019
+},
+{
+ Id: 4021
+ AegisName: "YellowPresentBox"
+ Name: "YellowPresentBox"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 4021
+},
+{
+ Id: 4022
+ AegisName: "WhitePresentBox"
+ Name: "WhitePresentBox"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 4022
+},
+{
+ Id: 4023
+ AegisName: "AnimalBones"
+ Name: "AnimalBones"
+ Type: "IT_ETC"
+ Buy: 50
+ Sell: 25
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 4023
+},
+{
+ Id: 4024
+ AegisName: "FrozenYetiTear"
+ Name: "FrozenYetiTear"
+ Type: "IT_ETC"
+ Buy: 500
+ Sell: 250
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 4024
+},
+{
+ Id: 4025
+ AegisName: "YetiClaw"
+ Name: "YetiClaw"
+ Type: "IT_ETC"
+ Buy: 150
+ Sell: 75
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 4025
+},
+{
+ Id: 4026
+ AegisName: "IceCube"
+ Name: "IceCube"
+ Type: "IT_ETC"
+ Buy: 200
+ Sell: 100
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 4026
+},
+{
+ Id: 4029
+ AegisName: "GrimaceOfDementia"
+ Name: "GrimaceOfDementia"
+ Type: "IT_ETC"
+ Buy: 20
+ Sell: 10
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 4029
+},
+{
+ Id: 4034
+ AegisName: "BlackPearl"
+ Name: "BlackPearl"
+ Type: "IT_ETC"
+ Buy: 8000
+ Sell: 4000
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 4034
+},
+{
+ Id: 4037
+ AegisName: "WhiteBlanket"
+ Name: "WhiteBlanket"
+ Type: "IT_ETC"
+ Buy: 600
+ Sell: 125
+ Weight: 50
+ Def: 0
+ Refine: false
+ ViewSprite: 4037
+},
+{
+ Id: 4038
+ AegisName: "WhiteSaddleRug"
+ Name: "WhiteSaddleRug"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 250
+ Weight: 100
+ Def: 0
+ Refine: false
+ ViewSprite: 4038
+},
+{
+ Id: 4039
+ AegisName: "RedSaddleRug"
+ Name: "RedSaddleRug"
+ Type: "IT_ETC"
+ Buy: 1200
+ Sell: 300
+ Weight: 110
+ Def: 0
+ Refine: false
+ ViewSprite: 4039
+},
+{
+ Id: 4040
+ AegisName: "RawTalisman"
+ Name: "RawTalisman"
+ Type: "IT_ETC"
+ Buy: 800
+ Sell: 200
+ Weight: 8
+ Def: 0
+ Refine: false
+ ViewSprite: 4040
+},
+{
+ Id: 4041
+ AegisName: "FlightTalisman"
+ Name: "FlightTalisman"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 1200
+ Weight: 12
+ Def: 0
+ Refine: false
+ ViewSprite: 4041
+},
+{
+ Id: 5110
+ AegisName: "Bloodstone"
+ Name: "Bloodstone"
+ Type: "IT_ETC"
+ Buy: 2000
+ Sell: 250
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 5110
+},
+{
+ Id: 5111
+ AegisName: "BrainStem"
+ Name: "BrainStem"
+ Type: "IT_ETC"
+ Buy: 180
+ Sell: 90
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 5111
+},
+{
+ Id: 5112
+ AegisName: "CryptKey"
+ Name: "CryptKey"
+ Type: "IT_ETC"
+ Buy: 300
+ Sell: 150
+ Weight: 2
+ Def: 0
+ Refine: false
+ ViewSprite: 5112
+},
+{
+ Id: 5113
+ AegisName: "Ectoplasm"
+ Name: "Ectoplasm"
+ Type: "IT_ETC"
+ Buy: 80
+ Sell: 20
+ Weight: 4
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 5113
+},
+{
+ Id: 5114
+ AegisName: "Urn"
+ Name: "Urn"
+ Type: "IT_ETC"
+ Buy: 40
+ Sell: 20
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 5114
+},
+{
+ Id: 5115
+ AegisName: "VampireBatWing"
+ Name: "VampireBatWing"
+ Type: "IT_ETC"
+ Buy: 700
+ Sell: 20
+ Weight: 4
+ Def: 0
+ Refine: false
+ ViewSprite: 5115
+},
+{
+ Id: 5116
+ AegisName: "WraithHorn"
+ Name: "WraithHorn"
+ Type: "IT_ETC"
+ Buy: 700
+ Sell: 20
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 5116
+},
+{
+ Id: 5117
+ AegisName: "AstralCube"
+ Name: "AstralCube"
+ Type: "IT_ETC"
+ Buy: 10000
+ Sell: 10
+ Weight: 800
+ Def: 0
+ Refine: false
+ ViewSprite: 5117
+},
+{
+ Id: 5118
+ AegisName: "RunestoneA"
+ Name: "RunestoneA"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 5118
+},
+{
+ Id: 5119
+ AegisName: "RunestoneL"
+ Name: "RunestoneL"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 5119
+},
+{
+ Id: 5120
+ AegisName: "RunestoneN"
+ Name: "RunestoneN"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 5120
+},
+{
+ Id: 5121
+ AegisName: "RunestoneT"
+ Name: "RunestoneT"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 5121
+},
+{
+ Id: 5122
+ AegisName: "RunestoneW"
+ Name: "RunestoneW"
+ Type: "IT_ETC"
+ Buy: 1000
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 5122
+},
+{
+ Id: 5123
+ AegisName: "QuillOfBinding"
+ Name: "QuillOfBinding"
+ Type: "IT_ETC"
+ Buy: 10
+ Sell: 5
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5123
+},
+{
+ Id: 5124
+ AegisName: "BloodInk"
+ Name: "BloodInk"
+ Type: "IT_ETC"
+ Buy: 10
+ Sell: 5
+ Weight: 4
+ Def: 0
+ Refine: false
+ ViewSprite: 5124
+},
+{
+ Id: 5125
+ AegisName: "UnderworldKey"
+ Name: "UnderworldKey"
+ Type: "IT_ETC"
+ Buy: 10
+ Sell: 5
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 5125
+},
+{
+ Id: 5127
+ AegisName: "JarofOwnBlood"
+ Name: "JarofOwnBlood"
+ Type: "IT_ETC"
+ Buy: 200
+ Sell: 100
+ Weight: 375
+ Def: 0
+ Refine: false
+ ViewSprite: 5127
+},
+{
+ Id: 1197
+ AegisName: "SkeletonCharm"
+ Name: "SkeletonCharm"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 1197
+},
+{
+ Id: 5211
+ AegisName: "ActivatedSulphur"
+ Name: "ActivatedSulphur"
+ Type: "IT_ETC"
+ Buy: 3000
+ Sell: 5
+ Weight: 10
+ Def: 0
+ Refine: false
+ ViewSprite: 5211
+},
+{
+ Id: 5212
+ AegisName: "FairTradeSoil"
+ Name: "FairTradeSoil"
+ Type: "IT_ETC"
+ Buy: 500
+ Sell: 23
+ Weight: 40
+ Def: 0
+ Refine: false
+ ViewSprite: 5212
+},
+{
+ Id: 5215
+ AegisName: "FreeRangeMoss"
+ Name: "FreeRangeMoss"
+ Type: "IT_ETC"
+ Buy: 830
+ Sell: 20
+ Weight: 5
+ Def: 0
+ Refine: false
+ ViewSprite: 5215
+},
+{
+ Id: 5216
+ AegisName: "JadeEgg"
+ Name: "JadeEgg"
+ Type: "IT_ETC"
+ Buy: 938
+ Sell: 250
+ Weight: 2
+ Def: 0
+ Refine: false
+ ViewSprite: 5216
+},
+{
+ Id: 5217
+ AegisName: "RawAir"
+ Name: "RawAir"
+ Type: "IT_ETC"
+ Buy: 1999
+ Sell: 10
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5217
+},
+{
+ Id: 5218
+ AegisName: "RedTicket"
+ Name: "RedTicket"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5218
+},
+{
+ Id: 5219
+ AegisName: "YellowTicket"
+ Name: "YellowTicket"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5219
+},
+{
+ Id: 5220
+ AegisName: "GoldTicket"
+ Name: "GoldTicket"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5220
+},
+{
+ Id: 5221
+ AegisName: "GreenTicket"
+ Name: "GreenTicket"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5221
+},
+{
+ Id: 5222
+ AegisName: "AquaTicket"
+ Name: "AquaTicket"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5222
+},
+{
+ Id: 5223
+ AegisName: "BlueTicket"
+ Name: "BlueTicket"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5223
+},
+{
+ Id: 5224
+ AegisName: "PurpleTicket"
+ Name: "PurpleTicket"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5224
+},
+{
+ Id: 5225
+ AegisName: "PinkTicket"
+ Name: "PinkTicket"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5225
+},
+{
+ Id: 5251
+ AegisName: "WumpusEgg"
+ Name: "WumpusEgg"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5251
+},
+{
+ Id: 5256
+ AegisName: "PVPCoin"
+ Name: "PVPCoin"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5256
+},
+{
+ Id: 5265
+ AegisName: "LoveLetter"
+ Name: "LoveLetter"
+ Type: "IT_ETC"
+ Buy: 0
+ Sell: 0
+ Weight: 1
+ Def: 0
+ Refine: false
+ ViewSprite: 5265
+},
+{
+ Id: 523
+ AegisName: "LeatherShirt"
+ Name: "LeatherShirt"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 523
+ Script: <"
+ bonus bMatkRate, -1;
+ ">
+},
+{
+ Id: 546
+ AegisName: "DesertShirt"
+ Name: "DesertShirt"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 20
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 546
+ Script: <"
+ bonus bMatkRate, -2;
+ ">
+},
+{
+ Id: 564
+ AegisName: "Turtleneck"
+ Name: "Turtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 30
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 564
+},
+{
+ Id: 624
+ AegisName: "VNeckSweater"
+ Name: "VNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 624
+},
+{
+ Id: 625
+ AegisName: "ChainmailShirt"
+ Name: "ChainmailShirt"
+ Type: "IT_ARMOR"
+ Buy: 15000
+ Sell: 1500
+ Weight: 800
+ Def: 20
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 625
+ Script: <"
+ bonus bMatkRate, -36;
+ ">
+},
+{
+ Id: 626
+ AegisName: "LightPlatemail"
+ Name: "LightPlatemail"
+ Type: "IT_ARMOR"
+ Buy: 50000
+ Sell: 2500
+ Weight: 1200
+ Def: 25
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 626
+ Script: <"
+ bonus bMatkRate, -45;
+ ">
+},
+{
+ Id: 645
+ AegisName: "GoldenPlatemail"
+ Name: "GoldenPlatemail"
+ Type: "IT_ARMOR"
+ Buy: 9999000
+ Sell: 3000
+ Weight: 4500
+ Def: 25
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 645
+ Script: <"
+ bonus bMatkRate, -30;
+ ">
+},
+{
+ Id: 649
+ AegisName: "WhiteEvokersRobeBlue"
+ Name: "WhiteEvokersRobeBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 5
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 649
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ bonus bCriticalDef, 10;
+ ">
+},
+{
+ Id: 650
+ AegisName: "BlackEvokersRobeBlue"
+ Name: "BlackEvokersRobeBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 5
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 650
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ bonus bCriticalDef, 10;
+ ">
+},
+{
+ Id: 651
+ AegisName: "WhiteWizardRobe"
+ Name: "WhiteWizardRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 5
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 651
+ Script: <"
+ bonus bMatkRate, 1;
+ ">
+},
+{
+ Id: 652
+ AegisName: "BlackWizardRobe"
+ Name: "BlackWizardRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 5
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 652
+ Script: <"
+ bonus bMatkRate, 1;
+ ">
+},
+{
+ Id: 653
+ AegisName: "ApprenticeRobe"
+ Name: "ApprenticeRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 5
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 653
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ bonus bCriticalDef, 10;
+ ">
+},
+{
+ Id: 658
+ AegisName: "WarlordPlate"
+ Name: "WarlordPlate"
+ Type: "IT_ARMOR"
+ Buy: 100000
+ Sell: 3000
+ Weight: 2600
+ Def: 27
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 658
+ Script: <"
+ bonus bMatkRate, -51;
+ ">
+},
+{
+ Id: 659
+ AegisName: "GoldenWarlordPlate"
+ Name: "GoldenWarlordPlate"
+ Type: "IT_ARMOR"
+ Buy: 500000
+ Sell: 4000
+ Weight: 7600
+ Def: 27
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 659
+ Script: <"
+ bonus bMatkRate, -33;
+ ">
+},
+{
+ Id: 688
+ AegisName: "TankTop"
+ Name: "TankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 10
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 688
+},
+{
+ Id: 689
+ AegisName: "ShortTankTop"
+ Name: "ShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 689
+},
+{
+ Id: 720
+ AegisName: "SilkRobe"
+ Name: "SilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 5
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 720
+},
+{
+ Id: 726
+ AegisName: "GMRobe"
+ Name: "GMRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 40
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 726
+ Nouse: {
+ override: 60
+ }
+},
+{
+ Id: 755
+ AegisName: "AssassinShirt"
+ Name: "AssassinShirt"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 3000
+ Weight: 15
+ Def: 15
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ WeaponLv: 0
+ EquipLv: 90
+ Refine: false
+ ViewSprite: 755
+ Script: <"
+ callfunc "BrawlingItem", EQI_HEAD_MID;
+ bonus bAgi, 15;
+ bonus bSpeedAddRate, 10;
+ bonus bFlee, 20;
+ bonus bHit, 20;
+ bonus bMaxHP, 200;
+ bonus bMatkRate, -3;
+ ">
+},
+{
+ Id: 767
+ AegisName: "TerraniteChestArmor"
+ Name: "TerraniteChestArmor"
+ Type: "IT_ARMOR"
+ Buy: 100000
+ Sell: 3000
+ Weight: 800
+ Def: 20
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 767
+ Script: <"
+ bonus bMatkRate, -14;
+ bonus bDex, 1;
+ bonus bMdef, 10;
+ ">
+},
+{
+ Id: 782
+ AegisName: "ForestArmor"
+ Name: "ForestArmor"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 1500
+ Weight: 40
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 782
+ Script: <"
+ bonus bMatkRate, -6;
+ bonus bDex, 3;
+ ">
+},
+{
+ Id: 783
+ AegisName: "PlatynaRedDress"
+ Name: "PlatynaRedDress"
+ Type: "IT_ARMOR"
+ Buy: 100000
+ Sell: 50000
+ Weight: 35
+ Def: 15
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 783
+},
+{
+ Id: 791
+ AegisName: "YetiSkinShirt"
+ Name: "YetiSkinShirt"
+ Type: "IT_ARMOR"
+ Buy: 20000
+ Sell: 10000
+ Weight: 20
+ Def: 12
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 791
+ Script: <"
+ bonus bMatkRate, -3;
+ ">
+},
+{
+ Id: 793
+ AegisName: "BromenalChest"
+ Name: "BromenalChest"
+ Type: "IT_ARMOR"
+ Buy: 100000
+ Sell: 3000
+ Weight: 2000
+ Def: 25
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 793
+ Script: <"
+ bonus bMatkRate, -50;
+ ">
+},
+{
+ Id: 798
+ AegisName: "SorcererRed"
+ Name: "SorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 5
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 798
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 870
+ AegisName: "FineDress"
+ Name: "FineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 870
+},
+{
+ Id: 880
+ AegisName: "LazuriteRobe"
+ Name: "LazuriteRobe"
+ Type: "IT_ARMOR"
+ Buy: 92000
+ Sell: 52000
+ Weight: 30
+ Def: 7
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ WeaponLv: 0
+ EquipLv: 90
+ Refine: false
+ ViewSprite: 880
+ OnEquipScript: <"
+ callfunc "RequireStat", bInt, 70, EQI_HEAD_MID;
+ callfunc "RequireStat", bVit, 40, EQI_HEAD_MID;
+ ">
+ Script: <"
+ bonus bSpeedAddRate, -15;
+ bonus bDef2Rate, -40;
+ bonus bMatkRate, 6;
+ bonus bMdef, 60;
+ bonus bVit, -1;
+ bonus bInt, 7;
+ bonus bLuk, -1;
+ bonus bDex, -1;
+ bonus bStr, -1;
+ ">
+},
+{
+ Id: 1178
+ AegisName: "Contributor"
+ Name: "Contributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 1178
+},
+{
+ Id: 1183
+ AegisName: "AmberChristmasSweater"
+ Name: "AmberChristmasSweater"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 1183
+},
+{
+ Id: 1184
+ AegisName: "FunkyChristmasSweater"
+ Name: "FunkyChristmasSweater"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 1184
+},
+{
+ Id: 1185
+ AegisName: "PinkChristmasSweater"
+ Name: "PinkChristmasSweater"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 1185
+},
+{
+ Id: 1186
+ AegisName: "DarkChristmasSweater"
+ Name: "DarkChristmasSweater"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 1186
+},
+{
+ Id: 1187
+ AegisName: "BlueChristmasSweater"
+ Name: "BlueChristmasSweater"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 1187
+},
+{
+ Id: 1202
+ AegisName: "CottonShirt"
+ Name: "CottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 13
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 1202
+},
+{
+ Id: 2050
+ AegisName: "RedCottonShirt"
+ Name: "RedCottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2050
+},
+{
+ Id: 2051
+ AegisName: "GreenCottonShirt"
+ Name: "GreenCottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2051
+},
+{
+ Id: 2052
+ AegisName: "DarkBlueCottonShirt"
+ Name: "DarkBlueCottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2052
+},
+{
+ Id: 2053
+ AegisName: "YellowCottonShirt"
+ Name: "YellowCottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2053
+},
+{
+ Id: 2054
+ AegisName: "LightBlueCottonShirt"
+ Name: "LightBlueCottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2054
+},
+{
+ Id: 2055
+ AegisName: "PinkCottonShirt"
+ Name: "PinkCottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2055
+},
+{
+ Id: 2056
+ AegisName: "BlackCottonShirt"
+ Name: "BlackCottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2056
+},
+{
+ Id: 2057
+ AegisName: "OrangeCottonShirt"
+ Name: "OrangeCottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2057
+},
+{
+ Id: 2058
+ AegisName: "PurpleCottonShirt"
+ Name: "PurpleCottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2058
+},
+{
+ Id: 2059
+ AegisName: "DarkGreenCottonShirt"
+ Name: "DarkGreenCottonShirt"
+ Type: "IT_ARMOR"
+ Buy: 300
+ Sell: 5
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2059
+},
+{
+ Id: 2060
+ AegisName: "RedVNeckSweater"
+ Name: "RedVNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2060
+},
+{
+ Id: 2061
+ AegisName: "GreenVNeckSweater"
+ Name: "GreenVNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2061
+},
+{
+ Id: 2062
+ AegisName: "DarkBlueVNeckSweater"
+ Name: "DarkBlueVNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2062
+},
+{
+ Id: 2063
+ AegisName: "YellowVNeckSweater"
+ Name: "YellowVNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2063
+},
+{
+ Id: 2064
+ AegisName: "LightBlueVNeckSweater"
+ Name: "LightBlueVNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2064
+},
+{
+ Id: 2065
+ AegisName: "PinkVNeckSweater"
+ Name: "PinkVNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2065
+},
+{
+ Id: 2066
+ AegisName: "BlackVNeckSweater"
+ Name: "BlackVNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2066
+},
+{
+ Id: 2067
+ AegisName: "OrangeVNeckSweater"
+ Name: "OrangeVNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2067
+},
+{
+ Id: 2068
+ AegisName: "PurpleVNeckSweater"
+ Name: "PurpleVNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2068
+},
+{
+ Id: 2069
+ AegisName: "DarkGreenVNeckSweater"
+ Name: "DarkGreenVNeckSweater"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2069
+},
+{
+ Id: 2070
+ AegisName: "RedTurtleneck"
+ Name: "RedTurtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2070
+},
+{
+ Id: 2071
+ AegisName: "GreenTurtleneck"
+ Name: "GreenTurtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2071
+},
+{
+ Id: 2072
+ AegisName: "DarkBlueTurtleneck"
+ Name: "DarkBlueTurtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2072
+},
+{
+ Id: 2073
+ AegisName: "YellowTurtleneck"
+ Name: "YellowTurtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2073
+},
+{
+ Id: 2074
+ AegisName: "LightBlueTurtleneck"
+ Name: "LightBlueTurtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2074
+},
+{
+ Id: 2075
+ AegisName: "PinkTurtleneck"
+ Name: "PinkTurtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2075
+},
+{
+ Id: 2076
+ AegisName: "BlackTurtleneck"
+ Name: "BlackTurtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2076
+},
+{
+ Id: 2077
+ AegisName: "OrangeTurtleneck"
+ Name: "OrangeTurtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2077
+},
+{
+ Id: 2078
+ AegisName: "PurpleTurtleneck"
+ Name: "PurpleTurtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2078
+},
+{
+ Id: 2079
+ AegisName: "DarkGreenTurtleneck"
+ Name: "DarkGreenTurtleneck"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 35
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2079
+},
+{
+ Id: 2080
+ AegisName: "RedSilkRobe"
+ Name: "RedSilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2080
+},
+{
+ Id: 2081
+ AegisName: "GreenSilkRobe"
+ Name: "GreenSilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2081
+},
+{
+ Id: 2082
+ AegisName: "DarkBlueSilkRobe"
+ Name: "DarkBlueSilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2082
+},
+{
+ Id: 2083
+ AegisName: "YellowSilkRobe"
+ Name: "YellowSilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2083
+},
+{
+ Id: 2084
+ AegisName: "LightBlueSilkRobe"
+ Name: "LightBlueSilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2084
+},
+{
+ Id: 2085
+ AegisName: "PinkSilkRobe"
+ Name: "PinkSilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2085
+},
+{
+ Id: 2086
+ AegisName: "BlackSilkRobe"
+ Name: "BlackSilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2086
+},
+{
+ Id: 2087
+ AegisName: "OrangeSilkRobe"
+ Name: "OrangeSilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2087
+},
+{
+ Id: 2088
+ AegisName: "PurpleSilkRobe"
+ Name: "PurpleSilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2088
+},
+{
+ Id: 2089
+ AegisName: "DarkGreenSilkRobe"
+ Name: "DarkGreenSilkRobe"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2089
+},
+{
+ Id: 2090
+ AegisName: "RedTankTop"
+ Name: "RedTankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 12
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2090
+},
+{
+ Id: 2091
+ AegisName: "GreenTankTop"
+ Name: "GreenTankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 12
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2091
+},
+{
+ Id: 2092
+ AegisName: "DarkBlueTankTop"
+ Name: "DarkBlueTankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 12
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2092
+},
+{
+ Id: 2093
+ AegisName: "YellowTankTop"
+ Name: "YellowTankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 12
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2093
+},
+{
+ Id: 2094
+ AegisName: "LightBlueTankTop"
+ Name: "LightBlueTankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 12
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2094
+},
+{
+ Id: 2095
+ AegisName: "PinkTankTop"
+ Name: "PinkTankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 12
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2095
+},
+{
+ Id: 2096
+ AegisName: "BlackTankTop"
+ Name: "BlackTankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 12
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2096
+},
+{
+ Id: 2097
+ AegisName: "OrangeTankTop"
+ Name: "OrangeTankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 12
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2097
+},
+{
+ Id: 2098
+ AegisName: "PurpleTankTop"
+ Name: "PurpleTankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 12
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2098
+},
+{
+ Id: 2099
+ AegisName: "DarkGreenTankTop"
+ Name: "DarkGreenTankTop"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 12
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2099
+},
+{
+ Id: 2120
+ AegisName: "RedShortTankTop"
+ Name: "RedShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2120
+},
+{
+ Id: 2121
+ AegisName: "GreenShortTankTop"
+ Name: "GreenShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2121
+},
+{
+ Id: 2122
+ AegisName: "DarkBlueShortTankTop"
+ Name: "DarkBlueShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2122
+},
+{
+ Id: 2123
+ AegisName: "YellowShortTankTop"
+ Name: "YellowShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2123
+},
+{
+ Id: 2124
+ AegisName: "LightBlueShortTankTop"
+ Name: "LightBlueShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2124
+},
+{
+ Id: 2125
+ AegisName: "PinkShortTankTop"
+ Name: "PinkShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2125
+},
+{
+ Id: 2126
+ AegisName: "BlackShortTankTop"
+ Name: "BlackShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2126
+},
+{
+ Id: 2127
+ AegisName: "OrangeShortTankTop"
+ Name: "OrangeShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2127
+},
+{
+ Id: 2128
+ AegisName: "PurpleShortTankTop"
+ Name: "PurpleShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2128
+},
+{
+ Id: 2129
+ AegisName: "DarkGreenShortTankTop"
+ Name: "DarkGreenShortTankTop"
+ Type: "IT_ARMOR"
+ Buy: 600
+ Sell: 300
+ Weight: 8
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2129
+},
+{
+ Id: 2220
+ AegisName: "RedSorcererRed"
+ Name: "RedSorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2220
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 2221
+ AegisName: "GreenSorcererRed"
+ Name: "GreenSorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2221
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 2222
+ AegisName: "DarkBlueSorcererRed"
+ Name: "DarkBlueSorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2222
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 2223
+ AegisName: "YellowSorcererRed"
+ Name: "YellowSorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2223
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 2224
+ AegisName: "LightBlueSorcererRed"
+ Name: "LightBlueSorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2224
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 2225
+ AegisName: "PinkSorcererRed"
+ Name: "PinkSorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2225
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 2226
+ AegisName: "BlackSorcererRed"
+ Name: "BlackSorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2226
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 2227
+ AegisName: "OrangeSorcererRed"
+ Name: "OrangeSorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2227
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 2228
+ AegisName: "PurpleSorcererRed"
+ Name: "PurpleSorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2228
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 2229
+ AegisName: "DarkGreenSorcererRed"
+ Name: "DarkGreenSorcererRed"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2229
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 2240
+ AegisName: "RedFineDress"
+ Name: "RedFineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2240
+},
+{
+ Id: 2241
+ AegisName: "GreenFineDress"
+ Name: "GreenFineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2241
+},
+{
+ Id: 2242
+ AegisName: "DarkBlueFineDress"
+ Name: "DarkBlueFineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2242
+},
+{
+ Id: 2243
+ AegisName: "YellowFineDress"
+ Name: "YellowFineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2243
+},
+{
+ Id: 2244
+ AegisName: "LightBlueFineDress"
+ Name: "LightBlueFineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2244
+},
+{
+ Id: 2245
+ AegisName: "PinkFineDress"
+ Name: "PinkFineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2245
+},
+{
+ Id: 2246
+ AegisName: "BlackFineDress"
+ Name: "BlackFineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2246
+},
+{
+ Id: 2247
+ AegisName: "OrangeFineDress"
+ Name: "OrangeFineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2247
+},
+{
+ Id: 2248
+ AegisName: "PurpleFineDress"
+ Name: "PurpleFineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2248
+},
+{
+ Id: 2249
+ AegisName: "DarkGreenFineDress"
+ Name: "DarkGreenFineDress"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 35
+ Def: 8
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 2249
+},
+{
+ Id: 5000
+ AegisName: "RedSorcererGreen"
+ Name: "RedSorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5000
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5001
+ AegisName: "GreenSorcererGreen"
+ Name: "GreenSorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5001
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5002
+ AegisName: "DarkBlueSorcererGreen"
+ Name: "DarkBlueSorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5002
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5003
+ AegisName: "YellowSorcererGreen"
+ Name: "YellowSorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5003
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5004
+ AegisName: "LightBlueSorcererGreen"
+ Name: "LightBlueSorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5004
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5005
+ AegisName: "PinkSorcererGreen"
+ Name: "PinkSorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5005
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5006
+ AegisName: "BlackSorcererGreen"
+ Name: "BlackSorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5006
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5007
+ AegisName: "OrangeSorcererGreen"
+ Name: "OrangeSorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5007
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5008
+ AegisName: "PurpleSorcererGreen"
+ Name: "PurpleSorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5008
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5009
+ AegisName: "DarkGreenSorcererGreen"
+ Name: "DarkGreenSorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5009
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5010
+ AegisName: "SorcererGreen"
+ Name: "SorcererGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5010
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5011
+ AegisName: "RedSorcererDBlue"
+ Name: "RedSorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5011
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5012
+ AegisName: "GreenSorcererDBlue"
+ Name: "GreenSorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5012
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5013
+ AegisName: "DarkBlueSorcererDBlue"
+ Name: "DarkBlueSorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5013
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5014
+ AegisName: "YellowSorcererDBlue"
+ Name: "YellowSorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5014
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5015
+ AegisName: "LightBlueSorcererDBlue"
+ Name: "LightBlueSorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5015
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5016
+ AegisName: "PinkSorcererDBlue"
+ Name: "PinkSorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5016
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5017
+ AegisName: "BlackSorcererDBlue"
+ Name: "BlackSorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5017
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5018
+ AegisName: "OrangeSorcererDBlue"
+ Name: "OrangeSorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5018
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5019
+ AegisName: "PurpleSorcererDBlue"
+ Name: "PurpleSorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5019
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5020
+ AegisName: "DarkGreenSorcererDBlue"
+ Name: "DarkGreenSorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5020
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5021
+ AegisName: "SorcererDBlue"
+ Name: "SorcererDBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5021
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5022
+ AegisName: "RedSorcererYellow"
+ Name: "RedSorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5022
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5023
+ AegisName: "GreenSorcererYellow"
+ Name: "GreenSorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5023
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5024
+ AegisName: "DarkBlueSorcererYellow"
+ Name: "DarkBlueSorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5024
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5025
+ AegisName: "YellowSorcererYellow"
+ Name: "YellowSorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5025
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5026
+ AegisName: "LightBlueSorcererYellow"
+ Name: "LightBlueSorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5026
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5027
+ AegisName: "PinkSorcererYellow"
+ Name: "PinkSorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5027
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5028
+ AegisName: "BlackSorcererYellow"
+ Name: "BlackSorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5028
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5029
+ AegisName: "OrangeSorcererYellow"
+ Name: "OrangeSorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5029
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5030
+ AegisName: "PurpleSorcererYellow"
+ Name: "PurpleSorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5030
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5031
+ AegisName: "DarkGreenSorcererYellow"
+ Name: "DarkGreenSorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5031
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5032
+ AegisName: "SorcererYellow"
+ Name: "SorcererYellow"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5032
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5033
+ AegisName: "RedSorcererLBlue"
+ Name: "RedSorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5033
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5034
+ AegisName: "GreenSorcererLBlue"
+ Name: "GreenSorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5034
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5035
+ AegisName: "DarkBlueSorcererLBlue"
+ Name: "DarkBlueSorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5035
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5036
+ AegisName: "YellowSorcererLBlue"
+ Name: "YellowSorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5036
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5037
+ AegisName: "LightBlueSorcererLBlue"
+ Name: "LightBlueSorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5037
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5038
+ AegisName: "PinkSorcererLBlue"
+ Name: "PinkSorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5038
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5039
+ AegisName: "BlackSorcererLBlue"
+ Name: "BlackSorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5039
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5040
+ AegisName: "OrangeSorcererLBlue"
+ Name: "OrangeSorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5040
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5041
+ AegisName: "PurpleSorcererLBlue"
+ Name: "PurpleSorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5041
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5042
+ AegisName: "DarkGreenSorcererLBlue"
+ Name: "DarkGreenSorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5042
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5043
+ AegisName: "SorcererLBlue"
+ Name: "SorcererLBlue"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5043
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5044
+ AegisName: "RedSorcererPink"
+ Name: "RedSorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5044
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5045
+ AegisName: "GreenSorcererPink"
+ Name: "GreenSorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5045
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5046
+ AegisName: "DarkBlueSorcererPink"
+ Name: "DarkBlueSorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5046
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5047
+ AegisName: "YellowSorcererPink"
+ Name: "YellowSorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5047
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5048
+ AegisName: "LightBlueSorcererPink"
+ Name: "LightBlueSorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5048
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5049
+ AegisName: "PinkSorcererPink"
+ Name: "PinkSorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5049
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5050
+ AegisName: "BlackSorcererPink"
+ Name: "BlackSorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5050
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5051
+ AegisName: "OrangeSorcererPink"
+ Name: "OrangeSorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5051
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5052
+ AegisName: "PurpleSorcererPink"
+ Name: "PurpleSorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5052
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5053
+ AegisName: "DarkGreenSorcererPink"
+ Name: "DarkGreenSorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5053
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5054
+ AegisName: "SorcererPink"
+ Name: "SorcererPink"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5054
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5055
+ AegisName: "RedSorcererBlack"
+ Name: "RedSorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5055
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5056
+ AegisName: "GreenSorcererBlack"
+ Name: "GreenSorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5056
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5057
+ AegisName: "DarkBlueSorcererBlack"
+ Name: "DarkBlueSorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5057
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5058
+ AegisName: "YellowSorcererBlack"
+ Name: "YellowSorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5058
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5059
+ AegisName: "LightBlueSorcererBlack"
+ Name: "LightBlueSorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5059
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5060
+ AegisName: "PinkSorcererBlack"
+ Name: "PinkSorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5060
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5061
+ AegisName: "BlackSorcererBlack"
+ Name: "BlackSorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5061
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5062
+ AegisName: "OrangeSorcererBlack"
+ Name: "OrangeSorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5062
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5063
+ AegisName: "PurpleSorcererBlack"
+ Name: "PurpleSorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5063
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5064
+ AegisName: "DarkGreenSorcererBlack"
+ Name: "DarkGreenSorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5064
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5065
+ AegisName: "SorcererBlack"
+ Name: "SorcererBlack"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5065
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5066
+ AegisName: "RedSorcererOrange"
+ Name: "RedSorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5066
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5067
+ AegisName: "GreenSorcererOrange"
+ Name: "GreenSorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5067
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5068
+ AegisName: "DarkBlueSorcererOrange"
+ Name: "DarkBlueSorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5068
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5069
+ AegisName: "YellowSorcererOrange"
+ Name: "YellowSorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5069
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5070
+ AegisName: "LightBlueSorcererOrange"
+ Name: "LightBlueSorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5070
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5071
+ AegisName: "PinkSorcererOrange"
+ Name: "PinkSorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5071
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5072
+ AegisName: "BlackSorcererOrange"
+ Name: "BlackSorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5072
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5073
+ AegisName: "OrangeSorcererOrange"
+ Name: "OrangeSorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5073
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5074
+ AegisName: "PurpleSorcererOrange"
+ Name: "PurpleSorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5074
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5075
+ AegisName: "DarkGreenSorcererOrange"
+ Name: "DarkGreenSorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5075
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5076
+ AegisName: "SorcererOrange"
+ Name: "SorcererOrange"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5076
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5077
+ AegisName: "RedSorcererPurple"
+ Name: "RedSorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5077
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5078
+ AegisName: "GreenSorcererPurple"
+ Name: "GreenSorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5078
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5079
+ AegisName: "DarkBlueSorcererPurple"
+ Name: "DarkBlueSorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5079
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5080
+ AegisName: "YellowSorcererPurple"
+ Name: "YellowSorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5080
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5081
+ AegisName: "LightBlueSorcererPurple"
+ Name: "LightBlueSorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5081
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5082
+ AegisName: "PinkSorcererPurple"
+ Name: "PinkSorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5082
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5083
+ AegisName: "BlackSorcererPurple"
+ Name: "BlackSorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5083
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5084
+ AegisName: "OrangeSorcererPurple"
+ Name: "OrangeSorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5084
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5085
+ AegisName: "PurpleSorcererPurple"
+ Name: "PurpleSorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5085
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5086
+ AegisName: "DarkGreenSorcererPurple"
+ Name: "DarkGreenSorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5086
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5087
+ AegisName: "SorcererPurple"
+ Name: "SorcererPurple"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5087
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5088
+ AegisName: "RedSorcererDGreen"
+ Name: "RedSorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5088
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5089
+ AegisName: "GreenSorcererDGreen"
+ Name: "GreenSorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5089
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5090
+ AegisName: "DarkBlueSorcererDGreen"
+ Name: "DarkBlueSorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5090
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5091
+ AegisName: "YellowSorcererDGreen"
+ Name: "YellowSorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5091
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5092
+ AegisName: "LightBlueSorcererDGreen"
+ Name: "LightBlueSorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5092
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5093
+ AegisName: "PinkSorcererDGreen"
+ Name: "PinkSorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5093
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5094
+ AegisName: "BlackSorcererDGreen"
+ Name: "BlackSorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5094
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5095
+ AegisName: "OrangeSorcererDGreen"
+ Name: "OrangeSorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5095
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5096
+ AegisName: "PurpleSorcererDGreen"
+ Name: "PurpleSorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5096
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5097
+ AegisName: "DarkGreenSorcererDGreen"
+ Name: "DarkGreenSorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5097
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5098
+ AegisName: "SorcererDGreen"
+ Name: "SorcererDGreen"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5098
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5099
+ AegisName: "RedSorcererWhite"
+ Name: "RedSorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5099
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5100
+ AegisName: "GreenSorcererWhite"
+ Name: "GreenSorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5100
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5101
+ AegisName: "DarkBlueSorcererWhite"
+ Name: "DarkBlueSorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5101
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5102
+ AegisName: "YellowSorcererWhite"
+ Name: "YellowSorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5102
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5103
+ AegisName: "LightBlueSorcererWhite"
+ Name: "LightBlueSorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5103
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5104
+ AegisName: "PinkSorcererWhite"
+ Name: "PinkSorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5104
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5105
+ AegisName: "BlackSorcererWhite"
+ Name: "BlackSorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5105
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5106
+ AegisName: "OrangeSorcererWhite"
+ Name: "OrangeSorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5106
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5107
+ AegisName: "PurpleSorcererWhite"
+ Name: "PurpleSorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5107
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5108
+ AegisName: "DarkGreenSorcererWhite"
+ Name: "DarkGreenSorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5108
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5109
+ AegisName: "SorcererWhite"
+ Name: "SorcererWhite"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5109
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bAgi, 1;
+ ">
+},
+{
+ Id: 5131
+ AegisName: "RedContributor"
+ Name: "RedContributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5131
+},
+{
+ Id: 5132
+ AegisName: "GreenContributor"
+ Name: "GreenContributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5132
+},
+{
+ Id: 5133
+ AegisName: "DarkBlueContributor"
+ Name: "DarkBlueContributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5133
+},
+{
+ Id: 5134
+ AegisName: "YellowContributor"
+ Name: "YellowContributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5134
+},
+{
+ Id: 5135
+ AegisName: "LightBlueContributor"
+ Name: "LightBlueContributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5135
+},
+{
+ Id: 5136
+ AegisName: "PinkContributor"
+ Name: "PinkContributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5136
+},
+{
+ Id: 5137
+ AegisName: "BlackContributor"
+ Name: "BlackContributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5137
+},
+{
+ Id: 5138
+ AegisName: "OrangeContributor"
+ Name: "OrangeContributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5138
+},
+{
+ Id: 5139
+ AegisName: "PurpleContributor"
+ Name: "PurpleContributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5139
+},
+{
+ Id: 5140
+ AegisName: "DarkGreenContributor"
+ Name: "DarkGreenContributor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5140
+},
+{
+ Id: 5254
+ AegisName: "SaviorArmor"
+ Name: "SaviorArmor"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 2000
+ Def: 24
+ Slots: 0
+ Loc: "EQP_HEAD_MID"
+ Refine: false
+ ViewSprite: 5254
+ Script: <"
+ bonus bMatkRate, -27;
+ bonus bDex, 1;
+ bonus bMaxHP, 100;
+ ">
+},
+{
+ Id: 511
+ AegisName: "SantaHat"
+ Name: "SantaHat"
+ Type: "IT_ARMOR"
+ Buy: 400
+ Sell: 200
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 511
+},
+{
+ Id: 524
+ AegisName: "FancyHat"
+ Name: "FancyHat"
+ Type: "IT_ARMOR"
+ Buy: 1600
+ Sell: 800
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 524
+},
+{
+ Id: 525
+ AegisName: "MinersHat"
+ Name: "MinersHat"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 40
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 525
+},
+{
+ Id: 543
+ AegisName: "StandardHeadband"
+ Name: "StandardHeadband"
+ Type: "IT_ARMOR"
+ Buy: 800
+ Sell: 400
+ Weight: 10
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 543
+},
+{
+ Id: 544
+ AegisName: "SilkHeadband"
+ Name: "SilkHeadband"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2000
+ Weight: 10
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 544
+},
+{
+ Id: 615
+ AegisName: "PumpkinHelmet"
+ Name: "PumpkinHelmet"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 60
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 615
+},
+{
+ Id: 616
+ AegisName: "AxeHat"
+ Name: "AxeHat"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 50
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 616
+},
+{
+ Id: 617
+ AegisName: "PirateHat"
+ Name: "PirateHat"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 40
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 617
+},
+{
+ Id: 618
+ AegisName: "Goggles"
+ Name: "Goggles"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 618
+},
+{
+ Id: 619
+ AegisName: "LeatherGoggles"
+ Name: "LeatherGoggles"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 619
+},
+{
+ Id: 620
+ AegisName: "Circlet"
+ Name: "Circlet"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 620
+},
+{
+ Id: 621
+ AegisName: "Eyepatch"
+ Name: "Eyepatch"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 5
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 621
+},
+{
+ Id: 622
+ AegisName: "Bandana"
+ Name: "Bandana"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 622
+},
+{
+ Id: 627
+ AegisName: "TopHat"
+ Name: "TopHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 627
+},
+{
+ Id: 628
+ AegisName: "FunkyHat"
+ Name: "FunkyHat"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 1500
+ Weight: 20
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 628
+},
+{
+ Id: 629
+ AegisName: "MushHat"
+ Name: "MushHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 629
+},
+{
+ Id: 630
+ AegisName: "ShroomHat"
+ Name: "ShroomHat"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 1500
+ Weight: 30
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 630
+},
+{
+ Id: 633
+ AegisName: "ChristmasElfHat"
+ Name: "ChristmasElfHat"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 1500
+ Weight: 30
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 633
+},
+{
+ Id: 634
+ AegisName: "FaceMask"
+ Name: "FaceMask"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 50
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 634
+},
+{
+ Id: 636
+ AegisName: "WarlordHelmet"
+ Name: "WarlordHelmet"
+ Type: "IT_ARMOR"
+ Buy: 30000
+ Sell: 3000
+ Weight: 900
+ Def: 18
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 636
+ Script: <"
+ bonus bMatkRate, -8;
+ ">
+},
+{
+ Id: 637
+ AegisName: "KnightsHelmet"
+ Name: "KnightsHelmet"
+ Type: "IT_ARMOR"
+ Buy: 20000
+ Sell: 2000
+ Weight: 600
+ Def: 15
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 637
+ Script: <"
+ bonus bMatkRate, -7;
+ ">
+},
+{
+ Id: 638
+ AegisName: "InfantryHelmet"
+ Name: "InfantryHelmet"
+ Type: "IT_ARMOR"
+ Buy: 15000
+ Sell: 1500
+ Weight: 400
+ Def: 15
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 638
+ Script: <"
+ bonus bMatkRate, -8;
+ ">
+},
+{
+ Id: 639
+ AegisName: "CrusadeHelmet"
+ Name: "CrusadeHelmet"
+ Type: "IT_ARMOR"
+ Buy: 25000
+ Sell: 2500
+ Weight: 1300
+ Def: 18
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 639
+ Script: <"
+ bonus bMatkRate, -8;
+ ">
+},
+{
+ Id: 643
+ AegisName: "WhiteCowboyHat"
+ Name: "WhiteCowboyHat"
+ Type: "IT_ARMOR"
+ Buy: 1800
+ Sell: 900
+ Weight: 30
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 643
+ Script: <"
+ bonus bMatkRate, -2;
+ ">
+},
+{
+ Id: 644
+ AegisName: "BlackCowboyHat"
+ Name: "BlackCowboyHat"
+ Type: "IT_ARMOR"
+ Buy: 1800
+ Sell: 900
+ Weight: 30
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 644
+ Script: <"
+ bonus bMatkRate, -2;
+ ">
+},
+{
+ Id: 646
+ AegisName: "Crown"
+ Name: "Crown"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 1000
+ Weight: 240
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 646
+},
+{
+ Id: 647
+ AegisName: "DevelopersCap"
+ Name: "DevelopersCap"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 647
+},
+{
+ Id: 654
+ AegisName: "Cap"
+ Name: "Cap"
+ Type: "IT_ARMOR"
+ Buy: 4000000
+ Sell: 500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 654
+},
+{
+ Id: 656
+ AegisName: "SerfHat"
+ Name: "SerfHat"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 656
+},
+{
+ Id: 675
+ AegisName: "GraduationCap"
+ Name: "GraduationCap"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 250
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 675
+},
+{
+ Id: 678
+ AegisName: "NohMask"
+ Name: "NohMask"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 1000
+ Weight: 18
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 678
+},
+{
+ Id: 679
+ AegisName: "DemonMask"
+ Name: "DemonMask"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 23
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 679
+},
+{
+ Id: 721
+ AegisName: "HighPriestCrown"
+ Name: "HighPriestCrown"
+ Type: "IT_ARMOR"
+ Buy: 6000000
+ Sell: 5000
+ Weight: 400
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 721
+ Script: <"
+ bonus bMatkRate, 2;
+ bonus bMaxSP, 20;
+ ">
+},
+{
+ Id: 722
+ AegisName: "MonsterSkullHelmet"
+ Name: "MonsterSkullHelmet"
+ Type: "IT_ARMOR"
+ Buy: 6000000
+ Sell: 3000
+ Weight: 250
+ Def: 7
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 722
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bMdef, 20;
+ ">
+},
+{
+ Id: 723
+ AegisName: "DesertHat"
+ Name: "DesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 723
+},
+{
+ Id: 724
+ AegisName: "CottonHeadband"
+ Name: "CottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 724
+},
+{
+ Id: 725
+ AegisName: "GMCap"
+ Name: "GMCap"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 725
+ Nouse: {
+ override: 60
+ }
+},
+{
+ Id: 751
+ AegisName: "PinkieHat"
+ Name: "PinkieHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 1000
+ Weight: 5
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 751
+},
+{
+ Id: 752
+ AegisName: "FluffyHat"
+ Name: "FluffyHat"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 2000
+ Weight: 10
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 752
+},
+{
+ Id: 759
+ AegisName: "PaladinsHelmet"
+ Name: "PaladinsHelmet"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 0
+ Def: 19
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 759
+},
+{
+ Id: 760
+ AegisName: "OverlordsHelmet"
+ Name: "OverlordsHelmet"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 0
+ Def: 50
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 760
+ Script: <"
+ bonus bMdef, -50;
+ bonus bStr, -2;
+ bonus bAgi, -2;
+ bonus bDex, -2;
+ ">
+},
+{
+ Id: 761
+ AegisName: "DesertHelmet"
+ Name: "DesertHelmet"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 0
+ Def: 21
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 761
+},
+{
+ Id: 764
+ AegisName: "SailorHat"
+ Name: "SailorHat"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 0
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 764
+},
+{
+ Id: 765
+ AegisName: "CaptainsHat"
+ Name: "CaptainsHat"
+ Type: "IT_ARMOR"
+ Buy: 0
+ Sell: 0
+ Weight: 0
+ Def: 15
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 765
+},
+{
+ Id: 766
+ AegisName: "TerraniteHelmet"
+ Name: "TerraniteHelmet"
+ Type: "IT_ARMOR"
+ Buy: 30000
+ Sell: 3000
+ Weight: 300
+ Def: 15
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 766
+ Script: <"
+ bonus bMatkRate, -2;
+ bonus bMdef, 5;
+ ">
+},
+{
+ Id: 769
+ AegisName: "GuyFawkesMask"
+ Name: "GuyFawkesMask"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 769
+},
+{
+ Id: 770
+ AegisName: "FairyHat"
+ Name: "FairyHat"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 770
+ Script: <"
+ bonus bMatkRate, -6;
+ bonus bLuk, 3;
+ ">
+},
+{
+ Id: 781
+ AegisName: "WitchDoctorsMask"
+ Name: "WitchDoctorsMask"
+ Type: "IT_ARMOR"
+ Buy: 20000
+ Sell: 100
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 781
+},
+{
+ Id: 795
+ AegisName: "BromenalHelmet"
+ Name: "BromenalHelmet"
+ Type: "IT_ARMOR"
+ Buy: 15000
+ Sell: 1500
+ Weight: 400
+ Def: 15
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 795
+ Script: <"
+ bonus bMatkRate, -6;
+ ">
+},
+{
+ Id: 800
+ AegisName: "BowlerHatBrown"
+ Name: "BowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 800
+},
+{
+ Id: 801
+ AegisName: "PinkieHelmet"
+ Name: "PinkieHelmet"
+ Type: "IT_ARMOR"
+ Buy: 20000
+ Sell: 1500
+ Weight: 800
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 801
+ Script: <"
+ bonus bMatkRate, -3;
+ bonus bLuk, 1;
+ ">
+},
+{
+ Id: 848
+ AegisName: "Earmuffs"
+ Name: "Earmuffs"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 848
+},
+{
+ Id: 854
+ AegisName: "ElfNightcap"
+ Name: "ElfNightcap"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 854
+},
+{
+ Id: 855
+ AegisName: "Sunglasses"
+ Name: "Sunglasses"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 10
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 855
+},
+{
+ Id: 856
+ AegisName: "KnitCap"
+ Name: "KnitCap"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 856
+},
+{
+ Id: 877
+ AegisName: "BullHelmet"
+ Name: "BullHelmet"
+ Type: "IT_ARMOR"
+ Buy: 90000
+ Sell: 45000
+ Weight: 1300
+ Def: 19
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 90
+ Refine: false
+ ViewSprite: 877
+ OnEquipScript: <"
+ callfunc "RequireStat", bStr, 70, EQI_HEAD_TOP;
+ callfunc "RequireStat", bVit, 50, EQI_HEAD_TOP;
+ callfunc "RequireStat", bLuk, 50, EQI_HEAD_TOP;
+ ">
+ Script: <"
+ bonus bMatkRate, -14;
+ // FIXME Maybe this works? Or maybe not and need a timer.
+ bonus bAtkRange, 1-readbattleparam(getcharid(3), UDT_ATKRANGE);
+ bonus bDoubleAddRate, 20;
+ bonus bStr, 10;
+ bonus bCritical, 15;
+ bonus bAspdRate, 10;
+ bonus bDef2Rate, -39;
+ bonus bHit, -15;
+ ">
+},
+{
+ Id: 882
+ AegisName: "RedEggshellHat"
+ Name: "RedEggshellHat"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 9
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 882
+},
+{
+ Id: 883
+ AegisName: "BlueEggshellHat"
+ Name: "BlueEggshellHat"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 9
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 883
+},
+{
+ Id: 884
+ AegisName: "YellowEggshellHat"
+ Name: "YellowEggshellHat"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 9
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 884
+},
+{
+ Id: 885
+ AegisName: "GreenEggshellHat"
+ Name: "GreenEggshellHat"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 9
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 885
+},
+{
+ Id: 886
+ AegisName: "OrangeEggshellHat"
+ Name: "OrangeEggshellHat"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 9
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 886
+},
+{
+ Id: 887
+ AegisName: "DarkEggshellHat"
+ Name: "DarkEggshellHat"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 9
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 887
+},
+{
+ Id: 888
+ AegisName: "MagicGMTopHat"
+ Name: "MagicGMTopHat"
+ Type: "IT_ARMOR"
+ Buy: 4200
+ Sell: 1900
+ Weight: 30
+ Def: 60
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 888
+ Nouse: {
+ override: 50
+ }
+ Script: <"
+ bonus bMaxHP, 31000;
+ bonus bFlee, -200;
+ bonus bHPrecovRate, -400;
+ bonus bCriticalDef, 250;
+ bonus bMdef, 89;
+ bonus bMatkRate, 2;
+ ">
+},
+{
+ Id: 889
+ AegisName: "MurdererCrown"
+ Name: "MurdererCrown"
+ Type: "IT_ARMOR"
+ Buy: 75000
+ Sell: 12000
+ Weight: 240
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 889
+},
+{
+ Id: 890
+ AegisName: "BeanieCopter"
+ Name: "BeanieCopter"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 2000
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 890
+},
+{
+ Id: 897
+ AegisName: "RedRoseHat"
+ Name: "RedRoseHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 1000
+ Weight: 0
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 897
+},
+{
+ Id: 898
+ AegisName: "WhiteRoseHat"
+ Name: "WhiteRoseHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 1000
+ Weight: 0
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 898
+},
+{
+ Id: 899
+ AegisName: "PinkRoseHat"
+ Name: "PinkRoseHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 1000
+ Weight: 0
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 899
+},
+{
+ Id: 900
+ AegisName: "YellowRoseHat"
+ Name: "YellowRoseHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 1000
+ Weight: 0
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 900
+},
+{
+ Id: 901
+ AegisName: "OrangeRoseHat"
+ Name: "OrangeRoseHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 1000
+ Weight: 0
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 901
+},
+{
+ Id: 902
+ AegisName: "BlueRoseHat"
+ Name: "BlueRoseHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 1000
+ Weight: 0
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 902
+},
+{
+ Id: 905
+ AegisName: "BucketHat"
+ Name: "BucketHat"
+ Type: "IT_ARMOR"
+ Buy: 1600
+ Sell: 800
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 905
+},
+{
+ Id: 1173
+ AegisName: "TamOShanter"
+ Name: "TamOShanter"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 500
+ Weight: 20
+ Def: 9
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1173
+},
+{
+ Id: 1174
+ AegisName: "CashiersShade"
+ Name: "CashiersShade"
+ Type: "IT_ARMOR"
+ Buy: 4000
+ Sell: 500
+ Weight: 15
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1174
+},
+{
+ Id: 1175
+ AegisName: "AutumnMask"
+ Name: "AutumnMask"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 500
+ Weight: 10
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1175
+},
+{
+ Id: 1190
+ AegisName: "NutcrackerHat"
+ Name: "NutcrackerHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1190
+},
+{
+ Id: 1196
+ AegisName: "Beret"
+ Name: "Beret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1196
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 1203
+ AegisName: "RangerHat"
+ Name: "RangerHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1203
+},
+{
+ Id: 1204
+ AegisName: "AntlerHat"
+ Name: "AntlerHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 15
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1204
+},
+{
+ Id: 1205
+ AegisName: "ChristmasTreeHat"
+ Name: "ChristmasTreeHat"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1205
+},
+{
+ Id: 1206
+ AegisName: "SantaBeardHat"
+ Name: "SantaBeardHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1206
+},
+{
+ Id: 1214
+ AegisName: "BunnyEars"
+ Name: "BunnyEars"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2000
+ Weight: 20
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1214
+},
+{
+ Id: 1216
+ AegisName: "MoubooHead"
+ Name: "MoubooHead"
+ Type: "IT_ARMOR"
+ Buy: 10
+ Sell: 1
+ Weight: 80
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1216
+},
+{
+ Id: 1217
+ AegisName: "CatEars"
+ Name: "CatEars"
+ Type: "IT_ARMOR"
+ Buy: 100
+ Sell: 50
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1217
+ Script: <"
+ bonus bAgi, 3;
+ ">
+},
+{
+ Id: 1218
+ AegisName: "PaperBag"
+ Name: "PaperBag"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 5
+ Weight: 10
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1218
+ Script: <"
+ bonus bAgi, -1;
+ ">
+},
+{
+ Id: 1219
+ AegisName: "MoubootaurHead"
+ Name: "MoubootaurHead"
+ Type: "IT_ARMOR"
+ Buy: 10
+ Sell: 1
+ Weight: 80
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1219
+ Nouse: {
+ override: 1
+ }
+},
+{
+ Id: 1220
+ AegisName: "BunchOfParsley"
+ Name: "BunchOfParsley"
+ Type: "IT_ARMOR"
+ Buy: 3
+ Sell: 1
+ Weight: 1
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1220
+ Script: <"
+ bonus bDeaf, 1; // FIXME SC_SILENCE or Manner = 0 or whatever
+ ">
+},
+{
+ Id: 1221
+ AegisName: "SkullMask"
+ Name: "SkullMask"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 150
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1221
+},
+{
+ Id: 1242
+ AegisName: "SnowGoggles"
+ Name: "SnowGoggles"
+ Type: "IT_ARMOR"
+ Buy: 7500
+ Sell: 3750
+ Weight: 10
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1242
+},
+{
+ Id: 1247
+ AegisName: "HeartGlasses"
+ Name: "HeartGlasses"
+ Type: "IT_ARMOR"
+ Buy: 7500
+ Sell: 3750
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1247
+},
+{
+ Id: 1255
+ AegisName: "RabbitEars"
+ Name: "RabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1255
+},
+{
+ Id: 1256
+ AegisName: "EggshellHat"
+ Name: "EggshellHat"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 12
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1256
+ Script: <"
+ bonus bAgi, -1;
+ ">
+},
+{
+ Id: 1275
+ AegisName: "ReadingGlasses"
+ Name: "ReadingGlasses"
+ Type: "IT_ARMOR"
+ Buy: 7500
+ Sell: 3750
+ Weight: 12
+ Def: 0
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1275
+ Script: <"
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 1276
+ AegisName: "OperaMask"
+ Name: "OperaMask"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1276
+},
+{
+ Id: 1277
+ AegisName: "JesterMask"
+ Name: "JesterMask"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1277
+},
+{
+ Id: 1278
+ AegisName: "WitchHat"
+ Name: "WitchHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1278
+ Script: <"
+ bonus bMatkRate, 2;
+ ">
+},
+{
+ Id: 1279
+ AegisName: "GoblinMask"
+ Name: "GoblinMask"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 1279
+},
+{
+ Id: 2130
+ AegisName: "RedDesertHat"
+ Name: "RedDesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2130
+},
+{
+ Id: 2131
+ AegisName: "GreenDesertHat"
+ Name: "GreenDesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2131
+},
+{
+ Id: 2132
+ AegisName: "DarkBlueDesertHat"
+ Name: "DarkBlueDesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2132
+},
+{
+ Id: 2133
+ AegisName: "YellowDesertHat"
+ Name: "YellowDesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2133
+},
+{
+ Id: 2134
+ AegisName: "LightBlueDesertHat"
+ Name: "LightBlueDesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2134
+},
+{
+ Id: 2135
+ AegisName: "PinkDesertHat"
+ Name: "PinkDesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2135
+},
+{
+ Id: 2136
+ AegisName: "BlackDesertHat"
+ Name: "BlackDesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2136
+},
+{
+ Id: 2137
+ AegisName: "OrangeDesertHat"
+ Name: "OrangeDesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2137
+},
+{
+ Id: 2138
+ AegisName: "PurpleDesertHat"
+ Name: "PurpleDesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2138
+},
+{
+ Id: 2139
+ AegisName: "DarkGreenDesertHat"
+ Name: "DarkGreenDesertHat"
+ Type: "IT_ARMOR"
+ Buy: 2400
+ Sell: 600
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2139
+},
+{
+ Id: 2140
+ AegisName: "RedCottonHeadband"
+ Name: "RedCottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2140
+},
+{
+ Id: 2141
+ AegisName: "GreenCottonHeadband"
+ Name: "GreenCottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2141
+},
+{
+ Id: 2142
+ AegisName: "DarkBlueCottonHeadband"
+ Name: "DarkBlueCottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2142
+},
+{
+ Id: 2143
+ AegisName: "YellowCottonHeadband"
+ Name: "YellowCottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2143
+},
+{
+ Id: 2144
+ AegisName: "LightBlueCottonHeadband"
+ Name: "LightBlueCottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2144
+},
+{
+ Id: 2145
+ AegisName: "PinkCottonHeadband"
+ Name: "PinkCottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2145
+},
+{
+ Id: 2146
+ AegisName: "BlackCottonHeadband"
+ Name: "BlackCottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2146
+},
+{
+ Id: 2147
+ AegisName: "OrangeCottonHeadband"
+ Name: "OrangeCottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2147
+},
+{
+ Id: 2148
+ AegisName: "PurpleCottonHeadband"
+ Name: "PurpleCottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2148
+},
+{
+ Id: 2149
+ AegisName: "DarkGreenCottonHeadband"
+ Name: "DarkGreenCottonHeadband"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 500
+ Weight: 5
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2149
+},
+{
+ Id: 2190
+ AegisName: "RedRabbitEars"
+ Name: "RedRabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2190
+},
+{
+ Id: 2191
+ AegisName: "GreenRabbitEars"
+ Name: "GreenRabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2191
+},
+{
+ Id: 2192
+ AegisName: "DarkBlueRabbitEars"
+ Name: "DarkBlueRabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2192
+},
+{
+ Id: 2193
+ AegisName: "YellowRabbitEars"
+ Name: "YellowRabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2193
+},
+{
+ Id: 2194
+ AegisName: "LightBlueRabbitEars"
+ Name: "LightBlueRabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2194
+},
+{
+ Id: 2195
+ AegisName: "PinkRabbitEars"
+ Name: "PinkRabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2195
+},
+{
+ Id: 2196
+ AegisName: "BlackRabbitEars"
+ Name: "BlackRabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2196
+},
+{
+ Id: 2197
+ AegisName: "OrangeRabbitEars"
+ Name: "OrangeRabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2197
+},
+{
+ Id: 2198
+ AegisName: "PurpleRabbitEars"
+ Name: "PurpleRabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2198
+},
+{
+ Id: 2199
+ AegisName: "DarkGreenRabbitEars"
+ Name: "DarkGreenRabbitEars"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 3500
+ Weight: 15
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2199
+},
+{
+ Id: 2200
+ AegisName: "RedWizardHat"
+ Name: "RedWizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2200
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 2201
+ AegisName: "GreenWizardHat"
+ Name: "GreenWizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2201
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 2202
+ AegisName: "DarkBlueWizardHat"
+ Name: "DarkBlueWizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2202
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 2203
+ AegisName: "YellowWizardHat"
+ Name: "YellowWizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2203
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 2204
+ AegisName: "LightBlueWizardHat"
+ Name: "LightBlueWizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2204
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 2205
+ AegisName: "PinkWizardHat"
+ Name: "PinkWizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2205
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 2206
+ AegisName: "BlackWizardHat"
+ Name: "BlackWizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2206
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 2207
+ AegisName: "OrangeWizardHat"
+ Name: "OrangeWizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2207
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 2208
+ AegisName: "PurpleWizardHat"
+ Name: "PurpleWizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2208
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 2209
+ AegisName: "DarkGreenWizardHat"
+ Name: "DarkGreenWizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2209
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 2210
+ AegisName: "RedBowlerHat"
+ Name: "RedBowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2210
+},
+{
+ Id: 2211
+ AegisName: "GreenBowlerHat"
+ Name: "GreenBowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2211
+},
+{
+ Id: 2212
+ AegisName: "DarkBlueBowlerHat"
+ Name: "DarkBlueBowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2212
+},
+{
+ Id: 2213
+ AegisName: "YellowBowlerHat"
+ Name: "YellowBowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2213
+},
+{
+ Id: 2214
+ AegisName: "LightBlueBowlerHat"
+ Name: "LightBlueBowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2214
+},
+{
+ Id: 2215
+ AegisName: "PinkBowlerHat"
+ Name: "PinkBowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2215
+},
+{
+ Id: 2216
+ AegisName: "BlackBowlerHat"
+ Name: "BlackBowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2216
+ Script: <"
+ bonus bMatkRate, -3;
+ ">
+},
+{
+ Id: 2217
+ AegisName: "OrangeBowlerHat"
+ Name: "OrangeBowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2217
+},
+{
+ Id: 2218
+ AegisName: "PurpleBowlerHat"
+ Name: "PurpleBowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2218
+},
+{
+ Id: 2219
+ AegisName: "DarkGreenBowlerHat"
+ Name: "DarkGreenBowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2219
+},
+{
+ Id: 2230
+ AegisName: "RedBowlerHatBrown"
+ Name: "RedBowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2230
+},
+{
+ Id: 2231
+ AegisName: "GreenBowlerHatBrown"
+ Name: "GreenBowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2231
+},
+{
+ Id: 2232
+ AegisName: "DarkBlueBowlerHatBrown"
+ Name: "DarkBlueBowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2232
+},
+{
+ Id: 2233
+ AegisName: "YellowBowlerHatBrown"
+ Name: "YellowBowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2233
+},
+{
+ Id: 2234
+ AegisName: "LightBlueBowlerHatBrown"
+ Name: "LightBlueBowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2234
+},
+{
+ Id: 2235
+ AegisName: "PinkBowlerHatBrown"
+ Name: "PinkBowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2235
+},
+{
+ Id: 2236
+ AegisName: "BlackBowlerHatBrown"
+ Name: "BlackBowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2236
+},
+{
+ Id: 2237
+ AegisName: "OrangeBowlerHatBrown"
+ Name: "OrangeBowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2237
+},
+{
+ Id: 2238
+ AegisName: "PurpleBowlerHatBrown"
+ Name: "PurpleBowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2238
+},
+{
+ Id: 2239
+ AegisName: "DarkGreenBowlerHatBrown"
+ Name: "DarkGreenBowlerHatBrown"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2239
+},
+{
+ Id: 2260
+ AegisName: "RedBeret"
+ Name: "RedBeret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2260
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 2261
+ AegisName: "GreenBeret"
+ Name: "GreenBeret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2261
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 2262
+ AegisName: "DarkBlueBeret"
+ Name: "DarkBlueBeret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2262
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 2263
+ AegisName: "YellowBeret"
+ Name: "YellowBeret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2263
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 2264
+ AegisName: "LightBlueBeret"
+ Name: "LightBlueBeret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2264
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 2265
+ AegisName: "PinkBeret"
+ Name: "PinkBeret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2265
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 2266
+ AegisName: "BlackBeret"
+ Name: "BlackBeret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2266
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 2267
+ AegisName: "OrangeBeret"
+ Name: "OrangeBeret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2267
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 2268
+ AegisName: "PurpleBeret"
+ Name: "PurpleBeret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2268
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 2269
+ AegisName: "DarkGreenBeret"
+ Name: "DarkGreenBeret"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2269
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Id: 2270
+ AegisName: "BlinkingEvil"
+ Name: "BlinkingEvil"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 50
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2270
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bMdef, 5;
+ ">
+},
+{
+ Id: 2271
+ AegisName: "BlinkingEvilRed"
+ Name: "BlinkingEvilRed"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 50
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2271
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bMdef, 5;
+ ">
+},
+{
+ Id: 2272
+ AegisName: "BlinkingEvilBlue"
+ Name: "BlinkingEvilBlue"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 50
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2272
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bMdef, 5;
+ ">
+},
+{
+ Id: 2273
+ AegisName: "BlinkingEvilPink"
+ Name: "BlinkingEvilPink"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 50
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2273
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bMdef, 5;
+ ">
+},
+{
+ Id: 2274
+ AegisName: "BlinkingEvilYellow"
+ Name: "BlinkingEvilYellow"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 50
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 2274
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bMdef, 5;
+ ">
+},
+{
+ Id: 4020
+ AegisName: "CandleHelmet"
+ Name: "CandleHelmet"
+ Type: "IT_ARMOR"
+ Buy: 20000
+ Sell: 2000
+ Weight: 450
+ Def: 16
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 4020
+ Script: <"
+ bonus bMatkRate, -6;
+ bonus bInt, 1;
+ bonus bAgi, -1;
+ ">
+},
+{
+ Id: 4027
+ AegisName: "YetiMask"
+ Name: "YetiMask"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 10
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 4027
+ Script: <"
+ bonus bMatkRate, -2;
+ ">
+},
+{
+ Id: 4028
+ AegisName: "WizardHat"
+ Name: "WizardHat"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 4028
+ Script: <"
+ bonus bMatkRate, 1;
+ bonus bInt, 3;
+ ">
+},
+{
+ Id: 4030
+ AegisName: "BowlerHat"
+ Name: "BowlerHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 4030
+},
+{
+ Id: 4031
+ AegisName: "Monocle"
+ Name: "Monocle"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 4031
+ Script: <"
+ bonus bDex, 1;
+ bonus bLuk, 1;
+ bonus bCritical, 10;
+ ">
+},
+{
+ Id: 4032
+ AegisName: "PanHat"
+ Name: "PanHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 400
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 4032
+ Script: <"
+ bonus bMatkRate, -4;
+ ">
+},
+{
+ Id: 4033
+ AegisName: "ChefHat"
+ Name: "ChefHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 30
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 4033
+},
+{
+ Id: 4042
+ AegisName: "RedNose"
+ Name: "RedNose"
+ Type: "IT_ARMOR"
+ Buy: 4000
+ Sell: 1000
+ Weight: 4
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 4042
+},
+{
+ Id: 5128
+ AegisName: "DarkHelm"
+ Name: "DarkHelm"
+ Type: "IT_ARMOR"
+ Buy: 50000
+ Sell: 10000
+ Weight: 800
+ Def: 19
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5128
+ Script: <"
+ bonus bMatkRate, -22;
+ bonus bMaxHPrate, 10;
+ bonus bInt, -readparam(bInt);
+ ">
+},
+{
+ Id: 5129
+ AegisName: "UnderworldMask"
+ Name: "UnderworldMask"
+ Type: "IT_ARMOR"
+ Buy: 50000
+ Sell: 10000
+ Weight: 100
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5129
+ Script: <"
+ bonus bAtkRange, 2;
+ bonus bInt, -readparam(bInt);
+ bonus bAgi, 2;
+ bonus bDex, 2;
+ ">
+},
+{
+ Id: 5130
+ AegisName: "Phylactery"
+ Name: "Phylactery"
+ Type: "IT_ARMOR"
+ Buy: 50000
+ Sell: 10000
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5130
+ Script: <"
+ bonus bAspdRate, 15;
+ bonus bDex, -(readparam(bDex)/2);
+ ">
+},
+{
+ Id: 5200
+ AegisName: "PointyWitchHat"
+ Name: "PointyWitchHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5200
+ Script: <"
+ bonus bMatkRate, 2;
+ ">
+},
+{
+ Id: 5201
+ AegisName: "Pipe"
+ Name: "Pipe"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ WeaponLv: 0
+ EquipLv: 18
+ Refine: false
+ ViewSprite: 5201
+ Script: <"
+ bonus bDex, 1;
+ bonus bLuk, 1;
+ bonus bCritical, 10;
+ callfunc "DrugItem";
+ ">
+},
+{
+ Id: 5202
+ AegisName: "PilotHat"
+ Name: "PilotHat"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 30
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5202
+},
+{
+ Id: 5203
+ AegisName: "MoonshroomHat"
+ Name: "MoonshroomHat"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 1500
+ Weight: 30
+ Def: 15
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5203
+ Script: <"
+ bonus bMatkRate, 1;
+ ">
+},
+{
+ Id: 5204
+ AegisName: "CarbonGasMask"
+ Name: "CarbonGasMask"
+ Type: "IT_ARMOR"
+ Buy: 2500
+ Sell: 1250
+ Weight: 50
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5204
+},
+{
+ Id: 5205
+ AegisName: "EskimoHat"
+ Name: "EskimoHat"
+ Type: "IT_ARMOR"
+ Buy: 7500
+ Sell: 3750
+ Weight: 10
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5205
+},
+{
+ Id: 5209
+ AegisName: "TerraniteHead"
+ Name: "TerraniteHead"
+ Type: "IT_ARMOR"
+ Buy: 30000
+ Sell: 3000
+ Weight: 500
+ Def: 16
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5209
+ Script: <"
+ bonus bMatkRate, -6;
+ bonus bMdef, 5;
+ bonus bAgi, 3;
+ bonus bDex, 1;
+ ">
+},
+{
+ Id: 5226
+ AegisName: "GroovyHat"
+ Name: "GroovyHat"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 1500
+ Weight: 20
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5226
+},
+{
+ Id: 5227
+ AegisName: "JazzyHat"
+ Name: "JazzyHat"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 1500
+ Weight: 20
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5227
+},
+{
+ Id: 5228
+ AegisName: "ChicSantaHat"
+ Name: "ChicSantaHat"
+ Type: "IT_ARMOR"
+ Buy: 400
+ Sell: 200
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5228
+},
+{
+ Id: 5229
+ AegisName: "ScentedCandleHelmet"
+ Name: "ScentedCandleHelmet"
+ Type: "IT_ARMOR"
+ Buy: 20000
+ Sell: 1
+ Weight: 450
+ Def: 10
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5229
+ Script: <"
+ bonus bInt, 2;
+ addtimer 1, "ScentedCandle::OnEquip";
+ ">
+},
+{
+ Id: 5230
+ AegisName: "AnniversaryHat"
+ Name: "AnniversaryHat"
+ Type: "IT_ARMOR"
+ Buy: 100000
+ Sell: 1
+ Weight: 100
+ Def: 12
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5230
+ Script: <"
+ bonus bInt, 2;
+ ">
+},
+{
+ Id: 5231
+ AegisName: "RedPresentHat"
+ Name: "RedPresentHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 1
+ Weight: 60
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5231
+},
+{
+ Id: 5232
+ AegisName: "GreenPresentHat"
+ Name: "GreenPresentHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 1
+ Weight: 60
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5232
+},
+{
+ Id: 5233
+ AegisName: "BluePresentHat"
+ Name: "BluePresentHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 1
+ Weight: 60
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5233
+},
+{
+ Id: 5234
+ AegisName: "YellowPresentHat"
+ Name: "YellowPresentHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 1
+ Weight: 60
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5234
+},
+{
+ Id: 5238
+ AegisName: "AFKCap"
+ Name: "AFKCap"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 1
+ Weight: 60
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5238
+},
+{
+ Id: 5239
+ AegisName: "Aureole"
+ Name: "Aureole"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 1
+ Weight: 60
+ Def: 0
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5239
+ Script: <"
+ bonus bFlee, 50;
+ ">
+},
+{
+ Id: 5240
+ AegisName: "SmileyCap"
+ Name: "SmileyCap"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 1
+ Weight: 60
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5240
+},
+{
+ Id: 5241
+ AegisName: "RedShades"
+ Name: "RedShades"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5241
+},
+{
+ Id: 5242
+ AegisName: "GreenShades"
+ Name: "GreenShades"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5242
+},
+{
+ Id: 5243
+ AegisName: "DarkBlueShades"
+ Name: "DarkBlueShades"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5243
+},
+{
+ Id: 5244
+ AegisName: "YellowShades"
+ Name: "YellowShades"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5244
+},
+{
+ Id: 5245
+ AegisName: "LightBlueShades"
+ Name: "LightBlueShades"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5245
+},
+{
+ Id: 5246
+ AegisName: "PinkShades"
+ Name: "PinkShades"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5246
+},
+{
+ Id: 5247
+ AegisName: "BlackShades"
+ Name: "BlackShades"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5247
+},
+{
+ Id: 5248
+ AegisName: "OrangeShades"
+ Name: "OrangeShades"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5248
+},
+{
+ Id: 5249
+ AegisName: "PurpleShades"
+ Name: "PurpleShades"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5249
+},
+{
+ Id: 5250
+ AegisName: "DarkGreenShades"
+ Name: "DarkGreenShades"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5250
+},
+{
+ Id: 5255
+ AegisName: "PVPCap"
+ Name: "PVPCap"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 60
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5255
+},
+{
+ Id: 5257
+ AegisName: "GoldenPVPCap"
+ Name: "GoldenPVPCap"
+ Type: "IT_ARMOR"
+ Buy: 500
+ Sell: 100
+ Weight: 60
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5257
+},
+{
+ Id: 5258
+ AegisName: "BlinkingHocus"
+ Name: "BlinkingHocus"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 400
+ Def: 0
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5258
+},
+{
+ Id: 5259
+ AegisName: "BlinkingEvilHalloween"
+ Name: "BlinkingEvilHalloween"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 5000
+ Weight: 50
+ Def: 13
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5259
+ Script: <"
+ bonus bMdef, 5;
+ ">
+},
+{
+ Id: 5262
+ AegisName: "MovieCap"
+ Name: "MovieCap"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5262
+},
+{
+ Id: 5264
+ AegisName: "BlueWolfHelmet"
+ Name: "BlueWolfHelmet"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5264
+},
+{
+ Id: 5266
+ AegisName: "CloverHat"
+ Name: "CloverHat"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 50
+ Def: 3
+ Slots: 0
+ Loc: "EQP_HEAD_TOP"
+ Refine: false
+ ViewSprite: 5266
+ Script: <"
+ bonus bLuk, 1;
+ ">
+},
+{
+ Id: 501
+ AegisName: "CactusDrink"
+ Name: "CactusDrink"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 25
+ Weight: 4
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 501
+ Script: <"
+ callfunc "itheal", 15, 0;
+ ">
+},
+{
+ Id: 502
+ AegisName: "CactusPotion"
+ Name: "CactusPotion"
+ Type: "IT_USABLE"
+ Buy: 70
+ Sell: 35
+ Weight: 7
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 502
+ Script: <"
+ callfunc "itheal", 25, 0;
+ ">
+},
+{
+ Id: 506
+ AegisName: "CandyCane"
+ Name: "CandyCane"
+ Type: "IT_USABLE"
+ Buy: 20
+ Sell: 10
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 506
+ Script: <"
+ callfunc "itheal", 5, 0;
+ ">
+},
+{
+ Id: 508
+ AegisName: "XmasCake"
+ Name: "XmasCake"
+ Type: "IT_USABLE"
+ Buy: 70
+ Sell: 10
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 508
+ Script: <"
+ callfunc "itheal", 10, 0;
+ ">
+},
+{
+ Id: 509
+ AegisName: "ChocolateBar"
+ Name: "ChocolateBar"
+ Type: "IT_USABLE"
+ Buy: 60
+ Sell: 20
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 509
+ Script: <"
+ callfunc "itheal", 20, 0;
+ ">
+},
+{
+ Id: 510
+ AegisName: "Candy"
+ Name: "Candy"
+ Type: "IT_USABLE"
+ Buy: 20
+ Sell: 10
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 510
+ Script: <"
+ callfunc "itheal", 5, 0;
+ ">
+},
+{
+ Id: 512
+ AegisName: "GingerBreadMan"
+ Name: "GingerBreadMan"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 25
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 512
+ Script: <"
+ callfunc "itheal", 25, 0;
+ ">
+},
+{
+ Id: 513
+ AegisName: "Cake"
+ Name: "Cake"
+ Type: "IT_USABLE"
+ Buy: 30
+ Sell: 15
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 513
+ Script: <"
+ callfunc "itheal", 15, 0;
+ ">
+},
+{
+ Id: 514
+ AegisName: "XmasCandyCane"
+ Name: "XmasCandyCane"
+ Type: "IT_USABLE"
+ Buy: 30
+ Sell: 15
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 514
+ Script: <"
+ callfunc "itheal", 10, 0;
+ ">
+},
+{
+ Id: 519
+ AegisName: "CherryCake"
+ Name: "CherryCake"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 519
+ Script: <"
+ callfunc "itheal", 35, 0;
+ ">
+},
+{
+ Id: 520
+ AegisName: "EasterEgg"
+ Name: "EasterEgg"
+ Type: "IT_USABLE"
+ Buy: 200
+ Sell: 100
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 520
+ Script: <"
+ callfunc "itheal", 100, 0;
+ ">
+},
+{
+ Id: 527
+ AegisName: "Milk"
+ Name: "Milk"
+ Type: "IT_USABLE"
+ Buy: 300
+ Sell: 150
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 527
+ Script: <"
+ callfunc "itheal", 150, 0;
+ ">
+},
+{
+ Id: 533
+ AegisName: "RoastedMaggot"
+ Name: "RoastedMaggot"
+ Type: "IT_USABLE"
+ Buy: 110
+ Sell: 55
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 533
+ Script: <"
+ callfunc "itheal", 150, 0;
+ ">
+},
+{
+ Id: 534
+ AegisName: "OrangeCupcake"
+ Name: "OrangeCupcake"
+ Type: "IT_USABLE"
+ Buy: 90
+ Sell: 45
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 534
+ Script: <"
+ callfunc "itheal", 100, 0;
+ ">
+},
+{
+ Id: 535
+ AegisName: "RedApple"
+ Name: "RedApple"
+ Type: "IT_USABLE"
+ Buy: 25
+ Sell: 6
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 535
+ Script: <"
+ callfunc "itheal", 50, 0;
+ ">
+},
+{
+ Id: 539
+ AegisName: "Beer"
+ Name: "Beer"
+ Type: "IT_USABLE"
+ Buy: 175
+ Sell: 87
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 539
+ Script: <"
+ callfunc "itheal", 200, 5;
+ ">
+},
+{
+ Id: 541
+ AegisName: "BottleOfWater"
+ Name: "BottleOfWater"
+ Type: "IT_USABLE"
+ Buy: 200
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 541
+ Script: <"
+ callfunc "itheal", 250, 0;
+ getitem 540, 1;
+ ">
+},
+{
+ Id: 562
+ AegisName: "ChickenLeg"
+ Name: "ChickenLeg"
+ Type: "IT_USABLE"
+ Buy: 250
+ Sell: 125
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 562
+ Script: <"
+ callfunc "itheal", 500, 0;
+ ">
+},
+{
+ Id: 565
+ AegisName: "PinkPetal"
+ Name: "PinkPetal"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 565
+ Script: <"
+ callfunc "itheal", 50, 0;
+ ">
+},
+{
+ Id: 566
+ AegisName: "SmallMushroom"
+ Name: "SmallMushroom"
+ Type: "IT_USABLE"
+ Buy: 125
+ Sell: 50
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 566
+ Script: <"
+ callfunc "itheal", 50, 0;
+ ">
+},
+{
+ Id: 567
+ AegisName: "IronPotion"
+ Name: "IronPotion"
+ Type: "IT_USABLE"
+ Buy: 500
+ Sell: 250
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 567
+ Script: <"
+ callfunc("SC_Bonus", 60, SC_PLUSATTACKPOWER, 60);
+ ">
+},
+{
+ Id: 568
+ AegisName: "ConcentrationPotion"
+ Name: "ConcentrationPotion"
+ Type: "IT_USABLE"
+ Buy: 500
+ Sell: 250
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 568
+ Script: <"
+ callfunc("SC_Bonus", 60, SC_ATTHASTE_POTION1, 30);
+ ">
+},
+{
+ Id: 657
+ AegisName: "Orange"
+ Name: "Orange"
+ Type: "IT_USABLE"
+ Buy: 40
+ Sell: 10
+ Weight: 7
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 657
+ Script: <"
+ callfunc "itheal", 60, 0;
+ ">
+},
+{
+ Id: 676
+ AegisName: "Steak"
+ Name: "Steak"
+ Type: "IT_USABLE"
+ Buy: 275
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 676
+ Script: <"
+ callfunc "itheal", 250, 0;
+ ">
+},
+{
+ Id: 684
+ AegisName: "TinyHealingPotion"
+ Name: "TinyHealingPotion"
+ Type: "IT_USABLE"
+ Buy: 25
+ Sell: 12
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 684
+ Script: <"
+ callfunc "itheal", 100, 0;
+ ">
+},
+{
+ Id: 685
+ AegisName: "SmallHealingPotion"
+ Name: "SmallHealingPotion"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 25
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 685
+ Script: <"
+ callfunc "itheal", 200, 0;
+ ">
+},
+{
+ Id: 686
+ AegisName: "MediumHealingPotion"
+ Name: "MediumHealingPotion"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 15
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 686
+ Script: <"
+ callfunc "itheal", 400, 0;
+ ">
+},
+{
+ Id: 687
+ AegisName: "LargeHealingPotion"
+ Name: "LargeHealingPotion"
+ Type: "IT_USABLE"
+ Buy: 200
+ Sell: 100
+ Weight: 25
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 687
+ Script: <"
+ callfunc "itheal", 800, 0;
+ ">
+},
+{
+ Id: 705
+ AegisName: "ManaPotion"
+ Name: "ManaPotion"
+ Type: "IT_USABLE"
+ Buy: 2000
+ Sell: 300
+ Weight: 50
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 705
+ Script: <"
+ callfunc "itheal", 0, 10;
+ callfunc "MagicGainBasic";
+ ">
+},
+{
+ Id: 714
+ AegisName: "SnakeEgg"
+ Name: "SnakeEgg"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 25
+ Weight: 4
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 714
+ Script: <"
+ callfunc "itheal", 30, 0;
+ ">
+},
+{
+ Id: 715
+ AegisName: "MountainSnakeEgg"
+ Name: "MountainSnakeEgg"
+ Type: "IT_USABLE"
+ Buy: 80
+ Sell: 40
+ Weight: 4
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 715
+ Script: <"
+ callfunc "itheal", 40, 0;
+ ">
+},
+{
+ Id: 716
+ AegisName: "GrassSnakeEgg"
+ Name: "GrassSnakeEgg"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 4
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 716
+ Script: <"
+ callfunc "itheal", 50, 0;
+ ">
+},
+{
+ Id: 717
+ AegisName: "CaveSnakeEgg"
+ Name: "CaveSnakeEgg"
+ Type: "IT_USABLE"
+ Buy: 60
+ Sell: 30
+ Weight: 4
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 717
+ Script: <"
+ callfunc "itheal", 20, 0;
+ ">
+},
+{
+ Id: 719
+ AegisName: "GreenApple"
+ Name: "GreenApple"
+ Type: "IT_USABLE"
+ Buy: 20
+ Sell: 5
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 719
+ Script: <"
+ callfunc "itheal", 45, 0;
+ ">
+},
+{
+ Id: 733
+ AegisName: "PurificationPotion"
+ Name: "PurificationPotion"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 15
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 733
+ Script: <"
+ callfunc "usePurificationPotion";
+ ">
+},
+{
+ Id: 736
+ AegisName: "WhiteCake"
+ Name: "WhiteCake"
+ Type: "IT_USABLE"
+ Buy: 500
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 736
+ Script: <"
+ callfunc "itheal", 10, 0;
+ ">
+},
+{
+ Id: 737
+ AegisName: "ChocolateCake"
+ Name: "ChocolateCake"
+ Type: "IT_USABLE"
+ Buy: 550
+ Sell: 125
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 737
+ Script: <"
+ callfunc "itheal", 11, 0;
+ ">
+},
+{
+ Id: 738
+ AegisName: "OrangeCake"
+ Name: "OrangeCake"
+ Type: "IT_USABLE"
+ Buy: 600
+ Sell: 150
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 738
+ Script: <"
+ callfunc "itheal", 12, 0;
+ ">
+},
+{
+ Id: 739
+ AegisName: "AppleCake"
+ Name: "AppleCake"
+ Type: "IT_USABLE"
+ Buy: 600
+ Sell: 150
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 739
+ Script: <"
+ callfunc "itheal", 12, 0;
+ ">
+},
+{
+ Id: 743
+ AegisName: "Acorn"
+ Name: "Acorn"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 10
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 743
+ Script: <"
+ callfunc "itheal", 3, 0;
+ ">
+},
+{
+ Id: 744
+ AegisName: "DilutedConcentrationPot"
+ Name: "DilutedConcentrationPot"
+ Type: "IT_USABLE"
+ Buy: 250
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 744
+ Script: <"
+ callfunc("SC_Bonus", 30, SC_ATTHASTE_POTION1, 20);
+ ">
+},
+{
+ Id: 745
+ AegisName: "DarkConcentrationPotion"
+ Name: "DarkConcentrationPotion"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 25
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 745
+ Script: <"
+ callfunc("SC_Bonus", 10, SC_ATTHASTE_POTION1, 40);
+ callfunc("SC_Bonus", 50, SC_BLOODING, 1);
+ ">
+},
+{
+ Id: 747
+ AegisName: "LacedChocolateCake"
+ Name: "LacedChocolateCake"
+ Type: "IT_USABLE"
+ Buy: 550
+ Sell: 125
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 747
+ Script: <"
+ callfunc "itheal", 11, 0;
+ ">
+},
+{
+ Id: 748
+ AegisName: "LacedOrangeCupcake"
+ Name: "LacedOrangeCupcake"
+ Type: "IT_USABLE"
+ Buy: 90
+ Sell: 45
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 748
+ Script: <"
+ callfunc "itheal", 100, 0;
+ ">
+},
+{
+ Id: 750
+ AegisName: "SlowPoisonPotion"
+ Name: "SlowPoisonPotion"
+ Type: "IT_USABLE"
+ Buy: 500
+ Sell: 200
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 750
+ Script: <"
+ callfunc "itheal", 5, 0;
+ callfunc("SC_Bonus", 180, SC_SLOWPOISON, 100);
+ ">
+},
+{
+ Id: 784
+ AegisName: "ZombieNachos"
+ Name: "ZombieNachos"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 30
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 784
+ Script: <"
+ callfunc "itheal", 60, 0;
+ ">
+},
+{
+ Id: 785
+ AegisName: "LadyFingers"
+ Name: "LadyFingers"
+ Type: "IT_USABLE"
+ Buy: 70
+ Sell: 25
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 785
+ Script: <"
+ callfunc "itheal", 40, 0;
+ ">
+},
+{
+ Id: 786
+ AegisName: "JellAhh"
+ Name: "JellAhh"
+ Type: "IT_USABLE"
+ Buy: 80
+ Sell: 30
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 786
+ Script: <"
+ callfunc "itheal", 50, 0;
+ ">
+},
+{
+ Id: 787
+ AegisName: "Snapple"
+ Name: "Snapple"
+ Type: "IT_USABLE"
+ Buy: 110
+ Sell: 55
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 787
+ Script: <"
+ callfunc "itheal", 70, 0;
+ ">
+},
+{
+ Id: 788
+ AegisName: "BeetleJuice"
+ Name: "BeetleJuice"
+ Type: "IT_USABLE"
+ Buy: 80
+ Sell: 30
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 788
+ Script: <"
+ callfunc "itheal", 50, 0;
+ ">
+},
+{
+ Id: 789
+ AegisName: "GutBuster"
+ Name: "GutBuster"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 30
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 789
+ Script: <"
+ callfunc "itheal", 60, 0;
+ ">
+},
+{
+ Id: 790
+ AegisName: "BloodWine"
+ Name: "BloodWine"
+ Type: "IT_USABLE"
+ Buy: 150
+ Sell: 50
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 790
+ Script: <"
+ callfunc "itheal", 100, 0;
+ ">
+},
+{
+ Id: 808
+ AegisName: "HitchhikersTowel"
+ Name: "HitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 808
+ Script: <"
+ set @warpTowelName$, "HitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 809
+ AegisName: "WhiteHitchhikersTowel"
+ Name: "WhiteHitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 809
+ Script: <"
+ set @warpTowelName$, "WhiteHitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 810
+ AegisName: "RedHitchhikersTowel"
+ Name: "RedHitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 810
+ Script: <"
+ set @warpTowelName$, "RedHitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 811
+ AegisName: "GreenHitchhikersTowel"
+ Name: "GreenHitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 811
+ Script: <"
+ set @warpTowelName$, "GreenHitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 812
+ AegisName: "BlueHitchhikersTowel"
+ Name: "BlueHitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 812
+ Script: <"
+ set @warpTowelName$, "BlueHitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 813
+ AegisName: "YellowHitchhikersTowel"
+ Name: "YellowHitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 813
+ Script: <"
+ set @warpTowelName$, "YellowHitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 814
+ AegisName: "PurpleHitchhikersTowel"
+ Name: "PurpleHitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 814
+ Script: <"
+ set @warpTowelName$, "PurpleHitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 815
+ AegisName: "OrangeHitchhikersTowel"
+ Name: "OrangeHitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 815
+ Script: <"
+ set @warpTowelName$, "OrangeHitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 816
+ AegisName: "PinkHitchhikersTowel"
+ Name: "PinkHitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 816
+ Script: <"
+ set @warpTowelName$, "PinkHitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 817
+ AegisName: "TealHitchhikersTowel"
+ Name: "TealHitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 817
+ Script: <"
+ set @warpTowelName$, "TealHitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 818
+ AegisName: "LimeHitchhikersTowel"
+ Name: "LimeHitchhikersTowel"
+ Type: "IT_USABLE"
+ Buy: 0
+ Sell: 0
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 818
+ Script: <"
+ set @warpTowelName$, "LimeHitchhikersTowel";
+ callfunc "WarpTowel";
+ ">
+},
+{
+ Id: 825
+ AegisName: "TinyManaElixir"
+ Name: "TinyManaElixir"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 10
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 825
+ Script: <"
+ callfunc "itheal", 0, 25;
+ ">
+},
+{
+ Id: 826
+ AegisName: "SmallManaElixir"
+ Name: "SmallManaElixir"
+ Type: "IT_USABLE"
+ Buy: 200
+ Sell: 20
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 826
+ Script: <"
+ callfunc "itheal", 0, 50;
+ ">
+},
+{
+ Id: 827
+ AegisName: "MediumManaElixir"
+ Name: "MediumManaElixir"
+ Type: "IT_USABLE"
+ Buy: 400
+ Sell: 40
+ Weight: 15
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 827
+ Script: <"
+ callfunc "itheal", 0, 100;
+ ">
+},
+{
+ Id: 828
+ AegisName: "LargeManaElixir"
+ Name: "LargeManaElixir"
+ Type: "IT_USABLE"
+ Buy: 800
+ Sell: 80
+ Weight: 25
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 828
+ Script: <"
+ callfunc "itheal", 0, 250;
+ ">
+},
+{
+ Id: 838
+ AegisName: "CranberryLollipop"
+ Name: "CranberryLollipop"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 838
+ Script: <"
+ callfunc "itheal", 750, 0;
+ ">
+},
+{
+ Id: 839
+ AegisName: "GrapeLollipop"
+ Name: "GrapeLollipop"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 839
+ Script: <"
+ callfunc "itheal", 750, 0;
+ ">
+},
+{
+ Id: 840
+ AegisName: "OrangeLollipop"
+ Name: "OrangeLollipop"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 840
+ Script: <"
+ callfunc "itheal", 750, 0;
+ ">
+},
+{
+ Id: 1189
+ AegisName: "PollettEgg"
+ Name: "PollettEgg"
+ Type: "IT_USABLE"
+ Buy: 250
+ Sell: 25
+ Weight: 4
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1189
+ Script: <"
+ callfunc "itheal", 75, 10;
+ ">
+},
+{
+ Id: 1229
+ AegisName: "CaramelApple"
+ Name: "CaramelApple"
+ Type: "IT_USABLE"
+ Buy: 500
+ Sell: 75
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1229
+ Script: <"
+ callfunc "itheal", 1000, 0;
+ ">
+},
+{
+ Id: 1230
+ AegisName: "LollipopColor1"
+ Name: "LollipopColor1"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1230
+ Script: <"
+ callfunc "itheal", 800, 0;
+ ">
+},
+{
+ Id: 1231
+ AegisName: "LollipopColor2"
+ Name: "LollipopColor2"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1231
+ Script: <"
+ callfunc "itheal", 800, 0;
+ ">
+},
+{
+ Id: 1232
+ AegisName: "LollipopColor3"
+ Name: "LollipopColor3"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1232
+ Script: <"
+ callfunc "itheal", 800, 0;
+ ">
+},
+{
+ Id: 1248
+ AegisName: "Blueberries"
+ Name: "Blueberries"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 25
+ Weight: 6
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1248
+ Script: <"
+ callfunc "itheal", 200, 0;
+ ">
+},
+{
+ Id: 1250
+ AegisName: "Pear"
+ Name: "Pear"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 25
+ Weight: 7
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1250
+ Script: <"
+ callfunc "itheal", 150, 0;
+ ">
+},
+{
+ Id: 1251
+ AegisName: "Plum"
+ Name: "Plum"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 25
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1251
+ Script: <"
+ callfunc "itheal", 100, 0;
+ ">
+},
+{
+ Id: 1252
+ AegisName: "Cherry"
+ Name: "Cherry"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 25
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1252
+ Script: <"
+ callfunc "itheal", 50, 0;
+ ">
+},
+{
+ Id: 1253
+ AegisName: "GoldenDeliciousApple"
+ Name: "GoldenDeliciousApple"
+ Type: "IT_USABLE"
+ Buy: 1000
+ Sell: 500
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1253
+ Script: <"
+ callfunc "itheal", 200, 0;
+ ">
+},
+{
+ Id: 1258
+ AegisName: "Honey"
+ Name: "Honey"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 20
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1258
+ Script: <"
+ callfunc "itheal", 45, 0;
+ ">
+},
+{
+ Id: 1280
+ AegisName: "Scissors"
+ Name: "Scissors"
+ Type: "IT_USABLE"
+ Buy: 1000
+ Sell: 500
+ Weight: 120
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1280
+ Script: <"
+ callfunc "useScissors";
+ ">
+},
+{
+ Id: 1281
+ AegisName: "ShockSweet"
+ Name: "ShockSweet"
+ Type: "IT_USABLE"
+ Buy: 1000
+ Sell: 500
+ Weight: 5
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 1281
+ Script: <"
+ callfunc "useShockSweet";
+ ">
+},
+{
+ Id: 3001
+ AegisName: "RubberBat"
+ Name: "RubberBat"
+ Type: "IT_USABLE"
+ Buy: 200
+ Sell: 100
+ Weight: 30
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 3001
+ Script: <"
+ callfunc "rubberBat";
+ ">
+},
+{
+ Id: 3006
+ AegisName: "TonoriDelight"
+ Name: "TonoriDelight"
+ Type: "IT_USABLE"
+ Buy: 5
+ Sell: 1
+ Weight: 2
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 3006
+ Script: <"
+ callfunc "itheal", 10, 2;
+ ">
+},
+{
+ Id: 3007
+ AegisName: "Marshmallow"
+ Name: "Marshmallow"
+ Type: "IT_USABLE"
+ Buy: 5
+ Sell: 1
+ Weight: 2
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 3007
+ Script: <"
+ callfunc "itheal", 10, 0;
+ ">
+},
+{
+ Id: 3009
+ AegisName: "JellySkull"
+ Name: "JellySkull"
+ Type: "IT_USABLE"
+ Buy: 5
+ Sell: 1
+ Weight: 2
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 3009
+ Script: <"
+ callfunc "itheal", 10, 0;
+ ">
+},
+{
+ Id: 3010
+ AegisName: "CandyPumpkin"
+ Name: "CandyPumpkin"
+ Type: "IT_USABLE"
+ Buy: 5
+ Sell: 1
+ Weight: 2
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 3010
+ Script: <"
+ callfunc "itheal", 10, 0;
+ ">
+},
+{
+ Id: 4035
+ AegisName: "PickledBeets"
+ Name: "PickledBeets"
+ Type: "IT_USABLE"
+ Buy: 1500
+ Sell: 50
+ Weight: 150
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 4035
+ Script: <"
+ callfunc "usePickledBeets";
+ ">
+},
+{
+ Id: 4036
+ AegisName: "RoastedAcorn"
+ Name: "RoastedAcorn"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 4036
+ Script: <"
+ callfunc "itheal", 15, 0;
+ ">
+},
+{
+ Id: 5126
+ AegisName: "MTJarofOwnBlood"
+ Name: "MTJarofOwnBlood"
+ Type: "IT_USABLE"
+ Buy: 200
+ Sell: 100
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 5126
+ Script: <"
+ callfunc "itheal", -250, 0;
+ getitem 5127, 1;
+ ">
+},
+{
+ Id: 5210
+ AegisName: "GrassFedTofu"
+ Name: "GrassFedTofu"
+ Type: "IT_USABLE"
+ Buy: 50
+ Sell: 1
+ Weight: 2
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 5210
+ Script: <"
+ callfunc "itheal", -10, -2;
+ ">
+},
+{
+ Id: 5213
+ AegisName: "VeganWater"
+ Name: "VeganWater"
+ Type: "IT_USABLE"
+ Buy: 200
+ Sell: 100
+ Weight: 10
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 5213
+ Script: <"
+ callfunc "itheal", 250, 0;
+ getitem 540, 1;
+ ">
+},
+{
+ Id: 5214
+ AegisName: "LactoseFreeAcorn"
+ Name: "LactoseFreeAcorn"
+ Type: "IT_USABLE"
+ Buy: 100
+ Sell: 50
+ Weight: 1
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 5214
+ Script: <"
+ callfunc "itheal", 15, 0;
+ ">
+},
+{
+ Id: 5235
+ AegisName: "TMWBirthdayGift"
+ Name: "TMWBirthdayGift"
+ Type: "IT_USABLE"
+ Buy: 1000000
+ Sell: 50
+ Weight: 0
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 5235
+ Script: <"
+ // 5231..5234
+ .@it=callfunc("any",
+ RedPresentHat, GreenPresentHat, BluePresentHat, YellowPresentHat);
+ getitem .@it, 1;
+ ">
+},
+{
+ Id: 5236
+ AegisName: "GumiCandy"
+ Name: "GumiCandy"
+ Type: "IT_USABLE"
+ Buy: 10000
+ Sell: 250
+ Weight: 0
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 5236
+ Script: <"
+ set Sex, Sex == 3 ? rand(0, 1) : (rand(0, 1) ? 3 : !Sex);
+ ">
+},
+{
+ Id: 5237
+ AegisName: "CaramelCandy"
+ Name: "CaramelCandy"
+ Type: "IT_USABLE"
+ Buy: 700
+ Sell: 350
+ Weight: 0
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 5237
+ Script: <"
+ callfunc "itheal", 350, 0;
+ ">
+},
+{
+ Id: 5263
+ AegisName: "LovePotion"
+ Name: "LovePotion"
+ Type: "IT_USABLE"
+ Buy: 90000
+ Sell: 550
+ Weight: 0
+ Def: 0
+ Slots: 0
+ Refine: false
+ ViewSprite: 5263
+ Script: <"
+ callfunc "LovePotion";
+ ">
+},
+{
+ Id: 5267
+ AegisName: "AlizarinScroll"
+ Name: "Alizarin Scroll"
+ Type: "IT_USABLE"
+ Buy: 5000
+ Sell: 1000
+ Weight: 7
+ Script: <"
+ callfunc "learnskill", SKILL_MODRIPHOO;
+ @skillId = SKILL_MODRIPHOO;
+ @skillLv = 1;
+ callfunc "SK_GrowPlants", false;
+ ">
+},
+{
+ Id: 5268
+ AegisName: "CobaltScroll"
+ Name: "Cobalt Scroll"
+ Type: "IT_USABLE"
+ Buy: 5000
+ Sell: 1000
+ Weight: 7
+ Script: <"
+ callfunc "learnskill", SKILL_MODRISUMP;
+ @skillId = SKILL_MODRISUMP;
+ @skillLv = 1;
+ callfunc "SK_GrowPlants", false;
+ ">
+},
+{
+ Id: 5269
+ AegisName: "GambogeScroll"
+ Name: "Gamboge Scroll"
+ Type: "IT_USABLE"
+ Buy: 5000
+ Sell: 1000
+ Weight: 7
+ Script: <"
+ callfunc "learnskill", SKILL_MODRIYIKAM;
+ @skillId = SKILL_MODRIYIKAM;
+ @skillLv = 1;
+ callfunc "SK_GrowPlants", false;
+ ">
+},
+{
+ Id: 5270
+ AegisName: "MauveScroll"
+ Name: "Mauve Scroll"
+ Type: "IT_USABLE"
+ Buy: 5000
+ Sell: 1000
+ Weight: 7
+ Script: <"
+ callfunc "learnskill", SKILL_MODRILAX;
+ @skillId = SKILL_MODRILAX;
+ @skillLv = 1;
+ callfunc "SK_GrowPlants", false;
+ ">
+},
+{
+ Id: 5271
+ AegisName: "JoyplimScroll"
+ Name: "Joyplim Scroll"
+ Type: "IT_USABLE"
+ Buy: 5000
+ Sell: 1000
+ Weight: 7
+ Script: <"
+ callfunc "learnskill", SKILL_JOYPLIM;
+ @skillId = SKILL_JOYPLIM;
+ @skillLv = 10;
+ callfunc "SK_Joyplim", false;
+ ">
+},
+{
+ Id: 586
+ AegisName: "CottonShorts"
+ Name: "CottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 15
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 586
+},
+{
+ Id: 610
+ AegisName: "JeansShorts"
+ Name: "JeansShorts"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ Refine: false
+ ViewSprite: 610
+},
+{
+ Id: 632
+ AegisName: "CottonSkirt"
+ Name: "CottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 10
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 632
+},
+{
+ Id: 642
+ AegisName: "JeansChaps"
+ Name: "JeansChaps"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 60
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ Refine: false
+ ViewSprite: 642
+ Script: <"
+ bonus bMatkRate, -2;
+ ">
+},
+{
+ Id: 648
+ AegisName: "CottonTrousers"
+ Name: "CottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 648
+},
+{
+ Id: 731
+ AegisName: "AssassinPants"
+ Name: "AssassinPants"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 3000
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ Refine: false
+ ViewSprite: 731
+ Script: <"
+ callfunc "BrawlingItem", EQI_HEAD_LOW;
+ bonus bAgi, 5;
+ bonus bMatkRate, -2;
+ ">
+},
+{
+ Id: 768
+ AegisName: "TerraniteLegs"
+ Name: "TerraniteLegs"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 3000
+ Weight: 30
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ Refine: false
+ ViewSprite: 768
+ Script: <"
+ bonus bAgi, 1;
+ bonus bMdef, 5;
+ ">
+},
+{
+ Id: 771
+ AegisName: "Miniskirt"
+ Name: "Miniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 771
+},
+{
+ Id: 796
+ AegisName: "BromenalLegs"
+ Name: "BromenalLegs"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 150
+ Def: 6
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ Refine: false
+ ViewSprite: 796
+},
+{
+ Id: 857
+ AegisName: "LeatherTrousers"
+ Name: "LeatherTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 25
+ Def: 5
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ Refine: false
+ ViewSprite: 857
+ Script: <"
+ bonus bHit, 2;
+ ">
+},
+{
+ Id: 881
+ AegisName: "RaggedShorts"
+ Name: "RaggedShorts"
+ Type: "IT_ARMOR"
+ Buy: 60
+ Sell: 1
+ Weight: 7
+ Def: 1
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 881
+},
+{
+ Id: 1172
+ AegisName: "SilkPants"
+ Name: "SilkPants"
+ Type: "IT_ARMOR"
+ Buy: 20000
+ Sell: 750
+ Weight: 10
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 1172
+},
+{
+ Id: 2100
+ AegisName: "RedCottonSkirt"
+ Name: "RedCottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2100
+},
+{
+ Id: 2101
+ AegisName: "GreenCottonSkirt"
+ Name: "GreenCottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2101
+},
+{
+ Id: 2102
+ AegisName: "DarkBlueCottonSkirt"
+ Name: "DarkBlueCottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2102
+},
+{
+ Id: 2103
+ AegisName: "YellowCottonSkirt"
+ Name: "YellowCottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2103
+},
+{
+ Id: 2104
+ AegisName: "LightBlueCottonSkirt"
+ Name: "LightBlueCottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2104
+},
+{
+ Id: 2105
+ AegisName: "PinkCottonSkirt"
+ Name: "PinkCottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2105
+},
+{
+ Id: 2106
+ AegisName: "BlackCottonSkirt"
+ Name: "BlackCottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2106
+},
+{
+ Id: 2107
+ AegisName: "OrangeCottonSkirt"
+ Name: "OrangeCottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2107
+},
+{
+ Id: 2108
+ AegisName: "PurpleCottonSkirt"
+ Name: "PurpleCottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2108
+},
+{
+ Id: 2109
+ AegisName: "DarkGreenCottonSkirt"
+ Name: "DarkGreenCottonSkirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2109
+},
+{
+ Id: 2110
+ AegisName: "RedCottonShorts"
+ Name: "RedCottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2110
+},
+{
+ Id: 2111
+ AegisName: "GreenCottonShorts"
+ Name: "GreenCottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2111
+},
+{
+ Id: 2112
+ AegisName: "DarkBlueCottonShorts"
+ Name: "DarkBlueCottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2112
+},
+{
+ Id: 2113
+ AegisName: "YellowCottonShorts"
+ Name: "YellowCottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2113
+},
+{
+ Id: 2114
+ AegisName: "LightBlueCottonShorts"
+ Name: "LightBlueCottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2114
+},
+{
+ Id: 2115
+ AegisName: "PinkCottonShorts"
+ Name: "PinkCottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2115
+},
+{
+ Id: 2116
+ AegisName: "BlackCottonShorts"
+ Name: "BlackCottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2116
+},
+{
+ Id: 2117
+ AegisName: "OrangeCottonShorts"
+ Name: "OrangeCottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2117
+},
+{
+ Id: 2118
+ AegisName: "PurpleCottonShorts"
+ Name: "PurpleCottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2118
+},
+{
+ Id: 2119
+ AegisName: "DarkGreenCottonShorts"
+ Name: "DarkGreenCottonShorts"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 20
+ Def: 2
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2119
+},
+{
+ Id: 2170
+ AegisName: "RedMiniskirt"
+ Name: "RedMiniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2170
+},
+{
+ Id: 2171
+ AegisName: "GreenMiniskirt"
+ Name: "GreenMiniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2171
+},
+{
+ Id: 2172
+ AegisName: "DarkBlueMiniskirt"
+ Name: "DarkBlueMiniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2172
+},
+{
+ Id: 2173
+ AegisName: "YellowMiniskirt"
+ Name: "YellowMiniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2173
+},
+{
+ Id: 2174
+ AegisName: "LightBlueMiniskirt"
+ Name: "LightBlueMiniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2174
+},
+{
+ Id: 2175
+ AegisName: "PinkMiniskirt"
+ Name: "PinkMiniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2175
+},
+{
+ Id: 2176
+ AegisName: "BlackMiniskirt"
+ Name: "BlackMiniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2176
+},
+{
+ Id: 2177
+ AegisName: "OrangeMiniskirt"
+ Name: "OrangeMiniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2177
+},
+{
+ Id: 2178
+ AegisName: "PurpleMiniskirt"
+ Name: "PurpleMiniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2178
+},
+{
+ Id: 2179
+ AegisName: "DarkGreenMiniskirt"
+ Name: "DarkGreenMiniskirt"
+ Type: "IT_ARMOR"
+ Buy: 1000
+ Sell: 500
+ Weight: 8
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2179
+},
+{
+ Id: 2180
+ AegisName: "RedCottonTrousers"
+ Name: "RedCottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2180
+},
+{
+ Id: 2181
+ AegisName: "GreenCottonTrousers"
+ Name: "GreenCottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2181
+},
+{
+ Id: 2182
+ AegisName: "DarkBlueCottonTrousers"
+ Name: "DarkBlueCottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2182
+},
+{
+ Id: 2183
+ AegisName: "YellowCottonTrousers"
+ Name: "YellowCottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2183
+},
+{
+ Id: 2184
+ AegisName: "LightBlueCottonTrousers"
+ Name: "LightBlueCottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2184
+},
+{
+ Id: 2185
+ AegisName: "PinkCottonTrousers"
+ Name: "PinkCottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2185
+},
+{
+ Id: 2186
+ AegisName: "BlackCottonTrousers"
+ Name: "BlackCottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2186
+},
+{
+ Id: 2187
+ AegisName: "OrangeCottonTrousers"
+ Name: "OrangeCottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2187
+},
+{
+ Id: 2188
+ AegisName: "PurpleCottonTrousers"
+ Name: "PurpleCottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2188
+},
+{
+ Id: 2189
+ AegisName: "DarkGreenCottonTrousers"
+ Name: "DarkGreenCottonTrousers"
+ Type: "IT_ARMOR"
+ Buy: 1500
+ Sell: 750
+ Weight: 25
+ Def: 4
+ Slots: 0
+ Loc: "EQP_HEAD_LOW"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 2189
+},
+{
+ Id: 531
+ AegisName: "MinerGloves"
+ Name: "MinerGloves"
+ Type: "IT_ARMOR"
+ Buy: 3000
+ Sell: 1000
+ Weight: 30
+ Def: 2
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 531
+ Script: <"
+ bonus bMatkRate, -2;
+ ">
+},
+{
+ Id: 532
+ AegisName: "LeatherGloves"
+ Name: "LeatherGloves"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 2000
+ Weight: 20
+ Def: 4
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 532
+ Script: <"
+ bonus bMatkRate, -3;
+ ">
+},
+{
+ Id: 563
+ AegisName: "WinterGloves"
+ Name: "WinterGloves"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 3000
+ Weight: 20
+ Def: 3
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 563
+},
+{
+ Id: 741
+ AegisName: "CottonGloves"
+ Name: "CottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 10
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 741
+},
+{
+ Id: 756
+ AegisName: "AssassinGloves"
+ Name: "AssassinGloves"
+ Type: "IT_ARMOR"
+ Buy: 7000
+ Sell: 2000
+ Weight: 9
+ Def: 3
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 756
+ Script: <"
+ callfunc "BrawlingItem", EQI_GARMENT;
+ bonus bAgi, 4;
+ bonus bMatkRate, -1;
+ ">
+},
+{
+ Id: 794
+ AegisName: "BromenalGloves"
+ Name: "BromenalGloves"
+ Type: "IT_ARMOR"
+ Buy: 6000
+ Sell: 2000
+ Weight: 40
+ Def: 4
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 794
+ Script: <"
+ bonus bMatkRate, -3;
+ ">
+},
+{
+ Id: 868
+ AegisName: "SilkGloves"
+ Name: "SilkGloves"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 2500
+ Weight: 4
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 868
+},
+{
+ Id: 2160
+ AegisName: "RedCottonGloves"
+ Name: "RedCottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 2160
+},
+{
+ Id: 2161
+ AegisName: "GreenCottonGloves"
+ Name: "GreenCottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 2161
+},
+{
+ Id: 2162
+ AegisName: "DarkBlueCottonGloves"
+ Name: "DarkBlueCottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 2162
+},
+{
+ Id: 2163
+ AegisName: "YellowCottonGloves"
+ Name: "YellowCottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 2163
+},
+{
+ Id: 2164
+ AegisName: "LightBlueCottonGloves"
+ Name: "LightBlueCottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 2164
+},
+{
+ Id: 2165
+ AegisName: "PinkCottonGloves"
+ Name: "PinkCottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 2165
+},
+{
+ Id: 2166
+ AegisName: "BlackCottonGloves"
+ Name: "BlackCottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 2166
+},
+{
+ Id: 2167
+ AegisName: "OrangeCottonGloves"
+ Name: "OrangeCottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 2167
+},
+{
+ Id: 2168
+ AegisName: "PurpleCottonGloves"
+ Name: "PurpleCottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 2168
+},
+{
+ Id: 2169
+ AegisName: "DarkGreenCottonGloves"
+ Name: "DarkGreenCottonGloves"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 500
+ Weight: 20
+ Def: 1
+ Slots: 0
+ Loc: "EQP_GARMENT"
+ Refine: false
+ ViewSprite: 2169
+},
+{
+ Id: 585
+ AegisName: "ScarabArmlet"
+ Name: "ScarabArmlet"
+ Type: "IT_ARMOR"
+ Buy: 8000
+ Sell: 4000
+ Weight: 200
+ Def: 0
+ Slots: 0
+ Loc: "EQP_HAND_L"
+ WeaponLv: 0
+ EquipLv: 1
+ Refine: false
+ ViewSprite: 585
+},
+{
+ Id: 601
+ AegisName: "SteelShield"
+ Name: "SteelShield"
+ Type: "IT_ARMOR"
+ Buy: 40000
+ Sell: 3000
+ Weight: 2500
+ Def: 20
+ Slots: 0
+ Loc: "EQP_HAND_L"
+ Refine: false
+ ViewSprite: 601
+},
+{
+ Id: 602
+ AegisName: "WoodenShield"
+ Name: "WoodenShield"
+ Type: "IT_ARMOR"
+ Buy: 10000
+ Sell: 2000
+ Weight: 1500
+ Def: 14
+ Slots: 0
+ Loc: "EQP_HAND_L"
+ Refine: false
+ ViewSprite: 602
+},
+{
+ Id: 603
+ AegisName: "LeatherShield"
+ Name: "LeatherShield"
+ Type: "IT_ARMOR"
+ Buy: 2000
+ Sell: 1000
+ Weight: 1300
+ Def: 7
+ Slots: 0
+ Loc: "EQP_HAND_L"
+ Refine: false
+ ViewSprite: 603
+},
+{
+ Id: 797
+ AegisName: "BromenalShield"
+ Name: "BromenalShield"
+ Type: "IT_ARMOR"
+ Buy: 40000
+ Sell: 3000
+ Weight: 2500
+ Def: 20
+ Slots: 0
+ Loc: "EQP_HAND_L"
+ Refine: false
+ ViewSprite: 797
+},
+
+//
+// Pets
+{
+ Id: 6000
+ AegisName: "PinkieScroll"
+ Name: "Pinkie Scroll"
+ Type: "IT_PETEGG"
+ Buy: 30000
+ Sell: 1000
+ Weight: 400
+ KeepAfterUse: true
+ Trade: {
+ partneroverride: true
+ notrade: true
+ nodrop: true
+ nogstorage: true
+ nomail: true
+ noauction: true
+ noselltonpc: true
+ }
+ Script: <"
+ bpet;
+ ">
+},
+)
diff --git a/db/pre-re/item_group.conf b/db/pre-re/item_group.conf
new file mode 100644
index 00000000..09f10ba0
--- /dev/null
+++ b/db/pre-re/item_group.conf
@@ -0,0 +1,20 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//================= More Information =================
+// http://herc.ws/board/topic/1244-official-item-grouppackagechain
+//====================================================
+// Structure of file:
+/*
+<Container_Item_Name>: (
+ "Item_Name" or
+ ("Item_Name",Repeat_Count)
+)
+*/
+
diff --git a/db/pre-re/item_lapineddukddak.conf b/db/pre-re/item_lapineddukddak.conf
new file mode 100644
index 00000000..a0e66f0c
--- /dev/null
+++ b/db/pre-re/item_lapineddukddak.conf
@@ -0,0 +1,44 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018-2019 Hercules Dev Team
+//= Copyright (C) 2018-2019 Asheraf
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+
+/**************************************************************************
+************* Entry structure ********************************************
+**************************************************************************
+<Box_Item_Const>: {
+ NeedCount: (int, defaults to 0) The required amount of unique items
+ NeedRefineMin: (int, defaults to 0) The minimum refine for each of the items
+ NeedRefineMax: (int, defaults to 0) The maximum refine for each of the items
+ SourceItems: { A list of allowed items to be converted with specific amount for each item
+ <Item_Const>: <amount> (string, int)
+ ...
+ }
+ Script: <"
+ Script (it can be multi-line)
+ Executes on success
+ ">
+}
diff --git a/db/pre-re/item_packages.conf b/db/pre-re/item_packages.conf
new file mode 100644
index 00000000..0b458587
--- /dev/null
+++ b/db/pre-re/item_packages.conf
@@ -0,0 +1,25 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//================= More Information =================
+// http://herc.ws/board/topic/1244-official-item-grouppackagechain
+//====================================================
+// Structure of file:
+/*
+<Container_Item_Name>: {
+ <Entry_Item_Name>: {
+ Random: 0 - Signs what group type this item belongs to, 0 is "Must", a group of items that come out whenever the package is open (doesn't use rate), anything above 0 is considered "random_group_<value>", a package with 2 random groups for example gets 2 items whenever open, one from each group
+ Count: 30 - Stands for how much <Entry_Item_Name> will be obtained.
+ Expire: 2 - Signs how many hours this item will last (makes a rental item).
+ Announce: True/False - Signs whether to relay a special item obtain announcement when this item comes out of the package.
+ Rate: 50 - If 'Random' is not 0, a rate from 1 to 10000 (0.01% - 100%) will be given.
+ Named: True/False - Signs whether the item should have the owner's name in it.
+ }
+}
+*/
diff --git a/db/pre-re/job_db.conf b/db/pre-re/job_db.conf
new file mode 100644
index 00000000..85f34f26
--- /dev/null
+++ b/db/pre-re/job_db.conf
@@ -0,0 +1,145 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//================= More Information =================
+// http://herc.ws/board/topic/9082-job-db1txt-redesign/
+//============== RE Structure Example ================
+/*
+Job_Name: { // Job names as in src/map/pc.c (they are hardcoded at the moment so if you want to add a new job you should add it there)
+ BaseExpGroup: "Exp Group Name" (string) // Name of base exp group defined in exp_group_db.conf
+ JobExpGroup: "Exp Group Name" (string) // Name of job exp group defined in exp_group_db.conf
+ Inherit: ( "Other_Job_Name" ); // Base job from which this job will inherit its max weight, base ASPD set and HP/SP table.
+ InheritHP: ( "Other_Job_Name" );// Base job from which this job will inherit its HP table.
+ InheritSP: ( "Other_Job_Name" );// Base job from which this job will inherit its SP table.
+ Weight: Max Weight (int, defaults to 20000, units in Weight/10)
+ BaseASPD: { // Base ASPD for specific weapon type
+ Fist: 0~200 (int, defaults to 200)
+ Dagger: 0~200 (int, defaults to 200)
+ Sword: 0~200 (int, defaults to 200)
+ TwoHandSword: 0~200 (int, defaults to 200)
+ Spear: 0~200 (int, defaults to 200)
+ TwoHandSpear: 0~200 (int, defaults to 200)
+ Axe: 0~200 (int, defaults to 200)
+ TwoHandAxe: 0~200 (int, defaults to 200)
+ Mace: 0~200 (int, defaults to 200)
+ TwoHandMace: 0~200 (int, defaults to 200)
+ Rod: 0~200 (int, defaults to 200)
+ Bow: 0~200 (int, defaults to 200)
+ Knuckle: 0~200 (int, defaults to 200)
+ Instrumen: 0~200 (int, defaults to 200)
+ Whip: 0~200 (int, defaults to 200)
+ Book: 0~200 (int, defaults to 200)
+ Katar: 0~200 (int, defaults to 200)
+ Revolver: 0~200 (int, defaults to 200)
+ Rifle: 0~200 (int, defaults to 200)
+ GatlingGun: 0~200 (int, defaults to 200)
+ Shotgun: 0~200 (int, defaults to 200)
+ GrenadeLauncher: 0~200 (int, defaults to 200)
+ FuumaShuriken: 0~200 (int, defaults to 200)
+ TwoHandRod: 0~200 (int, defaults to 200)
+ }
+ HPTable:[ 1, .... 150 ] (int[]) Reference table for base HP per level
+ SPTable:[ 1, .... 150 ] (int[]) Reference table for base SP per level
+ // Note: If table index size is smaller than the max level the server will automatically generate the missing index based on the average increase per level.
+}
+*/
+//====================================================
+Talpan: {
+ BaseExpGroup: "EvolClasses"
+ JobExpGroup: "EvolClasses"
+ MoveSpeed: 150
+ Weight: 23500
+ BaseASPD: {
+ Fist: 500
+ Dagger: 650
+ Sword: 700
+ Axe: 550
+ TwoHandAxe: 1000
+ TwoHandSpear: 1200
+ Mace: 550
+ TwoHandMace: 550
+ Rod: 700
+ TwoHandRod: 700
+ Bow: 800
+ Katar: 650
+ }
+ HPTable:[ 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, // 1 - 10
+ 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, // 11 - 20
+ 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, // 21 - 30
+ 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, // 31 - 40
+ 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, // 41 - 50
+ 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, // 51 - 60
+ 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, // 61 - 70
+ 390, 395, 400, 405, 410, 415, 420, 425, 430, 435, // 71 - 80
+ 440, 445, 450, 455, 460, 465, 470, 475, 480, 485, // 81 - 90
+ 490, 495, 500, 505, 510, 515, 520, 525, 530, 535, // 91 - 100
+ 540, 545, 550, 555, 560, 565, 570, 575, 580, 585, // 101 - 110
+ 590, 595, 600, 605, 610, 615, 620, 625, 630, 635, // 111 - 120
+ 640, 645, 650, 655, 660, 665, 670, 675, 680, 685, // 121 - 130
+ 690, 695, 700, 705, 710, 715, 720, 725, 730, 735, // 131 - 140
+ 740, 745, 750, 755, 760, 765, 770, 775, 780, 785] // 141 - 150
+ SPTable:[ 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, // 1 - 10
+ 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, // 11 - 20
+ 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, // 21 - 30
+ 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, // 31 - 40
+ 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, // 41 - 50
+ 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, // 51 - 60
+ 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, // 61 - 70
+ 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, // 71 - 80
+ 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, // 81 - 90
+ 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, // 91 - 100
+ 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, // 101 - 110
+ 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, // 111 - 120
+ 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, // 121 - 130
+ 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, // 131 - 140
+ 292, 294, 296, 298, 300, 302, 304, 306, 308, 310] // 141 - 150
+}
+
+NoRace: {
+ BaseExpGroup: "EvolClasses"
+ JobExpGroup: "EvolClasses"
+ MoveSpeed: 150
+ Inherit: ( "Talpan" );
+}
+
+Tritan: {
+ BaseExpGroup: "EvolClasses"
+ JobExpGroup: "EvolClasses"
+ MoveSpeed: 150
+ Inherit: ( "Talpan" );
+}
+
+Ifriton: {
+ BaseExpGroup: "EvolClasses"
+ JobExpGroup: "EvolClasses"
+ MoveSpeed: 150
+ Inherit: ( "Talpan" );
+}
+
+Gispaan: {
+ BaseExpGroup: "EvolClasses"
+ JobExpGroup: "EvolClasses"
+ MoveSpeed: 150
+ Inherit: ( "Talpan" );
+}
+
+Sparron: {
+ BaseExpGroup: "EvolClasses"
+ JobExpGroup: "EvolClasses"
+ MoveSpeed: 150
+ Inherit: ( "Talpan" );
+}
+
+Skellie: {
+ BaseExpGroup: "EvolClasses"
+ JobExpGroup: "EvolClasses"
+ MoveSpeed: 150
+ Inherit: ( "Talpan" ); // Base job from which this job will inherit its max weight, base ASPD set and HP/SP table.
+}
+
diff --git a/db/pre-re/map_zone_db.conf b/db/pre-re/map_zone_db.conf
new file mode 100644
index 00000000..e5fdf71a
--- /dev/null
+++ b/db/pre-re/map_zone_db.conf
@@ -0,0 +1,490 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//====================================================
+//= Hercules Map Zone Database [Ind/Hercules]
+//================ More Information ==================
+//= http://herc.ws/board/topic/302-introducing-hercules-map-zone-database/
+//= (TODO: replace with wiki link and detail the wiki page in a decent format ^)
+//====================================================
+//================ Description =======================
+//= A unlimited number of zones may be created, a zone
+//= may be used to create a set of disabled items, disabled skills
+//= and mapflags to be used by as many maps as one chooses.
+//= Maps can be linked to a specific zone through the zone mapflag
+//= '<map name><tab>mapflag<tab>zone<tab><zone name>'.
+//====================================================
+//= Available types for 'disabled_skills':
+//= PLAYER, HOMUN, MERCENARY, MONSTER, PET, ELEMENTAL, MOB_BOSS, CLONE, ALL and NONE
+//====================================================
+
+
+zones: (
+{
+ /* All zone is a dynamic (very special) zone that is forcebly inherited by ALL maps automatically */
+ name: "All" /* changing this name requires MAP_ZONE_ALL_NAME to also be changed in src/map/map.h file */
+
+ disabled_skills: {
+ //both examples below disable napalm beat (id 11) to players
+ //MG_NAPALMBEAT: "PLAYER"
+ //ID11: "PLAYER"
+ }
+
+ disabled_items: {
+ //Both examples below disable apple (id 501)
+ //Apple: true
+ //ID501: true
+ }
+
+ mapflags: (
+ )
+
+ /* "command:min-group-lv-to-override" e.g. "heal: 70" */
+ disabled_commands: {
+ // Broken
+ reloadscript: 100
+ fireworks: 100
+ fog: 100
+ day: 100
+ night: 100
+ clouds: 100
+ clouds2: 100
+ snow: 100
+ sakura: 100
+ leaves: 100
+ size: 100
+ sizeguild: 100
+ points: 100
+ camerainfo: 100
+ clearweather: 100
+ costume: 100
+ sizeall: 100
+ searchstore: 100
+ refineryui: 100
+ haircolor: 100
+ dye: 100
+ model: 100
+ produce: 100
+ changedress: 100
+ hairstyle: 100
+ cash: 100
+ font: 100
+ fontcolor: 100
+ changelook: 100
+ nocosplay: 100
+ // Frequently abused
+ recallall: 100
+ doom: 100
+ guildspy: 100
+ partyspy: 100
+ // To be enabled again later
+ mapexit: 100
+ }
+ skill_damage_cap: {
+ //Exemple Below caps firebolt damage in maps within this zone to a maximum 50 damage,
+ // (depends on HMAP_ZONE_DAMAGE_CAP_TYPE in src/config/core.h)
+ // when cast vs players and monsters.
+ //MG_COLDBOLT: (50,"PLAYER | MONSTER")
+ }
+},
+{
+ /* Normal zone is applied to all maps that are not pkable (where players cant fight each other) */
+ /* However, it wont be applied to maps with its own zones (specified thru mapflag) */
+ name: "Normal" /* changing this name requires MAP_ZONE_NORMAL_NAME to also be changed in src/map/map.h file */
+
+ disabled_skills: {
+ WM_LULLABY_DEEPSLEEP: "PLAYER"
+ WM_SIRCLEOFNATURE: "PLAYER"
+ WM_SATURDAY_NIGHT_FEVER: "PLAYER"
+ SO_ARRULLO: "PLAYER"
+ CG_HERMODE: "PLAYER"
+ }
+
+ disabled_items: {
+ }
+ mapflags: (
+ )
+
+},
+{
+ /* PvP zone is applied to all maps with a pvp mapflag */
+ name: "PvP" /* changing this name requires MAP_ZONE_PVP_NAME to also be changed in src/map/map.h file */
+
+ disabled_skills: {
+ BS_GREED: "PLAYER"
+ CG_HERMODE: "PLAYER"
+ }
+
+ disabled_items: {
+ }
+
+ /* cashshop disabled in pvp maps */
+ mapflags: (
+ "nocashshop",
+ )
+},
+{
+ /* Outside Zone is a mapflag alias */
+ name: "outside"
+
+ disabled_skills: {
+ WM_POEMOFNETHERWORLD: "PLAYER"
+ }
+
+ disabled_items: {
+ }
+},
+{
+ /* Event Zone is a mapflag alias */
+ name: "Event"
+
+ disabled_skills: {
+ }
+
+ disabled_items: {
+ }
+
+ mapflags: (
+ "nopenalty",
+ "nosave 000-1,22,22",
+ "invincible_time_inc 5000",
+ )
+
+ /* "command:min-group-lv-to-override" e.g. "heal: 70" */
+ disabled_commands: {
+ }
+ skill_damage_cap: {
+ }
+},
+{
+ /* Jail Zone is a special mapflag alias */
+ name: "Jail"
+
+ disabled_skills: {
+ TK_JUMPKICK: "PLAYER"
+ TK_HIGHJUMP: "PLAYER"
+ }
+
+ disabled_items: {
+ }
+},
+{
+ /* MMO Zone is not the place for GMs to mess with */
+ name: "MMO"
+
+ disabled_skills: {
+ AL_WARP: "ALL"
+ AL_TELEPORT: "ALL"
+ WE_CALLPARTNER: "ALL"
+ WE_CALLPARENT: "ALL"
+ WE_CALLBABY: "ALL"
+ SC_DIMENSIONDOOR: "ALL"
+ GD_EMERGENCYCALL: "ALL"
+ }
+
+ disabled_items: {
+ HitchhikersTowel: true
+ WhiteHitchhikersTowel: true
+ RedHitchhikersTowel: true
+ GreenHitchhikersTowel: true
+ BlueHitchhikersTowel: true
+ YellowHitchhikersTowel: true
+ PurpleHitchhikersTowel: true
+ OrangeHitchhikersTowel: true
+ PinkHitchhikersTowel: true
+ TealHitchhikersTowel: true
+ LimeHitchhikersTowel: true
+ }
+
+ mapflags: (
+ "nopenalty",
+ //"nosave 000-1,22,22",
+ )
+
+ /* "command:min-group-lv-to-override" e.g. "heal: 70" */
+ disabled_commands: {
+ // Disabled (Should not ever be used)
+ recallall: 100
+ save: 100
+ // Admin Only (no CM on these map)
+ addwarp: 99
+ mapflag: 99
+ // Community Manager Only (no GM on these map)
+ recall: 80
+ kill: 80
+ nuke: 80
+ skillon: 80
+ skilloff: 80
+ pvpon: 80
+ pvpoff: 80
+ cvcon: 80
+ cvcoff: 80
+ gvgon: 80
+ gvgoff: 80
+ // GM Only (no EVTC on these map)
+ monster: 60
+ killmonster: 60
+ killmonster2: 60
+ raisemap: 60
+ doommap: 60
+ }
+ skill_damage_cap: {
+ }
+},
+{
+ /* CvC zone is applied to all maps with a cvc mapflag */
+ name: "CvC" /* changing this name requires MAP_ZONE_CVC_NAME to also be changed in src/map/map.h file */
+
+ disabled_skills: {
+ BS_GREED: "PLAYER"
+ CG_HERMODE: "PLAYER"
+ }
+
+ disabled_items: {
+ }
+
+ /* cashshop disabled in cvc maps */
+ mapflags: (
+ "nocashshop",
+ )
+},
+{
+ /* PK Mode zone is only used when server is on pk_mode (battle.conf),
+ it applies to all pvp maps that don't have their own zone */
+ name: "PK Mode" /* changing this name requires MAP_ZONE_PK_NAME to also be changed in src/map/map.h file */
+
+ disabled_skills: {
+
+ }
+
+ disabled_items: {
+
+ }
+
+ /* PK Mode Damage Reductions */
+ /* - weapon_damage_rate -40% */
+ /* - magic_damage_rate -40% */
+ /* - misc_damage_rate -40% */
+ /* - long_damage_rate -30% */
+ /* - short_damage_rate -20% */
+ mapflags: (
+ "weapon_damage_rate 60",
+ "magic_damage_rate 60",
+ "misc_damage_rate 60",
+ "long_damage_rate 70",
+ "short_damage_rate 80",
+ )
+},
+{
+ /* GvG zone is applied to all maps with a gvg mapflag */
+ name: "GvG" /* changing this name requires MAP_ZONE_GVG_NAME to also be changed in src/map/map.h file */
+
+ disabled_skills: {
+ AL_TELEPORT: "PLAYER"
+ AL_WARP: "PLAYER"
+ WZ_ICEWALL: "PLAYER"
+ TF_BACKSLIDING: "PLAYER"
+ RG_INTIMIDATE: "PLAYER"
+ WE_CALLPARTNER: "PLAYER"
+ HP_ASSUMPTIO: "PLAYER"
+ HP_BASILICA: "PLAYER"
+ CG_MOONLIT: "PLAYER"
+ WE_CALLPARENT: "PLAYER"
+ WE_CALLBABY: "PLAYER"
+ CR_CULTIVATION: "PLAYER"
+ NJ_KIRIKAGE: "PLAYER"
+ CASH_ASSUMPTIO: "PLAYER"
+ BS_GREED: "PLAYER"
+ SC_FATALMENACE: "PLAYER"
+ SC_DIMENSIONDOOR: "PLAYER"
+ SU_LOPE: "PLAYER"
+ }
+
+ disabled_items: {
+ }
+ /* 5 second duration increase on GvG */
+ /* knockback disabled */
+ /* GvG Mode Damage Reductions */
+ /* - weapon_damage_rate -40% */
+ /* - magic_damage_rate -40% */
+ /* - misc_damage_rate -40% */
+ /* - long_damage_rate -20% */
+ /* - short_damage_rate -20% */
+ mapflags: (
+ "invincible_time_inc 5000",
+ "noknockback",
+ "weapon_damage_rate 60",
+ "magic_damage_rate 60",
+ "misc_damage_rate 60",
+ "long_damage_rate 80",
+ "short_damage_rate 80",
+ "nocashshop",
+ "gvg_noparty",
+ )
+
+},
+{
+ /* Battlegrounds zone is applied to all maps with a battlegrounds mapflag */
+ name: "Battlegrounds" /* changing this name requires MAP_ZONE_BG_NAME to also be changed in src/map/map.h file */
+
+ disabled_skills: {
+ AL_TELEPORT: "PLAYER"
+ AL_WARP: "PLAYER"
+ WZ_ICEWALL: "PLAYER"
+ TF_BACKSLIDING: "PLAYER"
+ RG_INTIMIDATE: "PLAYER"
+ MO_BODYRELOCATION: "PLAYER"
+ WE_CALLPARTNER: "PLAYER"
+ HP_ASSUMPTIO: "PLAYER"
+ HP_BASILICA: "PLAYER"
+ CG_MOONLIT: "PLAYER"
+ WE_CALLPARENT: "PLAYER"
+ WE_CALLBABY: "PLAYER"
+ CR_CULTIVATION: "PLAYER"
+ TK_RUN: "PLAYER"
+ TK_HIGHJUMP: "PLAYER"
+ SG_FEEL: "PLAYER"
+ SG_SUN_WARM: "PLAYER"
+ SG_MOON_WARM: "PLAYER"
+ SG_STAR_WARM: "PLAYER"
+ SG_SUN_COMFORT: "PLAYER"
+ SG_MOON_COMFORT: "PLAYER"
+ SG_STAR_COMFORT: "PLAYER"
+ SG_HATE: "PLAYER"
+ SG_SUN_ANGER: "PLAYER"
+ SG_MOON_ANGER: "PLAYER"
+ SG_STAR_ANGER: "PLAYER"
+ SG_SUN_BLESS: "PLAYER"
+ SG_MOON_BLESS: "PLAYER"
+ SG_STAR_BLESS: "PLAYER"
+ NJ_KIRIKAGE: "PLAYER"
+ CASH_ASSUMPTIO: "PLAYER"
+ SC_FATALMENACE: "PLAYER"
+ SC_DIMENSIONDOOR: "PLAYER"
+ SU_LOPE: "PLAYER"
+ }
+ disabled_items: {
+ }
+
+ /* knockback disabled */
+ /* Battlegrounds Damage Reductions */
+ /* - weapon_damage_rate -30% */
+ /* - magic_damage_rate -30% */
+ /* - misc_damage_rate -30% */
+ /* - long_damage_rate -25% */
+ /* - short_damage_rate -25% */
+ mapflags: (
+ "noknockback",
+ "weapon_damage_rate 70",
+ "magic_damage_rate 70",
+ "misc_damage_rate 70",
+ "long_damage_rate 75",
+ "short_damage_rate 75",
+ )
+
+},
+{
+ name: "Aldebaran Turbo Track"
+
+ disabled_skills: {
+ SM_ENDURE: "PLAYER"
+ AL_TELEPORT: "PLAYER"
+ AL_WARP: "PLAYER"
+ AL_CURE: "PLAYER"
+ TF_HIDING: "PLAYER"
+ WZ_ICEWALL: "PLAYER"
+ AS_CLOAKING: "PLAYER"
+ RG_INTIMIDATE: "PLAYER"
+ MO_BODYRELOCATION: "PLAYER"
+ LK_CONCENTRATION: "PLAYER"
+ LK_BERSERK: "PLAYER"
+ HP_BASILICA: "PLAYER"
+ WS_CARTBOOST: "PLAYER"
+ ST_CHASEWALK: "PLAYER"
+ CG_MOONLIT: "PLAYER"
+ SC_FATALMENACE: "PLAYER"
+ SC_DIMENSIONDOOR: "PLAYER"
+ GN_CARTBOOST: "PLAYER"
+ }
+
+ disabled_items: {
+ }
+},
+{
+ name: "Izlude Battle Arena"
+
+ disabled_skills: {
+ RG_INTIMIDATE: "PLAYER"
+ AL_TELEPORT: "PLAYER"
+ SC_FATALMENACE: "PLAYER"
+ SC_DIMENSIONDOOR: "PLAYER"
+ }
+
+ disabled_items: {
+ }
+},
+{
+ name: "GvG2"
+ inherit: ( "GvG" ) /* will import all gvg has */
+
+ disabled_skills: {
+ TK_HIGHJUMP: "PLAYER"
+ SA_ABRACADABRA: "PLAYER"
+ }
+},
+{
+ name: "WoE TE"
+ inherit: ( "GvG" ) /* will import all gvg has */
+
+ disabled_items: {
+ }
+},
+{
+ name: "Sealed Shrine"
+
+ disabled_skills: {
+ MG_SAFETYWALL: "PLAYER"
+ AL_TELEPORT: "PLAYER | MONSTER | HOMUN | MERCENARY"
+ RG_INTIMIDATE: "PLAYER | MONSTER"
+ HP_ASSUMPTIO: "PLAYER"
+ CASH_ASSUMPTIO: "PLAYER"
+ SC_FATALMENACE: "PLAYER"
+ SC_DIMENSIONDOOR: "PLAYER"
+ }
+},
+{
+ name: "Memorial Dungeon" /* ETower, Orc's Memory, Nidhoggur's Nest, etc */
+
+ disabled_skills: {
+ AL_TELEPORT: "PLAYER | MONSTER | HOMUN | MERCENARY"
+ WZ_ICEWALL: "PLAYER"
+ RG_INTIMIDATE: "PLAYER | MONSTER"
+ PF_SPIDERWEB: "PLAYER"
+ NPC_EXPULSION: "PLAYER"
+ SC_FATALMENACE: "PLAYER"
+ SC_DIMENSIONDOOR: "PLAYER"
+ }
+},
+{
+ name: "Towns"
+
+ disabled_skills: {
+ AM_CANNIBALIZE: "PLAYER"
+ AM_SPHEREMINE: "PLAYER"
+ CR_CULTIVATION: "PLAYER"
+ BS_GREED: "PLAYER"
+ SC_MANHOLE: "PLAYER"
+ WM_POEMOFNETHERWORLD: "PLAYER"
+ GN_WALLOFTHORN: "PLAYER"
+ }
+
+ disabled_items: {
+ }
+}
+)
diff --git a/db/pre-re/mob_boss.txt b/db/pre-re/mob_boss.txt
new file mode 100644
index 00000000..84ae8ced
--- /dev/null
+++ b/db/pre-re/mob_boss.txt
@@ -0,0 +1,5 @@
+// Bloody Branch Summonable Monsters Database
+//
+// Structure of Database:
+// MobID,DummyName,Rate
+
diff --git a/db/pre-re/mob_branch.txt b/db/pre-re/mob_branch.txt
new file mode 100644
index 00000000..9d7256db
--- /dev/null
+++ b/db/pre-re/mob_branch.txt
@@ -0,0 +1,5 @@
+// Dead Branch Summonable Monsters Database
+//
+// Structure of Database:
+// MobID,DummyName,Rate
+
diff --git a/db/pre-re/mob_db.conf b/db/pre-re/mob_db.conf
new file mode 100644
index 00000000..4a0568be
--- /dev/null
+++ b/db/pre-re/mob_db.conf
@@ -0,0 +1,6968 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2015 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Mobs Database
+//=========================================================================
+
+mob_db: (
+// Mobs Database
+//
+/******************************************************************************
+ ************* Entry structure ************************************************
+ ******************************************************************************
+{
+ // =================== Mandatory fields ===============================
+ Id: ID (int)
+ SpriteName: "SPRITE_NAME" (string)
+ Name: "Mob name" (string)
+ // =================== Optional fields ================================
+ JName: "Mob name" (string)
+ Lv: level (int, defaults to 1)
+ Hp: health (int, defaults to 1)
+ Sp: mana (int, defaults to 0)
+ Exp: basic experience (int, defaults to 0)
+ JExp: job experience (int, defaults to 0)
+ AttackRange: attack range (int, defaults to 1)
+ Attack: [attack1, attack2] (int, defaults to 0)
+ Def: defence (int, defaults to 0)
+ Mdef: magic defence (int, defaults to 0)
+ Stats: {
+ Str: strength (int, defaults to 0)
+ Agi: agility (int, defaults to 0)
+ Vit: vitality (int, defaults to 0)
+ Int: intelligence (int, defaults to 0)
+ Dex: dexterity (int, defaults to 0)
+ Luk: luck (int, defaults to 0)
+ }
+ ViewRange: view range (int, defaults to 1)
+ ChaseRange: chase range (int, defaults to 1)
+ Size: size (int, defaults to 1)
+ Race: race (int, defaults to 0)
+ Element: (type, level)
+ Mode: {
+ CanMove: true/false (bool, defaults to false)
+ Looter: true/false (bool, defaults to false)
+ Aggressive: true/false (bool, defaults to false)
+ Assist: true/false (bool, defaults to false)
+ CastSensorIdle:true/false (bool, defaults to false)
+ Boss: true/false (bool, defaults to false)
+ Plant: true/false (bool, defaults to false)
+ CanAttack: true/false (bool, defaults to false)
+ Detector: true/false (bool, defaults to false)
+ CastSensorChase: true/false (bool, defaults to false)
+ ChangeChase: true/false (bool, defaults to false)
+ Angry: true/false (bool, defaults to false)
+ ChangeTargetMelee: true/false (bool, defaults to false)
+ ChangeTargetChase: true/false (bool, defaults to false)
+ TargetWeak: true/false (bool, defaults to false)
+ NoKnockback: true/false (bool, defaults to false)
+ SurviveWithoutMaster: true/false (bool, defaults to false)
+ }
+ MoveSpeed: move speed (int, defaults to 0)
+ WalkMask: walk mask (int, defaults to 0)
+ AttackDelay: attack delay (int, defaults to 4000)
+ AttackMotion: attack motion (int, defaults to 2000)
+ DamageMotion: damage motion (int, defaults to 0)
+ MvpExp: mvp experience (int, defaults to 0)
+ MvpDrops: {
+ AegisName: chance (string: int)
+ ...
+ }
+ Drops: {
+ AegisName: chance (string: int)
+ ...
+ }
+
+},
+******************************************************************************/
+
+//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop1id,Drop1per,Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
+{
+ Id: 1011
+ SpriteName: "FireGoblin"
+ Name: "Fire Goblin"
+ Lv: 20
+ Hp: 220
+ Sp: 0
+ Exp: 41
+ JExp: 4
+ AttackRange: 1
+ Attack: [15, 20]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 6
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (3, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 800
+ CactusDrink: 150
+ BugLeg: 800
+ CactusPotion: 150
+ Dagger: 70
+ SharpKnife: 10
+ PileOfAsh: 500
+ }
+},
+{
+ Id: 1017
+ SpriteName: "Bat"
+ Name: "Bat"
+ Lv: 20
+ Hp: 150
+ Sp: 0
+ Exp: 27
+ JExp: 3
+ AttackRange: 1
+ Attack: [5, 25]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 20
+ Luk: 25
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 800
+ CactusDrink: 150
+ BugLeg: 400
+ RoastedMaggot: 150
+ Dagger: 70
+ SharpKnife: 1
+ BatWing: 3000
+ BatTeeth: 2000
+ }
+},
+{
+ Id: 1131
+ SpriteName: "ManaBug"
+ Name: "Mana Bug"
+ Lv: 25
+ Hp: 300
+ Sp: 0
+ Exp: 52
+ JExp: 5
+ AttackRange: 2
+ Attack: [10, 17]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 1
+ Agi: 4
+ Vit: 1
+ Int: 4
+ Dex: 5
+ Luk: 4
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 1000
+ BugLeg: 800
+ RoastedMaggot: 400
+ }
+},
+{
+ Id: 1018
+ SpriteName: "Pinkie"
+ Name: "Pinkie"
+ Lv: 30
+ Hp: 300
+ Sp: 0
+ Exp: 60
+ JExp: 7
+ AttackRange: 2
+ Attack: [15, 20]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 20
+ Luk: 25
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ PinkAntenna: 1000
+ PinkieHat: (40, "ODG_BASICSTAT")
+ }
+},
+{
+ Id: 1019
+ SpriteName: "SpikyMushroom"
+ Name: "Spiky Mushroom"
+ Lv: 30
+ Hp: 300
+ Sp: 0
+ Exp: 54
+ JExp: 5
+ AttackRange: 1
+ Attack: [10, 13]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 10
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ IronPotion: 800
+ CactusDrink: 150
+ BugLeg: 50
+ HardSpike: 400
+ }
+},
+{
+ Id: 1020
+ SpriteName: "Fluffy"
+ Name: "Fluffy"
+ Lv: 30
+ Hp: 500
+ Sp: 0
+ Exp: 100
+ JExp: 7
+ AttackRange: 1
+ Attack: [6, 10]
+ Def: 1
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 2
+ Vit: 1
+ Int: 0
+ Dex: 20
+ Luk: 25
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1600
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ WhiteFur: 800
+ Milk: 150
+ RedApple: 400
+ FluffyHat: (20, "ODG_BASICSTAT")
+ }
+},
+{
+ Id: 1021
+ SpriteName: "CaveSnake"
+ Name: "Cave Snake"
+ Lv: 30
+ Hp: 800
+ Sp: 0
+ Exp: 157
+ JExp: 13
+ AttackRange: 1
+ Attack: [20, 15]
+ Def: 1
+ Mdef: 5
+ Stats: {
+ Str: 10
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 5
+ Luk: 20
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ CaveSnakeLamp: 1000
+ JeansShorts: (40, "ODG_BASICSTAT")
+ CaveSnakeTongue: 500
+ CaveSnakeEgg: 400
+ CaveSnakeEgg: 400
+ SnakeSkin: 20
+ }
+},
+{
+ Id: 1025
+ SpriteName: "LogHead"
+ Name: "Log Head"
+ Lv: 30
+ Hp: 500
+ Sp: 0
+ Exp: 150
+ JExp: 5
+ AttackRange: 1
+ Attack: [10, 20]
+ Def: 50
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 20
+ Luk: 25
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ RawLog: 2000
+ Root: 2500
+ Acorn: 3000
+ RawLog: 2000
+ }
+},
+{
+ Id: 1027
+ SpriteName: "EasterFluffy"
+ Name: "Easter Fluffy"
+ Lv: 30
+ Hp: 500
+ Sp: 0
+ Exp: 100
+ JExp: 7
+ AttackRange: 1
+ Attack: [10, 12]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 20
+ Luk: 25
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ RedEasterEgg: 2000
+ GreenEasterEgg: 2000
+ BlueEasterEgg: 2000
+ YellowEasterEgg: 1000
+ PinkEasterEgg: 1000
+ TealEasterEgg: 200
+ }
+},
+{
+ Id: 1035
+ SpriteName: "Silkworm"
+ Name: "Silkworm"
+ Lv: 20
+ Hp: 1
+ Sp: 0
+ Exp: 1
+ JExp: 1
+ AttackRange: 1
+ Attack: [0, 0]
+ Def: 2
+ Mdef: 10
+ Stats: {
+ Str: 20
+ Agi: 11
+ Vit: 10
+ Int: 10
+ Dex: 40
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1300
+ AttackDelay: 1100
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ SilkCocoon: 5000
+ }
+},
+{
+ Id: 1041
+ SpriteName: "Snail"
+ Name: "Snail"
+ Lv: 30
+ Hp: 900
+ Sp: 0
+ Exp: 180
+ JExp: 18
+ AttackRange: 1
+ Attack: [50, 65]
+ Def: 20
+ Mdef: 15
+ Stats: {
+ Str: 10
+ Agi: 1
+ Vit: 25
+ Int: 0
+ Dex: 20
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1800
+ AttackDelay: 2500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ GreenApple: 500
+ ReedBundle: 400
+ Pear: 1000
+ Plum: 1500
+ Blueberries: 500
+ Cherry: 2000
+ }
+},
+{
+ Id: 1049
+ SpriteName: "Bee"
+ Name: "Bee"
+ Lv: 30
+ Hp: 600
+ Sp: 0
+ Exp: 180
+ JExp: 32
+ AttackRange: 1
+ Attack: [5, 90]
+ Def: 12
+ Mdef: 4
+ Stats: {
+ Str: 15
+ Agi: 25
+ Vit: 20
+ Int: 3
+ Dex: 40
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 380
+ AttackDelay: 1500
+ AttackMotion: 300
+ DamageMotion: 350
+},
+{
+ Id: 1055
+ SpriteName: "Butterfly"
+ Name: "Butterfly"
+ Lv: 25
+ Hp: 250
+ Sp: 0
+ Exp: 85
+ JExp: 11
+ AttackRange: 2
+ Attack: [10, 40]
+ Def: 3
+ Mdef: 5
+ Stats: {
+ Str: 10
+ Agi: 45
+ Vit: 10
+ Int: 15
+ Dex: 35
+ Luk: 40
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 2)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 350
+ AttackDelay: 780
+ AttackMotion: 300
+ DamageMotion: 800
+ Drops: {
+ SilkCocoon: 1000
+ }
+},
+{
+ Id: 1057
+ SpriteName: "AngryScorpion"
+ Name: "Angry Scorpion"
+ Lv: 20
+ Hp: 200
+ Sp: 0
+ Exp: 37
+ JExp: 5
+ AttackRange: 1
+ Attack: [15, 15]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 5
+ Agi: 5
+ Vit: 1
+ Int: 0
+ Dex: 15
+ Luk: 5
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1000
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ AngryScorpionStinger: 700
+ Candy: 100
+ ChocolateBar: 50
+ BugLeg: 700
+ }
+},
+{
+ Id: 1058
+ SpriteName: "IceGoblin"
+ Name: "Ice Goblin"
+ Lv: 25
+ Hp: 330
+ Sp: 0
+ Exp: 75
+ JExp: 10
+ AttackRange: 1
+ Attack: [20, 25]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 5
+ Agi: 5
+ Vit: 1
+ Int: 0
+ Dex: 6
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 700
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 800
+ CactusDrink: 150
+ BugLeg: 800
+ CactusPotion: 150
+ Dagger: 70
+ SharpKnife: 10
+ IceCube: 500
+ }
+},
+{
+ Id: 1060
+ SpriteName: "Archant"
+ Name: "Archant"
+ Lv: 30
+ Hp: 400
+ Sp: 0
+ Exp: 88
+ JExp: 14
+ AttackRange: 1
+ Attack: [20, 30]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 10
+ Agi: 5
+ Vit: 1
+ Int: 0
+ Dex: 12
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1000
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ TreasureKey: 300
+ RedApple: 100
+ IronOre: 40
+ Coal: 20
+ }
+},
+{
+ Id: 1064
+ SpriteName: "Bandit"
+ Name: "Bandit"
+ Lv: 20
+ Hp: 400
+ Sp: 0
+ Exp: 92
+ JExp: 21
+ AttackRange: 1
+ Attack: [40, 40]
+ Def: 5
+ Mdef: 0
+ Stats: {
+ Str: 10
+ Agi: 10
+ Vit: 10
+ Int: 10
+ Dex: 10
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 500
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 900
+ Drops: {
+ BanditHood: 800
+ Dagger: 200
+ CoinBag: 500
+ RedApple: 200
+ }
+},
+{
+ Id: 1083
+ SpriteName: "HuntsmanSpider"
+ Name: "Huntsman Spider"
+ Lv: 30
+ Hp: 1500
+ Sp: 0
+ Exp: 467
+ JExp: 363
+ AttackRange: 1
+ Attack: [125, 150]
+ Def: 10
+ Mdef: 45
+ Stats: {
+ Str: 20
+ Agi: 15
+ Vit: 10
+ Int: 10
+ Dex: 45
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 2)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 575
+ AttackDelay: 1250
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ InfantryHelmet: (100, "ODG_BASICSTAT")
+ CoinBag: 500
+ IronOre: 300
+ BugLeg: 1000
+ GreenApple: 500
+ Coal: 150
+ }
+},
+{
+ Id: 1084
+ SpriteName: "CrotcherScorpion"
+ Name: "Crotcher Scorpion"
+ Lv: 25
+ Hp: 1200
+ Sp: 0
+ Exp: 430
+ JExp: 86
+ AttackRange: 1
+ Attack: [75, 175]
+ Def: 15
+ Mdef: 45
+ Stats: {
+ Str: 15
+ Agi: 30
+ Vit: 10
+ Int: 10
+ Dex: 25
+ Luk: 25
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 2)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 750
+ AttackDelay: 1350
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ LeatherShirt: (300, "ODG_BASICSTAT")
+ BugLeg: 1000
+ ChocolateBar: 300
+ GingerBreadMan: 300
+ RedApple: 500
+ }
+},
+{
+ Id: 1087
+ SpriteName: "Larvern"
+ Name: "Larvern"
+ Lv: 20
+ Hp: 550
+ Sp: 0
+ Exp: 165
+ JExp: 26
+ AttackRange: 1
+ Attack: [50, 200]
+ Def: 30
+ Mdef: 65
+ Stats: {
+ Str: 35
+ Agi: 20
+ Vit: 50
+ Int: 0
+ Dex: 70
+ Luk: 20
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1500
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ GrubSlime: 2000
+ BugLeg: 1000
+ GrassSeed: 300
+ ReedBundle: 300
+ }
+},
+{
+ Id: 1089
+ SpriteName: "HungryFluffy"
+ Name: "Hungry Fluffy"
+ Lv: 30
+ Hp: 500
+ Sp: 0
+ Exp: 111
+ JExp: 10
+ AttackRange: 1
+ Attack: [6, 10]
+ Def: 1
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 2
+ Vit: 1
+ Int: 0
+ Dex: 20
+ Luk: 25
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1600
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ WhiteFur: 500
+ Milk: 150
+ FluffyHat: (20, "ODG_BASICSTAT")
+ }
+},
+{
+ Id: 1093
+ SpriteName: "WhiteSlime"
+ Name: "White Slime"
+ Lv: 20
+ Hp: 200
+ Sp: 0
+ Exp: 55
+ JExp: 15
+ AttackRange: 1
+ Attack: [80, 120]
+ Def: 10
+ Mdef: 10
+ Stats: {
+ Str: 20
+ Agi: 30
+ Vit: 10
+ Int: 10
+ Dex: 30
+ Luk: 20
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 3)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 500
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ IceCube: 200
+ Diamond: 20
+ BottleOfWater: 500
+ SilverMirror: 100
+ BookPage: 200
+ }
+},
+{
+ Id: 1094
+ SpriteName: "Reinboo"
+ Name: "Reinboo"
+ Lv: 35
+ Hp: 1100
+ Sp: 0
+ Exp: 275
+ JExp: 29
+ AttackRange: 2
+ Attack: [40, 75]
+ Def: 35
+ Mdef: 5
+ Stats: {
+ Str: 15
+ Agi: 5
+ Vit: 15
+ Int: 0
+ Dex: 40
+ Luk: 10
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ GingerBreadMan: 1000
+ WhiteCake: 1200
+ ChocolateCake: 1200
+ OrangeCake: 1200
+ AppleCake: 1200
+ Antlers: 50
+ RedNose: 10
+ }
+},
+{
+ Id: 1099
+ SpriteName: "SleepingBandit"
+ Name: "Sleeping Bandit"
+ Lv: 20
+ Hp: 25
+ Sp: 0
+ Exp: 3
+ JExp: 1
+ AttackRange: 1
+ Attack: [0, 0]
+ Def: 0
+ Mdef: 0
+ Stats: {
+ Str: 10
+ Agi: 10
+ Vit: 10
+ Int: 10
+ Dex: 10
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ MoveSpeed: 500
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 900
+ Drops: {
+ BanditHood: 800
+ Dagger: 200
+ CoinBag: 500
+ RedApple: 200
+ }
+},
+{
+ Id: 1100
+ SpriteName: "AzulSlime"
+ Name: "Azul Slime"
+ Lv: 20
+ Hp: 200
+ Sp: 0
+ Exp: 55
+ JExp: 10
+ AttackRange: 1
+ Attack: [80, 120]
+ Def: 10
+ Mdef: 10
+ Stats: {
+ Str: 20
+ Agi: 30
+ Vit: 10
+ Int: 10
+ Dex: 30
+ Luk: 20
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 3)
+ Mode: {
+ CanMove: true
+ Looter: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 500
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+},
+{
+ Id: 1107
+ SpriteName: "Bluepar"
+ Name: "Bluepar"
+ Lv: 30
+ Hp: 350
+ Sp: 0
+ Exp: 77
+ JExp: 8
+ AttackRange: 2
+ Attack: [7, 15]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 20
+ Luk: 25
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ IronPotion: 800
+ ConcentrationPotion: 800
+ Diamond: 50
+ }
+},
+{
+ Id: 1108
+ SpriteName: "AngryFireGoblin"
+ Name: "Angry Fire Goblin"
+ Lv: 30
+ Hp: 320
+ Sp: 0
+ Exp: 85
+ JExp: 12
+ AttackRange: 1
+ Attack: [25, 40]
+ Def: 0
+ Mdef: 10
+ Stats: {
+ Str: 3
+ Agi: 3
+ Vit: 3
+ Int: 2
+ Dex: 10
+ Luk: 50
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (3, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 800
+ CactusDrink: 150
+ BugLeg: 800
+ CactusPotion: 150
+ Dagger: 70
+ SharpKnife: 10
+ PileOfAsh: 500
+ }
+},
+{
+ Id: 1113
+ SpriteName: "Pollett"
+ Name: "Pollett"
+ Lv: 30
+ Hp: 500
+ Sp: 0
+ Exp: 100
+ JExp: 7
+ AttackRange: 1
+ Attack: [6, 10]
+ Def: 1
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 2
+ Vit: 1
+ Int: 0
+ Dex: 20
+ Luk: 25
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1600
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ IceCube: 1000
+ AnimalBones: 500
+ Pearl: 300
+ IcedWater: 100
+ PollettEgg: 400
+ PollettEgg: 400
+ PollettEgg: 400
+ WhiteFur: 500
+ }
+},
+//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop1id,Drop1per,Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
+{
+ Id: 1009
+ SpriteName: "BlackScorpion"
+ Name: "Black Scorpion"
+ Lv: 100
+ Hp: 600
+ Sp: 0
+ Exp: 500
+ JExp: 37
+ AttackRange: 1
+ Attack: [60, 100]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 16
+ Agi: 30
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1000
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ LeatherShirt: (150, "ODG_BASICSTAT")
+ ChocolateBar: 100
+ BugLeg: 800
+ BlackScorpionStinger: 800
+ }
+},
+{
+ Id: 1010
+ SpriteName: "Snake"
+ Name: "Snake"
+ Lv: 115
+ Hp: 850
+ Sp: 0
+ Exp: 722
+ JExp: 56
+ AttackRange: 1
+ Attack: [75, 90]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 20
+ Agi: 11
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 900
+ AttackDelay: 1300
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ SnakeSkin: 150
+ SnakeEgg: 400
+ SnakeEgg: 400
+ SnakeTongue: 500
+ }
+},
+{
+ Id: 1012
+ SpriteName: "Spider"
+ Name: "Spider"
+ Lv: 125
+ Hp: 800
+ Sp: 0
+ Exp: 690
+ JExp: 115
+ AttackRange: 1
+ Attack: [70, 85]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 14
+ Agi: 13
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1000
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ TreasureKey: 500
+ RedApple: 100
+ InfantryHelmet: (20, "ODG_BASICSTAT")
+ CoinBag: 200
+ }
+},
+{
+ Id: 1013
+ SpriteName: "EvilMushroom"
+ Name: "Evil Mushroom"
+ Lv: 110
+ Hp: 650
+ Sp: 0
+ Exp: 233
+ JExp: 35
+ AttackRange: 1
+ Attack: [65, 80]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 16
+ Agi: 12
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ RedApple: 500
+ EmptyBottle: 10
+ OrangeCupcake: 100
+ SmallMushroom: 1000
+ }
+},
+{
+ Id: 1014
+ SpriteName: "PinkFlower"
+ Name: "Pink Flower"
+ Lv: 115
+ Hp: 700
+ Sp: 0
+ Exp: 296
+ JExp: 40
+ AttackRange: 2
+ Attack: [70, 75]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 16
+ Agi: 12
+ Vit: 20
+ Int: 20
+ Dex: 20
+ Luk: 50
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ RedApple: 100
+ EmptyBottle: 10
+ Arrow: 100
+ CoinBag: 400
+ PinkPetal: 1000
+ PinkPetal: 1000
+ }
+},
+{
+ Id: 1015
+ SpriteName: "SantaSlime"
+ Name: "Santa Slime"
+ Lv: 120
+ Hp: 750
+ Sp: 0
+ Exp: 298
+ JExp: 58
+ AttackRange: 1
+ Attack: [75, 80]
+ Def: 2
+ Mdef: 7
+ Stats: {
+ Str: 1
+ Agi: 20
+ Vit: 1
+ Int: 0
+ Dex: 30
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1500
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ GingerBreadMan: 800
+ Cake: 700
+ XmasCandyCane: 600
+ CherryCake: 500
+ Milk: 400
+ GreenPresentBox: 500
+ }
+},
+{
+ Id: 1022
+ SpriteName: "JackO"
+ Name: "Jack O"
+ Lv: 175
+ Hp: 10000
+ Sp: 0
+ Exp: 18130
+ JExp: 1241
+ AttackRange: 2
+ Attack: [100, 500]
+ Def: 40
+ Mdef: 20
+ Stats: {
+ Str: 105
+ Agi: 40
+ Vit: 85
+ Int: 75
+ Dex: 105
+ Luk: 95
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 250
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ PirateHat: (300, "ODG_BASICSTAT")
+ Bandana: (400, "ODG_BASICSTAT")
+ VNeckSweater: (400, "ODG_BASICSTAT")
+ Circlet: (400, "ODG_BASICSTAT")
+ PumpkinHelmet: (300, "ODG_BASICSTAT")
+ RangerHat: (400, "ODG_BASICSTAT")
+ Soul: 10000
+ AxeHat: (600, "ODG_BASICSTAT")
+ }
+},
+{
+ Id: 1023
+ SpriteName: "FireSkull"
+ Name: "Fire Skull"
+ Lv: 170
+ Hp: 5000
+ Sp: 0
+ Exp: 5808
+ JExp: 721
+ AttackRange: 2
+ Attack: [75, 175]
+ Def: 35
+ Mdef: 15
+ Stats: {
+ Str: 40
+ Agi: 30
+ Vit: 30
+ Int: 30
+ Dex: 35
+ Luk: 70
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (3, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1600
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ DarkCrystal: 1000
+ PileOfAsh: 5000
+ }
+},
+{
+ Id: 1024
+ SpriteName: "PoisonSkull"
+ Name: "Poison Skull"
+ Lv: 170
+ Hp: 5000
+ Sp: 0
+ Exp: 5808
+ JExp: 721
+ AttackRange: 2
+ Attack: [75, 175]
+ Def: 35
+ Mdef: 15
+ Stats: {
+ Str: 40
+ Agi: 30
+ Vit: 30
+ Int: 30
+ Dex: 35
+ Luk: 70
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1600
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ DarkCrystal: 1000
+ }
+},
+{
+ Id: 1026
+ SpriteName: "MountainSnake"
+ Name: "Mountain Snake"
+ Lv: 130
+ Hp: 900
+ Sp: 0
+ Exp: 1024
+ JExp: 63
+ AttackRange: 1
+ Attack: [80, 125]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 20
+ Agi: 40
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 45
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1000
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ LeatherGloves: (20, "ODG_BASICSTAT")
+ SnakeSkin: 350
+ MountainSnakeEgg: 400
+ MountainSnakeEgg: 400
+ MountainSnakeTongue: 500
+ }
+},
+{
+ Id: 1034
+ SpriteName: "GrassSnake"
+ Name: "Grass Snake"
+ Lv: 140
+ Hp: 1000
+ Sp: 0
+ Exp: 1254
+ JExp: 103
+ AttackRange: 1
+ Attack: [80, 120]
+ Def: 2
+ Mdef: 10
+ Stats: {
+ Str: 20
+ Agi: 40
+ Vit: 10
+ Int: 10
+ Dex: 40
+ Luk: 50
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 500
+ AttackDelay: 1100
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ GrassSnakeEgg: 400
+ GrassSnakeEgg: 400
+ GrassSnakeTongue: 500
+ Steak: 500
+ CottonCloth: 1600
+ SnakeSkin: 500
+ }
+},
+{
+ Id: 1036
+ SpriteName: "Zombie"
+ Name: "Zombie"
+ Lv: 110
+ Hp: 12000
+ Sp: 0
+ Exp: 7782
+ JExp: 1393
+ AttackRange: 2
+ Attack: [275, 355]
+ Def: 20
+ Mdef: 15
+ Stats: {
+ Str: 30
+ Agi: 15
+ Vit: 30
+ Int: 3
+ Dex: 60
+ Luk: 40
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 480
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 900
+ Drops: {
+ DarkCrystal: 1000
+ RottenRags: 700
+ DiseasedHeart: 500
+ UndeadEar: 200
+ UndeadEye: 150
+ Soul: 500
+ }
+},
+{
+ Id: 1042
+ SpriteName: "Spectre"
+ Name: "Spectre"
+ Lv: 140
+ Hp: 6500
+ Sp: 0
+ Exp: 3978
+ JExp: 359
+ AttackRange: 3
+ Attack: [160, 220]
+ Def: 40
+ Mdef: 0
+ Stats: {
+ Str: 35
+ Agi: 70
+ Vit: 22
+ Int: 15
+ Dex: 20
+ Luk: 70
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 2)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 650
+ AttackDelay: 1700
+ AttackMotion: 800
+ DamageMotion: 500
+ Drops: {
+ SpectrePowder: 1000
+ SulphurPowder: 600
+ SulphurPowder: 480
+ }
+},
+{
+ Id: 1045
+ SpriteName: "Fallen"
+ Name: "Fallen"
+ Lv: 120
+ Hp: 10000
+ Sp: 0
+ Exp: 7812
+ JExp: 1663
+ AttackRange: 2
+ Attack: [180, 430]
+ Def: 5
+ Mdef: 20
+ Stats: {
+ Str: 40
+ Agi: 3
+ Vit: 25
+ Int: 5
+ Dex: 80
+ Luk: 45
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 2)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 300
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 300
+ Drops: {
+ Bone: 210
+ Bone: 210
+ Skull: 300
+ DarkCrystal: 1000
+ WarlordHelmet: (3, "ODG_BASICSTAT")
+ WarlordPlate: (2, "ODG_BASICSTAT")
+ LeatherGloves: (35, "ODG_BASICSTAT")
+ DiseasedHeart: 500
+ Soul: 500
+ }
+},
+{
+ Id: 1062
+ SpriteName: "Terranite"
+ Name: "Terranite"
+ Lv: 110
+ Hp: 6000
+ Sp: 0
+ Exp: 4851
+ JExp: 889
+ AttackRange: 1
+ Attack: [200, 300]
+ Def: 20
+ Mdef: 40
+ Stats: {
+ Str: 60
+ Agi: 40
+ Vit: 40
+ Int: 30
+ Dex: 60
+ Luk: 40
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 400
+ AttackDelay: 872
+ AttackMotion: 672
+ DamageMotion: 900
+ Drops: {
+ Coal: 600
+ Emerald: 20
+ Sapphire: 20
+ Amethyst: 20
+ TerraniteOre: 500
+ IronOre: 500
+ }
+},
+{
+ Id: 1068
+ SpriteName: "Reaper"
+ Name: "Reaper"
+ Lv: 140
+ Hp: 40000
+ Sp: 0
+ Exp: 64128
+ JExp: 156
+ AttackRange: 7
+ Attack: [200, 350]
+ Def: 30
+ Mdef: 80
+ Stats: {
+ Str: 100
+ Agi: 120
+ Vit: 70
+ Int: 120
+ Dex: 100
+ Luk: 75
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 4)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 500
+ AttackDelay: 1200
+ AttackMotion: 800
+ DamageMotion: 300
+ Drops: {
+ RottenRags: 1000
+ Bone: 500
+ Skull: 100
+ SkullMask: 10
+ }
+},
+{
+ Id: 1071
+ SpriteName: "IceElement"
+ Name: "Ice Element"
+ Lv: 100
+ Hp: 5000
+ Sp: 0
+ Exp: 2897
+ JExp: 689
+ AttackRange: 3
+ Attack: [60, 200]
+ Def: 5
+ Mdef: 20
+ Stats: {
+ Str: 15
+ Agi: 25
+ Vit: 40
+ Int: 15
+ Dex: 45
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 2)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 330
+ AttackDelay: 740
+ AttackMotion: 672
+ DamageMotion: 400
+ Drops: {
+ IceCube: 900
+ TreasureKey: 750
+ ConcentrationPotion: 400
+ StandardHeadband: (900, "ODG_BASICSTAT")
+ SilkHeadband: (250, "ODG_BASICSTAT")
+ }
+},
+{
+ Id: 1072
+ SpriteName: "Yeti"
+ Name: "Yeti"
+ Lv: 100
+ Hp: 8500
+ Sp: 0
+ Exp: 9040
+ JExp: 726
+ AttackRange: 2
+ Attack: [100, 400]
+ Def: 60
+ Mdef: 15
+ Stats: {
+ Str: 60
+ Agi: 5
+ Vit: 45
+ Int: 15
+ Dex: 60
+ Luk: 32
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 3)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 220
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 900
+ Drops: {
+ AnimalBones: 700
+ FrozenYetiTear: 300
+ YetiClaw: 400
+ YetiMask: (142, "ODG_BASICSTAT")
+ YellowPresentBox: 800
+ WhitePresentBox: 700
+ }
+},
+{
+ Id: 1075
+ SpriteName: "Stalker"
+ Name: "Stalker"
+ Lv: 120
+ Hp: 20000
+ Sp: 0
+ Exp: 15628
+ JExp: 4000
+ AttackRange: 2
+ Attack: [220, 500]
+ Def: 23
+ Mdef: 30
+ Stats: {
+ Str: 35
+ Agi: 15
+ Vit: 3
+ Int: 50
+ Dex: 50
+ Luk: 50
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 340
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 950
+ Drops: {
+ Bone: 75
+ Bone: 115
+ Skull: 135
+ DarkCrystal: 40
+ DiseasedHeart: 500
+ Soul: 500
+ }
+},
+{
+ Id: 1085
+ SpriteName: "IceSkull"
+ Name: "Ice Skull"
+ Lv: 170
+ Hp: 7000
+ Sp: 0
+ Exp: 7595
+ JExp: 757
+ AttackRange: 2
+ Attack: [75, 400]
+ Def: 40
+ Mdef: 15
+ Stats: {
+ Str: 40
+ Agi: 30
+ Vit: 30
+ Int: 30
+ Dex: 35
+ Luk: 44
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1600
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ IceCube: 5000
+ IcedWater: 800
+ }
+},
+{
+ Id: 1096
+ SpriteName: "SoulSnake"
+ Name: "Soul Snake"
+ Lv: 115
+ Hp: 850
+ Sp: 0
+ Exp: 325
+ JExp: 56
+ AttackRange: 1
+ Attack: [75, 90]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 20
+ Agi: 11
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 900
+ AttackDelay: 1300
+ AttackMotion: 672
+ DamageMotion: 480
+},
+{
+ Id: 1102
+ SpriteName: "Luvia"
+ Name: "Luvia"
+ Lv: 127
+ Hp: 48044
+ Sp: 60
+ Exp: 315973
+ JExp: 12172
+ AttackRange: 5
+ Attack: [339, 364]
+ Def: 50
+ Mdef: 92
+ Stats: {
+ Str: 1
+ Agi: 29
+ Vit: 55
+ Int: 255
+ Dex: 255
+ Luk: 255
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 220
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 50
+ Drops: {
+ AlizarinScroll: 10
+ CobaltScroll: 10
+ GambogeScroll: 10
+ MauveScroll: 10
+ JoyplimScroll: 10
+ }
+},
+{
+ Id: 1106
+ SpriteName: "WickedMushroom"
+ Name: "Wicked Mushroom"
+ Lv: 110
+ Hp: 550
+ Sp: 0
+ Exp: 220
+ JExp: 30
+ AttackRange: 1
+ Attack: [70, 80]
+ Def: 4
+ Mdef: 4
+ Stats: {
+ Str: 16
+ Agi: 12
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ HardSpike: 600
+ Amethyst: 50
+ IronPotion: 100
+ SmallMushroom: 1000
+ JoyplimScroll: 40
+ }
+},
+//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop1id,Drop1per,Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
+{
+ Id: 1114
+ SpriteName: "Nutcracker"
+ Name: "Nutcracker"
+ Lv: 110
+ Hp: 6000
+ Sp: 0
+ Exp: 4226
+ JExp: 769
+ AttackRange: 1
+ Attack: [81, 281]
+ Def: 20
+ Mdef: 42
+ Stats: {
+ Str: 40
+ Agi: 20
+ Vit: 10
+ Int: 5
+ Dex: 60
+ Luk: 40
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 400
+ AttackDelay: 872
+ AttackMotion: 672
+ DamageMotion: 900
+ Drops: {
+ RawLog: 1000
+ CottonCloth: 750
+ Beer: 750
+ CasinoCoins: 250
+ IronOre: 200
+ Emerald: 200
+ Coal: 600
+ }
+},
+{
+ Id: 1119
+ SpriteName: "Thug"
+ Name: "Thug"
+ Lv: 170
+ Hp: 5000
+ Sp: 0
+ Exp: 5491
+ JExp: 999
+ AttackRange: 1
+ Attack: [125, 250]
+ Def: 30
+ Mdef: 6
+ Stats: {
+ Str: 10
+ Agi: 10
+ Vit: 60
+ Int: 10
+ Dex: 50
+ Luk: 70
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 500
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Beer: 1000
+ Orange: 1000
+ SulphurPowder: 1000
+ PileOfAsh: 500
+ Pearl: 250
+ SailorHat: (10, "ODG_BASICSTAT")
+ }
+},
+{
+ Id: 1120
+ SpriteName: "Swashbuckler"
+ Name: "Swashbuckler"
+ Lv: 170
+ Hp: 5000
+ Sp: 0
+ Exp: 5434
+ JExp: 999
+ AttackRange: 1
+ Attack: [75, 250]
+ Def: 23
+ Mdef: 27
+ Stats: {
+ Str: 20
+ Agi: 20
+ Vit: 40
+ Int: 30
+ Dex: 90
+ Luk: 70
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 400
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Beer: 1000
+ Orange: 1000
+ SulphurPowder: 1000
+ PileOfAsh: 500
+ Pearl: 250
+ Bandana: (500, "ODG_BASICSTAT")
+ }
+},
+{
+ Id: 1121
+ SpriteName: "Grenadier"
+ Name: "Grenadier"
+ Lv: 170
+ Hp: 6000
+ Sp: 0
+ Exp: 4332
+ JExp: 999
+ AttackRange: 6
+ Attack: [100, 200]
+ Def: 8
+ Mdef: 60
+ Stats: {
+ Str: 12
+ Agi: 10
+ Vit: 50
+ Int: 60
+ Dex: 90
+ Luk: 70
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 500
+ AttackDelay: 2000
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Beer: 1000
+ Orange: 1000
+ PileOfAsh: 500
+ IronPowder: 250
+ Pearl: 250
+ CaptainsHat: (1, "ODG_BASICSTAT")
+ }
+},
+{
+ Id: 1122
+ SpriteName: "DreadPirateMarley"
+ Name: "Dread Pirate Marley"
+ Lv: 180
+ Hp: 10000
+ Sp: 0
+ Exp: 17612
+ JExp: 20000
+ AttackRange: 4
+ Attack: [175, 250]
+ Def: 38
+ Mdef: 32
+ Stats: {
+ Str: 10
+ Agi: 20
+ Vit: 40
+ Int: 20
+ Dex: 90
+ Luk: 80
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 400
+ AttackDelay: 700
+ AttackMotion: 672
+ DamageMotion: 480
+},
+{
+ Id: 1123
+ SpriteName: "DreadPirateMarleyClone"
+ Name: "Dread Pirate Marley Clone"
+ Lv: 150
+ Hp: 2000
+ Sp: 0
+ Exp: 1652
+ JExp: 0
+ AttackRange: 4
+ Attack: [175, 250]
+ Def: 18
+ Mdef: 22
+ Stats: {
+ Str: 10
+ Agi: 40
+ Vit: 30
+ Int: 20
+ Dex: 80
+ Luk: 40
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 500
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 480
+},
+{
+ Id: 1126
+ SpriteName: "PsiBrain"
+ Name: "Psi Brain"
+ Lv: 100
+ Hp: 10000
+ Sp: 0
+ Exp: 7255
+ JExp: 4000
+ AttackRange: 2
+ Attack: [220, 500]
+ Def: 23
+ Mdef: 30
+ Stats: {
+ Str: 35
+ Agi: 15
+ Vit: 3
+ Int: 50
+ Dex: 50
+ Luk: 50
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 340
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 950
+ Drops: {
+ Bone: 75
+ Bone: 115
+ Skull: 135
+ DarkCrystal: 40
+ BrainStem: 700
+ }
+},
+{
+ Id: 1127
+ SpriteName: "GeneralKrukan"
+ Name: "General Krukan"
+ Lv: 140
+ Hp: 40000
+ Sp: 0
+ Exp: 27536
+ JExp: 1663
+ AttackRange: 2
+ Attack: [180, 430]
+ Def: 5
+ Mdef: 20
+ Stats: {
+ Str: 40
+ Agi: 3
+ Vit: 25
+ Int: 5
+ Dex: 80
+ Luk: 45
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 2)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ Boss: true
+ }
+ MoveSpeed: 300
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 300
+ MvpExp: 778
+ Drops: {
+ Bone: 1000
+ Skull: 1000
+ DarkCrystal: 1000
+ DarkHelm: 2
+ WarlordHelmet: (6, "ODG_BASICSTAT")
+ KnightsHelmet: (25, "ODG_BASICSTAT")
+ InfantryHelmet: (50, "ODG_BASICSTAT")
+ CrusadeHelmet: (8, "ODG_BASICSTAT")
+ DiseasedHeart: 500
+ Soul: 500
+ }
+},
+{
+ Id: 1128
+ SpriteName: "GeneralRazha"
+ Name: "General Razha"
+ Lv: 140
+ Hp: 40000
+ Sp: 0
+ Exp: 27536
+ JExp: 1663
+ AttackRange: 2
+ Attack: [180, 430]
+ Def: 5
+ Mdef: 20
+ Stats: {
+ Str: 40
+ Agi: 3
+ Vit: 25
+ Int: 5
+ Dex: 80
+ Luk: 45
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 2)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ Boss: true
+ }
+ MoveSpeed: 300
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 300
+ MvpExp: 1198
+ Drops: {
+ Bone: 210
+ UnderworldMask: 5
+ Skull: 300
+ DarkCrystal: 1000
+ WarlordHelmet: (3, "ODG_BASICSTAT")
+ WarlordPlate: (2, "ODG_BASICSTAT")
+ LeatherGloves: (35, "ODG_BASICSTAT")
+ DiseasedHeart: 500
+ Soul: 500
+ }
+},
+{
+ Id: 1129
+ SpriteName: "GeneralTerogan"
+ Name: "General Terogan"
+ Lv: 140
+ Hp: 40000
+ Sp: 0
+ Exp: 27536
+ JExp: 1663
+ AttackRange: 2
+ Attack: [180, 430]
+ Def: 5
+ Mdef: 20
+ Stats: {
+ Str: 40
+ Agi: 3
+ Vit: 25
+ Int: 5
+ Dex: 80
+ Luk: 45
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 2)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ Boss: true
+ }
+ MoveSpeed: 300
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 300
+ MvpExp: 1198
+ Drops: {
+ Bone: 210
+ Phylactery: 1
+ Skull: 300
+ DarkCrystal: 1000
+ WarlordHelmet: (3, "ODG_BASICSTAT")
+ WarlordPlate: (2, "ODG_BASICSTAT")
+ LeatherGloves: (35, "ODG_BASICSTAT")
+ DiseasedHeart: 500
+ Soul: 500
+ }
+},
+{
+ Id: 1130
+ SpriteName: "Moonshroom"
+ Name: "Moonshroom"
+ Lv: 110
+ Hp: 550
+ Sp: 0
+ Exp: 224
+ JExp: 35
+ AttackRange: 4
+ Attack: [70, 80]
+ Def: 4
+ Mdef: 4
+ Stats: {
+ Str: 16
+ Agi: 12
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ SmallMushroom: 500
+ BugLeg: 500
+ SulphurPowder: 400
+ Lifestone: 300
+ EmptyBottle: 100
+ JoyplimScroll: 50
+ }
+},
+{
+ Id: 1132
+ SpriteName: "LavaSlime"
+ Name: "Lava Slime"
+ Lv: 135
+ Hp: 4144
+ Sp: 0
+ Exp: 6000
+ JExp: 1111
+ AttackRange: 2
+ Attack: [105, 260]
+ Def: 75
+ Mdef: 80
+ Stats: {
+ Str: 30
+ Agi: 15
+ Vit: 35
+ Int: 10
+ Dex: 70
+ Luk: 250
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (3, 2)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 900
+ AttackDelay: 1300
+ AttackMotion: 672
+ DamageMotion: 100
+ Drops: {
+ SlingBullet: 10000
+ SulphurPowder: 5000
+ SulphurPowder: 5000
+ IronOre: 1000
+ PileOfAsh: 1000
+ Coal: 1000
+ TinyManaElixir: 500
+ }
+},
+{
+ Id: 1133
+ SpriteName: "Anne"
+ Name: "Anne"
+ Lv: 110
+ Hp: 12000
+ Sp: 0
+ Exp: 1100
+ JExp: 889
+ AttackRange: 1
+ Attack: [200, 300]
+ Def: 20
+ Mdef: 40
+ Stats: {
+ Str: 60
+ Agi: 40
+ Vit: 40
+ Int: 30
+ Dex: 60
+ Luk: 40
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 380
+ AttackDelay: 872
+ AttackMotion: 672
+ DamageMotion: 900
+ Drops: {
+ CranberryLollipop: 6000
+ GrapeLollipop: 6000
+ OrangeLollipop: 6000
+ CaramelApple: 200
+ LollipopColor1: 500
+ LollipopColor2: 500
+ LollipopColor3: 500
+ ShockSweet: 20
+ }
+},
+{
+ Id: 1134
+ SpriteName: "SUSAN"
+ Name: "SUSAN"
+ Lv: 255
+ Hp: 696969
+ Sp: 0
+ Exp: 69000
+ JExp: 1400
+ AttackRange: 1
+ Attack: [0, 0]
+ Def: 69
+ Mdef: 69
+ Stats: {
+ Str: 69
+ Agi: 69
+ Vit: 69
+ Int: 69
+ Dex: 69
+ Luk: 69
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1500
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ CranberryLollipop: 6000
+ GrapeLollipop: 6000
+ OrangeLollipop: 6000
+ CaramelApple: 200
+ LollipopColor1: 500
+ LollipopColor2: 500
+ LollipopColor3: 500
+ ShockSweet: 20
+ }
+},
+{
+ Id: 1135
+ SpriteName: "LovelyMaggot"
+ Name: "Lovely Maggot"
+ Lv: 1
+ Hp: 50
+ Sp: 0
+ Exp: 1
+ JExp: 1
+ AttackRange: 1
+ Attack: [69, 6969]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 5
+ Agi: 5
+ Vit: 1
+ Int: 0
+ Dex: 6
+ Luk: 5
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 200
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 400
+ CactusDrink: 70
+ BugLeg: 200
+ RoastedMaggot: 75
+ CactusPotion: 30
+ }
+},
+{
+ Id: 1136
+ SpriteName: "LesserGhost"
+ Name: "Lesser Ghost"
+ Lv: 1
+ Hp: 1
+ Sp: 0
+ Exp: 1
+ JExp: 1
+ AttackRange: 0
+ Attack: [150, 300]
+ Def: 0
+ Mdef: 0
+ Stats: {
+ Str: 0
+ Agi: 0
+ Vit: 0
+ Int: 0
+ Dex: 0
+ Luk: 0
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 340
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 950
+},
+{
+ Id: 1137
+ SpriteName: "Tormenta"
+ Name: "Tormenta"
+ Lv: 200
+ Hp: 18000
+ Sp: 60
+ Exp: 500000
+ JExp: 5000
+ AttackRange: 5
+ Attack: [360, 374]
+ Def: 48
+ Mdef: 90
+ Stats: {
+ Str: 1
+ Agi: 32
+ Vit: 60
+ Int: 255
+ Dex: 255
+ Luk: 255
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 210
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 50
+ Drops: {
+ AlizarinScroll: 10
+ CobaltScroll: 10
+ GambogeScroll: 10
+ MauveScroll: 10
+ JoyplimScroll: 10
+ }
+},
+//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop1id,Drop1per,Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
+{
+ Id: 1138
+ SpriteName: "ManaGuard"
+ Name: "ManaGuardian"
+ Lv: 180
+ Hp: 20000
+ Sp: 280
+ Exp: 27000
+ JExp: 5000
+ AttackRange: 2
+ Attack: [280, 324]
+ Def: 22
+ Mdef: 67
+ Stats: {
+ Str: 31
+ Agi: 22
+ Vit: 90
+ Int: 127
+ Dex: 255
+ Luk: 95
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 210
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 50
+},
+{
+ Id: 1139
+ SpriteName: "Virus"
+ Name: "Virus"
+ Lv: 170
+ Hp: 5000
+ Sp: 0
+ Exp: 5254
+ JExp: 721
+ AttackRange: 6
+ Attack: [45, 75]
+ Def: 37
+ Mdef: 12
+ Stats: {
+ Str: 30
+ Agi: 30
+ Vit: 20
+ Int: 20
+ Dex: 25
+ Luk: 60
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Snapple: 500
+ Acorn: 1100
+ GumiCandy: 11
+ }
+},
+{
+ Id: 1140
+ SpriteName: "Tengu"
+ Name: "Tengu"
+ Lv: 180
+ Hp: 24000
+ Sp: 280
+ Exp: 45000
+ JExp: 5000
+ AttackRange: 2
+ Attack: [180, 224]
+ Def: 67
+ Mdef: 9
+ Stats: {
+ Str: 31
+ Agi: 22
+ Vit: 90
+ Int: 97
+ Dex: 255
+ Luk: 95
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 310
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 50
+},
+{
+ Id: 1141
+ SpriteName: "Sasquatch"
+ Name: "Sasquatch"
+ Lv: 180
+ Hp: 24000
+ Sp: 280
+ Exp: 45000
+ JExp: 5000
+ AttackRange: 1
+ Attack: [420, 444]
+ Def: 12
+ Mdef: 27
+ Stats: {
+ Str: 31
+ Agi: 22
+ Vit: 90
+ Int: 97
+ Dex: 255
+ Luk: 95
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 310
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 50
+},
+{
+ Id: 1142
+ SpriteName: "Kage"
+ Name: "ZaxDeKagen"
+ Lv: 200
+ Hp: 29999
+ Sp: 280
+ Exp: 999999
+ JExp: 99999
+ AttackRange: 9
+ Attack: [90, 124]
+ Def: 74
+ Mdef: 100
+ Stats: {
+ Str: 199
+ Agi: 2
+ Vit: 199
+ Int: 197
+ Dex: 255
+ Luk: 175
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 210
+ AttackDelay: 672
+ AttackMotion: 672
+ DamageMotion: 50
+ Drops: {
+ BlueRose: 10000
+ }
+},
+{
+ Id: 1143
+ SpriteName: "ManaSlayer"
+ Name: "Mana Slayer"
+ Lv: 180
+ Hp: 24000
+ Sp: 280
+ Exp: 42000
+ JExp: 5000
+ AttackRange: 2
+ Attack: [260, 274]
+ Def: 22
+ Mdef: 67
+ Stats: {
+ Str: 31
+ Agi: 22
+ Vit: 90
+ Int: 127
+ Dex: 255
+ Luk: 95
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 210
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 50
+},
+{
+ Id: 1144
+ SpriteName: "Dragon"
+ Name: "GreatDragon"
+ Lv: 250
+ Hp: 29999
+ Sp: 280
+ Exp: 1
+ JExp: 1
+ AttackRange: 3
+ Attack: [60, 90]
+ Def: 67
+ Mdef: 67
+ Stats: {
+ Str: 199
+ Agi: 2
+ Vit: 199
+ Int: 197
+ Dex: 255
+ Luk: 95
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 210
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 50
+ Drops: {
+ PaladinsHelmet: 1
+ }
+},
+{
+ Id: 1145
+ SpriteName: "KageGolem"
+ Name: "Kage Golem"
+ Lv: 180
+ Hp: 29999
+ Sp: 280
+ Exp: 150000
+ JExp: 15000
+ AttackRange: 6
+ Attack: [140, 174]
+ Def: 72
+ Mdef: 55
+ Stats: {
+ Str: 31
+ Agi: 22
+ Vit: 90
+ Int: 127
+ Dex: 255
+ Luk: 125
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 410
+ AttackDelay: 1000
+ AttackMotion: 672
+ DamageMotion: 50
+ Drops: {
+ WumpusEgg: 10000
+ }
+},
+{
+ Id: 1146
+ SpriteName: "Flashmob"
+ Name: "Flashmob"
+ Lv: 181
+ Hp: 27000
+ Sp: 280
+ Exp: 72000
+ JExp: 5000
+ AttackRange: 1
+ Attack: [40, 60]
+ Def: 57
+ Mdef: 57
+ Stats: {
+ Str: 31
+ Agi: 22
+ Vit: 90
+ Int: 127
+ Dex: 255
+ Luk: 95
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 160
+ AttackDelay: 600
+ AttackMotion: 672
+ DamageMotion: 50
+},
+{
+ Id: 1147
+ SpriteName: "Koyntety"
+ Name: "Koyntety"
+ Lv: 181
+ Hp: 27000
+ Sp: 280
+ Exp: 72000
+ JExp: 5000
+ AttackRange: 4
+ Attack: [220, 240]
+ Def: 52
+ Mdef: 52
+ Stats: {
+ Str: 31
+ Agi: 22
+ Vit: 90
+ Int: 127
+ Dex: 255
+ Luk: 115
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 240
+ AttackDelay: 1400
+ AttackMotion: 672
+ DamageMotion: 50
+},
+{
+ Id: 1148
+ SpriteName: "DoomGolem"
+ Name: "Doom Golem"
+ Lv: 180
+ Hp: 22000
+ Sp: 280
+ Exp: 65000
+ JExp: 2000
+ AttackRange: 3
+ Attack: [160, 180]
+ Def: 60
+ Mdef: 30
+ Stats: {
+ Str: 31
+ Agi: 22
+ Vit: 90
+ Int: 127
+ Dex: 255
+ Luk: 115
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 320
+ AttackDelay: 1000
+ AttackMotion: 672
+ DamageMotion: 50
+ Drops: {
+ MageRing: 4
+ BlackRose: 30
+ TreasureKey: 800
+ UndeadEar: 150
+ UndeadEye: 150
+ RottenRags: 70
+ Soul: 50
+ BlinkingHocus: 1
+ }
+},
+{
+ Id: 1149
+ SpriteName: "Enchanter"
+ Name: "Enchanter"
+ Lv: 181
+ Hp: 19000
+ Sp: 280
+ Exp: 55000
+ JExp: 2000
+ AttackRange: 8
+ Attack: [140, 180]
+ Def: 30
+ Mdef: 60
+ Stats: {
+ Str: 31
+ Agi: 22
+ Vit: 90
+ Int: 127
+ Dex: 255
+ Luk: 115
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 240
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 50
+ Drops: {
+ EnchantersAmulet: 2
+ BlackRose: 30
+ TreasureKey: 800
+ UndeadEar: 90
+ UndeadEye: 80
+ RottenRags: 70
+ Soul: 50
+ }
+},
+{
+ Id: 1150
+ SpriteName: "ManaTyrant"
+ Name: "Mana Tyrant"
+ Lv: 180
+ Hp: 24000
+ Sp: 280
+ Exp: 27000
+ JExp: 5000
+ AttackRange: 2
+ Attack: [300, 325]
+ Def: 42
+ Mdef: 67
+ Stats: {
+ Str: 31
+ Agi: 22
+ Vit: 90
+ Int: 127
+ Dex: 255
+ Luk: 95
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 180
+ AttackDelay: 1050
+ AttackMotion: 672
+ DamageMotion: 50
+ Drops: {
+ PaladinsHelmet: 1
+ CaramelCandy: 20
+ GoldenDeliciousApple: 5
+ SilkRobe: (100, "ODG_BASICSTAT")
+ TinyManaElixir: 500
+ SilkGloves: (20, "ODG_BASICSTAT")
+ SilkPants: (15, "ODG_BASICSTAT")
+ }
+},
+//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop1id,Drop1per,Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
+{
+ Id: 1151
+ SpriteName: "VoidFlower"
+ Name: "Void Flower"
+ Lv: 115
+ Hp: 7000
+ Sp: 0
+ Exp: 1068
+ JExp: 40
+ AttackRange: 12
+ Attack: [400, 420]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 16
+ Agi: 12
+ Vit: 20
+ Int: 20
+ Dex: 255
+ Luk: 50
+ }
+ ViewRange: 12
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 2000
+ AttackMotion: 672
+ DamageMotion: 180
+ Drops: {
+ RedApple: 100
+ EmptyBottle: 10
+ Arrow: 100
+ CoinBag: 400
+ PinkPetal: 1000
+ PinkPetal: 1000
+ }
+},
+{
+ Id: 1152
+ SpriteName: "VoidArchant"
+ Name: "Void Archant"
+ Lv: 130
+ Hp: 6000
+ Sp: 0
+ Exp: 1598
+ JExp: 14
+ AttackRange: 1
+ Attack: [140, 180]
+ Def: 36
+ Mdef: 6
+ Stats: {
+ Str: 10
+ Agi: 5
+ Vit: 1
+ Int: 0
+ Dex: 12
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 200
+ Drops: {
+ TreasureKey: 300
+ RedApple: 100
+ IronOre: 40
+ Coal: 20
+ }
+},
+{
+ Id: 1153
+ SpriteName: "VoidSlime"
+ Name: "Void Slime"
+ Lv: 135
+ Hp: 4144
+ Sp: 0
+ Exp: 6000
+ JExp: 70
+ AttackRange: 2
+ Attack: [105, 160]
+ Def: 75
+ Mdef: 40
+ Stats: {
+ Str: 30
+ Agi: 15
+ Vit: 35
+ Int: 10
+ Dex: 70
+ Luk: 250
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (3, 2)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1100
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 200
+ Drops: {
+ SlingBullet: 10000
+ SulphurPowder: 5000
+ SulphurPowder: 5000
+ IronOre: 1000
+ PileOfAsh: 1000
+ Coal: 1000
+ TinyManaElixir: 500
+ }
+},
+{
+ Id: 1154
+ SpriteName: "VoidSnake"
+ Name: "Void Snake"
+ Lv: 130
+ Hp: 2000
+ Sp: 0
+ Exp: 541
+ JExp: 63
+ AttackRange: 1
+ Attack: [80, 120]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 20
+ Agi: 40
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 45
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 320
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 200
+ Drops: {
+ LeatherGloves: (20, "ODG_BASICSTAT")
+ SnakeSkin: 350
+ MountainSnakeEgg: 400
+ MountainSnakeEgg: 400
+ MountainSnakeTongue: 500
+ }
+},
+{
+ Id: 1155
+ SpriteName: "VoidBat"
+ Name: "Void Bat"
+ Lv: 100
+ Hp: 400
+ Sp: 0
+ Exp: 81
+ JExp: 3
+ AttackRange: 1
+ Attack: [10, 25]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 20
+ Luk: 25
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 200
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 800
+ CactusDrink: 150
+ BugLeg: 400
+ RoastedMaggot: 150
+ Dagger: 70
+ SharpKnife: 1
+ BatWing: 3000
+ BatTeeth: 2000
+ }
+},
+{
+ Id: 1156
+ SpriteName: "VoidMaggot"
+ Name: "Void Maggot"
+ Lv: 100
+ Hp: 400
+ Sp: 0
+ Exp: 74
+ JExp: 1
+ AttackRange: 1
+ Attack: [10, 25]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 20
+ Luk: 25
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 800
+ CactusDrink: 150
+ BugLeg: 400
+ RoastedMaggot: 150
+ CactusPotion: 70
+ SharpKnife: 10
+ }
+},
+{
+ Id: 1157
+ SpriteName: "VoidSoldier"
+ Name: "Void Soldier"
+ Lv: 120
+ Hp: 8000
+ Sp: 0
+ Exp: 1957
+ JExp: 663
+ AttackRange: 7
+ Attack: [20, 30]
+ Def: 5
+ Mdef: 20
+ Stats: {
+ Str: 40
+ Agi: 3
+ Vit: 25
+ Int: 5
+ Dex: 80
+ Luk: 45
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 2)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 500
+ AttackDelay: 1600
+ AttackMotion: 672
+ DamageMotion: 300
+ Drops: {
+ UndeadEar: 210
+ UndeadEye: 210
+ PurpleDye: 200
+ DarkCrystal: 1000
+ WarlordHelmet: (3, "ODG_BASICSTAT")
+ WarlordPlate: (2, "ODG_BASICSTAT")
+ LeatherGloves: (35, "ODG_BASICSTAT")
+ DiseasedHeart: 500
+ Soul: 500
+ }
+},
+{
+ Id: 1158
+ SpriteName: "VoidMouboo"
+ Name: "Void Mouboo"
+ Lv: 100
+ Hp: 5000
+ Sp: 0
+ Exp: 1338
+ JExp: 16
+ AttackRange: 2
+ Attack: [50, 65]
+ Def: 60
+ Mdef: 5
+ Stats: {
+ Str: 15
+ Agi: 5
+ Vit: 15
+ Int: 0
+ Dex: 40
+ Luk: 10
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ CottonCloth: 1000
+ CottonCloth: 500
+ BottleOfWater: 750
+ CottonCloth: 50
+ ReedBundle: 500
+ }
+},
+{
+ Id: 1159
+ SpriteName: "VoidScorpion"
+ Name: "Void Scorpion"
+ Lv: 110
+ Hp: 6000
+ Sp: 0
+ Exp: 1327
+ JExp: 37
+ AttackRange: 1
+ Attack: [60, 90]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 16
+ Agi: 30
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 700
+ AttackDelay: 1700
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ LeatherShirt: (150, "ODG_BASICSTAT")
+ ChocolateBar: 100
+ BugLeg: 800
+ BlackScorpionStinger: 800
+ }
+},
+{
+ Id: 1160
+ SpriteName: "VoidShroom"
+ Name: "Void Shroom"
+ Lv: 110
+ Hp: 5500
+ Sp: 0
+ Exp: 1223
+ JExp: 30
+ AttackRange: 3
+ Attack: [70, 80]
+ Def: 4
+ Mdef: 4
+ Stats: {
+ Str: 16
+ Agi: 12
+ Vit: 10
+ Int: 10
+ Dex: 35
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 550
+ AttackDelay: 1700
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ HardSpike: 600
+ Amethyst: 50
+ IronPotion: 100
+ SmallMushroom: 1000
+ }
+},
+{
+ Id: 1161
+ SpriteName: "Xakelbael"
+ Name: "Xakelbael"
+ Lv: 200
+ Hp: 29999
+ Sp: 280
+ Exp: 999999
+ JExp: 99999
+ AttackRange: 9
+ Attack: [90, 124]
+ Def: 74
+ Mdef: 100
+ Stats: {
+ Str: 199
+ Agi: 2
+ Vit: 199
+ Int: 197
+ Dex: 255
+ Luk: 175
+ }
+ ViewRange: 31
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CastSensorIdle: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 210
+ AttackDelay: 672
+ AttackMotion: 672
+ DamageMotion: 50
+ Drops: {
+ BlueRose: 10000
+ }
+},
+
+//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop1id,Drop1per,Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
+{
+ Id: 1004
+ SpriteName: "RedScorpion"
+ Name: "Red Scorpion"
+ Lv: 90
+ Hp: 550
+ Sp: 0
+ Exp: 168
+ JExp: 16
+ AttackRange: 1
+ Attack: [50, 55]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 8
+ Agi: 8
+ Vit: 10
+ Int: 10
+ Dex: 30
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1000
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ RedScorpionStinger: 2000
+ ChocolateBar: 100
+ BugLeg: 500
+ Bow: 10
+ Arrow: 760
+ Knife: 540
+ FancyHat: (25, "ODG_BASICSTAT")
+ }
+},
+{
+ Id: 1006
+ SpriteName: "GiantMaggot"
+ Name: "Giant Maggot"
+ Lv: 80
+ Hp: 500
+ Sp: 0
+ Exp: 136
+ JExp: 14
+ AttackRange: 2
+ Attack: [45, 75]
+ Def: 2
+ Mdef: 7
+ Stats: {
+ Str: 8
+ Agi: 6
+ Vit: 2
+ Int: 1
+ Dex: 22
+ Luk: 1
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 2)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 2000
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Arrow: 900
+ CherryCake: 100
+ BugLeg: 750
+ CactusDrink: 5000
+ CactusPotion: 3000
+ CasinoCoins: 11
+ CoinBag: 200
+ }
+},
+{
+ Id: 1028
+ SpriteName: "Mouboo"
+ Name: "Mouboo"
+ Lv: 85
+ Hp: 1200
+ Sp: 0
+ Exp: 497
+ JExp: 16
+ AttackRange: 2
+ Attack: [30, 75]
+ Def: 65
+ Mdef: 5
+ Stats: {
+ Str: 15
+ Agi: 5
+ Vit: 15
+ Int: 0
+ Dex: 40
+ Luk: 10
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ CottonCloth: 1000
+ CottonCloth: 500
+ BottleOfWater: 750
+ CottonCloth: 50
+ ReedBundle: 500
+ }
+},
+{
+ Id: 1043
+ SpriteName: "Skeleton"
+ Name: "Skeleton"
+ Lv: 90
+ Hp: 6800
+ Sp: 0
+ Exp: 3940
+ JExp: 1467
+ AttackRange: 1
+ Attack: [51, 284]
+ Def: 12
+ Mdef: 10
+ Stats: {
+ Str: 35
+ Agi: 18
+ Vit: 3
+ Int: 8
+ Dex: 71
+ Luk: 65
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 340
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 950
+ Drops: {
+ Bone: 200
+ Bone: 280
+ Skull: 300
+ DarkCrystal: 1000
+ DiseasedHeart: 250
+ }
+},
+{
+ Id: 1044
+ SpriteName: "LadySkeleton"
+ Name: "Lady Skeleton"
+ Lv: 90
+ Hp: 5500
+ Sp: 0
+ Exp: 4120
+ JExp: 957
+ AttackRange: 2
+ Attack: [73, 146]
+ Def: 31
+ Mdef: 8
+ Stats: {
+ Str: 20
+ Agi: 25
+ Vit: 15
+ Int: 8
+ Dex: 43
+ Luk: 48
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 650
+ AttackDelay: 750
+ AttackMotion: 672
+ DamageMotion: 700
+ Drops: {
+ Bone: 200
+ Bone: 280
+ Skull: 300
+ DarkCrystal: 1000
+ DiseasedHeart: 250
+ }
+},
+{
+ Id: 1047
+ SpriteName: "Poltergeist"
+ Name: "Poltergeist"
+ Lv: 90
+ Hp: 9000
+ Sp: 0
+ Exp: 4230
+ JExp: 1306
+ AttackRange: 3
+ Attack: [110, 150]
+ Def: 0
+ Mdef: 20
+ Stats: {
+ Str: 35
+ Agi: 0
+ Vit: 15
+ Int: 15
+ Dex: 75
+ Luk: 50
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 330
+ AttackDelay: 740
+ AttackMotion: 672
+ DamageMotion: 400
+ Drops: {
+ PoltergeistPowder: 1000
+ SulphurPowder: 600
+ SulphurPowder: 480
+ }
+},
+{
+ Id: 1059
+ SpriteName: "GCMaggot"
+ Name: "GiantCaveMaggot"
+ Lv: 90
+ Hp: 2000
+ Sp: 0
+ Exp: 685
+ JExp: 102
+ AttackRange: 2
+ Attack: [60, 80]
+ Def: 2
+ Mdef: 7
+ Stats: {
+ Str: 10
+ Agi: 10
+ Vit: 2
+ Int: 1
+ Dex: 22
+ Luk: 1
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 2)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1000
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Iten: 10000
+ }
+},
+{
+ Id: 1066
+ SpriteName: "VampireBat"
+ Name: "Vampire Bat"
+ Lv: 80
+ Hp: 800
+ Sp: 0
+ Exp: 245
+ JExp: 9
+ AttackRange: 1
+ Attack: [55, 150]
+ Def: 10
+ Mdef: 8
+ Stats: {
+ Str: 8
+ Agi: 8
+ Vit: 1
+ Int: 4
+ Dex: 20
+ Luk: 4
+ }
+ ViewRange: 6
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ CactusDrink: 150
+ BugLeg: 400
+ RoastedMaggot: 150
+ Dagger: 70
+ SharpKnife: 1
+ VampireBatWing: 3000
+ BatTeeth: 2000
+ }
+},
+{
+ Id: 1069
+ SpriteName: "ScytheMob"
+ Name: "Scythe"
+ Lv: 80
+ Hp: 3000
+ Sp: 0
+ Exp: 7042
+ JExp: 617
+ AttackRange: 1
+ Attack: [200, 350]
+ Def: 30
+ Mdef: 10
+ Stats: {
+ Str: 100
+ Agi: 250
+ Vit: 1
+ Int: 1
+ Dex: 150
+ Luk: 90
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 2)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 220
+ AttackDelay: 700
+ AttackMotion: 672
+ DamageMotion: 500
+},
+{
+ Id: 1070
+ SpriteName: "BallLightning"
+ Name: "Ball Lightning"
+ Lv: 80
+ Hp: 300
+ Sp: 0
+ Exp: 201
+ JExp: 1
+ AttackRange: 1
+ Attack: [5, 10]
+ Def: 40
+ Mdef: 65
+ Stats: {
+ Str: 1
+ Agi: 200
+ Vit: 1
+ Int: 1
+ Dex: 1
+ Luk: 1
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (7, 2)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 110
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 0
+},
+{
+ Id: 1073
+ SpriteName: "TheLost"
+ Name: "The Lost"
+ Lv: 83
+ Hp: 5000
+ Sp: 0
+ Exp: 8750
+ JExp: 2840
+ AttackRange: 5
+ Attack: [125, 150]
+ Def: 10
+ Mdef: 70
+ Stats: {
+ Str: 5
+ Agi: 40
+ Vit: 10
+ Int: 70
+ Dex: 70
+ Luk: 40
+ }
+ ViewRange: 4
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 3)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 500
+ AttackDelay: 2000
+ AttackMotion: 672
+ DamageMotion: 300
+ Drops: {
+ Bloodstone: 500
+ Bloodstone: 500
+ DarkCrystal: 500
+ SmallMushroom: 500
+ DiseasedHeart: 800
+ }
+},
+{
+ Id: 1074
+ SpriteName: "RedBone"
+ Name: "Red Bone"
+ Lv: 90
+ Hp: 8000
+ Sp: 0
+ Exp: 9750
+ JExp: 3434
+ AttackRange: 2
+ Attack: [100, 330]
+ Def: 24
+ Mdef: 30
+ Stats: {
+ Str: 35
+ Agi: 25
+ Vit: 3
+ Int: 50
+ Dex: 80
+ Luk: 75
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 340
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 950
+ Drops: {
+ Bone: 75
+ Bone: 115
+ Skull: 135
+ DarkCrystal: 4
+ DiseasedHeart: 250
+ }
+},
+{
+ Id: 1077
+ SpriteName: "DrunkenSkeleton"
+ Name: "Drunken Skeleton"
+ Lv: 90
+ Hp: 7200
+ Sp: 0
+ Exp: 4825
+ JExp: 530
+ AttackRange: 1
+ Attack: [55, 284]
+ Def: 30
+ Mdef: 10
+ Stats: {
+ Str: 35
+ Agi: 10
+ Vit: 3
+ Int: 8
+ Dex: 71
+ Luk: 65
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 350
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 950
+ Drops: {
+ BloodWine: 300
+ GutBuster: 280
+ JarofBlood: 100
+ JackOLantern: 50
+ JellySkull: 250
+ TonoriDelight: 400
+ DiseasedHeart: 250
+ }
+},
+{
+ Id: 1078
+ SpriteName: "TipsySkeleton"
+ Name: "Tipsy Skeleton"
+ Lv: 90
+ Hp: 7000
+ Sp: 0
+ Exp: 4950
+ JExp: 493
+ AttackRange: 1
+ Attack: [60, 284]
+ Def: 33
+ Mdef: 10
+ Stats: {
+ Str: 35
+ Agi: 10
+ Vit: 3
+ Int: 8
+ Dex: 71
+ Luk: 65
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 350
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 950
+ Drops: {
+ Snapple: 300
+ BeetleJuice: 280
+ RealisticBrain: 100
+ JackOLantern: 50
+ Marshmallow: 400
+ CandyPumpkin: 250
+ DiseasedHeart: 250
+ }
+},
+{
+ Id: 1079
+ SpriteName: "DrunkenLadySkeleton"
+ Name: "Drunken Lady Skeleton"
+ Lv: 90
+ Hp: 6000
+ Sp: 0
+ Exp: 4565
+ JExp: 389
+ AttackRange: 2
+ Attack: [75, 146]
+ Def: 40
+ Mdef: 8
+ Stats: {
+ Str: 20
+ Agi: 20
+ Vit: 15
+ Int: 8
+ Dex: 51
+ Luk: 48
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 660
+ AttackDelay: 750
+ AttackMotion: 672
+ DamageMotion: 700
+ Drops: {
+ LadyFingers: 300
+ JellAhh: 280
+ RubberBat: 100
+ JackOLantern: 50
+ CandyPumpkin: 250
+ JellySkull: 250
+ DiseasedHeart: 250
+ }
+},
+{
+ Id: 1097
+ SpriteName: "SoulEater"
+ Name: "Soul Eater"
+ Lv: 90
+ Hp: 6800
+ Sp: 0
+ Exp: 4150
+ JExp: 1746
+ AttackRange: 1
+ Attack: [129, 354]
+ Def: 12
+ Mdef: 10
+ Stats: {
+ Str: 35
+ Agi: 18
+ Vit: 3
+ Int: 8
+ Dex: 71
+ Luk: 65
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 340
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 950
+ Drops: {
+ DiseasedHeart: 250
+ }
+},
+{
+ Id: 1103
+ SpriteName: "WitchGuard"
+ Name: "Witch Guard"
+ Lv: 84
+ Hp: 9742
+ Sp: 0
+ Exp: 9525
+ JExp: 1060
+ AttackRange: 2
+ Attack: [200, 220]
+ Def: 25
+ Mdef: 50
+ Stats: {
+ Str: 90
+ Agi: 65
+ Vit: 45
+ Int: 5
+ Dex: 120
+ Luk: 69
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 4)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 290
+ AttackDelay: 1200
+ AttackMotion: 672
+ DamageMotion: 30
+ Drops: {
+ DarkCrystal: 2000
+ DarkCrystal: 500
+ DiseasedHeart: 250
+ AlizarinScroll: 50
+ CobaltScroll: 50
+ GambogeScroll: 50
+ MauveScroll: 50
+ }
+},
+{
+ Id: 1104
+ SpriteName: "DemonicMouboo"
+ Name: "Demonic Mouboo"
+ Lv: 85
+ Hp: 800
+ Sp: 0
+ Exp: 290
+ JExp: 32
+ AttackRange: 2
+ Attack: [40, 70]
+ Def: 35
+ Mdef: 15
+ Stats: {
+ Str: 15
+ Agi: 5
+ Vit: 15
+ Int: 0
+ Dex: 40
+ Luk: 10
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ SulphurPowder: 3000
+ CottonCloth: 1000
+ CottonCloth: 500
+ Emerald: 50
+ ReedBundle: 500
+ }
+},
+{
+ Id: 1109
+ SpriteName: "AngrySeaSlime"
+ Name: "Angry Sea Slime"
+ Lv: 80
+ Hp: 1200
+ Sp: 0
+ Exp: 505
+ JExp: 42
+ AttackRange: 1
+ Attack: [40, 70]
+ Def: 13
+ Mdef: 17
+ Stats: {
+ Str: 3
+ Agi: 30
+ Vit: 3
+ Int: 0
+ Dex: 35
+ Luk: 35
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 2)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1500
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ RedApple: 800
+ Orange: 800
+ BugLeg: 500
+ Candy: 1000
+ Pearl: 100
+ Arrow: 5000
+ ConcentrationPotion: 100
+ BottleOfWater: 50
+ }
+},
+{
+ Id: 1115
+ SpriteName: "SeaSlimeMother"
+ Name: "Sea Slime Mother"
+ Lv: 90
+ Hp: 8000
+ Sp: 0
+ Exp: 3131
+ JExp: 900
+ AttackRange: 5
+ Attack: [100, 150]
+ Def: 10
+ Mdef: 20
+ Stats: {
+ Str: 1
+ Agi: 15
+ Vit: 10
+ Int: 10
+ Dex: 10
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 2)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1500
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ RedApple: 800
+ Orange: 800
+ BugLeg: 500
+ Candy: 1000
+ Pearl: 100
+ Arrow: 5000
+ ConcentrationPotion: 100
+ BottleOfWater: 50
+ }
+},
+{
+ Id: 1116
+ SpriteName: "UndeadWitch"
+ Name: "Undead Witch"
+ Lv: 80
+ Hp: 4200
+ Sp: 0
+ Exp: 1875
+ JExp: 722
+ AttackRange: 3
+ Attack: [50, 110]
+ Def: 8
+ Mdef: 31
+ Stats: {
+ Str: 15
+ Agi: 20
+ Vit: 10
+ Int: 25
+ Dex: 50
+ Luk: 40
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 550
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 700
+ Drops: {
+ DarkCrystal: 1000
+ Bone: 400
+ Skull: 300
+ IronPowder: 100
+ }
+},
+{
+ Id: 1118
+ SpriteName: "GreenSlimeMother"
+ Name: "Green Slime Mother"
+ Lv: 90
+ Hp: 8000
+ Sp: 0
+ Exp: 3550
+ JExp: 900
+ AttackRange: 5
+ Attack: [100, 150]
+ Def: 15
+ Mdef: 20
+ Stats: {
+ Str: 20
+ Agi: 25
+ Vit: 20
+ Int: 30
+ Dex: 20
+ Luk: 20
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1400
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ CactusPotion: 200
+ Emerald: 20
+ CactusDrink: 100
+ Dagger: 250
+ SharpKnife: 200
+ CoinBag: 500
+ CasinoCoins: 500
+ RedApple: 750
+ }
+},
+{
+ Id: 1124
+ SpriteName: "Wight"
+ Name: "Wight"
+ Lv: 90
+ Hp: 8000
+ Sp: 0
+ Exp: 9000
+ JExp: 1900
+ AttackRange: 2
+ Attack: [56, 294]
+ Def: 32
+ Mdef: 15
+ Stats: {
+ Str: 28
+ Agi: 25
+ Vit: 15
+ Int: 15
+ Dex: 50
+ Luk: 65
+ }
+ ViewRange: 3
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 340
+ AttackDelay: 1400
+ AttackMotion: 672
+ DamageMotion: 950
+ Drops: {
+ Bone: 100
+ Bone: 140
+ Skull: 150
+ DarkCrystal: 50
+ DarkCrystal: 500
+ DiseasedHeart: 250
+ }
+},
+{
+ Id: 1125
+ SpriteName: "ManaGhost"
+ Name: "Mana Ghost"
+ Lv: 82
+ Hp: 8000
+ Sp: 0
+ Exp: 7500
+ JExp: 2400
+ AttackRange: 3
+ Attack: [150, 300]
+ Def: 23
+ Mdef: 30
+ Stats: {
+ Str: 35
+ Agi: 15
+ Vit: 3
+ Int: 50
+ Dex: 50
+ Luk: 40
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 340
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 950
+ Drops: {
+ Bone: 75
+ Bone: 115
+ Skull: 135
+ DarkCrystal: 40
+ Bloodstone: 700
+ DarkCrystal: 800
+ }
+},
+//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop1id,Drop1per,Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
+{
+ Id: 1007
+ SpriteName: "YellowSlime"
+ Name: "Yellow Slime"
+ Lv: 60
+ Hp: 400
+ Sp: 0
+ Exp: 94
+ JExp: 9
+ AttackRange: 1
+ Attack: [35, 40]
+ Def: 2
+ Mdef: 7
+ Stats: {
+ Str: 9
+ Agi: 6
+ Vit: 2
+ Int: 1
+ Dex: 34
+ Luk: 1
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1400
+ AttackDelay: 1800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ OrangeCupcake: 200
+ CherryCake: 100
+ CactusDrink: 350
+ CactusPotion: 250
+ SharpKnife: 10
+ IronOre: 450
+ Topaz: 20
+ Coal: 450
+ }
+},
+{
+ Id: 1008
+ SpriteName: "RedSlime"
+ Name: "Red Slime"
+ Lv: 70
+ Hp: 450
+ Sp: 0
+ Exp: 130
+ JExp: 17
+ AttackRange: 1
+ Attack: [40, 45]
+ Def: 2
+ Mdef: 7
+ Stats: {
+ Str: 12
+ Agi: 8
+ Vit: 2
+ Int: 1
+ Dex: 25
+ Luk: 1
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1300
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Knife: 300
+ ChocolateBar: 110
+ Dagger: 200
+ Ruby: 20
+ MinersHat: (80, "ODG_BASICSTAT")
+ RedApple: 750
+ Boots: (250, "ODG_BASICSTAT")
+ MinerGloves: (150, "ODG_BASICSTAT")
+ }
+},
+{
+ Id: 1033
+ SpriteName: "SeaSlime"
+ Name: "Sea Slime"
+ Lv: 70
+ Hp: 600
+ Sp: 0
+ Exp: 187
+ JExp: 13
+ AttackRange: 1
+ Attack: [30, 50]
+ Def: 3
+ Mdef: 7
+ Stats: {
+ Str: 1
+ Agi: 25
+ Vit: 1
+ Int: 0
+ Dex: 30
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 2)
+ Mode: {
+ CanMove: true
+ Looter: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1500
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ RedApple: 800
+ Orange: 800
+ BugLeg: 500
+ Candy: 1000
+ Pearl: 100
+ Arrow: 5000
+ ConcentrationPotion: 100
+ BottleOfWater: 50
+ }
+},
+{
+ Id: 1040
+ SpriteName: "Wisp"
+ Name: "Wisp"
+ Lv: 70
+ Hp: 9300
+ Sp: 0
+ Exp: 3725
+ JExp: 1210
+ AttackRange: 2
+ Attack: [215, 350]
+ Def: 0
+ Mdef: 20
+ Stats: {
+ Str: 45
+ Agi: 12
+ Vit: 13
+ Int: 15
+ Dex: 0
+ Luk: 45
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 380
+ AttackDelay: 2000
+ AttackMotion: 672
+ DamageMotion: 1500
+ Drops: {
+ WispPowder: 1000
+ SulphurPowder: 600
+ SulphurPowder: 480
+ }
+},
+{
+ Id: 1054
+ SpriteName: "Troll"
+ Name: "Troll"
+ Lv: 65
+ Hp: 2000
+ Sp: 0
+ Exp: 850
+ JExp: 129
+ AttackRange: 1
+ Attack: [70, 100]
+ Def: 20
+ Mdef: 10
+ Stats: {
+ Str: 50
+ Agi: 40
+ Vit: 10
+ Int: 10
+ Dex: 30
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Arrow: 2000
+ IronArrow: 500
+ Beer: 300
+ CoinBag: 250
+ GingerBreadMan: 200
+ KidBook: 10
+ }
+},
+{
+ Id: 1061
+ SpriteName: "Moggun"
+ Name: "Moggun"
+ Lv: 60
+ Hp: 800
+ Sp: 0
+ Exp: 280
+ JExp: 52
+ AttackRange: 1
+ Attack: [70, 90]
+ Def: 20
+ Mdef: 10
+ Stats: {
+ Str: 50
+ Agi: 40
+ Vit: 10
+ Int: 10
+ Dex: 10
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 1)
+ Mode: {
+ CanMove: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ WhiteFur: 600
+ Coal: 1000
+ Diamond: 20
+ }
+},
+{
+ Id: 1101
+ SpriteName: "DemonicSpirit"
+ Name: "Demonic Spirit"
+ Lv: 72
+ Hp: 1505
+ Sp: 0
+ Exp: 860
+ JExp: 270
+ AttackRange: 1
+ Attack: [125, 175]
+ Def: 4
+ Mdef: 6
+ Stats: {
+ Str: 20
+ Agi: 40
+ Vit: 10
+ Int: 10
+ Dex: 110
+ Luk: 45
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 4)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 230
+ AttackDelay: 900
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ DarkCrystal: 1000
+ }
+},
+{
+ Id: 1110
+ SpriteName: "AngryGreenSlime"
+ Name: "Angry Green Slime"
+ Lv: 60
+ Hp: 1000
+ Sp: 0
+ Exp: 435
+ JExp: 135
+ AttackRange: 1
+ Attack: [100, 160]
+ Def: 20
+ Mdef: 30
+ Stats: {
+ Str: 20
+ Agi: 30
+ Vit: 10
+ Int: 10
+ Dex: 30
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1200
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ CactusPotion: 200
+ Emerald: 20
+ CactusDrink: 100
+ Dagger: 250
+ SharpKnife: 200
+ CoinBag: 500
+ CasinoCoins: 500
+ RedApple: 750
+ }
+},
+{
+ Id: 1117
+ SpriteName: "UndeadTroll"
+ Name: "Undead Troll"
+ Lv: 75
+ Hp: 3100
+ Sp: 0
+ Exp: 1770
+ JExp: 179
+ AttackRange: 2
+ Attack: [60, 140]
+ Def: 20
+ Mdef: 10
+ Stats: {
+ Str: 50
+ Agi: 40
+ Vit: 20
+ Int: 10
+ Dex: 40
+ Luk: 49
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 650
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Arrow: 2000
+ DarkCrystal: 1000
+ IronArrow: 500
+ Beer: 300
+ CoinBag: 250
+ AnimalBones: 200
+ KidBook: 20
+ }
+},
+
+
+//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop1id,Drop1per,Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
+{
+ Id: 1002
+ SpriteName: "Maggot"
+ Name: "Maggot"
+ Lv: 5
+ Hp: 50
+ Sp: 0
+ Exp: 6
+ JExp: 1
+ AttackRange: 1
+ Attack: [5, 10]
+ Def: 0
+ Mdef: 0
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 6
+ Luk: 5
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 800
+ CactusDrink: 150
+ BugLeg: 400
+ RoastedMaggot: 150
+ CactusPotion: 70
+ SharpKnife: 10
+ }
+},
+{
+ Id: 1046
+ SpriteName: "TameScorpion"
+ Name: "Tame Scorpion"
+ Lv: 5
+ Hp: 50
+ Sp: 0
+ Exp: 6
+ JExp: 2
+ AttackRange: 1
+ Attack: [7, 10]
+ Def: 0
+ Mdef: 1
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 15
+ Luk: 5
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 2000
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ ScorpionStinger: 700
+ Candy: 100
+ ChocolateBar: 50
+ BugLeg: 700
+ }
+},
+{
+ Id: 1050
+ SpriteName: "HouseMaggot"
+ Name: "House Maggot"
+ Lv: 5
+ Hp: 50
+ Sp: 0
+ Exp: 7
+ JExp: 3
+ AttackRange: 1
+ Attack: [5, 7]
+ Def: 0
+ Mdef: 3
+ Stats: {
+ Str: 5
+ Agi: 5
+ Vit: 1
+ Int: 0
+ Dex: 6
+ Luk: 5
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 700
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 800
+ CactusDrink: 150
+ BugLeg: 400
+ RoastedMaggot: 150
+ CactusPotion: 70
+ SharpKnife: 10
+ }
+},
+{
+ Id: 1003
+ SpriteName: "Scorpion"
+ Name: "Scorpion"
+ Lv: 10
+ Hp: 100
+ Sp: 0
+ Exp: 13
+ JExp: 2
+ AttackRange: 1
+ Attack: [10, 15]
+ Def: 0
+ Mdef: 3
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 15
+ Luk: 5
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 2000
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ ScorpionStinger: 700
+ Candy: 100
+ ChocolateBar: 50
+ BugLeg: 700
+ }
+},
+{
+ Id: 1029
+ SpriteName: "MauvePlant"
+ Name: "Mauve Plant"
+ Lv: 1
+ Hp: 1
+ Sp: 0
+ Exp: 1
+ JExp: 1
+ AttackRange: 1
+ Attack: [0, 0]
+ Def: 1
+ Mdef: 0
+ Stats: {
+ Str: 0
+ Agi: 0
+ Vit: 0
+ Int: 0
+ Dex: 0
+ Luk: 0
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ MoveSpeed: 800
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MauveHerb: 3000
+ MauveHerb: 3000
+ MauveHerb: 3000
+ }
+},
+{
+ Id: 1030
+ SpriteName: "CobaltPlant"
+ Name: "Cobalt Plant"
+ Lv: 1
+ Hp: 1
+ Sp: 0
+ Exp: 1
+ JExp: 1
+ AttackRange: 1
+ Attack: [0, 0]
+ Def: 1
+ Mdef: 0
+ Stats: {
+ Str: 0
+ Agi: 0
+ Vit: 0
+ Int: 0
+ Dex: 0
+ Luk: 0
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ MoveSpeed: 800
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ CobaltHerb: 3000
+ CobaltHerb: 3000
+ CobaltHerb: 3000
+ }
+},
+{
+ Id: 1031
+ SpriteName: "GambogePlant"
+ Name: "Gamboge Plant"
+ Lv: 1
+ Hp: 1
+ Sp: 0
+ Exp: 1
+ JExp: 1
+ AttackRange: 1
+ Attack: [0, 0]
+ Def: 1
+ Mdef: 0
+ Stats: {
+ Str: 0
+ Agi: 0
+ Vit: 0
+ Int: 0
+ Dex: 0
+ Luk: 0
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ MoveSpeed: 800
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ GambogeHerb: 3000
+ GambogeHerb: 3000
+ GambogeHerb: 3000
+ }
+},
+{
+ Id: 1032
+ SpriteName: "AlizarinPlant"
+ Name: "Alizarin Plant"
+ Lv: 1
+ Hp: 1
+ Sp: 0
+ Exp: 1
+ JExp: 1
+ AttackRange: 1
+ Attack: [0, 0]
+ Def: 1
+ Mdef: 0
+ Stats: {
+ Str: 0
+ Agi: 0
+ Vit: 0
+ Int: 0
+ Dex: 0
+ Luk: 0
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ MoveSpeed: 800
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ AlizarinHerb: 3000
+ AlizarinHerb: 3000
+ AlizarinHerb: 3000
+ }
+},
+{
+ Id: 1037
+ SpriteName: "CloverPatch"
+ Name: "Clover Patch"
+ Lv: 1
+ Hp: 1
+ Sp: 0
+ Exp: 1
+ JExp: 1
+ AttackRange: 1
+ Attack: [0, 0]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 0
+ Agi: 0
+ Vit: 0
+ Int: 0
+ Dex: 0
+ Luk: 0
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ MoveSpeed: 800
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ FourLeafClover: 5
+ }
+},
+{
+ Id: 1038
+ SpriteName: "Squirrel"
+ Name: "Squirrel"
+ Lv: 15
+ Hp: 160
+ Sp: 1
+ Exp: 32
+ JExp: 5
+ AttackRange: 1
+ Attack: [10, 20]
+ Def: 1
+ Mdef: 6
+ Stats: {
+ Str: 1
+ Agi: 3
+ Vit: 1
+ Int: 0
+ Dex: 15
+ Luk: 40
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Acorn: 7000
+ MauveHerb: 1000
+ CobaltHerb: 1000
+ GambogeHerb: 1000
+ AlizarinHerb: 1000
+ GrassSeed: 800
+ SquirrelPelt: 550
+ }
+},
+{
+ Id: 1056
+ SpriteName: "CaveMaggot"
+ Name: "Cave Maggot"
+ Lv: 10
+ Hp: 100
+ Sp: 0
+ Exp: 16
+ JExp: 3
+ AttackRange: 1
+ Attack: [10, 10]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 5
+ Agi: 5
+ Vit: 1
+ Int: 0
+ Dex: 6
+ Luk: 5
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 700
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 800
+ CactusDrink: 150
+ BugLeg: 400
+ RoastedMaggot: 150
+ CactusPotion: 70
+ SharpKnife: 10
+ }
+},
+{
+ Id: 1063
+ SpriteName: "Pumpkin"
+ Name: "Pumpkin"
+ Lv: 1
+ Hp: 200
+ Sp: 0
+ Exp: 17
+ JExp: 1
+ AttackRange: 1
+ Attack: [0, 0]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 0
+ Agi: 0
+ Vit: 0
+ Int: 0
+ Dex: 0
+ Luk: 0
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ MoveSpeed: 800
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ JackOLantern: 100
+ RubberBat: 20
+ RealisticBrain: 10
+ JarofBlood: 15
+ PumpkinSeeds: 500
+ TonoriDelight: 1500
+ Marshmallow: 2000
+ CandyPumpkin: 2500
+ }
+},
+{
+ Id: 1082
+ SpriteName: "Serqet"
+ Name: "Serqet"
+ Lv: 10
+ Hp: 100
+ Sp: 0
+ Exp: 12
+ JExp: 2
+ AttackRange: 1
+ Attack: [10, 15]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 15
+ Luk: 5
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 2000
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+},
+{
+ Id: 1092
+ SpriteName: "SlimeBlast"
+ Name: "Slime Blast"
+ Lv: 10
+ Hp: 100
+ Sp: 0
+ Exp: 20
+ JExp: 8
+ AttackRange: 1
+ Attack: [10, 10]
+ Def: 10
+ Mdef: 10
+ Stats: {
+ Str: 10
+ Agi: 10
+ Vit: 10
+ Int: 10
+ Dex: 10
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 3)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 250
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+},
+{
+ Id: 1095
+ SpriteName: "WhiteBell"
+ Name: "White Bell"
+ Lv: 10
+ Hp: 100
+ Sp: 0
+ Exp: 25
+ JExp: 40
+ AttackRange: 2
+ Attack: [70, 75]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 16
+ Agi: 12
+ Vit: 20
+ Int: 20
+ Dex: 20
+ Luk: 50
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ RedApple: 100
+ EmptyBottle: 10
+ Arrow: 100
+ CoinBag: 400
+ WhiteBellTuber: 5000
+ }
+},
+{
+ Id: 1105
+ SpriteName: "ViciousSquirrel"
+ Name: "Vicious Squirrel"
+ Lv: 15
+ Hp: 140
+ Sp: 1
+ Exp: 35
+ JExp: 7
+ AttackRange: 1
+ Attack: [20, 25]
+ Def: 1
+ Mdef: 6
+ Stats: {
+ Str: 3
+ Agi: 3
+ Vit: 1
+ Int: 0
+ Dex: 15
+ Luk: 40
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ IronPowder: 7000
+ MauveHerb: 1000
+ CobaltHerb: 1000
+ GambogeHerb: 1000
+ AlizarinHerb: 1000
+ GrassSeed: 800
+ Sapphire: 50
+ }
+},
+{
+ Id: 1162
+ SpriteName: "Grinchboo"
+ Name: "Grinchboo"
+ Lv: 5
+ Hp: 50
+ Sp: 0
+ Exp: 6
+ JExp: 1
+ AttackRange: 1
+ Attack: [5, 10]
+ Def: 0
+ Mdef: 5
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 0
+ Dex: 6
+ Luk: 5
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 800
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ MaggotSlime: 800
+ CactusDrink: 150
+ BugLeg: 400
+ Milk: 50
+ Milk: 30
+ }
+},
+//ID, Name, Jname, LV, HP, SP, EXP, JEXP, Range1, ATK1, ATK2, DEF, MDEF, STR, AGI, VIT, INT, DEX, LUK, Range2, Range3, Scale, Race, Element,Mode, Speed, Adelay, Amotion,Dmotion,Drop1id,Drop1per,Drop2id,Drop2%, Drop3id,Drop3%, Drop4id,Drop4%, Drop5id,Drop5%, Drop6id,Drop6%, Drop7id,Drop7%, Drop8id,Drop8%, Item1, Item2, MEXP, ExpPer, MVP1id, MVP1per,MVP2id, MVP2per,MVP3id, MVP3per,mutationcount,mutationstrength
+{
+ Id: 1005
+ SpriteName: "GreenSlime"
+ Name: "Green Slime"
+ Lv: 40
+ Hp: 800
+ Sp: 0
+ Exp: 302
+ JExp: 96
+ AttackRange: 1
+ Attack: [80, 120]
+ Def: 20
+ Mdef: 30
+ Stats: {
+ Str: 20
+ Agi: 30
+ Vit: 10
+ Int: 10
+ Dex: 30
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1200
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ CactusPotion: 200
+ Emerald: 20
+ CactusDrink: 100
+ Dagger: 250
+ SharpKnife: 200
+ CoinBag: 500
+ CasinoCoins: 500
+ GreenApple: 750
+ }
+},
+{
+ Id: 1016
+ SpriteName: "RudolphSlime"
+ Name: "Rudolph Slime"
+ Lv: 50
+ Hp: 350
+ Sp: 0
+ Exp: 101
+ JExp: 8
+ AttackRange: 1
+ Attack: [30, 35]
+ Def: 10
+ Mdef: 7
+ Stats: {
+ Str: 1
+ Agi: 20
+ Vit: 1
+ Int: 0
+ Dex: 30
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1000
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ DecorCandy: 800
+ CandyCane: 500
+ XmasCake: 200
+ ChocolateBar: 300
+ Candy: 600
+ PurplePresentBox: 800
+ BluePresentBox: 500
+ }
+},
+{
+ Id: 1065
+ SpriteName: "BanditLord"
+ Name: "Bandit Lord"
+ Lv: 40
+ Hp: 2000
+ Sp: 0
+ Exp: 635
+ JExp: 103
+ AttackRange: 5
+ Attack: [50, 50]
+ Def: 15
+ Mdef: 15
+ Stats: {
+ Str: 15
+ Agi: 15
+ Vit: 15
+ Int: 15
+ Dex: 15
+ Luk: 15
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 1
+ Element: (7, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 400
+ AttackDelay: 1500
+ AttackMotion: 672
+ DamageMotion: 900
+},
+{
+ Id: 1080
+ SpriteName: "BlueSpark"
+ Name: "Blue Spark"
+ Lv: 40
+ Hp: 10000
+ Sp: 0
+ Exp: 3647
+ JExp: 392
+ AttackRange: 2
+ Attack: [40, 40]
+ Def: 20
+ Mdef: 40
+ Stats: {
+ Str: 30
+ Agi: 30
+ Vit: 30
+ Int: 30
+ Dex: 30
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 190
+ AttackDelay: 1500
+ AttackMotion: 800
+ DamageMotion: 800
+},
+{
+ Id: 1081
+ SpriteName: "RedSpark"
+ Name: "Red Spark"
+ Lv: 40
+ Hp: 10000
+ Sp: 0
+ Exp: 3647
+ JExp: 392
+ AttackRange: 2
+ Attack: [40, 40]
+ Def: 20
+ Mdef: 40
+ Stats: {
+ Str: 30
+ Agi: 30
+ Vit: 30
+ Int: 30
+ Dex: 30
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 190
+ AttackDelay: 1500
+ AttackMotion: 800
+ DamageMotion: 800
+},
+{
+ Id: 1086
+ SpriteName: "FeyElement"
+ Name: "Fey Element"
+ Lv: 50
+ Hp: 5000
+ Sp: 0
+ Exp: 12500
+ JExp: 901
+ AttackRange: 5
+ Attack: [50, 125]
+ Def: 25
+ Mdef: 50
+ Stats: {
+ Str: 20
+ Agi: 70
+ Vit: 10
+ Int: 20
+ Dex: 80
+ Luk: 1
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 4)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 330
+ AttackDelay: 740
+ AttackMotion: 672
+ DamageMotion: 400
+ Drops: {
+ BrokenDoll: 5000
+ MauveScroll: 3000
+ CobaltScroll: 3000
+ GambogeScroll: 3000
+ AlizarinScroll: 3000
+ MauveHerb: 1000
+ CobaltHerb: 1000
+ GambogeHerb: 1000
+ AlizarinHerb: 1000
+ }
+},
+{
+ Id: 1088
+ SpriteName: "Hyvern"
+ Name: "Hyvern"
+ Lv: 40
+ Hp: 2250
+ Sp: 0
+ Exp: 990
+ JExp: 346
+ AttackRange: 1
+ Attack: [50, 125]
+ Def: 0
+ Mdef: 10
+ Stats: {
+ Str: 10
+ Agi: 45
+ Vit: 5
+ Int: 0
+ Dex: 35
+ Luk: 35
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (2, 4)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 250
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ HyvernStinger: 2000
+ BugLeg: 1000
+ Orange: 600
+ IronArrow: 3000
+ }
+},
+{
+ Id: 1090
+ SpriteName: "Wolvern"
+ Name: "Wolvern"
+ Lv: 40
+ Hp: 900
+ Sp: 0
+ Exp: 280
+ JExp: 86
+ AttackRange: 1
+ Attack: [50, 80]
+ Def: 5
+ Mdef: 5
+ Stats: {
+ Str: 15
+ Agi: 10
+ Vit: 5
+ Int: 0
+ Dex: 20
+ Luk: 10
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ Aggressive: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 425
+ AttackDelay: 770
+ AttackMotion: 500
+ DamageMotion: 200
+ Drops: {
+ WolvernTooth: 1000
+ WolvernPelt: 400
+ AnimalBones: 200
+ Steak: 1300
+ }
+},
+{
+ Id: 1091
+ SpriteName: "BlueSlime"
+ Name: "Blue Slime"
+ Lv: 40
+ Hp: 2000
+ Sp: 0
+ Exp: 760
+ JExp: 77
+ AttackRange: 1
+ Attack: [100, 150]
+ Def: 20
+ Mdef: 40
+ Stats: {
+ Str: 40
+ Agi: 30
+ Vit: 50
+ Int: 10
+ Dex: 50
+ Luk: 40
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 3)
+ Mode: {
+ CanMove: true
+ Looter: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1200
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ IceCube: 200
+ Sapphire: 20
+ CactusDrink: 500
+ IcedWater: 700
+ SilverMirror: 100
+ BookPage: 500
+ }
+},
+{
+ Id: 1098
+ SpriteName: "CopperSlime"
+ Name: "Copper Slime"
+ Lv: 40
+ Hp: 600
+ Sp: 0
+ Exp: 200
+ JExp: 18
+ AttackRange: 1
+ Attack: [60, 90]
+ Def: 20
+ Mdef: 30
+ Stats: {
+ Str: 20
+ Agi: 30
+ Vit: 10
+ Int: 10
+ Dex: 30
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1200
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ IronOre: 1500
+ TreasureKey: 1000
+ Coal: 300
+ }
+},
+{
+ Id: 1111
+ SpriteName: "CandiedSlime"
+ Name: "Candied Slime"
+ Lv: 50
+ Hp: 800
+ Sp: 0
+ Exp: 800
+ JExp: 66
+ AttackRange: 3
+ Attack: [50, 50]
+ Def: 20
+ Mdef: 30
+ Stats: {
+ Str: 20
+ Agi: 30
+ Vit: 10
+ Int: 10
+ Dex: 30
+ Luk: 30
+ }
+ ViewRange: 9
+ ChaseRange: 10
+ Size: 1
+ Race: 0
+ Element: (1, 1)
+ Mode: {
+ CanMove: true
+ Looter: true
+ Aggressive: true
+ Assist: true
+ Boss: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 1200
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ Candy: 1000
+ ChocolateBar: 1000
+ PurplePresentBox: 200
+ BluePresentBox: 200
+ GreenPresentBox: 200
+ GingerBreadMan: 200
+ XmasCake: 500
+ XmasCandyCane: 750
+ }
+},
+{
+ Id: 1112
+ SpriteName: "Santaboo"
+ Name: "Santaboo"
+ Lv: 50
+ Hp: 2200
+ Sp: 0
+ Exp: 1040
+ JExp: 59
+ AttackRange: 2
+ Attack: [80, 125]
+ Def: 50
+ Mdef: 10
+ Stats: {
+ Str: 25
+ Agi: 10
+ Vit: 25
+ Int: 0
+ Dex: 60
+ Luk: 30
+ }
+ ViewRange: 2
+ ChaseRange: 10
+ Size: 1
+ Race: 3
+ Element: (0, 1)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ ChangeTargetMelee: true
+ ChangeTargetChase: true
+ }
+ MoveSpeed: 600
+ AttackDelay: 1872
+ AttackMotion: 672
+ DamageMotion: 480
+ Drops: {
+ GingerBreadMan: 1000
+ WhiteCake: 1200
+ ChocolateCake: 1200
+ OrangeCake: 1200
+ AppleCake: 1200
+ SantaHat: 50
+ RedNose: 10
+ }
+},
+)
diff --git a/db/pre-re/mob_poring.txt b/db/pre-re/mob_poring.txt
new file mode 100644
index 00000000..47b89264
--- /dev/null
+++ b/db/pre-re/mob_poring.txt
@@ -0,0 +1,5 @@
+// Poring Box Summonable Monsters Database
+//
+// Structure of Database:
+// MobID,DummyName,Rate
+
diff --git a/db/pre-re/mob_race2_db.txt b/db/pre-re/mob_race2_db.txt
new file mode 100644
index 00000000..2f182940
--- /dev/null
+++ b/db/pre-re/mob_race2_db.txt
@@ -0,0 +1,5 @@
+// Monster Racial Groups Database
+//
+// Structure of Database:
+// Race2ID,MobID1,MobID2,MobID3,...,MobID9
+
diff --git a/db/pre-re/mob_skill_db.conf b/db/pre-re/mob_skill_db.conf
new file mode 100644
index 00000000..2769b34d
--- /dev/null
+++ b/db/pre-re/mob_skill_db.conf
@@ -0,0 +1,771 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Monster Skill Database
+//=========================================================================
+
+mob_skill_db:(
+{
+/**************************************************************************
+************* Entry structure ********************************************
+**************************************************************************
+ <Monster_Constant>: {
+ <Skill_Constant>: {
+ ClearSkills: (boolean, defaults to false) allows cleaning all previous defined skills for the mob.
+ SkillLevel: (int, defaults to 1)
+ SkillState: (string, defaults to "MSS_ANY")
+ SkillTarget: (string, defaults to "MST_TARGET")
+ Rate: (int, defaults to 1) Rate refers to the chance of the skill being casted when the condition is fulfilled.(10000 = 100%)
+ CastTime: (int, defaults to 0) CastTime is the time in milliseconds that has to be pass to casting skill
+ Delay: (int, defaults to 0) Delay is the time in milliseconds that has to be pass before recasting the same skill.
+ Cancelable: (boolean, defaults to false)
+ CastCondition: (string, defaults to "MSC_ALWAYS")
+ ConditionData: (int, defaults to 0)
+ val0: (int, defaults to 0)
+ val1: (int, defaults to 0)
+ val2: (int, defaults to 0)
+ val3: (int, defaults to 0)
+ val4: (int, defaults to 0)
+ Emotion: (int, defaults to -1)
+ ChatMsgID: (int, defaults to 0)
+ }
+ }
+
+// STATE:
+// any (except dead) / idle (in standby) / walk (in movement) / dead (on killed) /
+// loot /attack / angry (like attack, except player has not attacked mob yet) /
+// chase (following target, after being attacked) / follow (following target,
+// without being attacked) / anytarget (attack+angry+chase+follow)
+SKILL_STATES = {
+ "any": "MSS_ANY",
+ "idle": "MSS_IDLE",
+ "walk": "MSS_WALK",
+ "loot": "MSS_LOOT",
+ "dead": "MSS_DEAD",
+ "attack": "MSS_BERSERK",
+ "angry": "MSS_ANGRY",
+ "chase": "MSS_RUSH",
+ "follow": "MSS_FOLLOW",
+ "anytarget": "MSS_ANYTARGET"
+}
+
+
+// TARGET:
+// target (current target) / self / friend / master / randomtarget (any enemy within skill's range)
+//
+// The following are for ground-skills, a random target tile is selected from the specified area:
+// around1 (3x3 area around self) / around2 (5x5 area around self) /
+// around3 (7x7 area around self) / around4 (9x9 area around self) /
+// around5 (3x3 area around target) / around6 (5x5 area around target) /
+// around7 (7x7 area around target) / around8 (9x9 area around target) /
+// around = around4
+SKILL_TARGET = {
+ "target": "MST_TARGET",
+ "randomtarget": "MST_RANDOM",
+ "self": "MST_SELF",
+ "friend": "MST_FRIEND",
+ "master": "MST_MASTER",
+ "around5": "MST_AROUND5",
+ "around6": "MST_AROUND6",
+ "around7": "MST_AROUND7",
+ "around8": "MST_AROUND8",
+ "around1": "MST_AROUND1",
+ "around2": "MST_AROUND2",
+ "around3": "MST_AROUND3",
+ "around4": "MST_AROUND4",
+ "around": "MST_AROUND"
+}
+
+// CONDITION:
+// always Unconditional (no condition value).
+// onspawn When mob spawns/respawns (no condition value).
+// myhpltmaxrate When mob's HP drops to the specified %.
+// myhpinrate When mob's HP is in a certain % range (condition value = lower bound, val1 = upper bound).
+// mystatuson If mob has the specified abnormality in status.
+// mystatusoff If mob has ended the specified abnormality in status.
+// friendhpltmaxrate When mob's friend's HP drops to the specified %.
+// friendhpinrate When mob's friend's HP is in a certain % range (condition value = lower bound, val1 = upper bound).
+// friendstatuson If friend has the specified abnormality in status.
+// friendstatusoff If friend has ended the specified abnormality in status.
+// attackpcgt When attack PCs become greater than specified number.
+// attackpcge When attack PCs become greater than or equal to the specified number.
+// slavelt When number of slaves is less than the original specified number.
+// slavele When number of slaves is less than or equal to the original specified number.
+// closedattacked When close range melee attacked (no condition value).
+// longrangeattacked When long range attacked, ex. bows, guns, ranged skills (no condition value).
+// skillused When the specified skill is used on the mob.
+// afterskill After mob casts the specified skill.
+// casttargeted When a target is in cast range (no condition value).
+// rudeattacked When mob is rude attacked (no condition value).
+SKILL_COND1 = {
+ "always": "MSC_ALWAYS",
+ "myhpltmaxrate": "MSC_MYHPLTMAXRATE",
+ "myhpinrate": "MSC_MYHPINRATE",
+ "friendhpltmaxrate": "MSC_FRIENDHPLTMAXRATE",
+ "friendhpinrate": "MSC_FRIENDHPINRATE",
+ "mystatuson": "MSC_MYSTATUSON",
+ "mystatusoff": "MSC_MYSTATUSOFF",
+ "friendstatuson": "MSC_FRIENDSTATUSON",
+ "friendstatusoff": "MSC_FRIENDSTATUSOFF",
+ "attackpcgt": "MSC_ATTACKPCGT",
+ "attackpcge": "MSC_ATTACKPCGE",
+ "slavelt": "MSC_SLAVELT",
+ "slavele": "MSC_SLAVELE",
+ "closedattacked": "MSC_CLOSEDATTACKED",
+ "longrangeattacked": "MSC_LONGRANGEATTACKED",
+ "skillused": "MSC_SKILLUSED",
+ "afterskill": "MSC_AFTERSKILL",
+ "casttargeted": "MSC_CASTTARGETED",
+ "rudeattacked": "MSC_RUDEATTACKED",
+ "masterhpltmaxrate": "MSC_MASTERHPLTMAXRATE",
+ "masterattacked": "MSC_MASTERATTACKED",
+ "alchemist": "MSC_ALCHEMIST",
+ "onspawn": "MSC_SPAWN"
+}
+
+// Status abnormalities specified through the statuson/statusoff system:
+// anybad (any type of state change) / stone / freeze / stun / sleep /
+// poison / curse / silence / confusion / blind / hiding / sight (unhidden)
+//
+// Note: if a negative MobID is provided, the skill will be treated as 'global':
+// -1: added for all boss types.
+// -2: added for all normal types.
+// -4: added for all mobs.
+
+SKILL_COND2 = {
+ "anybad": "MSC_ANY",
+ "stone": "SC_STONE",
+ "freeze": "SC_FREEZE",
+ "stun": "SC_STUN",
+ "sleep": "SC_SLEEP",
+ "poison": "SC_POISON",
+ "curse": "SC_CURSE",
+ "silence": "SC_SILENCE",
+ "confusion": "SC_CONFUSION",
+ "blind": "SC_BLIND",
+ "hiding": "SC_HIDING",
+ "sight": "SC_SIGHT"
+}
+
+**************************************************************************/
+ SlimeBlast: {
+ NPC_SELFDESTRUCTION: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 1
+ Rate: 10000
+ CastTime: 100
+ Delay: 500
+ Cancelable: true
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ BlueSlime: {
+ // TODO: use NPC_SUMMONMONSTER?
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 8000
+ CastTime: 1200
+ Delay: 18000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 1
+ val0: 1090
+ }
+ }
+
+ /**********************************************************************/
+ WhiteSlime: {
+ NPC_SELFDESTRUCTION: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 1
+ Rate: 10000
+ CastTime: 100
+ Delay: 500
+ Cancelable: true
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ SantaSlime: {
+ NPC_EMOTION: {
+ SkillState: "MSS_LOOT"
+ SkillLevel: 1
+ Rate: 10000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_ALWAYS"
+ val0: 101
+ }
+ NPC_EMOTION: {
+ SkillState: "MSS_WALK"
+ SkillLevel: 1
+ Rate: 5000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_ALWAYS"
+ val0: 5
+ }
+ NPC_EMOTION: {
+ SkillState: "MSS_IDLE"
+ SkillLevel: 1
+ Rate: 5000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_ALWAYS"
+ val0: 7
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 5
+ Rate: 10000
+ CastTime: 2000
+ Delay: 60000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELE"
+ ConditionData: 3
+ val0: 1016
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_IDLE"
+ SkillLevel: 5
+ Rate: 10000
+ CastTime: 2000
+ Delay: 60000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELE"
+ ConditionData: 3
+ val0: 1016
+ }
+ }
+
+ /**********************************************************************/
+ GreenSlimeMother: {
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 2
+ Rate: 8000
+ CastTime: 700
+ Delay: 8000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 2
+ val0: 1110
+ }
+ }
+
+ /**********************************************************************/
+ SeaSlimeMother: {
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 2
+ Rate: 8000
+ CastTime: 700
+ Delay: 8000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 2
+ val0: 1109
+ }
+ }
+
+ /**********************************************************************/
+ PinkFlower: {
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 10000
+ CastTime: 1000
+ Delay: 60000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 4
+ val0: 1049
+ }
+ NPC_BLINDATTACK: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 5
+ Rate: 10000
+ CastTime: 1000
+ Delay: 300000
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ // Note: Cannot explode if poisoned
+ BallLightning: {
+ NPC_SELFDESTRUCTION: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 3
+ Rate: 10000
+ CastTime: 500
+ Delay: 3000
+ Cancelable: true
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_MYSTATUSOFF"
+ ConditionData: "SC_POISON"
+ }
+ }
+
+ /**********************************************************************/
+ Luvia: {
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 10000
+ CastTime: 1000
+ Delay: 60000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 32
+ val0: 1103
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 2
+ Rate: 10000
+ CastTime: 10
+ Delay: 5000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 7
+ val0: 1101
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 10000
+ CastTime: 10
+ Delay: 20000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 64
+ val0: 1101
+ }
+ }
+
+ /**********************************************************************/
+ FeyElement: {
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 5000
+ CastTime: 100
+ Delay: 500
+ Cancelable: true
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 6
+ val0: 1083
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 5000
+ CastTime: 100
+ Delay: 500
+ Cancelable: true
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 6
+ val0: 1084
+ }
+ }
+
+ /**********************************************************************/
+ Tormenta: {
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 10000
+ CastTime: 1000
+ Delay: 150000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 32
+ val0: 1022
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 2
+ Rate: 10000
+ CastTime: 1000
+ Delay: 70000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 7
+ val0: 1103
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 2
+ Rate: 10000
+ CastTime: 10
+ Delay: 15000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 7
+ val0: 1101
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 10000
+ CastTime: 10
+ Delay: 32000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 64
+ val0: 1101
+ }
+ NPC_WIDECURSE: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 3
+ Rate: 620
+ CastTime: 10
+ Delay: 1000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_MYHPLTMAXRATE"
+ ConditionData: 40
+ }
+ }
+
+ /**********************************************************************/
+ SUSAN: {
+ NPC_EMOTION: {
+ SkillState: "MSS_IDLE"
+ SkillLevel: 1
+ Rate: 5000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_ALWAYS"
+ val0: 118
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 9
+ Rate: 1000
+ CastTime: 1000
+ Delay: 18000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 69
+ val0: 1135
+ Emotion: 104
+ }
+ }
+
+ /**********************************************************************/
+ Reaper: {
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 8000
+ CastTime: 1000
+ Delay: 5000
+ Cancelable: true
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 1
+ val0: 1070
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 8000
+ CastTime: 1000
+ Delay: 5000
+ Cancelable: true
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 2
+ val0: 1070 // TODO: Scythe
+ }
+ SM_BASH: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 5
+ Rate: 10000
+ Delay: 20000
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ TheLost: {
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 1
+ Rate: 8000
+ CastTime: 1000
+ Delay: 5000
+ Cancelable: true
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 2
+ val0: 1106
+ }
+ NPC_WIDESILENCE: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 5
+ Rate: 8000
+ CastTime: 1000
+ Delay: 90000
+ Cancelable: true
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_ALWAYS"
+ }
+ NPC_WIDESOULDRAIN: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 3
+ Rate: 8000
+ CastTime: 1000
+ Delay: 180000
+ Cancelable: true
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_MYHPLTMAXRATE"
+ ConditionData: 60
+ }
+ }
+
+ /**********************************************************************/
+ Snake: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 20
+ Rate: 400
+ Delay: 500
+ Cancelable: true
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ CaveSnake: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 10
+ Rate: 500
+ Delay: 500
+ Cancelable: true
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ MountainSnake: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 60
+ Rate: 100
+ Delay: 300
+ Cancelable: true
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ GrassSnake: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 45
+ Rate: 200
+ Delay: 200
+ Cancelable: true
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ BlackScorpion: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 30
+ Rate: 50
+ Delay: 500
+ Cancelable: true
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ HuntsmanSpider: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 5
+ Rate: 2500
+ Delay: 500
+ Cancelable: true
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ CrotcherScorpion: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 40
+ Rate: 15
+ Delay: 500
+ Cancelable: true
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ PoisonSkull: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 50
+ Rate: 500
+ Delay: 400
+ Cancelable: true
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ Bee: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 5
+ Rate: 1000
+ Delay: 500
+ Cancelable: true
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ Virus: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 50
+ Rate: 1500
+ CastTime: 1000
+ Delay: 600
+ Cancelable: false
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ Zombie: {
+ NPC_POISON: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 5
+ Rate: 100
+ Delay: 30000
+ Cancelable: true
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ }
+
+ /**********************************************************************/
+ DreadPirateMarley: {
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 2
+ Rate: 8000
+ CastTime: 1000
+ Delay: 5000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 1
+ val0: 1123
+ }
+ }
+
+ /**********************************************************************/
+ KageGolem: {
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 2
+ Rate: 9000
+ CastTime: 1000
+ Delay: 155000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 6
+ val0: 1140
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 2
+ Rate: 9000
+ CastTime: 1000
+ Delay: 155000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 1
+ val0: 1141
+ }
+ NPC_SUMMONSLAVE: {
+ SkillState: "MSS_ANY"
+ SkillLevel: 2
+ Rate: 9000
+ CastTime: 1000
+ Delay: 155000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_SLAVELT"
+ ConditionData: 1
+ val0: 1143
+ }
+ NPC_BLINDATTACK: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 5
+ Rate: 6700
+ Delay: 20000
+ SkillTarget: "MST_TARGET"
+ CastCondition: "MSC_ALWAYS"
+ }
+ NPC_WIDECURSE: {
+ SkillState: "MSS_BERSERK"
+ SkillLevel: 1
+ Rate: 2700
+ Delay: 90000
+ SkillTarget: "MST_SELF"
+ CastCondition: "MSC_MYHPLTMAXRATE"
+ ConditionData: 80
+ }
+ }
+
+}
+)
diff --git a/db/pre-re/pet_db.conf b/db/pre-re/pet_db.conf
new file mode 100644
index 00000000..16f9e57f
--- /dev/null
+++ b/db/pre-re/pet_db.conf
@@ -0,0 +1,97 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Pets Database
+//=========================================================================
+
+pet_db:(
+/**************************************************************************
+************* Entry structure ********************************************
+**************************************************************************
+{
+ // ================ Mandatory fields ==============================
+ Id: ID (int)
+ Name: "Pet Name" (string)
+ EggItem: "Egg Item Constant" (string)
+ // ================ Optional fields ===============================
+ TamingItem: "Taming Item Constant" (string, defaults to 0)
+ FoodItem: "Food Item Constant" (string, defaults to "Pet_Food" (ID=537))
+ AccessoryItem: "Equipment Item Constant" (string, defaults to 0)
+ FoodEffectiveness: hunger points (int, defaults to 80)
+ HungerDelay: hunger time (int, defaults to 60)
+ HungerDecrement: hunger points (int, defaults to 1)
+ Intimacy: {
+ Initial: start intimacy (int, defaults to 250)
+ FeedIncrement: feeding intimacy (int, defaults to 10)
+ OverFeedDecrement: overfeeding intimacy (int, defaults to 100)
+ OwnerDeathDecrement: owner die intimacy (int, defaults to 20)
+ StarvingDelay: starving time (int, defaults to 20)
+ StarvingDecrement: starving intimacy (int, defaults to 20)
+ }
+ CaptureRate: capture rate (int, defaults to 1000)
+ Speed: speed (int, defaults to 150)
+ SpecialPerformance: true/false (boolean, defaults to false)
+ TalkWithEmotes: convert talk (boolean, defaults to false)
+ AttackRate: attack rate (int, defaults to 300)
+ DefendRate: Defence attack (int, defaults to 300)
+ ChangeTargetRate: change target (int, defaults to 800)
+ AutoFeed: true/false (boolean, defaults to false)
+ PetScript: <" Pet Script (can also be multi-line) ">
+ EquipScript: <" Equip Script (can also be multi-line) ">
+ Evolve: {
+ EggID: { (string, Evolved Pet EggID)
+ Name: Amount (items required to perform evolution)
+ ...
+ }
+ }
+},
+**************************************************************************/
+
+{
+ Id: 1018
+ SpriteName: "Pinkie"
+ Name: "Pinkie"
+ TamingItem: "Iten"
+ EggItem: "PinkieScroll"
+ FoodItem: "Acorn"
+ FoodEffectiveness: 80
+ HungerDelay: 60
+ Intimacy: {
+ Initial: 250
+ FeedIncrement: 50
+ OverFeedDecrement: 100
+ OwnerDeathDecrement: 20
+ }
+ CaptureRate: 0
+ Speed: 150
+ SpecialPerformance: true
+ AttackRate: 350
+ DefendRate: 400
+ ChangeTargetRate: 800
+ PetScript: <" petloot 10; ">
+ EquipScript: <" bonus bLuk,2; bonus bCritical,1; ">
+},
+)
diff --git a/db/pre-re/refine_db.conf b/db/pre-re/refine_db.conf
new file mode 100644
index 00000000..b1f5c252
--- /dev/null
+++ b/db/pre-re/refine_db.conf
@@ -0,0 +1,330 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2015 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Renewal Refine Database
+//=========================================================================
+
+/**************************************************************************
+************* Entry structure ********************************************
+**************************************************************************
+Armors/WeaponLevel1~4: { // Specifies weapon level or armor type.
+ // - For armors, values of 100 add 1 armor defense.
+ // - For weapons, values of 100 add 1 ATK & MATK.
+ StatsPerLevel: (int) // This value is applied for ever level.
+ RandomBonusStartLevel: (int) // This value specifies the start point for those levels that give a random bonus value (usually the first unsafe upgrade).
+ // - RandomBonusStartLevel is only applied for weapons, and not displayed client-side.
+ RandomBonusValue: (int) // A random number between 0 and (Random bonus start level - Upgrade level + 1) * this value is applied for all upgrades past.
+
+ RefineryUISettings: (
+ {
+ Level: (int or array of int) // Holds either the individule refine level meant for this setting or an array defining a range
+ of Low to Max level
+ BlacksmithBlessing: (int) (optional) // How many Blacksmith Blessing required for this range to be safe from breaking
+ Announce: "(string)" (optional) // Sends an announcement server wide when a player reach this refine level using
+ Refinery UI, this feature is only available starting from 2017-08-30 RagexeRE or
+ 2017-09-06 Ragexe the field accepts the following values and it defaults to not announce
+ Success to set the announcement on item refine successful
+ Failure to set the announcement on item refine failure
+ Always to always announce it
+ Items: {
+ AegisName: {
+ Type: "(string)" // The type to determine the chances used for this item, REFINE_CHANCE_TYPE_*
+ constants are used in here
+ Cost: (int) (optional) // Amount of zeny required
+ FailureBehavior: "(string)" (optional) // The expected behvaior on failure for this item, the following strings are used in here
+ Destroy (default) sets the item to be destroyed on failure
+ Keep keeps the item after failure
+ Downgrade downgrades the item by one level on failure
+ }
+ }
+ }
+ )
+
+ Rates: { // Per level configuration of the refine rates.
+ Lv1~20: { // Lv1 ~ Lv20.
+ NormalChance: (int) // (optional, defaults to 100) Chance of successful refine using normal ores (100 = 100%).
+ EnrichedChance: (int) // (optional, defaults to 100 for weapons below refine level 20, otherwise 0.) Chance of successful refine using enriched ores (100 = 100%).
+ EventNormalChance: (int) // (optional, defaults to 100) Chance of successful refine using normal ores (100 = 100%) during a refine event.
+ EventEnrichedChance: (int) // (optional, defaults to 100 for weapons below refine level 10, otherwise 0.) Chance of successful refine using enriched ores (100 = 100%) during a refine event.
+ Bonus: (int) // (optional, defaults to 0) Bonus (Armor) for this level of refine.
+ }
+ // Note: Refine levels that use default values need not be listed. (Example: Lv1: { NormalChance: 100 Bonus: 0 })
+ }
+}
+**************************************************************************/
+
+Armors: {
+ RefineryUISettings: (
+ {
+ Level: [1, 10]
+ Items: {
+ Acorn: {
+ Type: "REFINE_CHANCE_TYPE_NORMAL"
+ Cost: 100000000
+ }
+ }
+ },
+ )
+ StatsPerLevel: 0
+ RandomBonusStartLevel: 0
+ RandomBonusValue: 0
+ Rates: {
+ Lv1: {
+ Bonus: 100
+ }
+ Lv2: {
+ Bonus: 100
+ }
+ Lv3: {
+ Bonus: 100
+ }
+ Lv4: {
+ Bonus: 100
+ }
+ Lv5: {
+ NormalChance: 60
+ EnrichedChance: 90
+ EventNormalChance: 60
+ EventEnrichedChance: 95
+ Bonus: 200
+ }
+ Lv6: {
+ NormalChance: 40
+ EnrichedChance: 70
+ EventNormalChance: 40
+ EventEnrichedChance: 80
+ Bonus: 200
+ }
+ Lv7: {
+ NormalChance: 40
+ EnrichedChance: 70
+ EventNormalChance: 40
+ EventEnrichedChance: 80
+ Bonus: 200
+ }
+ Lv8: {
+ NormalChance: 20
+ EnrichedChance: 40
+ EventNormalChance: 20
+ EventEnrichedChance: 60
+ Bonus: 200
+ }
+ Lv9: {
+ NormalChance: 20
+ EnrichedChance: 40
+ EventNormalChance: 20
+ EventEnrichedChance: 50
+ Bonus: 300
+ }
+ Lv10: {
+ NormalChance: 9
+ EnrichedChance: 20
+ EventNormalChance: 9
+ EventEnrichedChance: 35
+ Bonus: 300
+ }
+ }
+}
+WeaponLevel1: {
+ RefineryUISettings: (
+ {
+ Level: [1, 10]
+ Items: {
+ Acorn: {
+ Type: "REFINE_CHANCE_TYPE_NORMAL"
+ Cost: 100000000
+ }
+ }
+ },
+ )
+ StatsPerLevel: 200
+ RandomBonusStartLevel: 8
+ RandomBonusValue: 300
+ Rates: {
+ Lv8: {
+ NormalChance: 60
+ EnrichedChance: 90
+ EventNormalChance: 60
+ EventEnrichedChance: 95
+ }
+ Lv9: {
+ NormalChance: 40
+ EnrichedChance: 70
+ EventNormalChance: 40
+ EventEnrichedChance: 85
+ }
+ Lv10: {
+ NormalChance: 19
+ EnrichedChance: 30
+ EventNormalChance: 19
+ EventEnrichedChance: 55
+ }
+ }
+}
+WeaponLevel2: {
+ RefineryUISettings: (
+ {
+ Level: [1, 10]
+ Items: {
+ Acorn: {
+ Type: "REFINE_CHANCE_TYPE_NORMAL"
+ Cost: 100000000
+ }
+ }
+ },
+ )
+ StatsPerLevel: 300
+ RandomBonusStartLevel: 7
+ RandomBonusValue: 500
+ Rates: {
+ Lv7: {
+ NormalChance: 60
+ EnrichedChance: 90
+ EventNormalChance: 60
+ EventEnrichedChance: 95
+ }
+ Lv8: {
+ NormalChance: 40
+ EnrichedChance: 70
+ EventNormalChance: 40
+ EventEnrichedChance: 85
+ }
+ Lv9: {
+ NormalChance: 20
+ EnrichedChance: 40
+ EventNormalChance: 20
+ EventEnrichedChance: 60
+ }
+ Lv10: {
+ NormalChance: 19
+ EnrichedChance: 30
+ EventNormalChance: 19
+ EventEnrichedChance: 45
+ }
+ }
+}
+WeaponLevel3: {
+ RefineryUISettings: (
+ {
+ Level: [1, 10]
+ Items: {
+ Acorn: {
+ Type: "REFINE_CHANCE_TYPE_NORMAL"
+ Cost: 100000000
+ }
+ }
+ },
+ )
+ StatsPerLevel: 500
+ RandomBonusStartLevel: 6
+ RandomBonusValue: 800
+ Rates: {
+ Lv6: {
+ NormalChance: 60
+ EnrichedChance: 90
+ EventNormalChance: 60
+ EventEnrichedChance: 95
+ }
+ Lv7: {
+ NormalChance: 50
+ EnrichedChance: 80
+ EventNormalChance: 50
+ EventEnrichedChance: 90
+ }
+ Lv8: {
+ NormalChance: 20
+ EnrichedChance: 40
+ EventNormalChance: 20
+ EventEnrichedChance: 70
+ }
+ Lv9: {
+ NormalChance: 20
+ EnrichedChance: 40
+ EventNormalChance: 20
+ EventEnrichedChance: 60
+ }
+ Lv10: {
+ NormalChance: 19
+ EnrichedChance: 30
+ EventNormalChance: 19
+ EventEnrichedChance: 45
+ }
+ }
+}
+WeaponLevel4: {
+ RefineryUISettings: (
+ {
+ Level: [1, 10]
+ Items: {
+ Acorn: {
+ Type: "REFINE_CHANCE_TYPE_NORMAL"
+ Cost: 100000000
+ }
+ }
+ },
+ )
+ StatsPerLevel: 700
+ RandomBonusStartLevel: 5
+ RandomBonusValue: 1400
+ Rates: {
+ Lv5: {
+ NormalChance: 60
+ EnrichedChance: 90
+ EventNormalChance: 60
+ EventEnrichedChance: 95
+ }
+ Lv6: {
+ NormalChance: 40
+ EnrichedChance: 70
+ EventNormalChance: 40
+ EventEnrichedChance: 80
+ }
+ Lv7: {
+ NormalChance: 40
+ EnrichedChance: 70
+ EventNormalChance: 40
+ EventEnrichedChance: 80
+ }
+ Lv8: {
+ NormalChance: 20
+ EnrichedChance: 40
+ EventNormalChance: 20
+ EventEnrichedChance: 60
+ }
+ Lv9: {
+ NormalChance: 20
+ EnrichedChance: 40
+ EventNormalChance: 20
+ EventEnrichedChance: 50
+ }
+ Lv10: {
+ NormalChance: 9
+ EnrichedChance: 20
+ EventNormalChance: 9
+ EventEnrichedChance: 35
+ }
+ }
+}
diff --git a/db/pre-re/size_fix.txt b/db/pre-re/size_fix.txt
new file mode 100644
index 00000000..ae5ebdd4
--- /dev/null
+++ b/db/pre-re/size_fix.txt
@@ -0,0 +1,7 @@
+// Database for size fix for weapon damage.
+
+// Columns: Weapon type, Rows: Target size.
+// Unarmed, Knife, 1H Sword, 2H Sword, 1H Spear, 2H Spears, 1H Axe, 2H Axe, Mace, 2H Mace, Staff, Bow, Knuckle, Musical Instrument, Whip, Book, Katar, Revolver, Rifle, Shotgun, Gatling Gun, Grenade Launcher, Fuuma Shuriken, 2H Staff
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, 100,100,100,100,100,100,100,100 // Size: Small
+100,100,100,100,100,100,100,100,100,100,100,100, 100,100,100,100,100,100,100,100,100,100,100,100 // Size: Medium
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, 100,100,100,100,100,100,100,100 // Size: Large
diff --git a/db/pre-re/skill_db.conf b/db/pre-re/skill_db.conf
new file mode 100644
index 00000000..98f0ab73
--- /dev/null
+++ b/db/pre-re/skill_db.conf
@@ -0,0 +1,39370 @@
+//================= Hercules Database ==========================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ====================================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2014-2017 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//==============================================================================
+//= Renewal Skill Database [Hercules]
+//==============================================================================
+//= @Format Notes:
+//= - All string entries are case-sensitive and must be quoted.
+//= - All setting names are case-sensitive and must be keyed accurately.
+
+
+/******************************************************************************
+********************************* Entry structure *****************************
+*******************************************************************************
+{
+ // ------------------------------ Mandatory Fields ----------------------------
+ Id: ID (int) (Required)
+ Name: "Skill Name" (string) (Required)
+ MaxLevel: Skill Level (int) (Required)
+ // ------------------------------ Optional Fields -----------------------------
+ Description: "Skill Description" (string) (optional but recommended)
+ Range: Skill Range (int) (optional, defaults to 0) (can be grouped by Levels)
+ Note: Range < 5 is considered Melee range.
+ Hit: Hit Type (int) (optional, default "BDT_NORMAL")
+ Types - "BDT_SKILL", "BDT_MULTIHIT" or "BDT_NORMAL"
+ SkillType: { (bool, defaults to "Passive")
+ Passive: true/false (boolean, defaults to false)
+ Enemy: true/false (boolean, defaults to false)
+ Place: true/false (boolean, defaults to false)
+ Self: true/false (boolean, defaults to false)
+ Friend: true/false (boolean, defaults to false)
+ Trap: true/false (boolean, defaults to false)
+ }
+ SkillInfo: { (bool, defaults to "None")
+ Quest: true/false (boolean, defaults to false)
+ NPC: true/false (boolean, defaults to false)
+ Wedding: true/false (boolean, defaults to false)
+ Spirit: true/false (boolean, defaults to false)
+ Guild: true/false (boolean, defaults to false)
+ Song: true/false (boolean, defaults to false)
+ Ensemble: true/false (boolean, defaults to false)
+ Trap: true/false (boolean, defaults to false)
+ TargetSelf: true/false (boolean, defaults to false)
+ NoCastSelf: true/false (boolean, defaults to false)
+ PartyOnly: true/false (boolean, defaults to false)
+ GuildOnly: true/false (boolean, defaults to false)
+ NoEnemy: true/false (boolean, defaults to false)
+ IgnoreLandProtector: true/false (boolean, defaults to false)
+ Chorus: true/false (boolean, defaults to false)
+ FreeCastReduced: true/false (boolean, defaults to false)
+ Works like skill SA_FREECAST, allow move and attack with reduced speed.
+ FreeCastNormal: true/false (boolean, defaults to false)
+ Works like FreeCastReduced, but not reduce speed.
+ ShowSkillScale: true/false (boolean, defaults to false)
+ AllowReproduce: true/false (boolean, defaults to false)
+ HiddenTrap: true/false (boolean, defaults to false)
+ }
+ AttackType: "Attack Type" (string, defaults to "None")
+ Types: "None", "Weapon", "Magic" or "Misc"
+ Element: "Element Type" (string) (Optional field - Default "Ele_Neutral")
+ (can be grouped by Levels)
+ Types: "Ele_Neutral", "Ele_Water", "Ele_Earth", "Ele_Fire", "Ele_Wind"
+ "Ele_Poison", "Ele_Holy", "Ele_Dark", "Ele_Ghost", "Ele_Undead"
+ "Ele_Weapon" - Uses weapon's element.
+ "Ele_Endowed" - Uses Endowed element.
+ "Ele_Random" - Uses random element.
+ DamageType: { (bool, default to "NoDamage")
+ NoDamage: true/false No damage skill
+ SplashArea: true/false Has splash area (requires source modification)
+ SplitDamage: true/false Damage should be split among targets (requires 'SplashArea' in order to work)
+ IgnoreCards: true/false Skill ignores caster's % damage cards (misc type always ignores)
+ IgnoreElement: true/false Skill ignores elemental adjustments
+ IgnoreDefense: true/false Skill ignores target's defense (misc type always ignores)
+ IgnoreFlee: true/false Skill ignores target's flee (magic type always ignores)
+ IgnoreDefCards: true/false Skill ignores target's def cards
+ }
+ SplashRange: Damage Splash Area (int, defaults to 0) (can be grouped by Levels)
+ Note: -1 for screen-wide.
+ NumberOfHits: Number of Hits (int, defaults to 1) (can be grouped by Levels)
+ Note: when positive, damage is increased by hits,
+ negative values just show number of hits without
+ increasing total damage.
+ InterruptCast: Cast Interruption (bool, defaults to false)
+ CastDefRate: Cast Defense Reduction (int, defaults to 0)
+ SkillInstances: Skill instances (int, defaults to 0) (can be grouped by Levels)
+ Notes: max amount of skill instances to place on the ground when
+ player_land_skill_limit/monster_land_skill_limit is enabled. For skills
+ that attack using a path, this is the path length to be used.
+ KnockBackTiles: Knock-back by 'n' Tiles (int, defaults to 0) (can be grouped by Levels)
+ CastTime: Skill cast Time (in ms) (int, defaults to 0) (can be grouped by Levels)
+ AfterCastActDelay: Skill Delay (in ms) (int, defaults to 0) (can be grouped by Levels)
+ AfterCastWalkDelay: Walk Delay (in ms) (int, defaults to 0) (can be grouped by Levels)
+ SkillData1: Skill Data/Duration (in ms) (int, defaults to 0) (can be grouped by Levels)
+ SkillData2: Skill Data/Duration (in ms) (int, defaults to 0) (can be grouped by Levels)
+ CoolDown: Skill Cooldown (in ms) (int, defaults to 0) (can be grouped by Levels)
+ Note: when 0, uses 20% of cast time and less than
+ 0 means no fixed cast time.
+ TargetMiscEffects (int, default to -1)
+ one misc effect or array of effects
+ TargetMiscEffect (int, default to -1)
+ TargetMiscEffect1 (int, default to -1)
+ first misc effect
+ TargetMiscEffect2 (int, default to -1)
+ second misc effect
+ CastTimeOptions: {
+ IgnoreDex: true/false (boolean, defaults to false)
+ IgnoreStatusEffect: true/false (boolean, defaults to false)
+ IgnoreItemBonus: true/false (boolean, defaults to false)
+ Note: Delay setting 'IgnoreDex' only makes sense when
+ delay_dependon_dex is enabled.
+ }
+ SkillDelayOptions: {
+ IgnoreDex: true/false (boolean, defaults to false)
+ IgnoreStatusEffect: true/false (boolean, defaults to false)
+ IgnoreItemBonus: true/false (boolean, defaults to false)
+ Note: Delay setting 'IgnoreDex' only makes sense when
+ delay_dependon_dex is enabled.
+ }
+ Requirements: {
+ HPCost: HP Cost (int, defaults to 0) (can be grouped by Levels)
+ SPCost: SP Cost (int, defaults to 0) (can be grouped by Levels)
+ HPRateCost: HP % Cost (int, defaults to 0) (can be grouped by Levels)
+ Note: If positive, it is a percent of your current hp,
+ otherwise it is a percent of your max hp.
+ SPRateCost: SP % Cost (int, defaults to 0) (can be grouped by Levels)
+ Note: If positive, it is a percent of your current sp,
+ otherwise it is a percent of your max sp.
+ ZenyCost: Zeny Cost (int, defaults to 0) (can be grouped by Levels)
+ WeaponTypes: { (bool or string, defaults to "All")
+ NoWeapon: true/false (boolean, defaults to false)
+ Daggers: true/false (boolean, defaults to false)
+ 1HSwords: true/false (boolean, defaults to false)
+ 2HSwords: true/false (boolean, defaults to false)
+ 1HSpears: true/false (boolean, defaults to false)
+ 2HSpears: true/false (boolean, defaults to false)
+ 1HAxes: true/false (boolean, defaults to false)
+ 2HAxes: true/false (boolean, defaults to false)
+ Maces: true/false (boolean, defaults to false)
+ 2HMaces: true/false (boolean, defaults to false)
+ Staves: true/false (boolean, defaults to false)
+ Bows: true/false (boolean, defaults to false)
+ Knuckles: true/false (boolean, defaults to false)
+ Instruments: true/false (boolean, defaults to false)
+ Whips: true/false (boolean, defaults to false)
+ Books: true/false (boolean, defaults to false)
+ Katars: true/false (boolean, defaults to false)
+ Revolvers: true/false (boolean, defaults to false)
+ Rifles: true/false (boolean, defaults to false)
+ GatlingGuns: true/false (boolean, defaults to false)
+ Shotguns: true/false (boolean, defaults to false)
+ GrenadeLaunchers: true/false (boolean, defaults to false)
+ FuumaShurikens: true/false (boolean, defaults to false)
+ 2HStaves: true/false (boolean, defaults to false)
+ MaxSingleWeaponType: true/false (boolean, defaults to false)
+ DWDaggers: true/false (boolean, defaults to false)
+ DWSwords: true/false (boolean, defaults to false)
+ DWAxes: true/false (boolean, defaults to false)
+ DWDaggerSword: true/false (boolean, defaults to false)
+ DWDaggerAxe: true/false (boolean, defaults to false)
+ DWSwordAxe: true/false (boolean, defaults to false)
+ }
+ AmmoTypes: { (for all types use string "All")
+ A_ARROW: true/false (boolean, defaults to false)
+ A_DAGGER: true/false (boolean, defaults to false)
+ A_BULLET: true/false (boolean, defaults to false)
+ A_SHELL: true/false (boolean, defaults to false)
+ A_GRENADE: true/false (boolean, defaults to false)
+ A_SHURIKEN: true/false (boolean, defaults to false)
+ A_KUNAI: true/false (boolean, defaults to false)
+ A_CANNONBALL: true/false (boolean, defaults to false)
+ A_THROWWEAPON: true/false (boolean, defaults to false)
+ }
+ AmmoAmount: Ammunition Amount (int, defaults to 0) (can be grouped by Levels)
+ State: "Required State" (string, defaults to "None") (can be grouped by Levels)
+ Types : 'None' = Nothing special
+ 'Moveable' = Requires to be able to move
+ 'NotOverWeight' = Requires to be less than 50% weight
+ 'InWater' = Requires to be standing on a water cell
+ 'Cart' = Requires a Pushcart
+ 'Riding' = Requires to ride either a peco or a dragon
+ 'Falcon' = Requires a Falcon
+ 'Sight' = Requires Sight skill activated
+ 'Hiding' = Requires Hiding skill activated
+ 'Cloaking' = Requires Cloaking skill activated
+ 'ExplosionSpirits' = Requires Fury skill activated
+ 'CartBoost' = Requires a Pushcart and Cart Boost skill activated
+ 'Shield' = Requires a 0,shield equipped
+ 'Warg' = Requires a Warg
+ 'Dragon' = Requires to ride a Dragon
+ 'RidingWarg' = Requires to ride a Warg
+ 'Mado' = Requires to have an active mado
+ 'PoisonWeapon' = Requires to be under Poisoning Weapon.
+ 'RollingCutter' = Requires at least one Rotation Counter from Rolling Cutter.
+ 'ElementalSpirit' = Requires to have an Elemental Spirit summoned.
+ 'MH_Fighting' = Requires Eleanor fighthing mode
+ 'MH_Grappling' = Requires Eleanor grappling mode
+ 'Peco' = Requires riding a peco
+ SpiritSphereCost: Spirit Sphere Cost (int, defaults to 0) (can be grouped by Levels)
+ Items: {
+ ItemID or Aegis_Name : Amount (int, defaults to 0) (can be grouped by Levels)
+ Item example: "ID717" or "Blue_Gemstone".
+ Notes: Items with amount 0 will not be consumed.
+ Amount can also be grouped by levels.
+ }
+ }
+ Unit: {
+ Id: [ UnitID, UnitID2 ] (int, defaults to 0) (can be grouped by Levels)
+ Layout: Unit Layout (int, defaults to 0) (can be grouped by Levels)
+ Range: Unit Range (int, defaults to 0) (can be grouped by Levels)
+ Interval: Unit Interval (int, defaults to 0) (can be grouped by Levels)
+ Target: "Unit Target" (string, defaults to "None")
+ Types:
+ All - affects everyone
+ NotEnemy - affects anyone who isn't an enemy
+ Friend - affects party, guildmates and neutral players
+ Party - affects party only
+ Guild - affects guild only
+ Ally - affects party and guildmates only
+ Sameguild - affects guild but not allies
+ Enemy - affects enemies only
+ None - affects nobody
+ Flag: {
+ UF_DEFNOTENEMY: true/false (boolean, defaults to false)
+ UF_NOREITERATION: true/false (boolean, defaults to false)
+ UF_NOFOOTSET: true/false (boolean, defaults to false)
+ UF_NOOVERLAP: true/false (boolean, defaults to false)
+ UF_PATHCHECK: true/false (boolean, defaults to false)
+ UF_NOPC: true/false (boolean, defaults to false)
+ UF_NOMOB: true/false (boolean, defaults to false)
+ UF_SKILL: true/false (boolean, defaults to false)
+ UF_DANCE: true/false (boolean, defaults to false)
+ UF_ENSEMBLE: true/false (boolean, defaults to false)
+ UF_SONG: true/false (boolean, defaults to false)
+ UF_DUALMODE: true/false (boolean, defaults to false)
+ UF_RANGEDSINGLEUNI: true/false (boolean, defaults to false)
+ }
+ }
+}
+*******************************************************************************/
+
+skill_db: (
+{
+ Id: 1
+ Name: "NV_BASIC"
+ Description: "Basic Skill"
+ MaxLevel: 9
+ NumberOfHits: 0
+},
+{
+ Id: 2
+ Name: "SM_SWORD"
+ Description: "Sword Mastery"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+ SkillType: {
+ Passive: true
+ Self: true
+ }
+ WeaponTypes: {
+ Daggers: true
+ 1HSwords: true
+ }
+},
+{
+ Id: 3
+ Name: "SM_TWOHAND"
+ Description: "Two-Handed Sword Mastery"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+ SkillType: {
+ Passive: true
+ Self: true
+ }
+ WeaponTypes: {
+ 2HSwords: true
+ 2HSpears: true
+ 2HAxes: true
+ 2HMaces: true
+ 2HStaves: true
+ }
+},
+{
+ Id: 4
+ Name: "SM_RECOVERY"
+ Description: "Increase HP Recovery"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 5
+ Name: "SM_BASH"
+ Description: "Bash"
+ MaxLevel: 10
+ Range: -1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 8
+ Lv2: 8
+ Lv3: 8
+ Lv4: 8
+ Lv5: 8
+ Lv6: 15
+ Lv7: 15
+ Lv8: 15
+ Lv9: 15
+ Lv10: 15
+ }
+ WeaponTypes: {
+ NoWeapon: true
+ }
+ }
+},
+{
+ Id: 6
+ Name: "SM_PROVOKE"
+ Description: "Provoke"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 30000
+ Requirements: {
+ SPCost: {
+ Lv1: 4
+ Lv2: 5
+ Lv3: 6
+ Lv4: 7
+ Lv5: 8
+ Lv6: 9
+ Lv7: 10
+ Lv8: 11
+ Lv9: 12
+ Lv10: 13
+ }
+ }
+},
+{
+ Id: 7
+ Name: "SM_MAGNUM"
+ Description: "Magnum Break"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ KnockBackTiles: 2
+ AfterCastActDelay: 2000
+ SkillData1: 2000
+ SkillData2: 10000
+ Requirements: {
+ HPCost: {
+ Lv1: 20
+ Lv2: 20
+ Lv3: 19
+ Lv4: 19
+ Lv5: 18
+ Lv6: 18
+ Lv7: 17
+ Lv8: 17
+ Lv9: 16
+ Lv10: 16
+ }
+ SPCost: 30
+ }
+},
+{
+ Id: 8
+ Name: "SM_ENDURE"
+ Description: "Endure"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 13000
+ Lv3: 16000
+ Lv4: 19000
+ Lv5: 22000
+ Lv6: 25000
+ Lv7: 28000
+ Lv8: 31000
+ Lv9: 34000
+ Lv10: 37000
+ }
+ SkillData2: 10000
+ CoolDown: 10000
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 9
+ Name: "MG_SRECOVERY"
+ Description: "Increase SP Recovery"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 10
+ Name: "MG_SIGHT"
+ Description: "Sight"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 3
+ InterruptCast: true
+ SkillData1: 10000
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 11
+ Name: "MG_NAPALMBEAT"
+ Description: "Napalm Beat"
+ MaxLevel: 10
+ Range: {
+ Lv1: 10
+ Lv2: 11
+ Lv3: 12
+ Lv4: 13
+ Lv5: 14
+ Lv6: 15
+ Lv7: 15
+ Lv8: 15
+ Lv9: 15
+ Lv10: 15
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Neutral"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 3
+ Lv4: 4
+ Lv5: 4
+ Lv6: 5
+ Lv7: 5
+ Lv8: 5
+ Lv9: 5
+ Lv10: 5
+ }
+ InterruptCast: true
+ CastTime: 400
+ AfterCastActDelay: {
+ Lv1: 1000
+ Lv2: 900
+ Lv3: 750
+ Lv4: 550
+ Lv5: 300
+ Lv6: 300
+ Lv7: 300
+ Lv8: 300
+ Lv9: 300
+ Lv10: 200
+ }
+ FixedCastTime: 100
+ Requirements: {
+ SPCost: {
+ Lv1: 9
+ Lv2: 9
+ Lv3: 9
+ Lv4: 12
+ Lv5: 12
+ Lv6: 12
+ Lv7: 15
+ Lv8: 15
+ Lv9: 15
+ Lv10: 18
+ }
+ }
+},
+{
+ Id: 12
+ Name: "MG_SAFETYWALL"
+ Description: "Safety Wall"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Ghost"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 3200
+ Lv2: 2880
+ Lv3: 2560
+ Lv4: 2240
+ Lv5: 1920
+ Lv6: 1600
+ Lv7: 1280
+ Lv8: 960
+ Lv9: 640
+ Lv10: 320
+ }
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 10000
+ Lv3: 15000
+ Lv4: 20000
+ Lv5: 25000
+ Lv6: 30000
+ Lv7: 35000
+ Lv8: 40000
+ Lv9: 45000
+ Lv10: 50000
+ }
+ FixedCastTime: {
+ Lv1: 800
+ Lv2: 720
+ Lv3: 640
+ Lv4: 560
+ Lv5: 480
+ Lv6: 400
+ Lv7: 320
+ Lv8: 240
+ Lv9: 160
+ Lv10: 80
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 30
+ Lv3: 30
+ Lv4: 35
+ Lv5: 35
+ Lv6: 35
+ Lv7: 40
+ Lv8: 40
+ Lv9: 40
+ Lv10: 40
+ }
+// Items: {
+// Blue_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0x7e
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_DEFNOTENEMY: true
+ UF_NOREITERATION: true
+ }
+ }
+},
+{
+ Id: 13
+ Name: "MG_SOULSTRIKE"
+ Description: "Soul Strike"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Ghost"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ InterruptCast: true
+ CastTime: 400
+ AfterCastActDelay: {
+ Lv1: 1200
+ Lv2: 1200
+ Lv3: 1600
+ Lv4: 1600
+ Lv5: 2000
+ Lv6: 2000
+ Lv7: 2400
+ Lv8: 2400
+ Lv9: 2800
+ Lv10: 2500
+ }
+ FixedCastTime: 100
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 14
+ Lv3: 24
+ Lv4: 20
+ Lv5: 30
+ Lv6: 26
+ Lv7: 36
+ Lv8: 32
+ Lv9: 42
+ Lv10: 38
+ }
+ }
+},
+{
+ Id: 14
+ Name: "MG_COLDBOLT"
+ Description: "Cold Bolt"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 640
+ Lv2: 960
+ Lv3: 1280
+ Lv4: 1600
+ Lv5: 1920
+ Lv6: 2100
+ Lv7: 1560
+ Lv8: 2880
+ Lv9: 3200
+ Lv10: 3520
+ }
+ AfterCastActDelay: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ FixedCastTime: {
+ Lv1: 160
+ Lv2: 240
+ Lv3: 320
+ Lv4: 400
+ Lv5: 480
+ Lv6: 700
+ Lv7: 640
+ Lv8: 720
+ Lv9: 800
+ Lv10: 880
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 15
+ Name: "MG_FROSTDIVER"
+ Description: "Frost Diver"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ InterruptCast: true
+ CastTime: 640
+ AfterCastActDelay: 1500
+ SkillData2: {
+ Lv1: 3000
+ Lv2: 6000
+ Lv3: 9000
+ Lv4: 12000
+ Lv5: 15000
+ Lv6: 18000
+ Lv7: 21000
+ Lv8: 24000
+ Lv9: 27000
+ Lv10: 30000
+ }
+ FixedCastTime: 160
+ Requirements: {
+ SPCost: {
+ Lv1: 25
+ Lv2: 24
+ Lv3: 23
+ Lv4: 22
+ Lv5: 21
+ Lv6: 20
+ Lv7: 19
+ Lv8: 18
+ Lv9: 17
+ Lv10: 16
+ }
+ }
+},
+{
+ Id: 16
+ Name: "MG_STONECURSE"
+ Description: "Stone Curse"
+ MaxLevel: 10
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 800
+ SkillData1: 5000
+ SkillData2: 20000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: {
+ Lv1: 25
+ Lv2: 24
+ Lv3: 23
+ Lv4: 22
+ Lv5: 21
+ Lv6: 20
+ Lv7: 19
+ Lv8: 18
+ Lv9: 17
+ Lv10: 16
+ }
+// Items: {
+// Red_Gemstone: 1
+// }
+ }
+},
+{
+ Id: 17
+ Name: "MG_FIREBALL"
+ Description: "Fire Ball"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1280
+ Lv2: 1280
+ Lv3: 1280
+ Lv4: 1280
+ Lv5: 1280
+ Lv6: 800
+ Lv7: 800
+ Lv8: 800
+ Lv9: 800
+ Lv10: 800
+ }
+ AfterCastActDelay: {
+ Lv1: 1500
+ Lv2: 1500
+ Lv3: 1500
+ Lv4: 1500
+ Lv5: 1500
+ Lv6: 1000
+ Lv7: 1000
+ Lv8: 1000
+ Lv9: 1000
+ Lv10: 1000
+ }
+ FixedCastTime: {
+ Lv1: 320
+ Lv2: 320
+ Lv3: 320
+ Lv4: 320
+ Lv5: 320
+ Lv6: 200
+ Lv7: 200
+ Lv8: 200
+ Lv9: 200
+ Lv10: 200
+ }
+ Requirements: {
+ SPCost: 25
+ }
+},
+{
+ Id: 18
+ Name: "MG_FIREWALL"
+ Description: "Nature Wall"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Nature"
+ InterruptCast: true
+ SkillInstances: 3
+ KnockBackTiles: 2
+ CastTime: {
+ Lv1: 1600
+ Lv2: 1440
+ Lv3: 1280
+ Lv4: 1120
+ Lv5: 960
+ Lv6: 880
+ Lv7: 800
+ Lv8: 720
+ Lv9: 640
+ Lv10: 560
+ }
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 6000
+ Lv3: 7000
+ Lv4: 8000
+ Lv5: 9000
+ Lv6: 10000
+ Lv7: 11000
+ Lv8: 12000
+ Lv9: 13000
+ Lv10: 14000
+ }
+ FixedCastTime: {
+ Lv1: 400
+ Lv2: 360
+ Lv3: 320
+ Lv4: 280
+ Lv5: 240
+ Lv6: 220
+ Lv7: 200
+ Lv8: 180
+ Lv9: 160
+ Lv10: 140
+ }
+ Requirements: {
+ SPCost: 40
+ }
+ Unit: {
+ Id: 0x7f
+ Layout: -1
+ Interval: 20
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 19
+ Name: "MG_FIREBOLT"
+ Description: "Fire Bolt"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 640
+ Lv2: 960
+ Lv3: 1280
+ Lv4: 1600
+ Lv5: 1920
+ Lv6: 2100
+ Lv7: 1560
+ Lv8: 2880
+ Lv9: 3200
+ Lv10: 3520
+ }
+ AfterCastActDelay: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ FixedCastTime: {
+ Lv1: 160
+ Lv2: 240
+ Lv3: 320
+ Lv4: 400
+ Lv5: 480
+ Lv6: 700
+ Lv7: 640
+ Lv8: 720
+ Lv9: 800
+ Lv10: 880
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 20
+ Name: "MG_LIGHTNINGBOLT"
+ Description: "Lightning Bolt"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 640
+ Lv2: 960
+ Lv3: 1280
+ Lv4: 1600
+ Lv5: 1920
+ Lv6: 2100
+ Lv7: 1560
+ Lv8: 2880
+ Lv9: 3200
+ Lv10: 3520
+ }
+ AfterCastActDelay: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ FixedCastTime: {
+ Lv1: 160
+ Lv2: 240
+ Lv3: 320
+ Lv4: 400
+ Lv5: 480
+ Lv6: 700
+ Lv7: 640
+ Lv8: 720
+ Lv9: 800
+ Lv10: 880
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 21
+ Name: "MG_THUNDERSTORM"
+ Description: "Thunderstorm"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 640
+ Lv2: 1280
+ Lv3: 1920
+ Lv4: 2560
+ Lv5: 3200
+ Lv6: 3840
+ Lv7: 4480
+ Lv8: 5120
+ Lv9: 5760
+ Lv10: 6400
+ }
+ AfterCastActDelay: {
+ Lv1: 2000
+ Lv2: 2000
+ Lv3: 2000
+ Lv4: 2000
+ Lv5: 2000
+ Lv6: 2000
+ Lv7: 2000
+ Lv8: 2000
+ Lv9: 2000
+ Lv10: 2000
+ }
+ SkillData1: 500
+ FixedCastTime: {
+ Lv1: 160
+ Lv2: 320
+ Lv3: 480
+ Lv4: 640
+ Lv5: 800
+ Lv6: 960
+ Lv7: 1120
+ Lv8: 1280
+ Lv9: 1440
+ Lv10: 1600
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 29
+ Lv2: 34
+ Lv3: 39
+ Lv4: 44
+ Lv5: 49
+ Lv6: 54
+ Lv7: 59
+ Lv8: 64
+ Lv9: 69
+ Lv10: 74
+ }
+ }
+ Unit: {
+ Id: 0x86
+ Range: 2
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 22
+ Name: "AL_DP"
+ Description: "Divine Protection"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 23
+ Name: "AL_DEMONBANE"
+ Description: "Demon Bane"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 24
+ Name: "AL_RUWACH"
+ Description: "Ruwach"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 2
+ InterruptCast: true
+ SkillData1: 10000
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 25
+ Name: "AL_PNEUMA"
+ Description: "Pneuma"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 10000
+ Requirements: {
+ SPCost: 10
+ }
+ Unit: {
+ Id: 0x85
+ Layout: 1
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_DEFNOTENEMY: true
+ UF_NOREITERATION: true
+ UF_RANGEDSINGLEUNIT: true
+ }
+ }
+},
+{
+ Id: 26
+ Name: "AL_TELEPORT"
+ Description: "Teleport"
+ MaxLevel: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 9
+ Lv3: 8
+ Lv4: 7
+ Lv5: 6
+ Lv6: 5
+ Lv7: 4
+ Lv8: 3
+ Lv9: 2
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 27
+ Name: "AL_WARP"
+ Description: "Warp Portal"
+ MaxLevel: 4
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 3
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 10000
+ Lv3: 15000
+ Lv4: 20000
+ Lv5: 25000
+ Lv6: 30000
+ Lv7: 35000
+ Lv8: 40000
+ Lv9: 45000
+ Lv10: 50000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 35
+ Lv2: 32
+ Lv3: 29
+ Lv4: 26
+ Lv5: 23
+ Lv6: 20
+ Lv7: 17
+ Lv8: 14
+ Lv9: 11
+ Lv10: 8
+ }
+// Items: {
+// Blue_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: [ 0x81, 0x80 ]
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ UF_NOOVERLAP: true
+ }
+ }
+},
+{
+ Id: 28
+ Name: "AL_HEAL"
+ Description: "Heal"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ IgnoreDefense: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 13
+ Lv2: 16
+ Lv3: 19
+ Lv4: 22
+ Lv5: 25
+ Lv6: 28
+ Lv7: 31
+ Lv8: 34
+ Lv9: 37
+ Lv10: 40
+ }
+ }
+},
+{
+ Id: 29
+ Name: "AL_INCAGI"
+ Description: "Increase AGI"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 800
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 80000
+ Lv3: 100000
+ Lv4: 120000
+ Lv5: 140000
+ Lv6: 160000
+ Lv7: 180000
+ Lv8: 200000
+ Lv9: 220000
+ Lv10: 240000
+ }
+ FixedCastTime: 200
+ Requirements: {
+ HPCost: 15
+ SPCost: {
+ Lv1: 18
+ Lv2: 21
+ Lv3: 24
+ Lv4: 27
+ Lv5: 30
+ Lv6: 33
+ Lv7: 36
+ Lv8: 39
+ Lv9: 42
+ Lv10: 45
+ }
+ }
+},
+{
+ Id: 30
+ Name: "AL_DECAGI"
+ Description: "Decrease AGI"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 750
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 40000
+ Lv2: 50000
+ Lv3: 60000
+ Lv4: 70000
+ Lv5: 80000
+ Lv6: 90000
+ Lv7: 100000
+ Lv8: 110000
+ Lv9: 120000
+ Lv10: 130000
+ }
+ FixedCastTime: 250
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 17
+ Lv3: 19
+ Lv4: 21
+ Lv5: 23
+ Lv6: 25
+ Lv7: 27
+ Lv8: 29
+ Lv9: 31
+ Lv10: 33
+ }
+ }
+},
+{
+ Id: 31
+ Name: "AL_HOLYWATER"
+ Description: "Aqua Benedicta"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 800
+ AfterCastActDelay: 500
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: 10
+ State: "InWater"
+ }
+},
+{
+ Id: 32
+ Name: "AL_CRUCIS"
+ Description: "Signum Crucis"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 15
+ InterruptCast: true
+ CastTime: 350
+ AfterCastActDelay: 2000
+ FixedCastTime: 150
+ Requirements: {
+ SPCost: 35
+ }
+},
+{
+ Id: 33
+ Name: "AL_ANGELUS"
+ Description: "Angelus"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+ CastTime: 350
+ AfterCastActDelay: 3500
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 60000
+ Lv3: 90000
+ Lv4: 120000
+ Lv5: 150000
+ Lv6: 180000
+ Lv7: 210000
+ Lv8: 240000
+ Lv9: 270000
+ Lv10: 300000
+ }
+ FixedCastTime: 150
+ Requirements: {
+ SPCost: {
+ Lv1: 23
+ Lv2: 26
+ Lv3: 29
+ Lv4: 32
+ Lv5: 35
+ Lv6: 38
+ Lv7: 41
+ Lv8: 44
+ Lv9: 47
+ Lv10: 50
+ }
+ }
+},
+{
+ Id: 34
+ Name: "AL_BLESSING"
+ Description: "Blessing"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 80000
+ Lv3: 100000
+ Lv4: 120000
+ Lv5: 140000
+ Lv6: 160000
+ Lv7: 180000
+ Lv8: 200000
+ Lv9: 220000
+ Lv10: 240000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 28
+ Lv2: 32
+ Lv3: 36
+ Lv4: 40
+ Lv5: 44
+ Lv6: 48
+ Lv7: 52
+ Lv8: 56
+ Lv9: 60
+ Lv10: 64
+ }
+ }
+},
+{
+ Id: 35
+ Name: "AL_CURE"
+ Description: "Cure"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData2: 6000
+ Requirements: {
+ SPCost: 15
+ }
+},
+{
+ Id: 36
+ Name: "MC_INCCARRY"
+ Description: "Enlarge Weight Limit"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 37
+ Name: "MC_DISCOUNT"
+ Description: "Discount"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 38
+ Name: "MC_OVERCHARGE"
+ Description: "Overcharge"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 39
+ Name: "MC_PUSHCART"
+ Description: "Pushcart"
+ MaxLevel: 10
+ Range: 1
+ NumberOfHits: 0
+},
+{
+ Id: 40
+ Name: "MC_IDENTIFY"
+ Description: "Item Appraisal"
+ MaxLevel: 1
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 41
+ Name: "MC_VENDING"
+ Description: "Vending"
+ MaxLevel: 10
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 30
+ State: "Cart"
+ }
+},
+{
+ Id: 42
+ Name: "MC_MAMMONITE"
+ Description: "Mammonite"
+ MaxLevel: 10
+ Range: -1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: 5
+ ZenyCost: {
+ Lv1: 100
+ Lv2: 200
+ Lv3: 300
+ Lv4: 400
+ Lv5: 500
+ Lv6: 600
+ Lv7: 700
+ Lv8: 800
+ Lv9: 900
+ Lv10: 1000
+ }
+ }
+},
+{
+ Id: 43
+ Name: "AC_OWL"
+ Description: "Owl's Eye"
+ MaxLevel: 10
+ NumberOfHits: 0
+ SkillType: {
+ Passive: true
+ Self: true
+ }
+ WeaponTypes: {
+ Daggers: false
+ 1HSwords: false
+ Bows: true
+ }
+},
+{
+ Id: 44
+ Name: "AC_VULTURE"
+ Description: "Vulture's Eye"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 45
+ Name: "AC_CONCENTRATION"
+ Description: "Improve Concentration"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 3
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 80000
+ Lv3: 100000
+ Lv4: 120000
+ Lv5: 140000
+ Lv6: 160000
+ Lv7: 180000
+ Lv8: 200000
+ Lv9: 220000
+ Lv10: 240000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 25
+ Lv2: 30
+ Lv3: 35
+ Lv4: 40
+ Lv5: 45
+ Lv6: 50
+ Lv7: 55
+ Lv8: 60
+ Lv9: 65
+ Lv10: 70
+ }
+ }
+},
+{
+ Id: 46
+ Name: "AC_DOUBLE"
+ Description: "Double Strafe"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 2
+ AfterCastActDelay: 100
+ SkillData1: 100
+ Requirements: {
+ SPCost: 12
+ WeaponTypes: {
+ Bows: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 47
+ Name: "AC_SHOWER"
+ Description: "Arrow Shower"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ IgnoreLandProtector: true
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 2
+ Lv3: 2
+ Lv4: 2
+ Lv5: 2
+ Lv6: 3
+ Lv7: 3
+ Lv8: 3
+ Lv9: 3
+ Lv10: 3
+ }
+ KnockBackTiles: 2
+ AfterCastActDelay: 100
+ SkillData1: 100
+ Requirements: {
+ SPCost: 15
+ WeaponTypes: {
+ Bows: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+ Unit: {
+ Id: 0x86
+ Range: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 1
+ Lv5: 1
+ Lv6: 2
+ Lv7: 2
+ Lv8: 2
+ Lv9: 2
+ Lv10: 2
+ }
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_SKILL: true
+ }
+ }
+},
+{
+ Id: 48
+ Name: "TF_DOUBLE"
+ Description: "Double Attack"
+ MaxLevel: 10
+ Range: -1
+ Hit: "BDT_MULTIHIT"
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 2
+},
+{
+ Id: 49
+ Name: "TF_MISS"
+ Description: "Improve Dodge"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 50
+ Name: "TF_STEAL"
+ Description: "Steal"
+ MaxLevel: 10
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 51
+ Name: "TF_HIDING"
+ Description: "Hiding"
+ MaxLevel: 10
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 60000
+ Lv3: 90000
+ Lv4: 120000
+ Lv5: 150000
+ Lv6: 180000
+ Lv7: 210000
+ Lv8: 240000
+ Lv9: 270000
+ Lv10: 300000
+ }
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 52
+ Name: "TF_POISON"
+ Description: "Envenom"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Poison"
+ SkillData2: {
+ Lv1: 20000
+ Lv2: 40000
+ Lv3: 60000
+ Lv4: 80000
+ Lv5: 100000
+ Lv6: 120000
+ Lv7: 140000
+ Lv8: 160000
+ Lv9: 180000
+ Lv10: 200000
+ }
+ Requirements: {
+ SPCost: 12
+ }
+},
+{
+ Id: 53
+ Name: "TF_DETOXIFY"
+ Description: "Detoxify"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Poison"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 54
+ Name: "ALL_RESURRECTION"
+ Description: "Resurrection"
+ MaxLevel: 4
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 4800
+ Lv2: 3200
+ Lv3: 1600
+ Lv4: 0
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ AfterCastActDelay: {
+ Lv1: 0
+ Lv2: 1000
+ Lv3: 2000
+ Lv4: 3000
+ Lv5: 4000
+ Lv6: 5000
+ Lv7: 6000
+ Lv8: 7000
+ Lv9: 8000
+ Lv10: 9000
+ }
+ FixedCastTime: {
+ Lv1: 1200
+ Lv2: 800
+ Lv3: 400
+ Lv4: 0
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: 60
+// Items: {
+// Blue_Gemstone: 1
+// }
+ }
+},
+{
+ Id: 55
+ Name: "KN_SPEARMASTERY"
+ Description: "Spear Mastery"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 56
+ Name: "KN_PIERCE"
+ Description: "Pierce"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 3
+ Requirements: {
+ SPCost: 7
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 57
+ Name: "KN_BRANDISHSPEAR"
+ Description: "Brandish Spear"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ KnockBackTiles: 3
+ CastTime: 350
+ FixedCastTime: 350
+ Requirements: {
+ SPCost: 12
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ State: "Riding"
+ }
+},
+{
+ Id: 58
+ Name: "KN_SPEARSTAB"
+ Description: "Spear Stab"
+ MaxLevel: 10
+ Range: -4
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ KnockBackTiles: 6
+ Requirements: {
+ SPCost: 9
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 59
+ Name: "KN_SPEARBOOMERANG"
+ Description: "Spear Boomerang"
+ MaxLevel: 5
+ Range: {
+ Lv1: 3
+ Lv2: 5
+ Lv3: 7
+ Lv4: 9
+ Lv5: 11
+ Lv6: 13
+ Lv7: 15
+ Lv8: 17
+ Lv9: 19
+ Lv10: 21
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 1000
+ Requirements: {
+ SPCost: 10
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 60
+ Name: "KN_TWOHANDQUICKEN"
+ Description: "Twohand Quicken"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 60000
+ Lv3: 90000
+ Lv4: 120000
+ Lv5: 150000
+ Lv6: 180000
+ Lv7: 210000
+ Lv8: 240000
+ Lv9: 270000
+ Lv10: 300000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 14
+ Lv2: 18
+ Lv3: 22
+ Lv4: 26
+ Lv5: 30
+ Lv6: 34
+ Lv7: 38
+ Lv8: 42
+ Lv9: 46
+ Lv10: 50
+ }
+ WeaponTypes: {
+ 2HSwords: true
+ }
+ }
+},
+{
+ Id: 61
+ Name: "KN_AUTOCOUNTER"
+ Description: "Counter Attack"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreDefense: true
+ }
+ SkillData1: {
+ Lv1: 400
+ Lv2: 800
+ Lv3: 1200
+ Lv4: 1600
+ Lv5: 2000
+ Lv6: 2400
+ Lv7: 2800
+ Lv8: 3200
+ Lv9: 3600
+ Lv10: 4000
+ }
+ Requirements: {
+ SPCost: 3
+ WeaponTypes: {
+ NoWeapon: true
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
+ GrenadeLaunchers: true
+ FuumaShurikens: true
+ }
+ }
+},
+{
+ Id: 62
+ Name: "KN_BOWLINGBASH"
+ Description: "Bowling Bash"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ KnockBackTiles: 1
+ CastTime: 350
+ FixedCastTime: 350
+ Requirements: {
+ SPCost: {
+ Lv1: 13
+ Lv2: 14
+ Lv3: 15
+ Lv4: 16
+ Lv5: 17
+ Lv6: 18
+ Lv7: 19
+ Lv8: 20
+ Lv9: 21
+ Lv10: 22
+ }
+ }
+},
+{
+ Id: 63
+ Name: "KN_RIDING"
+ Description: "Peco Peco Riding"
+ MaxLevel: 1
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 64
+ Name: "KN_CAVALIERMASTERY"
+ Description: "Cavalier Mastery"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 65
+ Name: "PR_MACEMASTERY"
+ Description: "Mace Mastery"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 66
+ Name: "PR_IMPOSITIO"
+ Description: "Impositio Manus"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 3000
+ SkillData1: 60000
+ Requirements: {
+ SPCost: {
+ Lv1: 13
+ Lv2: 16
+ Lv3: 19
+ Lv4: 22
+ Lv5: 25
+ Lv6: 28
+ Lv7: 31
+ Lv8: 34
+ Lv9: 37
+ Lv10: 40
+ }
+ }
+},
+{
+ Id: 67
+ Name: "PR_SUFFRAGIUM"
+ Description: "Suffragium"
+ MaxLevel: 3
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 20000
+ Lv3: 10000
+ Lv4: 1
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: 8
+ }
+},
+{
+ Id: 68
+ Name: "PR_ASPERSIO"
+ Description: "Aspersio"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ IgnoreElement: true
+ IgnoreDefense: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 90000
+ Lv3: 120000
+ Lv4: 150000
+ Lv5: 180000
+ Lv6: 210000
+ Lv7: 240000
+ Lv8: 270000
+ Lv9: 300000
+ Lv10: 330000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 14
+ Lv2: 18
+ Lv3: 22
+ Lv4: 26
+ Lv5: 30
+ Lv6: 34
+ Lv7: 38
+ Lv8: 42
+ Lv9: 46
+ Lv10: 50
+ }
+// Items: {
+// Holy_Water: 1
+// }
+ }
+},
+{
+ Id: 69
+ Name: "PR_BENEDICTIO"
+ Description: "B.S. Sacramenti"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ IgnoreDefense: true
+ }
+ SplashRange: 1
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 40000
+ Lv2: 80000
+ Lv3: 120000
+ Lv4: 160000
+ Lv5: 200000
+ Lv6: 240000
+ Lv7: 280000
+ Lv8: 320000
+ Lv9: 360000
+ Lv10: 400000
+ }
+ Requirements: {
+ SPCost: 20
+ }
+},
+{
+ Id: 70
+ Name: "PR_SANCTUARY"
+ Description: "Sanctuary"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ IgnoreDefense: true
+ }
+ InterruptCast: true
+ KnockBackTiles: 1
+ CastTime: 4000
+ SkillData1: {
+ Lv1: 4000
+ Lv2: 7000
+ Lv3: 10000
+ Lv4: 13000
+ Lv5: 16000
+ Lv6: 19000
+ Lv7: 22000
+ Lv8: 25000
+ Lv9: 28000
+ Lv10: 31000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 18
+ Lv3: 21
+ Lv4: 24
+ Lv5: 27
+ Lv6: 30
+ Lv7: 33
+ Lv8: 36
+ Lv9: 39
+ Lv10: 42
+ }
+// Items: {
+// Blue_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0x83
+ Layout: -1
+ Range: 1
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 71
+ Name: "PR_SLOWPOISON"
+ Description: "Slow Poison"
+ MaxLevel: 4
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 20000
+ Lv3: 30000
+ Lv4: 40000
+ Lv5: 50000
+ Lv6: 60000
+ Lv7: 70000
+ Lv8: 80000
+ Lv9: 90000
+ Lv10: 100000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 6
+ Lv2: 8
+ Lv3: 10
+ Lv4: 12
+ Lv5: 14
+ Lv6: 16
+ Lv7: 18
+ Lv8: 20
+ Lv9: 22
+ Lv10: 24
+ }
+ }
+},
+{
+ Id: 72
+ Name: "PR_STRECOVERY"
+ Description: "Status Recovery"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 2000
+ SkillData2: 30000
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 73
+ Name: "PR_KYRIE"
+ Description: "Kyrie Eleison"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1600
+ AfterCastActDelay: 2000
+ SkillData1: 120000
+ FixedCastTime: 400
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 20
+ Lv3: 20
+ Lv4: 25
+ Lv5: 25
+ Lv6: 25
+ Lv7: 30
+ Lv8: 30
+ Lv9: 30
+ Lv10: 35
+ }
+ }
+},
+{
+ Id: 74
+ Name: "PR_MAGNIFICAT"
+ Description: "Magnificat"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+ CastTime: 3200
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: 800
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 75
+ Name: "PR_GLORIA"
+ Description: "Gloria"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ Requirements: {
+ SPCost: 20
+ }
+},
+{
+ Id: 76
+ Name: "PR_LEXDIVINA"
+ Description: "Lex Divina"
+ MaxLevel: 10
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ InterruptCast: true
+ AfterCastActDelay: 3000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 35000
+ Lv3: 40000
+ Lv4: 45000
+ Lv5: 50000
+ Lv6: 60000
+ Lv7: 60000
+ Lv8: 60000
+ Lv9: 60000
+ Lv10: 60000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 20
+ Lv3: 20
+ Lv4: 20
+ Lv5: 20
+ Lv6: 18
+ Lv7: 16
+ Lv8: 14
+ Lv9: 12
+ Lv10: 10
+ }
+ }
+},
+{
+ Id: 77
+ Name: "PR_TURNUNDEAD"
+ Description: "Turn Undead"
+ MaxLevel: 10
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ IgnoreCards: true
+ IgnoreDefense: true
+ }
+ InterruptCast: true
+ CastTime: 800
+ AfterCastActDelay: 3000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: 20
+ }
+},
+{
+ Id: 78
+ Name: "PR_LEXAETERNA"
+ Description: "Lex Aeterna"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ InterruptCast: true
+ AfterCastActDelay: 3000
+ SkillData1: 600000
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 79
+ Name: "PR_MAGNUS"
+ Description: "Magnus Exorcismus"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: 12000
+ AfterCastActDelay: 4000
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 6000
+ Lv3: 7000
+ Lv4: 8000
+ Lv5: 9000
+ Lv6: 10000
+ Lv7: 11000
+ Lv8: 12000
+ Lv9: 13000
+ Lv10: 14000
+ }
+ FixedCastTime: 3000
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 42
+ Lv3: 44
+ Lv4: 46
+ Lv5: 48
+ Lv6: 50
+ Lv7: 52
+ Lv8: 54
+ Lv9: 56
+ Lv10: 58
+ }
+// Items: {
+// Blue_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0x84
+ Layout: -1
+ Range: 1
+ Interval: 3000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 80
+ Name: "WZ_FIREPILLAR"
+ Description: "Fire Pillar"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ IgnoreDefense: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 1
+ Lv5: 1
+ Lv6: 2
+ Lv7: 2
+ Lv8: 2
+ Lv9: 2
+ Lv10: 2
+ }
+ NumberOfHits: {
+ Lv1: -3
+ Lv2: -4
+ Lv3: -5
+ Lv4: -6
+ Lv5: -7
+ Lv6: -8
+ Lv7: -9
+ Lv8: -10
+ Lv9: -11
+ Lv10: -12
+ }
+ InterruptCast: true
+ SkillInstances: 5
+ CastTime: {
+ Lv1: 1920
+ Lv2: 1728
+ Lv3: 1536
+ Lv4: 1344
+ Lv5: 1152
+ Lv6: 960
+ Lv7: 768
+ Lv8: 576
+ Lv9: 384
+ Lv10: 192
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 30000
+ SkillData2: {
+ Lv1: 600
+ Lv2: 800
+ Lv3: 1000
+ Lv4: 1200
+ Lv5: 1400
+ Lv6: 1600
+ Lv7: 1800
+ Lv8: 2000
+ Lv9: 2200
+ Lv10: 2400
+ }
+ FixedCastTime: {
+ Lv1: 480
+ Lv2: 432
+ Lv3: 384
+ Lv4: 336
+ Lv5: 288
+ Lv6: 240
+ Lv7: 192
+ Lv8: 144
+ Lv9: 96
+ Lv10: 48
+ }
+ Requirements: {
+ SPCost: 75
+ }
+ Unit: {
+ Id: [ 0x87, 0x88 ]
+ Range: 1
+ Interval: 2000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 81
+ Name: "WZ_SIGHTRASHER"
+ Description: "Sightrasher"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ SplashRange: 3
+ InterruptCast: true
+ KnockBackTiles: 5
+ AfterCastActDelay: 2000
+ SkillData1: 500
+ FixedCastTime: 80
+ Requirements: {
+ SPCost: {
+ Lv1: 35
+ Lv2: 37
+ Lv3: 39
+ Lv4: 41
+ Lv5: 43
+ Lv6: 45
+ Lv7: 47
+ Lv8: 49
+ Lv9: 51
+ Lv10: 53
+ }
+ State: "Sight"
+ }
+},
+{
+ Id: 83
+ Name: "WZ_METEOR"
+ Description: "Meteor Storm"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ SplashRange: {
+ Lv1: 3
+ Lv2: 3
+ Lv3: 3
+ Lv4: 3
+ Lv5: 3
+ Lv6: 3
+ Lv7: 3
+ Lv8: 3
+ Lv9: 3
+ Lv10: 3
+ }
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ InterruptCast: true
+ CastTime: 9600
+ AfterCastActDelay: {
+ Lv1: 2000
+ Lv2: 3000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 4000
+ Lv6: 5000
+ Lv7: 5000
+ Lv8: 6000
+ Lv9: 6000
+ Lv10: 7000
+ }
+ SkillData1: 500
+ SkillData2: 5000
+ FixedCastTime: 2400
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 24
+ Lv3: 30
+ Lv4: 34
+ Lv5: 40
+ Lv6: 44
+ Lv7: 50
+ Lv8: 54
+ Lv9: 60
+ Lv10: 64
+ }
+ }
+ Unit: {
+ Id: 0x86
+ Range: 3
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 84
+ Name: "WZ_JUPITEL"
+ Description: "Jupitel Thunder"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ NumberOfHits: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ InterruptCast: true
+ KnockBackTiles: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 3
+ Lv4: 4
+ Lv5: 4
+ Lv6: 5
+ Lv7: 5
+ Lv8: 6
+ Lv9: 6
+ Lv10: 7
+ }
+ CastTime: {
+ Lv1: 1600
+ Lv2: 1920
+ Lv3: 2240
+ Lv4: 2560
+ Lv5: 2880
+ Lv6: 3200
+ Lv7: 3520
+ Lv8: 3840
+ Lv9: 4160
+ Lv10: 4480
+ }
+ FixedCastTime: {
+ Lv1: 400
+ Lv2: 480
+ Lv3: 560
+ Lv4: 640
+ Lv5: 720
+ Lv6: 800
+ Lv7: 880
+ Lv8: 960
+ Lv9: 1040
+ Lv10: 1120
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 23
+ Lv3: 26
+ Lv4: 29
+ Lv5: 32
+ Lv6: 35
+ Lv7: 38
+ Lv8: 41
+ Lv9: 44
+ Lv10: 47
+ }
+ }
+},
+{
+ Id: 85
+ Name: "WZ_VERMILION"
+ Description: "Lord of Vermilion"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ NumberOfHits: -10
+ InterruptCast: true
+ CastTime: {
+ Lv1: 9600
+ Lv2: 9280
+ Lv3: 8960
+ Lv4: 8640
+ Lv5: 8320
+ Lv6: 8000
+ Lv7: 7680
+ Lv8: 7360
+ Lv9: 7040
+ Lv10: 6720
+ }
+ AfterCastActDelay: 5000
+ SkillData1: 4000
+ SkillData2: {
+ Lv1: 5500
+ Lv2: 6000
+ Lv3: 6500
+ Lv4: 7000
+ Lv5: 7500
+ Lv6: 8000
+ Lv7: 8500
+ Lv8: 9000
+ Lv9: 9500
+ Lv10: 10000
+ }
+ FixedCastTime: {
+ Lv1: 2400
+ Lv2: 2320
+ Lv3: 2240
+ Lv4: 2160
+ Lv5: 2080
+ Lv6: 2000
+ Lv7: 1920
+ Lv8: 1840
+ Lv9: 1760
+ Lv10: 1680
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 64
+ Lv3: 68
+ Lv4: 72
+ Lv5: 76
+ Lv6: 80
+ Lv7: 84
+ Lv8: 88
+ Lv9: 92
+ Lv10: 96
+ }
+ }
+ Unit: {
+ Id: 0x86
+ Layout: 5
+ Range: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 1
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Interval: 1250
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 86
+ Name: "WZ_WATERBALL"
+ Description: "Water Ball"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ InterruptCast: true
+ CastTime: {
+ Lv1: 640
+ Lv2: 1280
+ Lv3: 1920
+ Lv4: 2560
+ Lv5: 3200
+ Lv6: 3200
+ Lv7: 3200
+ Lv8: 3200
+ Lv9: 3200
+ Lv10: 3200
+ }
+ FixedCastTime: {
+ Lv1: 160
+ Lv2: 320
+ Lv3: 480
+ Lv4: 640
+ Lv5: 800
+ Lv6: 800
+ Lv7: 800
+ Lv8: 800
+ Lv9: 800
+ Lv10: 800
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 20
+ Lv3: 20
+ Lv4: 25
+ Lv5: 25
+ Lv6: 25
+ Lv7: 25
+ Lv8: 25
+ Lv9: 25
+ Lv10: 25
+ }
+ State: "InWater"
+ }
+},
+{
+ Id: 87
+ Name: "WZ_ICEWALL"
+ Description: "Ice Wall"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 10000
+ Lv3: 15000
+ Lv4: 20000
+ Lv5: 25000
+ Lv6: 30000
+ Lv7: 35000
+ Lv8: 40000
+ Lv9: 45000
+ Lv10: 50000
+ }
+ Requirements: {
+ SPCost: 20
+ }
+ Unit: {
+ Id: 0x8d
+ Layout: -1
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 88
+ Name: "WZ_FROSTNOVA"
+ Description: "Frost Nova"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ InterruptCast: true
+ CastTime: {
+ Lv1: 640
+ Lv2: 640
+ Lv3: 576
+ Lv4: 576
+ Lv5: 512
+ Lv6: 512
+ Lv7: 448
+ Lv8: 448
+ Lv9: 384
+ Lv10: 384
+ }
+ AfterCastActDelay: 200
+ SkillData2: {
+ Lv1: 4000
+ Lv2: 5000
+ Lv3: 6000
+ Lv4: 8000
+ Lv5: 10000
+ Lv6: 12000
+ Lv7: 13000
+ Lv8: 15000
+ Lv9: 16000
+ Lv10: 17000
+ }
+ FixedCastTime: {
+ Lv1: 160
+ Lv2: 160
+ Lv3: 144
+ Lv4: 144
+ Lv5: 128
+ Lv6: 128
+ Lv7: 112
+ Lv8: 112
+ Lv9: 96
+ Lv10: 96
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 45
+ Lv2: 43
+ Lv3: 41
+ Lv4: 39
+ Lv5: 37
+ Lv6: 35
+ Lv7: 33
+ Lv8: 31
+ Lv9: 29
+ Lv10: 27
+ }
+ }
+},
+{
+ Id: 89
+ Name: "WZ_STORMGUST"
+ Description: "Storm Gust"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ InterruptCast: true
+ KnockBackTiles: 2
+ CastTime: {
+ Lv1: 3840
+ Lv2: 4480
+ Lv3: 5120
+ Lv4: 5760
+ Lv5: 6400
+ Lv6: 7040
+ Lv7: 7680
+ Lv8: 8320
+ Lv9: 8960
+ Lv10: 9600
+ }
+ AfterCastActDelay: 5000
+ SkillData1: 4600
+ SkillData2: 12000
+ FixedCastTime: {
+ Lv1: 960
+ Lv2: 1120
+ Lv3: 1280
+ Lv4: 1440
+ Lv5: 1600
+ Lv6: 1760
+ Lv7: 1920
+ Lv8: 2080
+ Lv9: 2240
+ Lv10: 2400
+ }
+ Requirements: {
+ SPCost: 78
+ }
+ Unit: {
+ Id: 0x86
+ Layout: 4
+ Range: 1
+ Interval: 450
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 90
+ Name: "WZ_EARTHSPIKE"
+ Description: "Earth Spike"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 448
+ Lv2: 896
+ Lv3: 1344
+ Lv4: 1792
+ Lv5: 2240
+ Lv6: 2240
+ Lv7: 2240
+ Lv8: 2240
+ Lv9: 2240
+ Lv10: 2240
+ }
+ AfterCastActDelay: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ FixedCastTime: {
+ Lv1: 112
+ Lv2: 224
+ Lv3: 336
+ Lv4: 448
+ Lv5: 560
+ Lv6: 560
+ Lv7: 560
+ Lv8: 560
+ Lv9: 560
+ Lv10: 560
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 91
+ Name: "WZ_HEAVENDRIVE"
+ Description: "Heaven's Drive"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 640
+ Lv2: 1280
+ Lv3: 1920
+ Lv4: 2560
+ Lv5: 3200
+ Lv6: 3200
+ Lv7: 3200
+ Lv8: 3200
+ Lv9: 3200
+ Lv10: 3200
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 500
+ FixedCastTime: {
+ Lv1: 160
+ Lv2: 320
+ Lv3: 480
+ Lv4: 640
+ Lv5: 800
+ Lv6: 800
+ Lv7: 800
+ Lv8: 800
+ Lv9: 800
+ Lv10: 800
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 28
+ Lv2: 32
+ Lv3: 36
+ Lv4: 40
+ Lv5: 44
+ Lv6: 48
+ Lv7: 52
+ Lv8: 56
+ Lv9: 60
+ Lv10: 64
+ }
+ }
+ Unit: {
+ Id: 0x86
+ Layout: 2
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 92
+ Name: "WZ_QUAGMIRE"
+ Description: "Quagmire"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 3
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 10000
+ Lv3: 15000
+ Lv4: 20000
+ Lv5: 25000
+ Lv6: 30000
+ Lv7: 35000
+ Lv8: 40000
+ Lv9: 45000
+ Lv10: 50000
+ }
+ SkillData2: {
+ Lv1: 5000
+ Lv2: 10000
+ Lv3: 15000
+ Lv4: 20000
+ Lv5: 25000
+ Lv6: 30000
+ Lv7: 35000
+ Lv8: 40000
+ Lv9: 45000
+ Lv10: 50000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 5
+ Lv2: 10
+ Lv3: 15
+ Lv4: 20
+ Lv5: 25
+ Lv6: 30
+ Lv7: 35
+ Lv8: 40
+ Lv9: 45
+ Lv10: 50
+ }
+ }
+ Unit: {
+ Id: 0x8e
+ Layout: 2
+ Interval: -1
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 93
+ Name: "WZ_ESTIMATION"
+ Description: "Sense"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 94
+ Name: "BS_IRON"
+ Description: "Iron Tempering"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 95
+ Name: "BS_STEEL"
+ Description: "Steel Tempering"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 96
+ Name: "BS_ENCHANTEDSTONE"
+ Description: "Enchanted Stone Craft"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 97
+ Name: "BS_ORIDEOCON"
+ Description: "Oridecon Research"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 98
+ Name: "BS_DAGGER"
+ Description: "Smith Dagger"
+ MaxLevel: 3
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 99
+ Name: "BS_SWORD"
+ Description: "Smith Sword"
+ MaxLevel: 3
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 100
+ Name: "BS_TWOHANDSWORD"
+ Description: "Smith Two-handed Sword"
+ MaxLevel: 3
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 101
+ Name: "BS_AXE"
+ Description: "Smith Axe"
+ MaxLevel: 3
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 102
+ Name: "BS_MACE"
+ Description: "Smith Mace"
+ MaxLevel: 3
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 103
+ Name: "BS_KNUCKLE"
+ Description: "Smith Knucklebrace"
+ MaxLevel: 3
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 104
+ Name: "BS_SPEAR"
+ Description: "Smith Spear"
+ MaxLevel: 3
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 105
+ Name: "BS_HILTBINDING"
+ Description: "Hilt Binding"
+ MaxLevel: 1
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 106
+ Name: "BS_FINDINGORE"
+ Description: "Ore Discovery"
+ MaxLevel: 1
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 107
+ Name: "BS_WEAPONRESEARCH"
+ Description: "Weaponry Research"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 108
+ Name: "BS_REPAIRWEAPON"
+ Description: "Weapon Repair"
+ MaxLevel: 1
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2500
+ FixedCastTime: 2500
+ Requirements: {
+ SPCost: 30
+ }
+},
+{
+ Id: 109
+ Name: "BS_SKINTEMPER"
+ Description: "Skin Tempering"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 110
+ Name: "BS_HAMMERFALL"
+ Description: "Hammer Fall"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 2
+ Lv3: 2
+ Lv4: 2
+ Lv5: 2
+ Lv6: 14
+ Lv7: 14
+ Lv8: 14
+ Lv9: 14
+ Lv10: 14
+ }
+ SkillData2: 5000
+ Requirements: {
+ SPCost: 10
+ WeaponTypes: {
+ Daggers: true
+ 1HSwords: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ }
+ }
+},
+{
+ Id: 111
+ Name: "BS_ADRENALINE"
+ Description: "Adrenaline Rush"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 60000
+ Lv3: 90000
+ Lv4: 120000
+ Lv5: 150000
+ Lv6: 180000
+ Lv7: 210000
+ Lv8: 240000
+ Lv9: 270000
+ Lv10: 300000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 23
+ Lv3: 26
+ Lv4: 29
+ Lv5: 32
+ Lv6: 35
+ Lv7: 38
+ Lv8: 41
+ Lv9: 44
+ Lv10: 47
+ }
+ WeaponTypes: {
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ }
+ }
+},
+{
+ Id: 112
+ Name: "BS_WEAPONPERFECT"
+ Description: "Weapon Perfection"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 20000
+ Lv3: 30000
+ Lv4: 40000
+ Lv5: 50000
+ Lv6: 60000
+ Lv7: 70000
+ Lv8: 80000
+ Lv9: 90000
+ Lv10: 100000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 16
+ Lv3: 14
+ Lv4: 12
+ Lv5: 10
+ Lv6: 8
+ Lv7: 6
+ Lv8: 4
+ Lv9: 2
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 113
+ Name: "BS_OVERTHRUST"
+ Description: "Power-Thrust"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 40000
+ Lv3: 60000
+ Lv4: 80000
+ Lv5: 100000
+ Lv6: 120000
+ Lv7: 140000
+ Lv8: 160000
+ Lv9: 180000
+ Lv10: 200000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 16
+ Lv3: 14
+ Lv4: 12
+ Lv5: 10
+ Lv6: 8
+ Lv7: 6
+ Lv8: 4
+ Lv9: 2
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 114
+ Name: "BS_MAXIMIZE"
+ Description: "Maximize Power"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 5000
+ Lv6: 6000
+ Lv7: 7000
+ Lv8: 8000
+ Lv9: 9000
+ Lv10: 10000
+ }
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 115
+ Name: "HT_SKIDTRAP"
+ Description: "Skid Trap"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ KnockBackTiles: {
+ Lv1: 6
+ Lv2: 7
+ Lv3: 8
+ Lv4: 9
+ Lv5: 10
+ Lv6: 11
+ Lv7: 12
+ Lv8: 13
+ Lv9: 14
+ Lv10: 15
+ }
+ SkillData1: {
+ Lv1: 300000
+ Lv2: 240000
+ Lv3: 180000
+ Lv4: 120000
+ Lv5: 60000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Booby_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0x90
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 116
+ Name: "HT_LANDMINE"
+ Description: "Land Mine"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ AllowReproduce: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Earth"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 1
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 200000
+ Lv2: 160000
+ Lv3: 120000
+ Lv4: 80000
+ Lv5: 40000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData2: 5000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Booby_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0x93
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 117
+ Name: "HT_ANKLESNARE"
+ Description: "Ankle Snare"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 250000
+ Lv2: 200000
+ Lv3: 150000
+ Lv4: 100000
+ Lv5: 50000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData2: {
+ Lv1: 4000
+ Lv2: 8000
+ Lv3: 12000
+ Lv4: 16000
+ Lv5: 20000
+ Lv6: 24000
+ Lv7: 28000
+ Lv8: 32000
+ Lv9: 36000
+ Lv10: 40000
+ }
+ Requirements: {
+ SPCost: 12
+// Items: {
+// Booby_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0x91
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 118
+ Name: "HT_SHOCKWAVE"
+ Description: "Shockwave Trap"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ SkillData1: {
+ Lv1: 200000
+ Lv2: 160000
+ Lv3: 120000
+ Lv4: 80000
+ Lv5: 40000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: 45
+// Items: {
+// Booby_Trap: 2
+// }
+ }
+ Unit: {
+ Id: 0x94
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 119
+ Name: "HT_SANDMAN"
+ Description: "Sandman"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 2
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 120000
+ Lv3: 90000
+ Lv4: 60000
+ Lv5: 30000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData2: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ Requirements: {
+ SPCost: 12
+// Items: {
+// Booby_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0x95
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 120
+ Name: "HT_FLASHER"
+ Description: "Flasher"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 1
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 120000
+ Lv3: 90000
+ Lv4: 60000
+ Lv5: 30000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData2: {
+ Lv1: 10000
+ Lv2: 11000
+ Lv3: 12000
+ Lv4: 13000
+ Lv5: 14000
+ Lv6: 15000
+ Lv7: 16000
+ Lv8: 17000
+ Lv9: 18000
+ Lv10: 19000
+ }
+ Requirements: {
+ SPCost: 12
+// Items: {
+// Booby_Trap: 2
+// }
+ }
+ Unit: {
+ Id: 0x96
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 121
+ Name: "HT_FREEZINGTRAP"
+ Description: "Freezing Trap"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Water"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 1
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 120000
+ Lv3: 90000
+ Lv4: 60000
+ Lv5: 30000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData2: {
+ Lv1: 3000
+ Lv2: 6000
+ Lv3: 9000
+ Lv4: 12000
+ Lv5: 15000
+ Lv6: 18000
+ Lv7: 21000
+ Lv8: 24000
+ Lv9: 27000
+ Lv10: 30000
+ }
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Booby_Trap: 2
+// }
+ }
+ Unit: {
+ Id: 0x97
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 122
+ Name: "HT_BLASTMINE"
+ Description: "Blast Mine"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ AllowReproduce: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Wind"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 1
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 25000
+ Lv2: 20000
+ Lv3: 15000
+ Lv4: 10000
+ Lv5: 5000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Booby_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0x8f
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 123
+ Name: "HT_CLAYMORETRAP"
+ Description: "Claymore Trap"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ AllowReproduce: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 2
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 40000
+ Lv3: 60000
+ Lv4: 80000
+ Lv5: 100000
+ Lv6: 120000
+ Lv7: 140000
+ Lv8: 160000
+ Lv9: 180000
+ Lv10: 200000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 15
+// Items: {
+// Booby_Trap: 2
+// }
+ }
+ Unit: {
+ Id: 0x98
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 124
+ Name: "HT_REMOVETRAP"
+ Description: "Remove Trap"
+ MaxLevel: 1
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 125
+ Name: "HT_TALKIEBOX"
+ Description: "Talkie Box"
+ MaxLevel: 1
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 600000
+ Requirements: {
+ SPCost: 1
+// Items: {
+// Booby_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0x99
+ Range: 1
+ Interval: 1000
+ Target: "All"
+ }
+},
+{
+ Id: 126
+ Name: "HT_BEASTBANE"
+ Description: "Beast Bane"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 127
+ Name: "HT_FALCON"
+ Description: "Falconry Mastery"
+ MaxLevel: 1
+ AttackType: "Misc"
+ NumberOfHits: 0
+},
+{
+ Id: 128
+ Name: "HT_STEELCROW"
+ Description: "Steel Crow"
+ MaxLevel: 10
+ AttackType: "Misc"
+ NumberOfHits: 0
+},
+{
+ Id: 129
+ Name: "HT_BLITZBEAT"
+ Description: "Blitz Beat"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 1
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: 800
+ AfterCastActDelay: 1000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 13
+ Lv3: 16
+ Lv4: 19
+ Lv5: 22
+ Lv6: 25
+ Lv7: 28
+ Lv8: 31
+ Lv9: 34
+ Lv10: 37
+ }
+ State: "Falcon"
+ }
+},
+{
+ Id: 130
+ Name: "HT_DETECTING"
+ Description: "Detect"
+ MaxLevel: 4
+ Range: {
+ Lv1: 3
+ Lv2: 5
+ Lv3: 7
+ Lv4: 9
+ Lv5: 11
+ Lv6: 13
+ Lv7: 15
+ Lv8: 17
+ Lv9: 19
+ Lv10: 21
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 3
+ Requirements: {
+ SPCost: 8
+ State: "Falcon"
+ }
+},
+{
+ Id: 131
+ Name: "HT_SPRINGTRAP"
+ Description: "Spring Trap"
+ MaxLevel: 5
+ Range: {
+ Lv1: 4
+ Lv2: 5
+ Lv3: 6
+ Lv4: 7
+ Lv5: 8
+ Lv6: 9
+ Lv7: 10
+ Lv8: 11
+ Lv9: 12
+ Lv10: 13
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 10
+ State: "Falcon"
+ }
+},
+{
+ Id: 132
+ Name: "AS_RIGHT"
+ Description: "Righthand Mastery"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 133
+ Name: "AS_LEFT"
+ Description: "Lefthand Mastery"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 134
+ Name: "AS_KATAR"
+ Description: "Katar Mastery"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 135
+ Name: "AS_CLOAKING"
+ Description: "Cloaking"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 500
+ Lv2: 1000
+ Lv3: 2000
+ Lv4: 3000
+ Lv5: 4000
+ Lv6: 5000
+ Lv7: 6000
+ Lv8: 7000
+ Lv9: 8000
+ Lv10: 9000
+ }
+ Requirements: {
+ SPCost: 15
+ }
+},
+{
+ Id: 136
+ Name: "AS_SONICBLOW"
+ Description: "Sonic Blow"
+ MaxLevel: 10
+ Range: 1
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -8
+ AfterCastWalkDelay: 2000
+ SkillData2: 5000
+ SkillDelayOptions: {
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 16
+ Lv2: 18
+ Lv3: 20
+ Lv4: 22
+ Lv5: 24
+ Lv6: 26
+ Lv7: 28
+ Lv8: 30
+ Lv9: 32
+ Lv10: 34
+ }
+ WeaponTypes: {
+ Katars: true
+ }
+ }
+},
+{
+ Id: 137
+ Name: "AS_GRIMTOOTH"
+ Description: "Grimtooth"
+ MaxLevel: 5
+ Range: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ Requirements: {
+ SPCost: 3
+ WeaponTypes: {
+ Katars: true
+ }
+ State: "Hiding"
+ }
+},
+{
+ Id: 138
+ Name: "AS_ENCHANTPOISON"
+ Description: "Enchant Poison"
+ MaxLevel: 10
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ PartyOnly: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Poison"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ SkillData2: {
+ Lv1: 10000
+ Lv2: 20000
+ Lv3: 30000
+ Lv4: 40000
+ Lv5: 50000
+ Lv6: 60000
+ Lv7: 70000
+ Lv8: 80000
+ Lv9: 90000
+ Lv10: 100000
+ }
+ Requirements: {
+ SPCost: 20
+ }
+},
+{
+ Id: 139
+ Name: "AS_POISONREACT"
+ Description: "Poison React"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 25000
+ Lv3: 30000
+ Lv4: 35000
+ Lv5: 40000
+ Lv6: 45000
+ Lv7: 50000
+ Lv8: 55000
+ Lv9: 60000
+ Lv10: 65000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 25
+ Lv2: 30
+ Lv3: 35
+ Lv4: 40
+ Lv5: 45
+ Lv6: 50
+ Lv7: 55
+ Lv8: 60
+ Lv9: 45
+ Lv10: 45
+ }
+ }
+},
+{
+ Id: 140
+ Name: "AS_VENOMDUST"
+ Description: "Venom Dust"
+ MaxLevel: 10
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Poison"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 10000
+ Lv3: 15000
+ Lv4: 20000
+ Lv5: 25000
+ Lv6: 30000
+ Lv7: 35000
+ Lv8: 40000
+ Lv9: 45000
+ Lv10: 50000
+ }
+ SkillData2: {
+ Lv1: 15000
+ Lv2: 20000
+ Lv3: 25000
+ Lv4: 30000
+ Lv5: 35000
+ Lv6: 40000
+ Lv7: 45000
+ Lv8: 50000
+ Lv9: 55000
+ Lv10: 60000
+ }
+ Requirements: {
+ SPCost: 20
+// Items: {
+// Red_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0x92
+ Layout: -1
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ }
+},
+{
+ Id: 141
+ Name: "AS_SPLASHER"
+ Description: "Venom Splasher"
+ MaxLevel: 10
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ NoDamage: true
+ IgnoreElement: true
+ IgnoreFlee: true
+ }
+ SplashRange: 2
+ InterruptCast: true
+ CastTime: 500
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 5500
+ Lv3: 6000
+ Lv4: 6500
+ Lv5: 7000
+ Lv6: 7500
+ Lv7: 8000
+ Lv8: 8500
+ Lv9: 9000
+ Lv10: 9500
+ }
+ SkillData2: {
+ Lv1: 15000
+ Lv2: 20000
+ Lv3: 25000
+ Lv4: 30000
+ Lv5: 35000
+ Lv6: 40000
+ Lv7: 45000
+ Lv8: 50000
+ Lv9: 55000
+ Lv10: 60000
+ }
+ CoolDown: {
+ Lv1: 7500
+ Lv2: 8000
+ Lv3: 8500
+ Lv4: 9000
+ Lv5: 9500
+ Lv6: 10000
+ Lv7: 10500
+ Lv8: 11000
+ Lv9: 11500
+ Lv10: 12000
+ }
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+// Items: {
+// Red_Gemstone: 1
+// }
+ }
+},
+{
+ Id: 142
+ Name: "NV_FIRSTAID"
+ Description: "First Aid"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 3
+ }
+},
+{
+ Id: 143
+ Name: "NV_TRICKDEAD"
+ Description: "Play Dead"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 600000
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 144
+ Name: "SM_MOVINGRECOVERY"
+ Description: "Moving HP-Recovery"
+ MaxLevel: 1
+ SkillInfo: {
+ Quest: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 145
+ Name: "SM_FATALBLOW"
+ Description: "Fatal Blow"
+ MaxLevel: 1
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ NumberOfHits: 0
+ SkillData2: 5000
+},
+{
+ Id: 146
+ Name: "SM_AUTOBERSERK"
+ Description: "Auto Berserk"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 147
+ Name: "AC_MAKINGARROW"
+ Description: "Arrow Crafting"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 10
+ State: "NotOverWeight"
+ }
+},
+{
+ Id: 148
+ Name: "AC_CHARGEARROW"
+ Description: "Arrow Repel"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ KnockBackTiles: 6
+ FixedCastTime: 1500
+ Requirements: {
+ SPCost: 15
+ WeaponTypes: {
+ Bows: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 149
+ Name: "TF_SPRINKLESAND"
+ Description: "Sand Attack"
+ MaxLevel: 1
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Earth"
+ SkillData2: 10000
+ Requirements: {
+ SPCost: 9
+ }
+},
+{
+ Id: 150
+ Name: "TF_BACKSLIDING"
+ Description: "Back Slide"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ KnockBackTiles: 5
+ Requirements: {
+ SPCost: 7
+ }
+},
+{
+ Id: 151
+ Name: "TF_PICKSTONE"
+ Description: "Find Stone"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: 3
+ State: "NotOverWeight"
+ }
+},
+{
+ Id: 152
+ Name: "TF_THROWSTONE"
+ Description: "Stone Fling"
+ MaxLevel: 1
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ AllowReproduce: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ AfterCastActDelay: 100
+ SkillData1: 5000
+ SkillData2: 8000
+ Requirements: {
+ SPCost: 2
+// Items: {
+// Stone: 1
+// }
+ }
+},
+{
+ Id: 153
+ Name: "MC_CARTREVOLUTION"
+ Description: "Cart Revolution"
+ MaxLevel: 1
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ KnockBackTiles: 2
+ Requirements: {
+ SPCost: 12
+ State: "Cart"
+ }
+},
+{
+ Id: 154
+ Name: "MC_CHANGECART"
+ Description: "Change Cart"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 40
+ State: "Cart"
+ }
+},
+{
+ Id: 155
+ Name: "MC_LOUD"
+ Description: "Crazy Uproar"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 300000
+ Requirements: {
+ SPCost: 8
+ }
+},
+{
+ Id: 156
+ Name: "AL_HOLYLIGHT"
+ Description: "Holy Light"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ InterruptCast: true
+ CastTime: 1600
+ FixedCastTime: 400
+ Requirements: {
+ SPCost: 15
+ }
+},
+{
+ Id: 157
+ Name: "MG_ENERGYCOAT"
+ Description: "Energy Coat"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 300000
+ FixedCastTime: 5000
+ Requirements: {
+ SPCost: 30
+ }
+},
+{
+ Id: 158
+ Name: "NPC_PIERCINGATT"
+ Description: "Piercing Attack"
+ MaxLevel: 10
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+},
+{
+ Id: 159
+ Name: "NPC_MENTALBREAKER"
+ Description: "Spirit Destruction"
+ MaxLevel: 5
+ Range: -1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+},
+{
+ Id: 160
+ Name: "NPC_RANGEATTACK"
+ Description: "Stand off attack"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+},
+{
+ Id: 161
+ Name: "NPC_ATTRICHANGE"
+ Description: "Attribute Change"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 1800000
+},
+{
+ Id: 162
+ Name: "NPC_CHANGEWATER"
+ Description: "Water Attribute Change"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 1800000
+},
+{
+ Id: 163
+ Name: "NPC_CHANGEGROUND"
+ Description: "Earth Attribute Change"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 1800000
+},
+{
+ Id: 164
+ Name: "NPC_CHANGEFIRE"
+ Description: "Fire Attribute Change"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 1800000
+},
+{
+ Id: 165
+ Name: "NPC_CHANGEWIND"
+ Description: "Wind Attribute Change"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 1800000
+},
+{
+ Id: 166
+ Name: "NPC_CHANGEPOISON"
+ Description: "Poison Attribute Change"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Poison"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 1800000
+},
+{
+ Id: 167
+ Name: "NPC_CHANGEHOLY"
+ Description: "Holy Attribute Change"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 1800000
+},
+{
+ Id: 168
+ Name: "NPC_CHANGEDARKNESS"
+ Description: "Shadow Attribute Change"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Dark"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 1800000
+},
+{
+ Id: 169
+ Name: "NPC_CHANGETELEKINESIS"
+ Description: "Ghost Attribute Change"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Ghost"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 1800000
+},
+{
+ Id: 170
+ Name: "NPC_CRITICALSLASH"
+ Description: "Defense disregard attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreDefense: true
+ }
+},
+{
+ Id: 171
+ Name: "NPC_COMBOATTACK"
+ Description: "Multi-stage Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: {
+ Lv1: -2
+ Lv2: -3
+ Lv3: -4
+ Lv4: -5
+ Lv5: -6
+ Lv6: -7
+ Lv7: -8
+ Lv8: -9
+ Lv9: -10
+ Lv10: -11
+ }
+},
+{
+ Id: 172
+ Name: "NPC_GUIDEDATTACK"
+ Description: "Guided Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+},
+{
+ Id: 173
+ Name: "NPC_SELFDESTRUCTION"
+ Description: "Suicide bombing"
+ MaxLevel: 10
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ IgnoreDefense: true
+ IgnoreFlee: true
+ IgnoreDefCards: true
+ }
+ SplashRange: 5
+ KnockBackTiles: 3
+ SkillData1: 3500
+},
+{
+ Id: 174
+ Name: "NPC_SPLASHATTACK"
+ Description: "Splash attack"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+},
+{
+ Id: 175
+ Name: "NPC_SUICIDE"
+ Description: "Suicide"
+ MaxLevel: 10
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ IgnoreFlee: true
+ }
+},
+{
+ Id: 176
+ Name: "NPC_POISON"
+ Description: "Poison Attack"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData2: 60000
+},
+{
+ Id: 177
+ Name: "NPC_BLINDATTACK"
+ Description: "Blind Attack"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData2: 30000
+},
+{
+ Id: 178
+ Name: "NPC_SILENCEATTACK"
+ Description: "Silence Attack"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData2: 30000
+},
+{
+ Id: 179
+ Name: "NPC_STUNATTACK"
+ Description: "Stun Attack"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData2: 5000
+},
+{
+ Id: 180
+ Name: "NPC_PETRIFYATTACK"
+ Description: "Petrify Attack"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData2: 20000
+},
+{
+ Id: 181
+ Name: "NPC_CURSEATTACK"
+ Description: "Curse Attack"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Dark"
+ SkillData2: 30000
+},
+{
+ Id: 182
+ Name: "NPC_SLEEPATTACK"
+ Description: "Sleep attack"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData2: 30000
+},
+{
+ Id: 183
+ Name: "NPC_RANDOMATTACK"
+ Description: "Random Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+},
+{
+ Id: 184
+ Name: "NPC_WATERATTACK"
+ Description: "Water Attribute Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Water"
+},
+{
+ Id: 185
+ Name: "NPC_GROUNDATTACK"
+ Description: "Earth Attribute Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Earth"
+},
+{
+ Id: 186
+ Name: "NPC_FIREATTACK"
+ Description: "Fire Attribute Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+},
+{
+ Id: 187
+ Name: "NPC_WINDATTACK"
+ Description: "Wind Attribute Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Wind"
+},
+{
+ Id: 188
+ Name: "NPC_POISONATTACK"
+ Description: "Poison Attribute Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Poison"
+},
+{
+ Id: 189
+ Name: "NPC_HOLYATTACK"
+ Description: "Holy Attribute Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Holy"
+},
+{
+ Id: 190
+ Name: "NPC_DARKNESSATTACK"
+ Description: "Shadow Attribute Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Dark"
+},
+{
+ Id: 191
+ Name: "NPC_TELEKINESISATTACK"
+ Description: "Ghost Attribute Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Ghost"
+},
+{
+ Id: 192
+ Name: "NPC_MAGICALATTACK"
+ Description: "Demon Shock Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData1: 15000
+},
+{
+ Id: 193
+ Name: "NPC_METAMORPHOSIS"
+ Description: "Metamorphosis"
+ MaxLevel: 10
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 194
+ Name: "NPC_PROVOCATION"
+ Description: "Provocation"
+ MaxLevel: 10
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 195
+ Name: "NPC_SMOKING"
+ Description: "Smoking"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ IgnoreElement: true
+ IgnoreFlee: true
+ }
+},
+{
+ Id: 196
+ Name: "NPC_SUMMONSLAVE"
+ Description: "Follower Summons"
+ MaxLevel: 10
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 197
+ Name: "NPC_EMOTION"
+ Description: "Emotion"
+ MaxLevel: 10
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 198
+ Name: "NPC_TRANSFORMATION"
+ Description: "Transformation"
+ MaxLevel: 10
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 199
+ Name: "NPC_BLOODDRAIN"
+ Description: "Sucking Blood"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Dark"
+ DamageType: {
+ IgnoreFlee: true
+ }
+},
+{
+ Id: 200
+ Name: "NPC_ENERGYDRAIN"
+ Description: "Energy Drain"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Dark"
+},
+{
+ Id: 201
+ Name: "NPC_KEEPING"
+ Description: "Keeping"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 70000
+ Lv3: 80000
+ Lv4: 90000
+ Lv5: 100000
+ Lv6: 110000
+ Lv7: 120000
+ Lv8: 130000
+ Lv9: 140000
+ Lv10: 150000
+ }
+},
+{
+ Id: 202
+ Name: "NPC_DARKBREATH"
+ Description: "Dark Breath"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Dark"
+},
+{
+ Id: 203
+ Name: "NPC_DARKBLESSING"
+ Description: "Dark Blessing"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Dark"
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 204
+ Name: "NPC_BARRIER"
+ Description: "Barrier"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 70000
+ Lv3: 80000
+ Lv4: 90000
+ Lv5: 100000
+ Lv6: 110000
+ Lv7: 120000
+ Lv8: 130000
+ Lv9: 140000
+ Lv10: 150000
+ }
+},
+{
+ Id: 205
+ Name: "NPC_DEFENDER"
+ Description: "Defender"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 70000
+ Lv3: 80000
+ Lv4: 90000
+ Lv5: 100000
+ Lv6: 110000
+ Lv7: 120000
+ Lv8: 130000
+ Lv9: 140000
+ Lv10: 150000
+ }
+},
+{
+ Id: 206
+ Name: "NPC_LICK"
+ Description: "Lick"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData2: 5000
+},
+{
+ Id: 207
+ Name: "NPC_HALLUCINATION"
+ Description: "Hallucination"
+ MaxLevel: 10
+ Range: 9
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 40000
+ Lv3: 50000
+ Lv4: 60000
+ Lv5: 70000
+ Lv6: 80000
+ Lv7: 90000
+ Lv8: 100000
+ Lv9: 110000
+ Lv10: 120000
+ }
+},
+{
+ Id: 208
+ Name: "NPC_REBIRTH"
+ Description: "Rebirth"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 209
+ Name: "NPC_SUMMONMONSTER"
+ Description: "Monster Summons"
+ MaxLevel: 10
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 210
+ Name: "RG_SNATCHER"
+ Description: "Gank"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 211
+ Name: "RG_STEALCOIN"
+ Description: "Mug"
+ MaxLevel: 10
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 15
+ }
+},
+{
+ Id: 212
+ Name: "RG_BACKSTAP"
+ Description: "Back Stab"
+ MaxLevel: 10
+ Range: -1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ AfterCastActDelay: 500
+ SkillData1: 5000
+ Requirements: {
+ SPCost: 16
+ }
+},
+{
+ Id: 213
+ Name: "RG_TUNNELDRIVE"
+ Description: "Stalk"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 214
+ Name: "RG_RAID"
+ Description: "Sightless Mind"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+ SkillData1: 5000
+ SkillData2: 20000
+ Requirements: {
+ SPCost: 20
+ State: "Hiding"
+ }
+},
+{
+ Id: 215
+ Name: "RG_STRIPWEAPON"
+ Description: "Divest Weapon"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 560
+ Lv2: 720
+ Lv3: 880
+ Lv4: 1140
+ Lv5: 1200
+ Lv6: 1200
+ Lv7: 1200
+ Lv8: 1200
+ Lv9: 1200
+ Lv10: 1200
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 75000
+ Lv2: 90000
+ Lv3: 105000
+ Lv4: 120000
+ Lv5: 135000
+ Lv6: 150000
+ Lv7: 165000
+ Lv8: 180000
+ Lv9: 195000
+ Lv10: 210000
+ }
+ FixedCastTime: {
+ Lv1: 140
+ Lv2: 180
+ Lv3: 220
+ Lv4: 260
+ Lv5: 300
+ Lv6: 300
+ Lv7: 300
+ Lv8: 300
+ Lv9: 300
+ Lv10: 300
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 17
+ Lv2: 19
+ Lv3: 21
+ Lv4: 23
+ Lv5: 25
+ Lv6: 27
+ Lv7: 29
+ Lv8: 31
+ Lv9: 33
+ Lv10: 35
+ }
+ }
+},
+{
+ Id: 216
+ Name: "RG_STRIPSHIELD"
+ Description: "Divest Shield"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 560
+ Lv2: 720
+ Lv3: 880
+ Lv4: 1140
+ Lv5: 1200
+ Lv6: 1200
+ Lv7: 1200
+ Lv8: 1200
+ Lv9: 1200
+ Lv10: 1200
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 75000
+ Lv2: 90000
+ Lv3: 105000
+ Lv4: 120000
+ Lv5: 135000
+ Lv6: 150000
+ Lv7: 165000
+ Lv8: 180000
+ Lv9: 195000
+ Lv10: 210000
+ }
+ FixedCastTime: {
+ Lv1: 140
+ Lv2: 180
+ Lv3: 220
+ Lv4: 260
+ Lv5: 300
+ Lv6: 300
+ Lv7: 300
+ Lv8: 300
+ Lv9: 300
+ Lv10: 300
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 217
+ Name: "RG_STRIPARMOR"
+ Description: "Divest Armor"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 560
+ Lv2: 720
+ Lv3: 880
+ Lv4: 1140
+ Lv5: 1200
+ Lv6: 1200
+ Lv7: 1200
+ Lv8: 1200
+ Lv9: 1200
+ Lv10: 1200
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 75000
+ Lv2: 90000
+ Lv3: 105000
+ Lv4: 120000
+ Lv5: 135000
+ Lv6: 150000
+ Lv7: 165000
+ Lv8: 180000
+ Lv9: 195000
+ Lv10: 210000
+ }
+ FixedCastTime: {
+ Lv1: 140
+ Lv2: 180
+ Lv3: 220
+ Lv4: 260
+ Lv5: 300
+ Lv6: 300
+ Lv7: 300
+ Lv8: 300
+ Lv9: 300
+ Lv10: 300
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 17
+ Lv2: 19
+ Lv3: 21
+ Lv4: 23
+ Lv5: 25
+ Lv6: 27
+ Lv7: 29
+ Lv8: 31
+ Lv9: 33
+ Lv10: 35
+ }
+ }
+},
+{
+ Id: 218
+ Name: "RG_STRIPHELM"
+ Description: "Divest Helm"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 560
+ Lv2: 720
+ Lv3: 880
+ Lv4: 1140
+ Lv5: 1200
+ Lv6: 1200
+ Lv7: 1200
+ Lv8: 1200
+ Lv9: 1200
+ Lv10: 1200
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 75000
+ Lv2: 90000
+ Lv3: 105000
+ Lv4: 120000
+ Lv5: 135000
+ Lv6: 150000
+ Lv7: 165000
+ Lv8: 180000
+ Lv9: 195000
+ Lv10: 210000
+ }
+ FixedCastTime: {
+ Lv1: 140
+ Lv2: 180
+ Lv3: 220
+ Lv4: 260
+ Lv5: 300
+ Lv6: 300
+ Lv7: 300
+ Lv8: 300
+ Lv9: 300
+ Lv10: 300
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 219
+ Name: "RG_INTIMIDATE"
+ Description: "Snatch"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 13
+ Lv2: 16
+ Lv3: 19
+ Lv4: 22
+ Lv5: 25
+ Lv6: 28
+ Lv7: 31
+ Lv8: 34
+ Lv9: 37
+ Lv10: 40
+ }
+ }
+},
+{
+ Id: 220
+ Name: "RG_GRAFFITI"
+ Description: "Scribble"
+ MaxLevel: 1
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 180000
+ Requirements: {
+ SPCost: 15
+// Items: {
+// Red_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0xb0
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_NOREITERATION: true
+ }
+ }
+},
+{
+ Id: 221
+ Name: "RG_FLAGGRAFFITI"
+ Description: "Piece"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 222
+ Name: "RG_CLEANER"
+ Description: "Remover"
+ MaxLevel: 1
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 5
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 223
+ Name: "RG_GANGSTER"
+ Description: "Slyness"
+ MaxLevel: 1
+ SplashRange: 1
+ NumberOfHits: 0
+},
+{
+ Id: 224
+ Name: "RG_COMPULSION"
+ Description: "Haggle"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 225
+ Name: "RG_PLAGIARISM"
+ Description: "Intimidate"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 226
+ Name: "AM_AXEMASTERY"
+ Description: "Axe Mastery"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 227
+ Name: "AM_LEARNINGPOTION"
+ Description: "Potion Research"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 228
+ Name: "AM_PHARMACY"
+ Description: "Prepare Potion"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 5
+// Items: {
+// Medicine_Bowl: 1
+// }
+ }
+},
+{
+ Id: 229
+ Name: "AM_DEMONSTRATION"
+ Description: "Bomb"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ IgnoreCards: true
+ }
+ InterruptCast: true
+ CastTime: 800
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 40000
+ Lv2: 45000
+ Lv3: 50000
+ Lv4: 55000
+ Lv5: 60000
+ Lv6: 65000
+ Lv7: 70000
+ Lv8: 75000
+ Lv9: 80000
+ Lv10: 85000
+ }
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Fire_Bottle: 1
+// }
+ }
+ Unit: {
+ Id: 0xb1
+ Range: 1
+ Interval: 500
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 230
+ Name: "AM_ACIDTERROR"
+ Description: "Acid Terror"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ IgnoreCards: true
+ IgnoreFlee: true
+ }
+ InterruptCast: true
+ CastTime: 500
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 3
+ Lv2: 7
+ Lv3: 10
+ Lv4: 12
+ Lv5: 13
+ Lv6: 13
+ Lv7: 13
+ Lv8: 13
+ Lv9: 13
+ Lv10: 13
+ }
+ SkillData2: 120000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: 15
+// Items: {
+// Acid_Bottle: 1
+// }
+ }
+},
+{
+ Id: 231
+ Name: "AM_POTIONPITCHER"
+ Description: "Aid Potion"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ PartyOnly: true
+ GuildOnly: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 500
+ Requirements: {
+ SPCost: 1
+// Items: {
+// Red_Potion: 1
+// Orange_Potion: 1
+// Yellow_Potion: 1
+// White_Potion: 1
+// Blue_Potion: 1
+// Fruit_Of_Mastela: 1
+// Royal_Jelly: 1
+// Seed_Of_Yggdrasil: 1
+// Yggdrasilberry: 1
+// Berserk_Potion: 1
+// }
+ }
+},
+{
+ Id: 232
+ Name: "AM_CANNIBALIZE"
+ Description: "Summon Flora"
+ MaxLevel: 5
+ Range: 4
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillInstances: 5
+ CastTime: 1600
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 300000
+ Lv2: 240000
+ Lv3: 180000
+ Lv4: 120000
+ Lv5: 60000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ FixedCastTime: 400
+ Requirements: {
+ SPCost: 20
+// Items: {
+// MenEater_Plant_Bottle: 1
+// }
+ }
+},
+{
+ Id: 233
+ Name: "AM_SPHEREMINE"
+ Description: "Summon Marine Sphere"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillInstances: 3
+ CastTime: 1600
+ AfterCastActDelay: 500
+ SkillData1: 30000
+ FixedCastTime: 400
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Mini_Bottle: 1
+// }
+ }
+},
+{
+ Id: 234
+ Name: "AM_CP_WEAPON"
+ Description: "Alchemical Weapon"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 240000
+ Lv3: 360000
+ Lv4: 480000
+ Lv5: 600000
+ Lv6: 720000
+ Lv7: 840000
+ Lv8: 960000
+ Lv9: 1080000
+ Lv10: 1200000
+ }
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 30
+// Items: {
+// Coating_Bottle: 1
+// }
+ }
+},
+{
+ Id: 235
+ Name: "AM_CP_SHIELD"
+ Description: "Synthesized Shield"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 240000
+ Lv3: 360000
+ Lv4: 480000
+ Lv5: 600000
+ Lv6: 720000
+ Lv7: 840000
+ Lv8: 960000
+ Lv9: 1080000
+ Lv10: 1200000
+ }
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 25
+// Items: {
+// Coating_Bottle: 1
+// }
+ }
+},
+{
+ Id: 236
+ Name: "AM_CP_ARMOR"
+ Description: "Synthetic Armor"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 240000
+ Lv3: 360000
+ Lv4: 480000
+ Lv5: 600000
+ Lv6: 720000
+ Lv7: 840000
+ Lv8: 960000
+ Lv9: 1080000
+ Lv10: 1200000
+ }
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 25
+// Items: {
+// Coating_Bottle: 1
+// }
+ }
+},
+{
+ Id: 237
+ Name: "AM_CP_HELM"
+ Description: "Biochemical Helm"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 240000
+ Lv3: 360000
+ Lv4: 480000
+ Lv5: 600000
+ Lv6: 720000
+ Lv7: 840000
+ Lv8: 960000
+ Lv9: 1080000
+ Lv10: 1200000
+ }
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 25
+// Items: {
+// Coating_Bottle: 1
+// }
+ }
+},
+{
+ Id: 238
+ Name: "AM_BIOETHICS"
+ Description: "Bioethics"
+ MaxLevel: 1
+ SkillInfo: {
+ Quest: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 243
+ Name: "AM_CALLHOMUN"
+ Description: "Call Homunculus"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 1
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Germination_Breed: 1
+// }
+ }
+},
+{
+ Id: 244
+ Name: "AM_REST"
+ Description: "Vaporize"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 50
+ }
+},
+{
+ Id: 247
+ Name: "AM_RESURRECTHOMUN"
+ Description: "Homunculus Resurrection"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 1
+ NumberOfHits: 0
+ CastTime: 2000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 74
+ Lv2: 68
+ Lv3: 62
+ Lv4: 56
+ Lv5: 50
+ Lv6: 44
+ Lv7: 38
+ Lv8: 32
+ Lv9: 26
+ Lv10: 20
+ }
+ }
+},
+{
+ Id: 248
+ Name: "CR_TRUST"
+ Description: "Faith"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 249
+ Name: "CR_AUTOGUARD"
+ Description: "Guard"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 300000
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ State: "Shield"
+ }
+},
+{
+ Id: 250
+ Name: "CR_SHIELDCHARGE"
+ Description: "Smite"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ KnockBackTiles: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ SkillData2: 5000
+ Requirements: {
+ SPCost: 10
+ State: "Shield"
+ }
+},
+{
+ Id: 251
+ Name: "CR_SHIELDBOOMERANG"
+ Description: "Shield Boomerang"
+ MaxLevel: 5
+ Range: {
+ Lv1: 3
+ Lv2: 5
+ Lv3: 7
+ Lv4: 9
+ Lv5: 11
+ Lv6: 13
+ Lv7: 15
+ Lv8: 17
+ Lv9: 19
+ Lv10: 21
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ AfterCastActDelay: 700
+ Requirements: {
+ SPCost: 12
+ State: "Shield"
+ }
+},
+{
+ Id: 252
+ Name: "CR_REFLECTSHIELD"
+ Description: "Shield Reflect"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ SkillData1: 300000
+ Requirements: {
+ SPCost: {
+ Lv1: 35
+ Lv2: 40
+ Lv3: 45
+ Lv4: 50
+ Lv5: 55
+ Lv6: 60
+ Lv7: 65
+ Lv8: 70
+ Lv9: 75
+ Lv10: 80
+ }
+ State: "Shield"
+ }
+},
+{
+ Id: 253
+ Name: "CR_HOLYCROSS"
+ Description: "Holy Cross"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Holy"
+ NumberOfHits: -2
+ SkillData2: {
+ Lv1: 10000
+ Lv2: 11000
+ Lv3: 12000
+ Lv4: 13000
+ Lv5: 14000
+ Lv6: 15000
+ Lv7: 16000
+ Lv8: 17000
+ Lv9: 18000
+ Lv10: 19000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 11
+ Lv2: 12
+ Lv3: 13
+ Lv4: 14
+ Lv5: 15
+ Lv6: 16
+ Lv7: 17
+ Lv8: 18
+ Lv9: 19
+ Lv10: 20
+ }
+ }
+},
+{
+ Id: 254
+ Name: "CR_GRANDCROSS"
+ Description: "Grand Cross"
+ MaxLevel: 10
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ TargetSelf: true
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ IgnoreCards: true
+ IgnoreFlee: true
+ }
+ CastDefRate: 33
+ CastTime: 1500
+ AfterCastActDelay: 1500
+ AfterCastWalkDelay: 900
+ SkillData1: 900
+ SkillData2: {
+ Lv1: 10000
+ Lv2: 11000
+ Lv3: 12000
+ Lv4: 13000
+ Lv5: 14000
+ Lv6: 15000
+ Lv7: 16000
+ Lv8: 17000
+ Lv9: 18000
+ Lv10: 19000
+ }
+ FixedCastTime: 1500
+ Requirements: {
+ SPCost: {
+ Lv1: 37
+ Lv2: 44
+ Lv3: 51
+ Lv4: 58
+ Lv5: 65
+ Lv6: 72
+ Lv7: 79
+ Lv8: 86
+ Lv9: 93
+ Lv10: 100
+ }
+ HPRateCost: 20
+ }
+ Unit: {
+ Id: 0x86
+ Layout: -1
+ Interval: 300
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 255
+ Name: "CR_DEVOTION"
+ Description: "Sacrifice"
+ MaxLevel: 5
+ Range: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ PartyOnly: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1500
+ SkillData2: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: 1500
+ Requirements: {
+ SPCost: 25
+ }
+},
+{
+ Id: 256
+ Name: "CR_PROVIDENCE"
+ Description: "Resistant Souls"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1500
+ SkillData1: 180000
+ FixedCastTime: 1500
+ Requirements: {
+ SPCost: 30
+ }
+},
+{
+ Id: 257
+ Name: "CR_DEFENDER"
+ Description: "Defending Aura"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 800
+ SkillData1: 180000
+ Requirements: {
+ SPCost: 30
+ State: "Shield"
+ }
+},
+{
+ Id: 258
+ Name: "CR_SPEARQUICKEN"
+ Description: "Spear Quicken"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 60000
+ Lv3: 90000
+ Lv4: 120000
+ Lv5: 150000
+ Lv6: 180000
+ Lv7: 210000
+ Lv8: 240000
+ Lv9: 270000
+ Lv10: 300000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 24
+ Lv2: 28
+ Lv3: 32
+ Lv4: 36
+ Lv5: 40
+ Lv6: 44
+ Lv7: 48
+ Lv8: 52
+ Lv9: 56
+ Lv10: 60
+ }
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 259
+ Name: "MO_IRONHAND"
+ Description: "Iron Fists"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 260
+ Name: "MO_SPIRITSRECOVERY"
+ Description: "Spiritual Cadence"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 261
+ Name: "MO_CALLSPIRITS"
+ Description: "Summon Spirit Sphere"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 500
+ SkillData1: 600000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: 8
+ }
+},
+{
+ Id: 262
+ Name: "MO_ABSORBSPIRITS"
+ Description: "Absorb Spirit Sphere"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 263
+ Name: "MO_TRIPLEATTACK"
+ Description: "Raging Trifecta Blow"
+ MaxLevel: 10
+ Range: -1
+ Hit: "BDT_MULTIHIT"
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -3
+ SkillDelayOptions: {
+ IgnoreStatusEffect: true
+ }
+},
+{
+ Id: 264
+ Name: "MO_BODYRELOCATION"
+ Description: "Snap"
+ MaxLevel: 1
+ Range: 18
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 14
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 265
+ Name: "MO_DODGE"
+ Description: "Dodge"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 266
+ Name: "MO_INVESTIGATE"
+ Description: "Occult Impaction"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ CastTime: 500
+ AfterCastActDelay: 500
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 14
+ Lv3: 17
+ Lv4: 19
+ Lv5: 20
+ Lv6: 20
+ Lv7: 20
+ Lv8: 20
+ Lv9: 20
+ Lv10: 20
+ }
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 267
+ Name: "MO_FINGEROFFENSIVE"
+ Description: "Throw Spirit Sphere"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ CastTime: 500
+ AfterCastActDelay: 500
+ AfterCastWalkDelay: {
+ Lv1: 0
+ Lv2: 200
+ Lv3: 400
+ Lv4: 600
+ Lv5: 800
+ Lv6: 1000
+ Lv7: 1200
+ Lv8: 1400
+ Lv9: 1600
+ Lv10: 1800
+ }
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: 10
+ SpiritSphereCost: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ }
+},
+{
+ Id: 268
+ Name: "MO_STEELBODY"
+ Description: "Mental Strength"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 2500
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 60000
+ Lv3: 90000
+ Lv4: 120000
+ Lv5: 150000
+ Lv6: 180000
+ Lv7: 210000
+ Lv8: 240000
+ Lv9: 270000
+ Lv10: 300000
+ }
+ FixedCastTime: 2500
+ Requirements: {
+ SPCost: 200
+ SpiritSphereCost: 5
+ }
+},
+{
+ Id: 269
+ Name: "MO_BLADESTOP"
+ Description: "Root"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 500
+ Lv2: 700
+ Lv3: 900
+ Lv4: 1100
+ Lv5: 1300
+ Lv6: 1500
+ Lv7: 1700
+ Lv8: 1900
+ Lv9: 2100
+ Lv10: 2300
+ }
+ SkillData2: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ Requirements: {
+ SPCost: 10
+ WeaponTypes: {
+ NoWeapon: true
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
+ GrenadeLaunchers: true
+ FuumaShurikens: true
+ }
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 270
+ Name: "MO_EXPLOSIONSPIRITS"
+ Description: "Fury"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillData1: 180000
+ Requirements: {
+ SPCost: 15
+ SpiritSphereCost: 5
+ }
+},
+{
+ Id: 271
+ Name: "MO_EXTREMITYFIST"
+ Description: "Asura Strike"
+ MaxLevel: 5
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ IgnoreDefense: true
+ IgnoreFlee: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2000
+ Lv2: 1750
+ Lv3: 1500
+ Lv4: 1250
+ Lv5: 1000
+ Lv6: 500
+ Lv7: 1000
+ Lv8: 1000
+ Lv9: 1000
+ Lv10: 1000
+ }
+ AfterCastActDelay: {
+ Lv1: 3000
+ Lv2: 2500
+ Lv3: 2000
+ Lv4: 1500
+ Lv5: 1000
+ Lv6: 500
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData1: 10000
+ SkillData2: 300000
+ FixedCastTime: {
+ Lv1: 2000
+ Lv2: 1750
+ Lv3: 1500
+ Lv4: 1250
+ Lv5: 1000
+ Lv6: 500
+ Lv7: 1000
+ Lv8: 1000
+ Lv9: 1000
+ Lv10: 1000
+ }
+ Requirements: {
+ SPCost: 1
+ WeaponTypes: {
+ NoWeapon: true
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
+ GrenadeLaunchers: true
+ FuumaShurikens: true
+ }
+ State: "ExplosionSpirits"
+ SpiritSphereCost: 5
+ }
+},
+{
+ Id: 272
+ Name: "MO_CHAINCOMBO"
+ Description: "Raging Quadruple Blow"
+ MaxLevel: 5
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -4
+ SkillDelayOptions: {
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 11
+ Lv2: 12
+ Lv3: 13
+ Lv4: 14
+ Lv5: 15
+ Lv6: 16
+ Lv7: 17
+ Lv8: 18
+ Lv9: 19
+ Lv10: 20
+ }
+ WeaponTypes: {
+ NoWeapon: true
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
+ GrenadeLaunchers: true
+ FuumaShurikens: true
+ }
+ }
+},
+{
+ Id: 273
+ Name: "MO_COMBOFINISH"
+ Description: "Raging Thrust"
+ MaxLevel: 5
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ SkillDelayOptions: {
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 11
+ Lv2: 12
+ Lv3: 13
+ Lv4: 14
+ Lv5: 15
+ Lv6: 16
+ Lv7: 17
+ Lv8: 18
+ Lv9: 19
+ Lv10: 20
+ }
+ WeaponTypes: {
+ NoWeapon: true
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
+ GrenadeLaunchers: true
+ FuumaShurikens: true
+ }
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 274
+ Name: "SA_ADVANCEDBOOK"
+ Description: "Study"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 275
+ Name: "SA_CASTCANCEL"
+ Description: "Cast Cancel"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 2
+ }
+},
+{
+ Id: 276
+ Name: "SA_MAGICROD"
+ Description: "Magic Rod"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 400
+ Lv2: 600
+ Lv3: 800
+ Lv4: 1000
+ Lv5: 1200
+ Lv6: 1400
+ Lv7: 1600
+ Lv8: 1800
+ Lv9: 2000
+ Lv10: 2200
+ }
+ Requirements: {
+ SPCost: 2
+ }
+},
+{
+ Id: 277
+ Name: "SA_SPELLBREAKER"
+ Description: "Spell Breaker"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 560
+ FixedCastTime: 140
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 278
+ Name: "SA_FREECAST"
+ Description: "Free Cast"
+ MaxLevel: 10
+ AttackType: "Magic"
+ NumberOfHits: 0
+},
+{
+ Id: 279
+ Name: "SA_AUTOSPELL"
+ Description: "Hindsight"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 150000
+ Lv3: 180000
+ Lv4: 210000
+ Lv5: 240000
+ Lv6: 270000
+ Lv7: 300000
+ Lv8: 330000
+ Lv9: 360000
+ Lv10: 390000
+ }
+ FixedCastTime: 3000
+ Requirements: {
+ SPCost: 35
+ }
+},
+{
+ Id: 280
+ Name: "SA_FLAMELAUNCHER"
+ Description: "Endow Blaze"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ PartyOnly: true
+ GuildOnly: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 1200000
+ Lv2: 1200000
+ Lv3: 1200000
+ Lv4: 1200000
+ Lv5: 1800000
+ Lv6: 1800000
+ Lv7: 1800000
+ Lv8: 1800000
+ Lv9: 1800000
+ Lv10: 1800000
+ }
+ FixedCastTime: 3000
+ Requirements: {
+ SPCost: 40
+// Items: {
+// Boody_Red: 1
+// }
+ }
+},
+{
+ Id: 281
+ Name: "SA_FROSTWEAPON"
+ Description: "Endow Tsunami"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ PartyOnly: true
+ GuildOnly: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 1200000
+ Lv2: 1200000
+ Lv3: 1200000
+ Lv4: 1200000
+ Lv5: 1800000
+ Lv6: 1800000
+ Lv7: 1800000
+ Lv8: 1800000
+ Lv9: 1800000
+ Lv10: 1800000
+ }
+ FixedCastTime: 3000
+ Requirements: {
+ SPCost: 40
+// Items: {
+// Crystal_Blue: 1
+// }
+ }
+},
+{
+ Id: 282
+ Name: "SA_LIGHTNINGLOADER"
+ Description: "Endow Tornado"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ PartyOnly: true
+ GuildOnly: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 1200000
+ Lv2: 1200000
+ Lv3: 1200000
+ Lv4: 1200000
+ Lv5: 1800000
+ Lv6: 1800000
+ Lv7: 1800000
+ Lv8: 1800000
+ Lv9: 1800000
+ Lv10: 1800000
+ }
+ FixedCastTime: 3000
+ Requirements: {
+ SPCost: 40
+// Items: {
+// Wind_Of_Verdure: 1
+// }
+ }
+},
+{
+ Id: 283
+ Name: "SA_SEISMICWEAPON"
+ Description: "Endow Quake"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ PartyOnly: true
+ GuildOnly: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 1200000
+ Lv2: 1200000
+ Lv3: 1200000
+ Lv4: 1200000
+ Lv5: 1800000
+ Lv6: 1800000
+ Lv7: 1800000
+ Lv8: 1800000
+ Lv9: 1800000
+ Lv10: 1800000
+ }
+ FixedCastTime: 3000
+ Requirements: {
+ SPCost: 40
+// Items: {
+// Yellow_Live: 1
+// }
+ }
+},
+{
+ Id: 284
+ Name: "SA_DRAGONOLOGY"
+ Description: "Dragonology"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 285
+ Name: "SA_VOLCANO"
+ Description: "Volcano"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 4000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 120000
+ Lv3: 180000
+ Lv4: 240000
+ Lv5: 300000
+ Lv6: 360000
+ Lv7: 420000
+ Lv8: 480000
+ Lv9: 540000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 48
+ Lv2: 46
+ Lv3: 44
+ Lv4: 42
+ Lv5: 40
+ Lv6: 38
+ Lv7: 36
+ Lv8: 34
+ Lv9: 32
+ Lv10: 30
+ }
+// Items: {
+// Yellow_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0x9a
+ Layout: 3
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 286
+ Name: "SA_DELUGE"
+ Description: "Deluge"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 4000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 120000
+ Lv3: 180000
+ Lv4: 240000
+ Lv5: 300000
+ Lv6: 360000
+ Lv7: 420000
+ Lv8: 480000
+ Lv9: 540000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 48
+ Lv2: 46
+ Lv3: 44
+ Lv4: 42
+ Lv5: 40
+ Lv6: 38
+ Lv7: 36
+ Lv8: 34
+ Lv9: 32
+ Lv10: 30
+ }
+// Items: {
+// Yellow_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0x9b
+ Layout: 3
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 287
+ Name: "SA_VIOLENTGALE"
+ Description: "Whirlwind"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 4000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 120000
+ Lv3: 180000
+ Lv4: 240000
+ Lv5: 300000
+ Lv6: 360000
+ Lv7: 420000
+ Lv8: 480000
+ Lv9: 540000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 48
+ Lv2: 46
+ Lv3: 44
+ Lv4: 42
+ Lv5: 40
+ Lv6: 38
+ Lv7: 36
+ Lv8: 34
+ Lv9: 32
+ Lv10: 30
+ }
+// Items: {
+// Yellow_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0x9c
+ Layout: 3
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 288
+ Name: "SA_LANDPROTECTOR"
+ Description: "Magnetic Earth"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 4000
+ SkillData1: {
+ Lv1: 165000
+ Lv2: 210000
+ Lv3: 255000
+ Lv4: 300000
+ Lv5: 345000
+ Lv6: 390000
+ Lv7: 435000
+ Lv8: 480000
+ Lv9: 525000
+ Lv10: 570000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 66
+ Lv2: 62
+ Lv3: 58
+ Lv4: 54
+ Lv5: 50
+ Lv6: 46
+ Lv7: 42
+ Lv8: 38
+ Lv9: 34
+ Lv10: 30
+ }
+// Items: {
+// Blue_Gemstone: 1
+// Yellow_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0x9d
+ Layout: {
+ Lv1: 3
+ Lv2: 3
+ Lv3: 4
+ Lv4: 4
+ Lv5: 5
+ Lv6: 5
+ Lv7: 6
+ Lv8: 6
+ Lv9: 7
+ Lv10: 7
+ }
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 289
+ Name: "SA_DISPELL"
+ Description: "Dispell"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ PartyOnly: true
+ GuildOnly: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: {
+ Lv1: 0
+ Lv2: 0
+ Lv3: 0
+ Lv4: 0
+ Lv5: 0
+ Lv6: -1
+ Lv7: -1
+ Lv8: -1
+ Lv9: -1
+ Lv10: -1
+ }
+ InterruptCast: true
+ CastTime: 1600
+ FixedCastTime: 400
+ Requirements: {
+ SPCost: 1
+// Items: {
+// Yellow_Gemstone: 1
+// }
+ }
+},
+{
+ Id: 290
+ Name: "SA_ABRACADABRA"
+ Description: "Hocus-pocus"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 50
+// Items: {
+// Yellow_Gemstone: 2
+// }
+ }
+},
+{
+ Id: 291
+ Name: "SA_MONOCELL"
+ Description: "Monocell"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 292
+ Name: "SA_CLASSCHANGE"
+ Description: "Class Change"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 293
+ Name: "SA_SUMMONMONSTER"
+ Description: "Monster Chant"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 294
+ Name: "SA_REVERSEORCISH"
+ Description: "Grampus Morph"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 1200000
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 295
+ Name: "SA_DEATH"
+ Description: "Grim Reaper"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 296
+ Name: "SA_FORTUNE"
+ Description: "Gold Digger"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 297
+ Name: "SA_TAMINGMONSTER"
+ Description: "Beastly Hypnosis"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 298
+ Name: "SA_QUESTION"
+ Description: "Questioning"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 299
+ Name: "SA_GRAVITY"
+ Description: "Gravity"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 300
+ Name: "SA_LEVELUP"
+ Description: "Leveling"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 301
+ Name: "SA_INSTANTDEATH"
+ Description: "Suicide"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 302
+ Name: "SA_FULLRECOVERY"
+ Description: "Rejuvenation"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 303
+ Name: "SA_COMA"
+ Description: "Coma"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 304
+ Name: "BD_ADAPTATION"
+ Description: "Amp"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData2: 5000
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 305
+ Name: "BD_ENCORE"
+ Description: "Encore"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 1
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 306
+ Name: "BD_LULLABY"
+ Description: "Lullaby"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ SkillData2: 15000
+ Requirements: {
+ SPCost: 20
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0x9e
+ Layout: 4
+ Interval: 6000
+ Target: "Enemy"
+ Flag: {
+ UF_ENSEMBLE: true
+ }
+ }
+},
+{
+ Id: 307
+ Name: "BD_RICHMANKIM"
+ Description: "Mental Sensing"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ SkillData2: 60000
+ Requirements: {
+ SPCost: 20
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0x9f
+ Layout: 4
+ Interval: -1
+ Target: "Enemy"
+ Flag: {
+ UF_NOPC: true
+ UF_ENSEMBLE: true
+ }
+ }
+},
+{
+ Id: 308
+ Name: "BD_ETERNALCHAOS"
+ Description: "Down Tempo"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ SkillData2: 60000
+ Requirements: {
+ SPCost: 30
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xa0
+ Layout: 4
+ Interval: -1
+ Target: "Enemy"
+ Flag: {
+ UF_ENSEMBLE: true
+ }
+ }
+},
+{
+ Id: 309
+ Name: "BD_DRUMBATTLEFIELD"
+ Description: "Battle Theme"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ SkillData2: 60000
+ Requirements: {
+ SPCost: {
+ Lv1: 38
+ Lv2: 41
+ Lv3: 44
+ Lv4: 47
+ Lv5: 50
+ Lv6: 53
+ Lv7: 56
+ Lv8: 59
+ Lv9: 62
+ Lv10: 65
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xa1
+ Layout: 4
+ Interval: -1
+ Target: "Party"
+ Flag: {
+ UF_ENSEMBLE: true
+ }
+ }
+},
+{
+ Id: 310
+ Name: "BD_RINGNIBELUNGEN"
+ Description: "Harmonic Lick"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ SkillData2: 60000
+ Requirements: {
+ SPCost: {
+ Lv1: 38
+ Lv2: 41
+ Lv3: 44
+ Lv4: 47
+ Lv5: 50
+ Lv6: 53
+ Lv7: 56
+ Lv8: 59
+ Lv9: 62
+ Lv10: 65
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xa2
+ Layout: 4
+ Interval: -1
+ Target: "Party"
+ Flag: {
+ UF_ENSEMBLE: true
+ }
+ }
+},
+{
+ Id: 311
+ Name: "BD_ROKISWEIL"
+ Description: "Classical Pluck"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ SkillData2: 60000
+ Requirements: {
+ SPCost: 15
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xa3
+ Layout: 4
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_ENSEMBLE: true
+ }
+ }
+},
+{
+ Id: 312
+ Name: "BD_INTOABYSS"
+ Description: "Power Chord"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ SkillData2: 60000
+ Requirements: {
+ SPCost: 10
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xa4
+ Layout: 4
+ Interval: -1
+ Target: "Party"
+ Flag: {
+ UF_NOMOB: true
+ UF_ENSEMBLE: true
+ }
+ }
+},
+{
+ Id: 313
+ Name: "BD_SIEGFRIED"
+ Description: "Acoustic Rhythm"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ SkillData2: 60000
+ Requirements: {
+ SPCost: 20
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xa5
+ Layout: 4
+ Interval: -1
+ Target: "Party"
+ Flag: {
+ UF_ENSEMBLE: true
+ }
+ }
+},
+{
+ Id: 315
+ Name: "BA_MUSICALLESSON"
+ Description: "Music Lessons"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 316
+ Name: "BA_MUSICALSTRIKE"
+ Description: "Melody Strike"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ CastTime: 1200
+ FixedCastTime: 300
+ Requirements: {
+ SPCost: {
+ Lv1: 1
+ Lv2: 3
+ Lv3: 5
+ Lv4: 7
+ Lv5: 9
+ Lv6: 11
+ Lv7: 13
+ Lv8: 15
+ Lv9: 17
+ Lv10: 19
+ }
+ WeaponTypes: {
+ Instruments: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 317
+ Name: "BA_DISSONANCE"
+ Description: "Unchained Serenade"
+ MaxLevel: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Song: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ IgnoreFlee: true
+ }
+ SkillData1: 30000
+ SkillData2: 3000
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 21
+ Lv3: 24
+ Lv4: 27
+ Lv5: 30
+ Lv6: 33
+ Lv7: 36
+ Lv8: 39
+ Lv9: 42
+ Lv10: 45
+ }
+ WeaponTypes: {
+ Instruments: true
+ }
+ }
+ Unit: {
+ Id: 0xa6
+ Layout: 3
+ Interval: 3000
+ Target: "Enemy"
+ Flag: {
+ UF_SONG: true
+ }
+ }
+},
+{
+ Id: 318
+ Name: "BA_FROSTJOKER"
+ Description: "Unbarring Octave"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ AfterCastActDelay: 4000
+ SkillData2: {
+ Lv1: 10000
+ Lv2: 11000
+ Lv3: 12000
+ Lv4: 13000
+ Lv5: 14000
+ Lv6: 15000
+ Lv7: 16000
+ Lv8: 17000
+ Lv9: 18000
+ Lv10: 19000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 319
+ Name: "BA_WHISTLE"
+ Description: "Perfect Tablature"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Song: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ SkillData2: 20000
+ Requirements: {
+ SPCost: {
+ Lv1: 24
+ Lv2: 28
+ Lv3: 32
+ Lv4: 36
+ Lv5: 40
+ Lv6: 44
+ Lv7: 48
+ Lv8: 52
+ Lv9: 56
+ Lv10: 60
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xa7
+ Layout: 3
+ Interval: 3000
+ Target: "All"
+ Flag: {
+ UF_NOMOB: true
+ UF_SONG: true
+ UF_DUALMODE: true
+ }
+ }
+},
+{
+ Id: 320
+ Name: "BA_ASSASSINCROSS"
+ Description: "Impressive Riff"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Song: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 120000
+ SkillData2: 20000
+ Requirements: {
+ SPCost: {
+ Lv1: 38
+ Lv2: 41
+ Lv3: 44
+ Lv4: 47
+ Lv5: 50
+ Lv6: 53
+ Lv7: 56
+ Lv8: 59
+ Lv9: 62
+ Lv10: 65
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xa8
+ Layout: 3
+ Interval: 3000
+ Target: "All"
+ Flag: {
+ UF_NOMOB: true
+ UF_SONG: true
+ UF_DUALMODE: true
+ }
+ }
+},
+{
+ Id: 321
+ Name: "BA_POEMBRAGI"
+ Description: "Magic Strings"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Song: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 180000
+ SkillData2: 20000
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xa9
+ Layout: 3
+ Interval: 3000
+ Target: "All"
+ Flag: {
+ UF_NOMOB: true
+ UF_SONG: true
+ UF_DUALMODE: true
+ }
+ }
+},
+{
+ Id: 322
+ Name: "BA_APPLEIDUN"
+ Description: "Song of Lutie"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Song: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 180000
+ SkillData2: 20000
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xaa
+ Layout: 3
+ Interval: 6000
+ Target: "All"
+ Flag: {
+ UF_NOMOB: true
+ UF_SONG: true
+ UF_DUALMODE: true
+ }
+ }
+},
+{
+ Id: 323
+ Name: "DC_DANCINGLESSON"
+ Description: "Dance Lessons"
+ MaxLevel: 10
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 324
+ Name: "DC_THROWARROW"
+ Description: "Slinging Arrow"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ CastTime: 1200
+ FixedCastTime: 300
+ Requirements: {
+ SPCost: {
+ Lv1: 1
+ Lv2: 3
+ Lv3: 5
+ Lv4: 7
+ Lv5: 9
+ Lv6: 11
+ Lv7: 13
+ Lv8: 15
+ Lv9: 17
+ Lv10: 19
+ }
+ WeaponTypes: {
+ Whips: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 325
+ Name: "DC_UGLYDANCE"
+ Description: "Hip Shaker"
+ MaxLevel: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Song: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 30000
+ SkillData2: 3000
+ Requirements: {
+ SPCost: {
+ Lv1: 23
+ Lv2: 26
+ Lv3: 29
+ Lv4: 32
+ Lv5: 35
+ Lv6: 38
+ Lv7: 41
+ Lv8: 44
+ Lv9: 47
+ Lv10: 50
+ }
+ WeaponTypes: {
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xab
+ Layout: 3
+ Interval: 3000
+ Target: "Enemy"
+ Flag: {
+ UF_DANCE: true
+ }
+ }
+},
+{
+ Id: 326
+ Name: "DC_SCREAM"
+ Description: "Dazzler"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ AfterCastActDelay: 4000
+ SkillData2: 5000
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 327
+ Name: "DC_HUMMING"
+ Description: "Focus Ballet"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Song: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ SkillData2: 20000
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 24
+ Lv3: 26
+ Lv4: 28
+ Lv5: 30
+ Lv6: 32
+ Lv7: 34
+ Lv8: 36
+ Lv9: 38
+ Lv10: 40
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xac
+ Layout: 3
+ Interval: 3000
+ Target: "All"
+ Flag: {
+ UF_NOMOB: true
+ UF_DANCE: true
+ UF_DUALMODE: true
+ }
+ }
+},
+{
+ Id: 328
+ Name: "DC_DONTFORGETME"
+ Description: "Slow Grace"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Song: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 180000
+ SkillData2: 20000
+ Requirements: {
+ SPCost: {
+ Lv1: 28
+ Lv2: 31
+ Lv3: 34
+ Lv4: 37
+ Lv5: 40
+ Lv6: 43
+ Lv7: 46
+ Lv8: 49
+ Lv9: 52
+ Lv10: 55
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xad
+ Layout: 3
+ Interval: 3000
+ Target: "Enemy"
+ Flag: {
+ UF_DANCE: true
+ UF_DUALMODE: true
+ }
+ }
+},
+{
+ Id: 329
+ Name: "DC_FORTUNEKISS"
+ Description: "Lady Luck"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Song: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 120000
+ SkillData2: 20000
+ Requirements: {
+ SPCost: {
+ Lv1: 43
+ Lv2: 46
+ Lv3: 49
+ Lv4: 52
+ Lv5: 55
+ Lv6: 58
+ Lv7: 61
+ Lv8: 64
+ Lv9: 67
+ Lv10: 70
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xae
+ Layout: 3
+ Interval: 3000
+ Target: "All"
+ Flag: {
+ UF_NOMOB: true
+ UF_DANCE: true
+ UF_DUALMODE: true
+ }
+ }
+},
+{
+ Id: 330
+ Name: "DC_SERVICEFORYOU"
+ Description: "Gypsy's Kiss"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Song: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 180000
+ SkillData2: 20000
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xaf
+ Layout: 3
+ Interval: 3000
+ Target: "All"
+ Flag: {
+ UF_NOMOB: true
+ UF_DANCE: true
+ UF_DUALMODE: true
+ }
+ }
+},
+{
+ Id: 331
+ Name: "NPC_RANDOMMOVE"
+ Description: "Random Move"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 332
+ Name: "NPC_SPEEDUP"
+ Description: "Speed UP"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 333
+ Name: "NPC_REVENGE"
+ Description: "Revenge"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 334
+ Name: "WE_MALE"
+ Description: "I Will Protect You"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Wedding: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1500
+ FixedCastTime: 1500
+ Requirements: {
+ SPCost: 1
+ HPRateCost: -10
+ }
+},
+{
+ Id: 335
+ Name: "WE_FEMALE"
+ Description: "I Look up to You"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Wedding: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1500
+ FixedCastTime: 1500
+ Requirements: {
+ SPCost: 1
+ SPRateCost: -10
+ }
+},
+{
+ Id: 336
+ Name: "WE_CALLPARTNER"
+ Description: "I miss You"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Wedding: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 3
+ InterruptCast: true
+ SkillInstances: 1
+ SkillData1: 20000
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+ Unit: {
+ Id: 0xb2
+ Range: -1
+ Interval: -1
+ }
+},
+{
+ Id: 337
+ Name: "ITM_TOMAHAWK"
+ Description: "Throw Tomahawk"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 338
+ Name: "NPC_DARKCROSS"
+ Description: "Cross of Darkness"
+ MaxLevel: 10
+ Range: -1
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Dark"
+ NumberOfHits: -2
+},
+{
+ Id: 339
+ Name: "NPC_GRANDDARKNESS"
+ Description: "Grand cross of Darkness"
+ MaxLevel: 10
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ TargetSelf: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Dark"
+ DamageType: {
+ IgnoreCards: true
+ IgnoreFlee: true
+ }
+ AfterCastWalkDelay: 900
+ SkillData1: 900
+ SkillData2: {
+ Lv1: 10000
+ Lv2: 11000
+ Lv3: 12000
+ Lv4: 13000
+ Lv5: 14000
+ Lv6: 15000
+ Lv7: 16000
+ Lv8: 17000
+ Lv9: 18000
+ Lv10: 19000
+ }
+ Unit: {
+ Id: 0x86
+ Layout: -1
+ Interval: 300
+ Target: "Enemy"
+ }
+},
+{
+ Id: 340
+ Name: "NPC_DARKSTRIKE"
+ Description: "Soul Strike of Darkness"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Dark"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ InterruptCast: true
+},
+{
+ Id: 341
+ Name: "NPC_DARKTHUNDER"
+ Description: "Darkness Jupitel"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Dark"
+ NumberOfHits: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ InterruptCast: true
+ KnockBackTiles: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 3
+ Lv4: 4
+ Lv5: 4
+ Lv6: 5
+ Lv7: 5
+ Lv8: 6
+ Lv9: 6
+ Lv10: 7
+ }
+},
+{
+ Id: 342
+ Name: "NPC_STOP"
+ Description: "Stop"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillData1: 10000
+},
+{
+ Id: 343
+ Name: "NPC_WEAPONBRAKER"
+ Description: "Break weapon"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+},
+{
+ Id: 344
+ Name: "NPC_ARMORBRAKE"
+ Description: "Break armor"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+},
+{
+ Id: 345
+ Name: "NPC_HELMBRAKE"
+ Description: "Break helm"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+},
+{
+ Id: 346
+ Name: "NPC_SHIELDBRAKE"
+ Description: "Break shield"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+},
+{
+ Id: 347
+ Name: "NPC_UNDEADATTACK"
+ Description: "Undead Element Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Undead"
+},
+{
+ Id: 348
+ Name: "NPC_CHANGEUNDEAD"
+ Description: "Undead Attribute Change"
+ MaxLevel: 5
+ Range: 9
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Undead"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 30000
+},
+{
+ Id: 349
+ Name: "NPC_POWERUP"
+ Description: "Power Up"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+},
+{
+ Id: 350
+ Name: "NPC_AGIUP"
+ Description: "Agility UP"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+},
+{
+ Id: 351
+ Name: "NPC_SIEGEMODE"
+ Description: "Siege Mode"
+ MaxLevel: 1
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 352
+ Name: "NPC_CALLSLAVE"
+ Description: "Recall Slaves"
+ MaxLevel: 1
+ Range: 2
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 353
+ Name: "NPC_INVISIBLE"
+ Description: "Invisible"
+ MaxLevel: 1
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillData1: 30000
+},
+{
+ Id: 354
+ Name: "NPC_RUN"
+ Description: "Run"
+ MaxLevel: 20
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 355
+ Name: "LK_AURABLADE"
+ Description: "Aura Blade"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 40000
+ Lv2: 60000
+ Lv3: 80000
+ Lv4: 100000
+ Lv5: 120000
+ Lv6: 140000
+ Lv7: 160000
+ Lv8: 180000
+ Lv9: 200000
+ Lv10: 220000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 26
+ Lv3: 34
+ Lv4: 42
+ Lv5: 50
+ Lv6: 58
+ Lv7: 66
+ Lv8: 74
+ Lv9: 82
+ Lv10: 90
+ }
+ WeaponTypes: {
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Bows: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
+ GrenadeLaunchers: true
+ FuumaShurikens: true
+ }
+ }
+},
+{
+ Id: 356
+ Name: "LK_PARRYING"
+ Description: "Parrying"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 15000
+ Lv2: 20000
+ Lv3: 25000
+ Lv4: 30000
+ Lv5: 35000
+ Lv6: 40000
+ Lv7: 45000
+ Lv8: 50000
+ Lv9: 55000
+ Lv10: 60000
+ }
+ Requirements: {
+ SPCost: 50
+ WeaponTypes: {
+ 2HSwords: true
+ }
+ }
+},
+{
+ Id: 357
+ Name: "LK_CONCENTRATION"
+ Description: "Concentration"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 25000
+ Lv2: 30000
+ Lv3: 35000
+ Lv4: 40000
+ Lv5: 45000
+ Lv6: 50000
+ Lv7: 55000
+ Lv8: 60000
+ Lv9: 65000
+ Lv10: 70000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 14
+ Lv2: 18
+ Lv3: 22
+ Lv4: 26
+ Lv5: 30
+ Lv6: 34
+ Lv7: 38
+ Lv8: 42
+ Lv9: 46
+ Lv10: 50
+ }
+ }
+},
+{
+ Id: 358
+ Name: "LK_TENSIONRELAX"
+ Description: "Relax"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 180000
+ Requirements: {
+ SPCost: 15
+ }
+},
+{
+ Id: 359
+ Name: "LK_BERSERK"
+ Description: "Frenzy"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 300000
+ SkillData2: 15000
+ Requirements: {
+ SPCost: 200
+ }
+},
+{
+ Id: 361
+ Name: "HP_ASSUMPTIO"
+ Description: "Assumptio"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 1
+ InterruptCast: true
+ CastTime: {
+ Lv1: 800
+ Lv2: 1200
+ Lv3: 1600
+ Lv4: 2000
+ Lv5: 2400
+ Lv6: 2400
+ Lv7: 2400
+ Lv8: 2400
+ Lv9: 2400
+ Lv10: 2400
+ }
+ AfterCastActDelay: {
+ Lv1: 1100
+ Lv2: 1200
+ Lv3: 1300
+ Lv4: 1400
+ Lv5: 1500
+ Lv6: 1600
+ Lv7: 1700
+ Lv8: 1800
+ Lv9: 1900
+ Lv10: 2000
+ }
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 40000
+ Lv3: 60000
+ Lv4: 80000
+ Lv5: 100000
+ Lv6: 120000
+ Lv7: 140000
+ Lv8: 160000
+ Lv9: 180000
+ Lv10: 200000
+ }
+ FixedCastTime: {
+ Lv1: 200
+ Lv2: 300
+ Lv3: 400
+ Lv4: 500
+ Lv5: 600
+ Lv6: 700
+ Lv7: 800
+ Lv8: 900
+ Lv9: 1000
+ Lv10: 1100
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 30
+ Lv3: 40
+ Lv4: 50
+ Lv5: 60
+ Lv6: 70
+ Lv7: 80
+ Lv8: 90
+ Lv9: 100
+ Lv10: 110
+ }
+ }
+},
+{
+ Id: 362
+ Name: "HP_BASILICA"
+ Description: "Basilica"
+ MaxLevel: 5
+ Range: 4
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ KnockBackTiles: 2
+ AfterCastActDelay: {
+ Lv1: 2000
+ Lv2: 3000
+ Lv3: 4000
+ Lv4: 5000
+ Lv5: 6000
+ Lv6: 7000
+ Lv7: 8000
+ Lv8: 9000
+ Lv9: 10000
+ Lv10: 11000
+ }
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 25000
+ Lv3: 30000
+ Lv4: 35000
+ Lv5: 40000
+ Lv6: 45000
+ Lv7: 50000
+ Lv8: 55000
+ Lv9: 60000
+ Lv10: 65000
+ }
+ SkillData2: {
+ Lv1: 20000
+ Lv2: 25000
+ Lv3: 30000
+ Lv4: 35000
+ Lv5: 40000
+ Lv6: 45000
+ Lv7: 50000
+ Lv8: 55000
+ Lv9: 60000
+ Lv10: 65000
+ }
+ FixedCastTime: {
+ Lv1: 5000
+ Lv2: 6000
+ Lv3: 7000
+ Lv4: 8000
+ Lv5: 9000
+ Lv6: 10000
+ Lv7: 11000
+ Lv8: 12000
+ Lv9: 13000
+ Lv10: 14000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 90
+ Lv3: 100
+ Lv4: 110
+ Lv5: 120
+ Lv6: 130
+ Lv7: 140
+ Lv8: 150
+ Lv9: 160
+ Lv10: 170
+ }
+// Items: {
+// Yellow_Gemstone: 1
+// Red_Gemstone: 1
+// Blue_Gemstone: 1
+// Holy_Water: 1
+// }
+ }
+ Unit: {
+ Id: 0xb4
+ Range: 2
+ Interval: 300
+ Target: "All"
+ }
+},
+{
+ Id: 363
+ Name: "HP_MEDITATIO"
+ Description: "Meditatio"
+ MaxLevel: 10
+ AttackType: "Magic"
+ NumberOfHits: 0
+},
+{
+ Id: 364
+ Name: "HW_SOULDRAIN"
+ Description: "Soul Drain"
+ MaxLevel: 10
+ AttackType: "Magic"
+},
+{
+ Id: 365
+ Name: "HW_MAGICCRASHER"
+ Description: "Stave Crasher"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ InterruptCast: true
+ CastTime: 240
+ AfterCastActDelay: 300
+ FixedCastTime: 60
+ Requirements: {
+ SPCost: 8
+ }
+},
+{
+ Id: 366
+ Name: "HW_MAGICPOWER"
+ Description: "Mystical Amplification"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 30000
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 14
+ Lv2: 18
+ Lv3: 22
+ Lv4: 26
+ Lv5: 30
+ Lv6: 34
+ Lv7: 38
+ Lv8: 42
+ Lv9: 46
+ Lv10: 50
+ }
+ }
+},
+{
+ Id: 367
+ Name: "PA_PRESSURE"
+ Description: "Gloria Domini"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ IgnoreElement: true
+ IgnoreFlee: true
+ IgnoreDefCards: true
+ }
+ CastTime: 1600
+ AfterCastActDelay: {
+ Lv1: 2000
+ Lv2: 2500
+ Lv3: 3000
+ Lv4: 3500
+ Lv5: 4000
+ Lv6: 4500
+ Lv7: 5000
+ Lv8: 5500
+ Lv9: 6000
+ Lv10: 6500
+ }
+ SkillData2: {
+ Lv1: 2000
+ Lv2: 3000
+ Lv3: 4000
+ Lv4: 5000
+ Lv5: 6000
+ Lv6: 7000
+ Lv7: 8000
+ Lv8: 9000
+ Lv9: 10000
+ Lv10: 11000
+ }
+ FixedCastTime: 400
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 35
+ Lv3: 40
+ Lv4: 45
+ Lv5: 50
+ Lv6: 55
+ Lv7: 60
+ Lv8: 65
+ Lv9: 70
+ Lv10: 75
+ }
+ }
+},
+{
+ Id: 368
+ Name: "PA_SACRIFICE"
+ Description: "Martyr's Reckoning"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ IgnoreCards: true
+ IgnoreDefense: true
+ IgnoreFlee: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 100
+ }
+},
+{
+ Id: 369
+ Name: "PA_GOSPEL"
+ Description: "Battle Chant"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ IgnoreFlee: true
+ }
+ InterruptCast: true
+ SkillData1: 60000
+ SkillData2: 60000
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 80
+ Lv3: 80
+ Lv4: 80
+ Lv5: 80
+ Lv6: 100
+ Lv7: 100
+ Lv8: 100
+ Lv9: 100
+ Lv10: 100
+ }
+ }
+ Unit: {
+ Id: 0xb3
+ Layout: -1
+ Interval: 10000
+ Target: "All"
+ Flag: {
+ UF_NOOVERLAP: true
+ }
+ }
+},
+{
+ Id: 370
+ Name: "CH_PALMSTRIKE"
+ Description: "Raging Palm Strike"
+ MaxLevel: 5
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ InterruptCast: true
+ KnockBackTiles: 3
+ AfterCastActDelay: 300
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 2
+ Lv2: 4
+ Lv3: 6
+ Lv4: 8
+ Lv5: 10
+ Lv6: 12
+ Lv7: 14
+ Lv8: 16
+ Lv9: 18
+ Lv10: 20
+ }
+ State: "ExplosionSpirits"
+ }
+},
+{
+ Id: 371
+ Name: "CH_TIGERFIST"
+ Description: "Glacier Fist"
+ MaxLevel: 5
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData2: {
+ Lv1: 2000
+ Lv2: 4000
+ Lv3: 6000
+ Lv4: 8000
+ Lv5: 10000
+ Lv6: 12000
+ Lv7: 14000
+ Lv8: 16000
+ Lv9: 18000
+ Lv10: 20000
+ }
+ SkillDelayOptions: {
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 4
+ Lv2: 6
+ Lv3: 8
+ Lv4: 10
+ Lv5: 12
+ Lv6: 14
+ Lv7: 16
+ Lv8: 18
+ Lv9: 20
+ Lv10: 22
+ }
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 372
+ Name: "CH_CHAINCRUSH"
+ Description: "Chain Crush Combo"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: {
+ Lv1: -1
+ Lv2: -1
+ Lv3: -2
+ Lv4: -2
+ Lv5: -3
+ Lv6: -3
+ Lv7: -4
+ Lv8: -4
+ Lv9: -5
+ Lv10: -5
+ }
+ SkillDelayOptions: {
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 4
+ Lv2: 6
+ Lv3: 8
+ Lv4: 10
+ Lv5: 12
+ Lv6: 14
+ Lv7: 16
+ Lv8: 18
+ Lv9: 20
+ Lv10: 22
+ }
+ SpiritSphereCost: 2
+ }
+},
+{
+ Id: 373
+ Name: "PF_HPCONVERSION"
+ Description: "Indulge"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ }
+},
+{
+ Id: 374
+ Name: "PF_SOULCHANGE"
+ Description: "Soul Exhale"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ PartyOnly: true
+ GuildOnly: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ FixedCastTime: 3000
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 375
+ Name: "PF_SOULBURN"
+ Description: "Soul Siphon"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ IgnoreCards: true
+ IgnoreElement: true
+ IgnoreDefCards: true
+ }
+ InterruptCast: true
+ CoolDown: {
+ Lv1: 10000
+ Lv2: 10000
+ Lv3: 10000
+ Lv4: 10000
+ Lv5: 15000
+ Lv6: 15000
+ Lv7: 15000
+ Lv8: 15000
+ Lv9: 15000
+ Lv10: 15000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 90
+ Lv3: 100
+ Lv4: 110
+ Lv5: 120
+ Lv6: 130
+ Lv7: 140
+ Lv8: 150
+ Lv9: 160
+ Lv10: 170
+ }
+ }
+},
+{
+ Id: 376
+ Name: "ASC_KATAR"
+ Description: "Advanced Katar Mastery"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 378
+ Name: "ASC_EDP"
+ Description: "Enchant Deadly Poison"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Poison"
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 40000
+ Lv2: 45000
+ Lv3: 50000
+ Lv4: 55000
+ Lv5: 60000
+ Lv6: 65000
+ Lv7: 70000
+ Lv8: 75000
+ Lv9: 80000
+ Lv10: 85000
+ }
+ SkillData2: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 70
+ Lv3: 80
+ Lv4: 90
+ Lv5: 100
+ Lv6: 110
+ Lv7: 120
+ Lv8: 130
+ Lv9: 140
+ Lv10: 150
+ }
+ WeaponTypes: {
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Bows: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
+ GrenadeLaunchers: true
+ FuumaShurikens: true
+ }
+// Items: {
+// Poison_Bottle: 1
+// }
+ }
+},
+{
+ Id: 379
+ Name: "ASC_BREAKER"
+ Description: "Soul Destroyer"
+ MaxLevel: 10
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ InterruptCast: true
+ CastTime: 250
+ AfterCastActDelay: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ FixedCastTime: 250
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 20
+ Lv3: 20
+ Lv4: 20
+ Lv5: 20
+ Lv6: 30
+ Lv7: 30
+ Lv8: 30
+ Lv9: 30
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 380
+ Name: "SN_SIGHT"
+ Description: "Falcon Eyes"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 30000
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 20
+ Lv3: 25
+ Lv4: 25
+ Lv5: 30
+ Lv6: 30
+ Lv7: 35
+ Lv8: 35
+ Lv9: 40
+ Lv10: 40
+ }
+ }
+},
+{
+ Id: 381
+ Name: "SN_FALCONASSAULT"
+ Description: "Falcon Assault"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ InterruptCast: true
+ CastTime: 500
+ AfterCastActDelay: 3000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 34
+ Lv3: 38
+ Lv4: 42
+ Lv5: 46
+ Lv6: 50
+ Lv7: 54
+ Lv8: 58
+ Lv9: 62
+ Lv10: 66
+ }
+ State: "Falcon"
+ }
+},
+{
+ Id: 382
+ Name: "SN_SHARPSHOOTING"
+ Description: "Focused Arrow Strike"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SplashRange: 1
+ InterruptCast: true
+ SkillInstances: 13
+ CastTime: 1000
+ AfterCastActDelay: 1500
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 21
+ Lv3: 24
+ Lv4: 27
+ Lv5: 30
+ Lv6: 33
+ Lv7: 36
+ Lv8: 39
+ Lv9: 42
+ Lv10: 45
+ }
+ WeaponTypes: {
+ Bows: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 383
+ Name: "SN_WINDWALK"
+ Description: "Wind Walker"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1500
+ Lv2: 1800
+ Lv3: 2100
+ Lv4: 2400
+ Lv5: 2700
+ Lv6: 3000
+ Lv7: 3300
+ Lv8: 3600
+ Lv9: 3900
+ Lv10: 4200
+ }
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 130000
+ Lv2: 160000
+ Lv3: 190000
+ Lv4: 220000
+ Lv5: 250000
+ Lv6: 280000
+ Lv7: 310000
+ Lv8: 340000
+ Lv9: 370000
+ Lv10: 400000
+ }
+ FixedCastTime: {
+ Lv1: 500
+ Lv2: 600
+ Lv3: 700
+ Lv4: 800
+ Lv5: 900
+ Lv6: 1000
+ Lv7: 1100
+ Lv8: 1200
+ Lv9: 1300
+ Lv10: 1400
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 46
+ Lv2: 52
+ Lv3: 58
+ Lv4: 64
+ Lv5: 70
+ Lv6: 76
+ Lv7: 82
+ Lv8: 88
+ Lv9: 94
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 384
+ Name: "WS_MELTDOWN"
+ Description: "Shattering Strike"
+ MaxLevel: 10
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 15000
+ Lv2: 20000
+ Lv3: 25000
+ Lv4: 30000
+ Lv5: 35000
+ Lv6: 40000
+ Lv7: 45000
+ Lv8: 50000
+ Lv9: 55000
+ Lv10: 60000
+ }
+ SkillData2: 5000
+ FixedCastTime: {
+ Lv1: 5
+ Lv2: 5
+ Lv3: 6
+ Lv4: 6
+ Lv5: 7
+ Lv6: 7
+ Lv7: 8
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 50
+ Lv3: 60
+ Lv4: 60
+ Lv5: 70
+ Lv6: 70
+ Lv7: 80
+ Lv8: 80
+ Lv9: 90
+ Lv10: 90
+ }
+ }
+},
+{
+ Id: 387
+ Name: "WS_CARTBOOST"
+ Description: "Cart Boost"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ Requirements: {
+ SPCost: 20
+ State: "Cart"
+ }
+},
+{
+ Id: 389
+ Name: "ST_CHASEWALK"
+ Description: "Stealth"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 500
+ SkillData1: 10000
+ SkillData2: 30000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 390
+ Name: "ST_REJECTSWORD"
+ Description: "Counter Instinct"
+ MaxLevel: 5
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ InterruptCast: true
+ SkillData1: 300000
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 15
+ Lv3: 20
+ Lv4: 25
+ Lv5: 30
+ Lv6: 35
+ Lv7: 40
+ Lv8: 45
+ Lv9: 50
+ Lv10: 55
+ }
+ }
+},
+{
+ Id: 392
+ Name: "CR_ALCHEMY"
+ Description: "Alchemy"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+},
+{
+ Id: 393
+ Name: "CR_SYNTHESISPOTION"
+ Description: "Potion Synthesis"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+},
+{
+ Id: 394
+ Name: "CG_ARROWVULCAN"
+ Description: "Vulcan Arrow"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -9
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1600
+ Lv2: 1760
+ Lv3: 1920
+ Lv4: 2080
+ Lv5: 2240
+ Lv6: 2400
+ Lv7: 2560
+ Lv8: 2720
+ Lv9: 2880
+ Lv10: 3040
+ }
+ AfterCastActDelay: 2000
+ AfterCastWalkDelay: 2000
+ FixedCastTime: {
+ Lv1: 400
+ Lv2: 440
+ Lv3: 480
+ Lv4: 520
+ Lv5: 560
+ Lv6: 600
+ Lv7: 640
+ Lv8: 680
+ Lv9: 720
+ Lv10: 760
+ }
+ SkillDelayOptions: {
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 395
+ Name: "CG_MOONLIT"
+ Description: "Sheltering Bliss"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 3
+ InterruptCast: true
+ KnockBackTiles: 2
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 25000
+ Lv3: 30000
+ Lv4: 35000
+ Lv5: 40000
+ Lv6: 45000
+ Lv7: 50000
+ Lv8: 55000
+ Lv9: 60000
+ Lv10: 65000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xb5
+ Layout: 4
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_ENSEMBLE: true
+ }
+ }
+},
+{
+ Id: 396
+ Name: "CG_MARIONETTE"
+ Description: "Marionette Control"
+ MaxLevel: 1
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ PartyOnly: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 1000
+ Requirements: {
+ SPCost: 100
+ }
+},
+{
+ Id: 397
+ Name: "LK_SPIRALPIERCE"
+ Description: "Spiral Pierce"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 5
+ CastTime: {
+ Lv1: 150
+ Lv2: 250
+ Lv3: 350
+ Lv4: 450
+ Lv5: 500
+ Lv6: 500
+ Lv7: 500
+ Lv8: 500
+ Lv9: 500
+ Lv10: 500
+ }
+ AfterCastActDelay: {
+ Lv1: 1200
+ Lv2: 1400
+ Lv3: 1600
+ Lv4: 1800
+ Lv5: 2000
+ Lv6: 2200
+ Lv7: 2400
+ Lv8: 2600
+ Lv9: 2800
+ Lv10: 3000
+ }
+ SkillData2: 1000
+ FixedCastTime: {
+ Lv1: 150
+ Lv2: 250
+ Lv3: 350
+ Lv4: 450
+ Lv5: 500
+ Lv6: 500
+ Lv7: 500
+ Lv8: 500
+ Lv9: 500
+ Lv10: 500
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 21
+ Lv3: 24
+ Lv4: 27
+ Lv5: 30
+ Lv6: 33
+ Lv7: 36
+ Lv8: 39
+ Lv9: 42
+ Lv10: 45
+ }
+ WeaponTypes: {
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 398
+ Name: "LK_HEADCRUSH"
+ Description: "Traumatic Blow"
+ MaxLevel: 5
+ Range: 4
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 500
+ SkillData2: 120000
+ Requirements: {
+ SPCost: 23
+ }
+},
+{
+ Id: 399
+ Name: "LK_JOINTBEAT"
+ Description: "Vital Strike"
+ MaxLevel: 10
+ Range: 4
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: {
+ Lv1: 800
+ Lv2: 800
+ Lv3: 800
+ Lv4: 800
+ Lv5: 1000
+ Lv6: 1000
+ Lv7: 1000
+ Lv8: 1000
+ Lv9: 1000
+ Lv10: 1000
+ }
+ SkillData2: 30000
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 12
+ Lv3: 14
+ Lv4: 14
+ Lv5: 16
+ Lv6: 16
+ Lv7: 18
+ Lv8: 18
+ Lv9: 20
+ Lv10: 20
+ }
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 400
+ Name: "HW_NAPALMVULCAN"
+ Description: "Napalm Vulcan"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Ghost"
+ DamageType: {
+ SplashArea: true
+ SplitDamage: true
+ }
+ SplashRange: 1
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: 800
+ AfterCastActDelay: 1000
+ SkillData2: 45000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 25
+ Lv3: 40
+ Lv4: 55
+ Lv5: 70
+ Lv6: 85
+ Lv7: 100
+ Lv8: 115
+ Lv9: 130
+ Lv10: 145
+ }
+ }
+},
+{
+ Id: 401
+ Name: "CH_SOULCOLLECT"
+ Description: "Zen"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 600000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 20
+ }
+},
+{
+ Id: 402
+ Name: "PF_MINDBREAKER"
+ Description: "Mind Breaker"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: {
+ Lv1: 800
+ Lv2: 900
+ Lv3: 1000
+ Lv4: 1100
+ Lv5: 1200
+ Lv6: 1300
+ Lv7: 1400
+ Lv8: 1500
+ Lv9: 1600
+ Lv10: 1700
+ }
+ SkillData1: 30000
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 15
+ Lv3: 18
+ Lv4: 21
+ Lv5: 24
+ Lv6: 27
+ Lv7: 30
+ Lv8: 33
+ Lv9: 36
+ Lv10: 39
+ }
+ }
+},
+{
+ Id: 403
+ Name: "PF_MEMORIZE"
+ Description: "Foresight"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ FixedCastTime: 5000
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 404
+ Name: "PF_FOGWALL"
+ Description: "Blinding Mist"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ TargetSelf: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 2
+ SkillData1: 20000
+ SkillData2: 10000
+ Requirements: {
+ SPCost: 25
+ }
+ Unit: {
+ Id: 0xb6
+ Layout: -1
+ Interval: -1
+ Target: "All"
+ }
+},
+{
+ Id: 405
+ Name: "PF_SPIDERWEB"
+ Description: "Fiber Lock"
+ MaxLevel: 1
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillInstances: 3
+ SkillData1: 30000
+ SkillData2: 8000
+ Requirements: {
+ SPCost: 50
+// Items: {
+// Spiderweb: 1
+// }
+ }
+ Unit: {
+ Id: 0xb7
+ Interval: -1
+ Target: "Enemy"
+ }
+},
+{
+ Id: 406
+ Name: "ASC_METEORASSAULT"
+ Description: "Meteor Assault"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ IgnoreCards: true
+ }
+ SplashRange: 2
+ CastTime: 250
+ AfterCastActDelay: 500
+ SkillData2: {
+ Lv1: 10000
+ Lv2: 5000
+ Lv3: 120000
+ Lv4: 120000
+ Lv5: 120000
+ Lv6: 120000
+ Lv7: 120000
+ Lv8: 120000
+ Lv9: 120000
+ Lv10: 120000
+ }
+ FixedCastTime: 250
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 12
+ Lv3: 14
+ Lv4: 16
+ Lv5: 18
+ Lv6: 20
+ Lv7: 22
+ Lv8: 24
+ Lv9: 26
+ Lv10: 28
+ }
+ }
+},
+{
+ Id: 407
+ Name: "ASC_CDP"
+ Description: "Create Deadly Poison"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ AfterCastActDelay: 5000
+ Requirements: {
+ SPCost: 50
+ }
+},
+{
+ Id: 408
+ Name: "WE_BABY"
+ Description: "Baby"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Wedding: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 300000
+ FixedCastTime: 2000
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: 1
+ SPRateCost: -10
+ }
+},
+{
+ Id: 409
+ Name: "WE_CALLPARENT"
+ Description: "Call Parent"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Wedding: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 3
+ InterruptCast: true
+ SkillInstances: 1
+ SkillData1: 20000
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+ Unit: {
+ Id: 0xb2
+ Range: -1
+ Interval: -1
+ }
+},
+{
+ Id: 410
+ Name: "WE_CALLBABY"
+ Description: "Call Baby"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Wedding: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 3
+ InterruptCast: true
+ SkillInstances: 1
+ SkillData1: 20000
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+ Unit: {
+ Id: 0xb2
+ Range: -1
+ Interval: -1
+ }
+},
+{
+ Id: 411
+ Name: "TK_RUN"
+ Description: "Running"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ KnockBackTiles: 4
+ CastTime: {
+ Lv1: 3000
+ Lv2: 2500
+ Lv3: 2000
+ Lv4: 1500
+ Lv5: 100
+ Lv6: 500
+ Lv7: 0
+ Lv8: 0
+ Lv9: 0
+ Lv10: 0
+ }
+ AfterCastActDelay: 300
+ SkillData1: 1000
+ SkillData2: 150000
+ FixedCastTime: {
+ Lv1: 3000
+ Lv2: 2500
+ Lv3: 2000
+ Lv4: 1500
+ Lv5: 1000
+ Lv6: 500
+ Lv7: 0
+ Lv8: 0
+ Lv9: 0
+ Lv10: 0
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 90
+ Lv3: 80
+ Lv4: 70
+ Lv5: 60
+ Lv6: 50
+ Lv7: 40
+ Lv8: 30
+ Lv9: 20
+ Lv10: 10
+ }
+ State: "Moveable"
+ }
+},
+{
+ Id: 412
+ Name: "TK_READYSTORM"
+ Description: "Tornado Stance"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 413
+ Name: "TK_STORMKICK"
+ Description: "Tornado Kick"
+ MaxLevel: 7
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ NumberOfHits: -3
+ Requirements: {
+ SPCost: {
+ Lv1: 14
+ Lv2: 12
+ Lv3: 10
+ Lv4: 8
+ Lv5: 6
+ Lv6: 4
+ Lv7: 2
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 414
+ Name: "TK_READYDOWN"
+ Description: "Heel Drop Stance"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 415
+ Name: "TK_DOWNKICK"
+ Description: "Heel Drop"
+ MaxLevel: 7
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -3
+ SkillData2: 3000
+ Requirements: {
+ SPCost: {
+ Lv1: 14
+ Lv2: 12
+ Lv3: 10
+ Lv4: 8
+ Lv5: 6
+ Lv6: 4
+ Lv7: 2
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 416
+ Name: "TK_READYTURN"
+ Description: "Roundhouse Stance"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 417
+ Name: "TK_TURNKICK"
+ Description: "Roundhouse Kick"
+ MaxLevel: 7
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ NumberOfHits: -3
+ KnockBackTiles: 2
+ SkillData2: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 14
+ Lv2: 12
+ Lv3: 10
+ Lv4: 8
+ Lv5: 6
+ Lv6: 4
+ Lv7: 2
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 418
+ Name: "TK_READYCOUNTER"
+ Description: "Counter Kick Stance"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 419
+ Name: "TK_COUNTER"
+ Description: "Counter Kick"
+ MaxLevel: 7
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ NumberOfHits: -3
+ Requirements: {
+ SPCost: {
+ Lv1: 14
+ Lv2: 12
+ Lv3: 10
+ Lv4: 8
+ Lv5: 6
+ Lv6: 4
+ Lv7: 2
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 420
+ Name: "TK_DODGE"
+ Description: "Tumbling"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 421
+ Name: "TK_JUMPKICK"
+ Description: "Flying Kick"
+ MaxLevel: 7
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: -3
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 60
+ Lv3: 50
+ Lv4: 40
+ Lv5: 30
+ Lv6: 20
+ Lv7: 10
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 422
+ Name: "TK_HPTIME"
+ Description: "Peaceful Break"
+ MaxLevel: 10
+ SplashRange: 1
+ NumberOfHits: 0
+},
+{
+ Id: 423
+ Name: "TK_SPTIME"
+ Description: "Happy Break"
+ MaxLevel: 10
+ SplashRange: 1
+ NumberOfHits: 0
+ SkillData1: 1800000
+},
+{
+ Id: 424
+ Name: "TK_POWER"
+ Description: "Kihop"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 425
+ Name: "TK_SEVENWIND"
+ Description: "Mild Wind"
+ MaxLevel: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: {
+ Lv1: "Ele_Earth"
+ Lv2: "Ele_Wind"
+ Lv3: "Ele_Water"
+ Lv4: "Ele_Fire"
+ Lv5: "Ele_Ghost"
+ Lv6: "Ele_Dark"
+ Lv7: "Ele_Holy"
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 300000
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 20
+ Lv3: 20
+ Lv4: 20
+ Lv5: 50
+ Lv6: 50
+ Lv7: 50
+ Lv8: 50
+ Lv9: 50
+ Lv10: 50
+ }
+ }
+},
+{
+ Id: 426
+ Name: "TK_HIGHJUMP"
+ Description: "Taekwon Jump"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 2500
+ Lv2: 2000
+ Lv3: 1500
+ Lv4: 1000
+ Lv5: 500
+ Lv6: 500
+ Lv7: 500
+ Lv8: 500
+ Lv9: 500
+ Lv10: 500
+ }
+ FixedCastTime: {
+ Lv1: 2500
+ Lv2: 2000
+ Lv3: 1500
+ Lv4: 1000
+ Lv5: 500
+ Lv6: 500
+ Lv7: 500
+ Lv8: 500
+ Lv9: 500
+ Lv10: 500
+ }
+ Requirements: {
+ SPCost: 50
+ }
+},
+{
+ Id: 427
+ Name: "SG_FEEL"
+ Description: "Feeling the Sun Moon and Stars"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ FixedCastTime: 3000
+ Requirements: {
+ SPCost: 100
+ }
+},
+{
+ Id: 428
+ Name: "SG_SUN_WARM"
+ Description: "Warmth of the Sun"
+ MaxLevel: 3
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ InterruptCast: true
+ KnockBackTiles: 2
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 20000
+ Lv3: 60000
+ Lv4: 60000
+ Lv5: 60000
+ Lv6: 60000
+ Lv7: 60000
+ Lv8: 60000
+ Lv9: 60000
+ Lv10: 60000
+ }
+ Requirements: {
+ SPCost: 20
+ }
+ Unit: {
+ Id: 0x86
+ Range: 1
+ Interval: 100
+ Target: "Enemy"
+ }
+},
+{
+ Id: 429
+ Name: "SG_MOON_WARM"
+ Description: "Warmth of the Moon"
+ MaxLevel: 3
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ InterruptCast: true
+ KnockBackTiles: 2
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 20000
+ Lv3: 60000
+ Lv4: 60000
+ Lv5: 60000
+ Lv6: 60000
+ Lv7: 60000
+ Lv8: 60000
+ Lv9: 60000
+ Lv10: 60000
+ }
+ Requirements: {
+ SPCost: 20
+ }
+ Unit: {
+ Id: 0x86
+ Range: 1
+ Interval: 100
+ Target: "Enemy"
+ }
+},
+{
+ Id: 430
+ Name: "SG_STAR_WARM"
+ Description: "Warmth of the Stars"
+ MaxLevel: 3
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ InterruptCast: true
+ KnockBackTiles: 2
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 20000
+ Lv3: 60000
+ Lv4: 60000
+ Lv5: 60000
+ Lv6: 60000
+ Lv7: 60000
+ Lv8: 60000
+ Lv9: 60000
+ Lv10: 60000
+ }
+ Requirements: {
+ SPCost: 10
+ }
+ Unit: {
+ Id: 0x86
+ Range: 1
+ Interval: 100
+ Target: "Enemy"
+ }
+},
+{
+ Id: 431
+ Name: "SG_SUN_COMFORT"
+ Description: "Comfort of the Sun"
+ MaxLevel: 4
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 80000
+ Lv2: 160000
+ Lv3: 240000
+ Lv4: 320000
+ Lv5: 400000
+ Lv6: 480000
+ Lv7: 560000
+ Lv8: 640000
+ Lv9: 720000
+ Lv10: 800000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 60
+ Lv3: 50
+ Lv4: 40
+ Lv5: 30
+ Lv6: 20
+ Lv7: 10
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 432
+ Name: "SG_MOON_COMFORT"
+ Description: "Comfort of the Moon"
+ MaxLevel: 4
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 80000
+ Lv2: 160000
+ Lv3: 240000
+ Lv4: 320000
+ Lv5: 400000
+ Lv6: 480000
+ Lv7: 560000
+ Lv8: 640000
+ Lv9: 720000
+ Lv10: 800000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 60
+ Lv3: 50
+ Lv4: 40
+ Lv5: 30
+ Lv6: 20
+ Lv7: 10
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 433
+ Name: "SG_STAR_COMFORT"
+ Description: "Comfort of the Stars"
+ MaxLevel: 4
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 80000
+ Lv2: 160000
+ Lv3: 240000
+ Lv4: 320000
+ Lv5: 400000
+ Lv6: 480000
+ Lv7: 560000
+ Lv8: 640000
+ Lv9: 720000
+ Lv10: 800000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 60
+ Lv3: 50
+ Lv4: 40
+ Lv5: 30
+ Lv6: 20
+ Lv7: 10
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 434
+ Name: "SG_HATE"
+ Description: "Hatred of the Sun Moon and Stars"
+ MaxLevel: 3
+ Range: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ FixedCastTime: 3000
+ Requirements: {
+ SPCost: 100
+ }
+},
+{
+ Id: 435
+ Name: "SG_SUN_ANGER"
+ Description: "Anger of the Sun"
+ MaxLevel: 3
+ NumberOfHits: 0
+},
+{
+ Id: 436
+ Name: "SG_MOON_ANGER"
+ Description: "Anger of the Moon"
+ MaxLevel: 3
+ NumberOfHits: 0
+},
+{
+ Id: 437
+ Name: "SG_STAR_ANGER"
+ Description: "Anger of the Stars"
+ MaxLevel: 3
+ NumberOfHits: 0
+},
+{
+ Id: 438
+ Name: "SG_SUN_BLESS"
+ Description: "Blessing of the Sun"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 439
+ Name: "SG_MOON_BLESS"
+ Description: "Blessing of the Moon"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 440
+ Name: "SG_STAR_BLESS"
+ Description: "Blessing of the Stars"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 441
+ Name: "SG_DEVIL"
+ Description: "Demon of the Sun Moon and Stars"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 442
+ Name: "SG_FRIEND"
+ Description: "Friend of the Sun Moon and Stars"
+ MaxLevel: 3
+ NumberOfHits: 0
+ SkillData1: 10000
+},
+{
+ Id: 443
+ Name: "SG_KNOWLEDGE"
+ Description: "Knowledge of the Sun Moon and Stars"
+ MaxLevel: 10
+ NumberOfHits: 0
+ SkillData1: 600000
+},
+{
+ Id: 444
+ Name: "SG_FUSION"
+ Description: "Union of the Sun Moon and Stars"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 600000
+ Requirements: {
+ SPCost: 100
+ }
+},
+{
+ Id: 445
+ Name: "SL_ALCHEMIST"
+ Description: "Spirit of the Alchemist"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 446
+ Name: "AM_BERSERKPITCHER"
+ Description: "Aid Berserk Potion"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ Spirit: true
+ PartyOnly: true
+ GuildOnly: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 10
+ SPRateCost: 8
+// Items: {
+// Berserk_Potion: 2
+// }
+ }
+},
+{
+ Id: 447
+ Name: "SL_MONK"
+ Description: "Spirit of the Monk"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 448
+ Name: "SL_STAR"
+ Description: "Spirit of the Star Gladiator"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 800
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 449
+ Name: "SL_SAGE"
+ Description: "Spirit of the Sage"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 450
+ Name: "SL_CRUSADER"
+ Description: "Spirit of the Crusader"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 451
+ Name: "SL_SUPERNOVICE"
+ Description: "Spirit of the Supernovice"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 452
+ Name: "SL_KNIGHT"
+ Description: "Spirit of the Knight"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 453
+ Name: "SL_WIZARD"
+ Description: "Spirit of the Wizard"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 454
+ Name: "SL_PRIEST"
+ Description: "Spirit of the Priest"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 455
+ Name: "SL_BARDDANCER"
+ Description: "Spirit of the Artist"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 456
+ Name: "SL_ROGUE"
+ Description: "Spirit of the Rogue"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 457
+ Name: "SL_ASSASIN"
+ Description: "Spirit of the Assasin"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 458
+ Name: "SL_BLACKSMITH"
+ Description: "Spirit of the Blacksmith"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 459
+ Name: "BS_ADRENALINE2"
+ Description: "Advanced Adrenaline Rush"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Spirit: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ KnockBackTiles: 0
+ SkillData1: 150000
+ Requirements: {
+ SPCost: 64
+ WeaponTypes: {
+ NoWeapon: true
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ }
+ }
+},
+{
+ Id: 460
+ Name: "SL_HUNTER"
+ Description: "Spirit of the Hunter"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 461
+ Name: "SL_SOULLINKER"
+ Description: "Spirit of the Soul Linker"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 462
+ Name: "SL_KAIZEL"
+ Description: "Kaizel"
+ MaxLevel: 7
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 3600
+ Lv2: 3200
+ Lv3: 2800
+ Lv4: 2400
+ Lv5: 2000
+ Lv6: 2000
+ Lv7: 2000
+ Lv8: 2000
+ Lv9: 2000
+ Lv10: 2000
+ }
+ SkillData1: 1800000
+ SkillData2: 2000
+ FixedCastTime: {
+ Lv1: 900
+ Lv2: 800
+ Lv3: 700
+ Lv4: 600
+ Lv5: 500
+ Lv6: 500
+ Lv7: 500
+ Lv8: 500
+ Lv9: 500
+ Lv10: 500
+ }
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 120
+ Lv2: 110
+ Lv3: 100
+ Lv4: 90
+ Lv5: 80
+ Lv6: 70
+ Lv7: 60
+ Lv8: 50
+ Lv9: 40
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 463
+ Name: "SL_KAAHI"
+ Description: "Kaahi"
+ MaxLevel: 7
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 1800000
+ SkillData2: 500
+ Requirements: {
+ SPCost: 30
+ }
+},
+{
+ Id: 464
+ Name: "SL_KAUPE"
+ Description: "Kaupe"
+ MaxLevel: 3
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 400
+ SkillData1: 600000
+ FixedCastTime: 100
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 30
+ Lv3: 40
+ Lv4: 50
+ Lv5: 60
+ Lv6: 70
+ Lv7: 80
+ Lv8: 90
+ Lv9: 100
+ Lv10: 110
+ }
+ }
+},
+{
+ Id: 465
+ Name: "SL_KAITE"
+ Description: "Kaite"
+ MaxLevel: 7
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 4800
+ Lv2: 4400
+ Lv3: 4000
+ Lv4: 3600
+ Lv5: 3200
+ Lv6: 2800
+ Lv7: 2400
+ Lv8: 2400
+ Lv9: 2400
+ Lv10: 2400
+ }
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 120000
+ Lv3: 180000
+ Lv4: 240000
+ Lv5: 300000
+ Lv6: 360000
+ Lv7: 600000
+ Lv8: 600000
+ Lv9: 600000
+ Lv10: 600000
+ }
+ FixedCastTime: {
+ Lv1: 1200
+ Lv2: 1100
+ Lv3: 1000
+ Lv4: 900
+ Lv5: 800
+ Lv6: 700
+ Lv7: 600
+ Lv8: 600
+ Lv9: 600
+ Lv10: 600
+ }
+ Requirements: {
+ SPCost: 70
+ }
+},
+{
+ Id: 466
+ Name: "SL_KAINA"
+ Description: "Kaina"
+ MaxLevel: 7
+ AttackType: "Magic"
+ NumberOfHits: 0
+ InterruptCast: true
+},
+{
+ Id: 467
+ Name: "SL_STIN"
+ Description: "Estin"
+ MaxLevel: 7
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Endowed"
+ KnockBackTiles: 2
+ CastTime: 80
+ AfterCastActDelay: 500
+ FixedCastTime: 20
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 20
+ Lv3: 22
+ Lv4: 24
+ Lv5: 26
+ Lv6: 28
+ Lv7: 30
+ Lv8: 32
+ Lv9: 34
+ Lv10: 36
+ }
+ }
+},
+{
+ Id: 468
+ Name: "SL_STUN"
+ Description: "Estun"
+ MaxLevel: 7
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Endowed"
+ CastTime: 80
+ AfterCastActDelay: 500
+ SkillData1: 2000
+ FixedCastTime: 20
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 20
+ Lv3: 22
+ Lv4: 24
+ Lv5: 26
+ Lv6: 28
+ Lv7: 30
+ Lv8: 32
+ Lv9: 34
+ Lv10: 36
+ }
+ }
+},
+{
+ Id: 469
+ Name: "SL_SMA"
+ Description: "Esma"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Endowed"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: 1600
+ AfterCastActDelay: 500
+ SkillData1: 3000
+ FixedCastTime: 400
+ Requirements: {
+ SPCost: {
+ Lv1: 8
+ Lv2: 16
+ Lv3: 24
+ Lv4: 32
+ Lv5: 40
+ Lv6: 48
+ Lv7: 56
+ Lv8: 64
+ Lv9: 72
+ Lv10: 80
+ }
+ }
+},
+{
+ Id: 470
+ Name: "SL_SWOO"
+ Description: "Eswoo"
+ MaxLevel: 7
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 800
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 5000
+ Lv6: 6000
+ Lv7: 7000
+ Lv8: 8000
+ Lv9: 9000
+ Lv10: 10000
+ }
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: {
+ Lv1: 75
+ Lv2: 65
+ Lv3: 55
+ Lv4: 45
+ Lv5: 35
+ Lv6: 25
+ Lv7: 15
+ Lv8: 5
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 471
+ Name: "SL_SKE"
+ Description: "Eske"
+ MaxLevel: 3
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 2400
+ Lv2: 1600
+ Lv3: 800
+ Lv4: 800
+ Lv5: 800
+ Lv6: 800
+ Lv7: 800
+ Lv8: 800
+ Lv9: 800
+ Lv10: 800
+ }
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 20000
+ Lv3: 30000
+ Lv4: 40000
+ Lv5: 50000
+ Lv6: 60000
+ Lv7: 70000
+ Lv8: 80000
+ Lv9: 90000
+ Lv10: 100000
+ }
+ SkillData2: 3000
+ FixedCastTime: {
+ Lv1: 600
+ Lv2: 400
+ Lv3: 200
+ Lv4: 200
+ Lv5: 200
+ Lv6: 200
+ Lv7: 200
+ Lv8: 200
+ Lv9: 200
+ Lv10: 200
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 55
+ Lv2: 35
+ Lv3: 15
+ Lv4: 1
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 472
+ Name: "SL_SKA"
+ Description: "Eska"
+ MaxLevel: 3
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 2400
+ Lv2: 1600
+ Lv3: 800
+ Lv4: 800
+ Lv5: 800
+ Lv6: 800
+ Lv7: 800
+ Lv8: 800
+ Lv9: 800
+ Lv10: 800
+ }
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 20000
+ Lv3: 30000
+ Lv4: 40000
+ Lv5: 50000
+ Lv6: 60000
+ Lv7: 70000
+ Lv8: 80000
+ Lv9: 90000
+ Lv10: 100000
+ }
+ FixedCastTime: {
+ Lv1: 600
+ Lv2: 400
+ Lv3: 200
+ Lv4: 200
+ Lv5: 200
+ Lv6: 200
+ Lv7: 200
+ Lv8: 200
+ Lv9: 200
+ Lv10: 200
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 80
+ Lv3: 60
+ Lv4: 40
+ Lv5: 20
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 473
+ Name: "SM_SELFPROVOKE"
+ Description: "Provoke Self"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillData1: 30000
+},
+{
+ Id: 474
+ Name: "NPC_EMOTION_ON"
+ Description: "Emotion ON"
+ MaxLevel: 10
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 475
+ Name: "ST_PRESERVE"
+ Description: "Preserve"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 600000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 30
+ }
+},
+{
+ Id: 476
+ Name: "ST_FULLSTRIP"
+ Description: "Divest All"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 75000
+ Lv2: 90000
+ Lv3: 105000
+ Lv4: 120000
+ Lv5: 135000
+ Lv6: 150000
+ Lv7: 165000
+ Lv8: 180000
+ Lv9: 195000
+ Lv10: 210000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 24
+ Lv3: 26
+ Lv4: 28
+ Lv5: 30
+ Lv6: 32
+ Lv7: 34
+ Lv8: 36
+ Lv9: 38
+ Lv10: 40
+ }
+ }
+},
+{
+ Id: 477
+ Name: "WS_WEAPONREFINE"
+ Description: "Upgrade Weapon"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 478
+ Name: "CR_SLIMPITCHER"
+ Description: "Aid Condensed Potion"
+ MaxLevel: 10
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 3
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 30
+// Items: {
+// Red_Slim_Potion: 1
+// Red_Slim_Potion: 1
+// Red_Slim_Potion: 1
+// Red_Slim_Potion: 1
+// Red_Slim_Potion: 1
+// Yellow_Slim_Potion: 1
+// Yellow_Slim_Potion: 1
+// Yellow_Slim_Potion: 1
+// Yellow_Slim_Potion: 1
+// White_Slim_Potion: 1
+// }
+ }
+},
+{
+ Id: 479
+ Name: "CR_FULLPROTECTION"
+ Description: "Full Protection"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 240000
+ Lv3: 360000
+ Lv4: 480000
+ Lv5: 600000
+ Lv6: 720000
+ Lv7: 840000
+ Lv8: 960000
+ Lv9: 1080000
+ Lv10: 1200000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 40
+// Items: {
+// Coating_Bottle: 1
+// }
+ }
+},
+{
+ Id: 480
+ Name: "PA_SHIELDCHAIN"
+ Description: "Shield Chain"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 5
+ CastTime: 800
+ AfterCastActDelay: 1000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: {
+ Lv1: 28
+ Lv2: 31
+ Lv3: 34
+ Lv4: 37
+ Lv5: 40
+ Lv6: 43
+ Lv7: 46
+ Lv8: 49
+ Lv9: 52
+ Lv10: 55
+ }
+ State: "Shield"
+ }
+},
+{
+ Id: 481
+ Name: "HP_MANARECHARGE"
+ Description: "Mana Recharge"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 482
+ Name: "PF_DOUBLECASTING"
+ Description: "Double Casting"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 1600
+ SkillData1: 90000
+ FixedCastTime: 400
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ }
+},
+{
+ Id: 483
+ Name: "HW_GANBANTEIN"
+ Description: "Ganbantein"
+ MaxLevel: 1
+ Range: 16
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ AfterCastActDelay: 5000
+ FixedCastTime: 3000
+ Requirements: {
+ SPCost: 40
+// Items: {
+// Yellow_Gemstone: 1
+// Blue_Gemstone: 1
+// }
+ }
+},
+{
+ Id: 484
+ Name: "HW_GRAVITATION"
+ Description: "Gravitation Field"
+ MaxLevel: 5
+ Range: 18
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ IgnoreElement: true
+ IgnoreDefCards: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 6000
+ Lv3: 7000
+ Lv4: 8000
+ Lv5: 9000
+ Lv6: 10000
+ Lv7: 11000
+ Lv8: 12000
+ Lv9: 13000
+ Lv10: 14000
+ }
+ FixedCastTime: 5000
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 40
+ Lv3: 60
+ Lv4: 80
+ Lv5: 100
+ Lv6: 120
+ Lv7: 140
+ Lv8: 160
+ Lv9: 180
+ Lv10: 200
+ }
+// Items: {
+// Blue_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0xb8
+ Layout: 2
+ Interval: 500
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_DUALMODE: true
+ }
+ }
+},
+{
+ Id: 485
+ Name: "WS_CARTTERMINATION"
+ Description: "Cart Termination"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreCards: true
+ }
+ SkillData2: 5000
+ Requirements: {
+ SPCost: 15
+ ZenyCost: {
+ Lv1: 600
+ Lv2: 700
+ Lv3: 800
+ Lv4: 900
+ Lv5: 1000
+ Lv6: 1100
+ Lv7: 1200
+ Lv8: 1300
+ Lv9: 1400
+ Lv10: 1500
+ }
+ WeaponTypes: {
+ NoWeapon: true
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
+ GrenadeLaunchers: true
+ FuumaShurikens: true
+ }
+ State: "CartBoost"
+ }
+},
+{
+ Id: 486
+ Name: "WS_OVERTHRUSTMAX"
+ Description: "Maximum Power Thrust"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 180000
+ Requirements: {
+ SPCost: 15
+ ZenyCost: {
+ Lv1: 3000
+ Lv2: 3500
+ Lv3: 4000
+ Lv4: 4500
+ Lv5: 5000
+ Lv6: 5500
+ Lv7: 6000
+ Lv8: 6500
+ Lv9: 7000
+ Lv10: 7500
+ }
+ WeaponTypes: {
+ NoWeapon: true
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
+ GrenadeLaunchers: true
+ FuumaShurikens: true
+ }
+ }
+},
+{
+ Id: 487
+ Name: "CG_LONGINGFREEDOM"
+ Description: "Longing for Freedom"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 180000
+ Requirements: {
+ SPCost: 15
+ }
+},
+{
+ Id: 488
+ Name: "CG_HERMODE"
+ Description: "Wand of Hermode"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Ensemble: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 1
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ SkillData2: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 30
+ Lv3: 40
+ Lv4: 50
+ Lv5: 60
+ Lv6: 70
+ Lv7: 80
+ Lv8: 90
+ Lv9: 100
+ Lv10: 110
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+ Unit: {
+ Id: 0xb9
+ Layout: 3
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_ENSEMBLE: true
+ }
+ }
+},
+{
+ Id: 489
+ Name: "CG_TAROTCARD"
+ Description: "Tarot Card of Fate"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ IgnoreFlee: true
+ }
+ CastTime: 500
+ AfterCastActDelay: 3000
+ SkillData2: 30000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 490
+ Name: "CR_ACIDDEMONSTRATION"
+ Description: "Acid Demonstration"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ NumberOfHits: {
+ Lv1: -1
+ Lv2: -2
+ Lv3: -3
+ Lv4: -4
+ Lv5: -5
+ Lv6: -6
+ Lv7: -7
+ Lv8: -8
+ Lv9: -9
+ Lv10: -10
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 30
+// Items: {
+// Fire_Bottle: 1
+// Acid_Bottle: 1
+// }
+ }
+},
+{
+ Id: 491
+ Name: "CR_CULTIVATION"
+ Description: "Plant Cultivation"
+ MaxLevel: 2
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 300000
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Mushroom_Spore: 1
+// Stem: 1
+// }
+ }
+},
+{
+ Id: 492
+ Name: "ITEM_ENCHANTARMS"
+ Description: "Weapon Enchantment"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ Element: {
+ Lv1: "Ele_Neutral"
+ Lv2: "Ele_Water"
+ Lv3: "Ele_Earth"
+ Lv4: "Ele_Fire"
+ Lv5: "Ele_Wind"
+ Lv6: "Ele_Poison"
+ Lv7: "Ele_Holy"
+ Lv8: "Ele_Dark"
+ Lv9: "Ele_Ghost"
+ Lv10: "Ele_Undead"
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 180000
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 493
+ Name: "TK_MISSION"
+ Description: "Taekwon Mission"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 494
+ Name: "SL_HIGH"
+ Description: "Spirit of Rebirth"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 200000
+ Lv3: 250000
+ Lv4: 300000
+ Lv5: 350000
+ Lv6: 400000
+ Lv7: 450000
+ Lv8: 500000
+ Lv9: 550000
+ Lv10: 600000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 460
+ Lv2: 360
+ Lv3: 260
+ Lv4: 160
+ Lv5: 60
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 495
+ Name: "KN_ONEHAND"
+ Description: "Onehand Quicken"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Spirit: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 300000
+ Requirements: {
+ SPCost: 100
+ WeaponTypes: {
+ 1HSwords: true
+ }
+ }
+},
+{
+ Id: 496
+ Name: "AM_TWILIGHT1"
+ Description: "Twilight Alchemy 1"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Spirit: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ FixedCastTime: 3000
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: 200
+// Items: {
+// Medicine_Bowl: 200
+// }
+ }
+},
+{
+ Id: 497
+ Name: "AM_TWILIGHT2"
+ Description: "Twilight Alchemy 2"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Spirit: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ FixedCastTime: 3000
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: 200
+// Items: {
+// Medicine_Bowl: 200
+// }
+ }
+},
+{
+ Id: 498
+ Name: "AM_TWILIGHT3"
+ Description: "Twilight Alchemy 3"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Spirit: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ FixedCastTime: 3000
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: 200
+// Items: {
+// Medicine_Bowl: 200
+// }
+ }
+},
+{
+ Id: 499
+ Name: "HT_POWER"
+ Description: "Beast Strafing"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Spirit: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 2
+ AfterCastActDelay: 100
+ SkillData1: 100
+ Requirements: {
+ SPCost: 12
+ WeaponTypes: {
+ Bows: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 500
+ Name: "GS_GLITTERING"
+ Description: "Flip the Coin"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ SkillData1: 600000
+ Requirements: {
+ SPCost: 2
+ ZenyCost: 1
+ }
+},
+{
+ Id: 501
+ Name: "GS_FLING"
+ Description: "Fling"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreElement: true
+ IgnoreFlee: true
+ }
+ SkillData1: 30000
+ Requirements: {
+ SPCost: 10
+ SpiritSphereCost: 5
+ }
+},
+{
+ Id: 502
+ Name: "GS_TRIPLEACTION"
+ Description: "Triple Action"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 3
+ Requirements: {
+ SPCost: 20
+ AmmoTypes: "All"
+ AmmoAmount: 1
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 503
+ Name: "GS_BULLSEYE"
+ Description: "Bulls Eye"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreCards: true
+ }
+ CastTime: 800
+ AfterCastActDelay: 1000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: 30
+ AmmoTypes: "All"
+ AmmoAmount: 1
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 504
+ Name: "GS_MADNESSCANCEL"
+ Description: "Madness Canceller"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 1600
+ AfterCastActDelay: 3000
+ SkillData1: 15000
+ FixedCastTime: 400
+ Requirements: {
+ SPCost: 30
+ SpiritSphereCost: 4
+ }
+},
+{
+ Id: 505
+ Name: "GS_ADJUSTMENT"
+ Description: "AdJustment"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 800
+ AfterCastActDelay: 2000
+ SkillData1: 30000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: 15
+ SpiritSphereCost: 2
+ }
+},
+{
+ Id: 506
+ Name: "GS_INCREASING"
+ Description: "Increasing Accuracy"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 60000
+ Requirements: {
+ SPCost: 30
+ SpiritSphereCost: 4
+ }
+},
+{
+ Id: 507
+ Name: "GS_MAGICALBULLET"
+ Description: "Magical Bullet"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Ghost"
+ Requirements: {
+ SPCost: 7
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 508
+ Name: "GS_CRACKER"
+ Description: "Cracker"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData2: 5000
+ Requirements: {
+ SPCost: 10
+ AmmoTypes: "All"
+ AmmoAmount: 1
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 509
+ Name: "GS_SINGLEACTION"
+ Description: "Single Action"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 510
+ Name: "GS_SNAKEEYE"
+ Description: "Snake Eye"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 511
+ Name: "GS_CHAINACTION"
+ Description: "Chain Action"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_MULTIHIT"
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 2
+},
+{
+ Id: 512
+ Name: "GS_TRACKING"
+ Description: "Tracking"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ InterruptCast: true
+ CastTime: {
+ Lv1: 600
+ Lv2: 700
+ Lv3: 800
+ Lv4: 900
+ Lv5: 1000
+ Lv6: 1100
+ Lv7: 1200
+ Lv8: 1300
+ Lv9: 1400
+ Lv10: 1500
+ }
+ AfterCastActDelay: 1500
+ FixedCastTime: {
+ Lv1: 600
+ Lv2: 700
+ Lv3: 800
+ Lv4: 900
+ Lv5: 1000
+ Lv6: 1100
+ Lv7: 1200
+ Lv8: 1300
+ Lv9: 1400
+ Lv10: 1500
+ }
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 20
+ Lv3: 25
+ Lv4: 30
+ Lv5: 35
+ Lv6: 40
+ Lv7: 45
+ Lv8: 50
+ Lv9: 55
+ Lv10: 60
+ }
+ WeaponTypes: {
+ Revolvers: true
+ Rifles: true
+ }
+ AmmoTypes: {
+ A_BULLET: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 513
+ Name: "GS_DISARM"
+ Description: "Disarm"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ CastTime: 1600
+ AfterCastActDelay: 1000
+ SkillData1: 30000
+ FixedCastTime: 400
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 20
+ Lv3: 25
+ Lv4: 30
+ Lv5: 35
+ Lv6: 40
+ Lv7: 45
+ Lv8: 50
+ Lv9: 55
+ Lv10: 60
+ }
+ WeaponTypes: {
+ Revolvers: true
+ Rifles: true
+ }
+ AmmoTypes: {
+ A_BULLET: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 514
+ Name: "GS_PIERCINGSHOT"
+ Description: "Piercing Shot"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreDefense: true
+ }
+ CastTime: 1200
+ AfterCastActDelay: 500
+ SkillData2: 120000
+ FixedCastTime: 300
+ Requirements: {
+ SPCost: {
+ Lv1: 11
+ Lv2: 12
+ Lv3: 13
+ Lv4: 14
+ Lv5: 15
+ Lv6: 16
+ Lv7: 17
+ Lv8: 18
+ Lv9: 19
+ Lv10: 20
+ }
+ WeaponTypes: {
+ Revolvers: true
+ Rifles: true
+ }
+ AmmoTypes: {
+ A_BULLET: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 515
+ Name: "GS_RAPIDSHOWER"
+ Description: "Rapid Shower"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 5
+ AfterCastActDelay: 1500
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 24
+ Lv3: 26
+ Lv4: 28
+ Lv5: 30
+ Lv6: 32
+ Lv7: 34
+ Lv8: 36
+ Lv9: 38
+ Lv10: 40
+ }
+ WeaponTypes: {
+ Revolvers: true
+ }
+ AmmoTypes: {
+ A_BULLET: true
+ }
+ AmmoAmount: 5
+ }
+},
+{
+ Id: 516
+ Name: "GS_DESPERADO"
+ Description: "Desperado"
+ MaxLevel: 10
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+ AfterCastActDelay: 1000
+ AfterCastWalkDelay: 1000
+ SkillData1: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 32
+ Lv2: 34
+ Lv3: 36
+ Lv4: 38
+ Lv5: 40
+ Lv6: 42
+ Lv7: 44
+ Lv8: 46
+ Lv9: 48
+ Lv10: 50
+ }
+ WeaponTypes: {
+ Revolvers: true
+ }
+ AmmoTypes: {
+ A_BULLET: true
+ }
+ AmmoAmount: 10
+ }
+ Unit: {
+ Id: 0x86
+ Layout: 3
+ Interval: 100
+ Target: "Enemy"
+ }
+},
+{
+ Id: 517
+ Name: "GS_GATLINGFEVER"
+ Description: "Gatling Fever"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 800
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 32
+ Lv3: 34
+ Lv4: 36
+ Lv5: 38
+ Lv6: 40
+ Lv7: 42
+ Lv8: 44
+ Lv9: 46
+ Lv10: 48
+ }
+ WeaponTypes: {
+ GatlingGuns: true
+ }
+ }
+},
+{
+ Id: 518
+ Name: "GS_DUST"
+ Description: "Dust"
+ MaxLevel: 10
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ KnockBackTiles: 5
+ CastTime: 1200
+ AfterCastActDelay: 1000
+ FixedCastTime: 300
+ Requirements: {
+ SPCost: {
+ Lv1: 3
+ Lv2: 6
+ Lv3: 9
+ Lv4: 12
+ Lv5: 15
+ Lv6: 18
+ Lv7: 21
+ Lv8: 24
+ Lv9: 27
+ Lv10: 30
+ }
+ WeaponTypes: {
+ Shotguns: true
+ }
+ AmmoTypes: {
+ A_BULLET: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 519
+ Name: "GS_FULLBUSTER"
+ Description: "Full Buster"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ InterruptCast: true
+ CastTime: 800
+ AfterCastActDelay: {
+ Lv1: 1200
+ Lv2: 1400
+ Lv3: 1600
+ Lv4: 1800
+ Lv5: 2000
+ Lv6: 2200
+ Lv7: 2400
+ Lv8: 2600
+ Lv9: 2800
+ Lv10: 3000
+ }
+ SkillData2: 10000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+ WeaponTypes: {
+ Shotguns: true
+ }
+ AmmoTypes: {
+ A_BULLET: true
+ }
+ AmmoAmount: {
+ Lv1: 2
+ Lv2: 2
+ Lv3: 4
+ Lv4: 4
+ Lv5: 6
+ Lv6: 6
+ Lv7: 8
+ Lv8: 8
+ Lv9: 10
+ Lv10: 10
+ }
+ }
+},
+{
+ Id: 520
+ Name: "GS_SPREADATTACK"
+ Description: "Spread Attack"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 2
+ Lv5: 2
+ Lv6: 2
+ Lv7: 3
+ Lv8: 3
+ Lv9: 3
+ Lv10: 4
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 20
+ Lv3: 25
+ Lv4: 30
+ Lv5: 35
+ Lv6: 40
+ Lv7: 45
+ Lv8: 50
+ Lv9: 55
+ Lv10: 60
+ }
+ WeaponTypes: {
+ Shotguns: true
+ GrenadeLaunchers: true
+ }
+ AmmoTypes: {
+ A_BULLET: true
+ }
+ AmmoAmount: 5
+ }
+},
+{
+ Id: 521
+ Name: "GS_GROUNDDRIFT"
+ Description: "Ground Drift"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ SplashRange: 1
+ KnockBackTiles: 3
+ CastTime: 800
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 3000
+ Lv2: 6000
+ Lv3: 9000
+ Lv4: 12000
+ Lv5: 15000
+ Lv6: 18000
+ Lv7: 21000
+ Lv8: 24000
+ Lv9: 27000
+ Lv10: 30000
+ }
+ SkillData2: 10000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: {
+ Lv1: 4
+ Lv2: 8
+ Lv3: 12
+ Lv4: 16
+ Lv5: 20
+ Lv6: 24
+ Lv7: 28
+ Lv8: 32
+ Lv9: 36
+ Lv10: 40
+ }
+ WeaponTypes: {
+ GrenadeLaunchers: true
+ }
+ AmmoTypes: {
+ A_GRENADE: true
+ }
+ AmmoAmount: 1
+ }
+ Unit: {
+ Id: 0xbe
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ }
+},
+{
+ Id: 522
+ Name: "NJ_TOBIDOUGU"
+ Description: "Shuriken Training"
+ MaxLevel: 10
+ AttackType: "Weapon"
+},
+{
+ Id: 523
+ Name: "NJ_SYURIKEN"
+ Description: "Throw Shuriken"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ Requirements: {
+ SPCost: 2
+ AmmoTypes: {
+ A_SHURIKEN: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 524
+ Name: "NJ_KUNAI"
+ Description: "Throw Kunai"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ NumberOfHits: 3
+ AfterCastActDelay: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 25
+ Lv3: 20
+ Lv4: 15
+ Lv5: 10
+ Lv6: 5
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ AmmoTypes: {
+ A_KUNAI: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 525
+ Name: "NJ_HUUMA"
+ Description: "Throw Huuma Shuriken"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ NumberOfHits: {
+ Lv1: -3
+ Lv2: -3
+ Lv3: -4
+ Lv4: -4
+ Lv5: -5
+ Lv6: -5
+ Lv7: -6
+ Lv8: -6
+ Lv9: -7
+ Lv10: -7
+ }
+ CastTime: {
+ Lv1: 2400
+ Lv2: 2400
+ Lv3: 2400
+ Lv4: 2400
+ Lv5: 2400
+ Lv6: 2400
+ Lv7: 2400
+ Lv8: 2400
+ Lv9: 2400
+ Lv10: 2400
+ }
+ AfterCastActDelay: 2000
+ SkillData1: 100
+ FixedCastTime: 600
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+ WeaponTypes: {
+ FuumaShurikens: true
+ }
+ }
+ Unit: {
+ Id: 0x86
+ Range: 2
+ Interval: 100
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 526
+ Name: "NJ_ZENYNAGE"
+ Description: "Throw Zeny"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ IgnoreElement: true
+ IgnoreFlee: true
+ }
+ AfterCastActDelay: 5000
+ Requirements: {
+ SPCost: 50
+ ZenyCost: {
+ Lv1: 500
+ Lv2: 1000
+ Lv3: 1500
+ Lv4: 2000
+ Lv5: 2500
+ Lv6: 3000
+ Lv7: 3500
+ Lv8: 4000
+ Lv9: 4500
+ Lv10: 5000
+ }
+ }
+},
+{
+ Id: 527
+ Name: "NJ_TATAMIGAESHI"
+ Description: "Improvised Defense"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ KnockBackTiles: 4
+ AfterCastActDelay: 3000
+ SkillData1: 3000
+ SkillData2: 3000
+ Requirements: {
+ SPCost: 15
+ }
+ Unit: {
+ Id: 0xbc
+ Layout: -1
+ Interval: 2000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 528
+ Name: "NJ_KASUMIKIRI"
+ Description: "Vanishing Slash"
+ MaxLevel: 10
+ Range: -1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 60000
+ Lv3: 90000
+ Lv4: 120000
+ Lv5: 150000
+ Lv6: 180000
+ Lv7: 210000
+ Lv8: 240000
+ Lv9: 270000
+ Lv10: 300000
+ }
+ Requirements: {
+ SPCost: 15
+ }
+},
+{
+ Id: 529
+ Name: "NJ_SHADOWJUMP"
+ Description: "Shadow Leap"
+ MaxLevel: 5
+ Range: {
+ Lv1: 7
+ Lv2: 9
+ Lv3: 11
+ Lv4: 13
+ Lv5: 15
+ Lv6: 17
+ Lv7: 19
+ Lv8: 21
+ Lv9: 23
+ Lv10: 25
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ Requirements: {
+ SPCost: 10
+ State: "Hiding"
+ }
+},
+{
+ Id: 530
+ Name: "NJ_KIRIKAGE"
+ Description: "Shadow Slash"
+ MaxLevel: 5
+ Range: {
+ Lv1: 7
+ Lv2: 9
+ Lv3: 11
+ Lv4: 13
+ Lv5: 15
+ Lv6: 17
+ Lv7: 19
+ Lv8: 21
+ Lv9: 23
+ Lv10: 25
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: 10
+ State: "Hiding"
+ }
+},
+{
+ Id: 531
+ Name: "NJ_UTSUSEMI"
+ Description: "Cicada Skin Sheeding"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ KnockBackTiles: 7
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 15
+ Lv3: 18
+ Lv4: 21
+ Lv5: 24
+ Lv6: 27
+ Lv7: 30
+ Lv8: 33
+ Lv9: 36
+ Lv10: 39
+ }
+ }
+},
+{
+ Id: 532
+ Name: "NJ_BUNSINJYUTSU"
+ Description: "Mirror Image"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 3200
+ Lv2: 2800
+ Lv3: 2400
+ Lv4: 2000
+ Lv5: 1600
+ Lv6: 1200
+ Lv7: 800
+ Lv8: 800
+ Lv9: 800
+ Lv10: 800
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 80000
+ Lv3: 100000
+ Lv4: 120000
+ Lv5: 140000
+ Lv6: 160000
+ Lv7: 180000
+ Lv8: 200000
+ Lv9: 220000
+ Lv10: 240000
+ }
+ FixedCastTime: {
+ Lv1: 800
+ Lv2: 700
+ Lv3: 600
+ Lv4: 500
+ Lv5: 400
+ Lv6: 300
+ Lv7: 200
+ Lv8: 200
+ Lv9: 200
+ Lv10: 200
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 32
+ Lv3: 34
+ Lv4: 36
+ Lv5: 38
+ Lv6: 40
+ Lv7: 42
+ Lv8: 44
+ Lv9: 46
+ Lv10: 48
+ }
+// Items: {
+// Shadow_Orb: 1
+// }
+ }
+},
+{
+ Id: 533
+ Name: "NJ_NINPOU"
+ Description: "Spirit of the Blade"
+ MaxLevel: 10
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 534
+ Name: "NJ_KOUENKA"
+ Description: "Crimson Fire Petal"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 560
+ Lv2: 1120
+ Lv3: 1680
+ Lv4: 2240
+ Lv5: 2800
+ Lv6: 3360
+ Lv7: 3840
+ Lv8: 4480
+ Lv9: 5040
+ Lv10: 5600
+ }
+ FixedCastTime: {
+ Lv1: 140
+ Lv2: 280
+ Lv3: 420
+ Lv4: 560
+ Lv5: 700
+ Lv6: 840
+ Lv7: 960
+ Lv8: 1120
+ Lv9: 1260
+ Lv10: 1400
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 20
+ Lv3: 22
+ Lv4: 24
+ Lv5: 26
+ Lv6: 28
+ Lv7: 30
+ Lv8: 32
+ Lv9: 34
+ Lv10: 36
+ }
+ }
+},
+{
+ Id: 535
+ Name: "NJ_KAENSIN"
+ Description: "Crimson Fire Formation"
+ MaxLevel: 10
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ InterruptCast: true
+ CastTime: {
+ Lv1: 4800
+ Lv2: 4400
+ Lv3: 4000
+ Lv4: 3600
+ Lv5: 3200
+ Lv6: 2800
+ Lv7: 2400
+ Lv8: 2000
+ Lv9: 1600
+ Lv10: 1200
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 20000
+ FixedCastTime: {
+ Lv1: 1200
+ Lv2: 1100
+ Lv3: 1000
+ Lv4: 900
+ Lv5: 800
+ Lv6: 700
+ Lv7: 600
+ Lv8: 500
+ Lv9: 400
+ Lv10: 300
+ }
+ Requirements: {
+ SPCost: 25
+// Items: {
+// Flame_Stone: 1
+// }
+ }
+ Unit: {
+ Id: 0xbd
+ Layout: -1
+ Interval: 20
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 536
+ Name: "NJ_BAKUENRYU"
+ Description: "Raging Fire Dragon"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ NumberOfHits: 3
+ InterruptCast: true
+ CastTime: 2400
+ AfterCastActDelay: 2000
+ FixedCastTime: 600
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+// Items: {
+// Flame_Stone: 1
+// }
+ }
+},
+{
+ Id: 537
+ Name: "NJ_HYOUSENSOU"
+ Description: "Spear of Ice"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ NumberOfHits: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 560
+ Lv2: 1120
+ Lv3: 1680
+ Lv4: 2240
+ Lv5: 2800
+ Lv6: 3360
+ Lv7: 3840
+ Lv8: 4480
+ Lv9: 5040
+ Lv10: 5600
+ }
+ FixedCastTime: {
+ Lv1: 140
+ Lv2: 280
+ Lv3: 420
+ Lv4: 560
+ Lv5: 700
+ Lv6: 840
+ Lv7: 960
+ Lv8: 1120
+ Lv9: 1260
+ Lv10: 1400
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 18
+ Lv3: 21
+ Lv4: 24
+ Lv5: 27
+ Lv6: 30
+ Lv7: 33
+ Lv8: 36
+ Lv9: 39
+ Lv10: 42
+ }
+ }
+},
+{
+ Id: 538
+ Name: "NJ_SUITON"
+ Description: "Hidden Water"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2400
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 15000
+ Lv2: 20000
+ Lv3: 25000
+ Lv4: 30000
+ Lv5: 35000
+ Lv6: 40000
+ Lv7: 45000
+ Lv8: 50000
+ Lv9: 55000
+ Lv10: 60000
+ }
+ SkillData2: {
+ Lv1: 15000
+ Lv2: 20000
+ Lv3: 25000
+ Lv4: 30000
+ Lv5: 35000
+ Lv6: 40000
+ Lv7: 45000
+ Lv8: 50000
+ Lv9: 55000
+ Lv10: 60000
+ }
+ FixedCastTime: 600
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 18
+ Lv3: 21
+ Lv4: 24
+ Lv5: 27
+ Lv6: 30
+ Lv7: 33
+ Lv8: 36
+ Lv9: 39
+ Lv10: 42
+ }
+// Items: {
+// Ice_Stone: 1
+// }
+ }
+ Unit: {
+ Id: 0xbb
+ Layout: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 2
+ Lv5: 2
+ Lv6: 2
+ Lv7: 3
+ Lv8: 3
+ Lv9: 3
+ Lv10: 4
+ }
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 539
+ Name: "NJ_HYOUSYOURAKU"
+ Description: "Ice Meteor"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1600
+ Lv2: 2000
+ Lv3: 2400
+ Lv4: 2800
+ Lv5: 3200
+ Lv6: 3200
+ Lv7: 3200
+ Lv8: 3200
+ Lv9: 3200
+ Lv10: 3200
+ }
+ AfterCastActDelay: 2000
+ SkillData2: {
+ Lv1: 10000
+ Lv2: 11000
+ Lv3: 12000
+ Lv4: 13000
+ Lv5: 14000
+ Lv6: 15000
+ Lv7: 16000
+ Lv8: 17000
+ Lv9: 18000
+ Lv10: 19000
+ }
+ FixedCastTime: {
+ Lv1: 400
+ Lv2: 500
+ Lv3: 600
+ Lv4: 700
+ Lv5: 800
+ Lv6: 800
+ Lv7: 800
+ Lv8: 800
+ Lv9: 800
+ Lv10: 800
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+// Items: {
+// Ice_Stone: 1
+// }
+ }
+},
+{
+ Id: 540
+ Name: "NJ_HUUJIN"
+ Description: "Wind Blade"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 2
+ Lv4: 3
+ Lv5: 3
+ Lv6: 4
+ Lv7: 4
+ Lv8: 5
+ Lv9: 5
+ Lv10: 6
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 800
+ Lv2: 1200
+ Lv3: 1600
+ Lv4: 2000
+ Lv5: 2400
+ Lv6: 2800
+ Lv7: 3200
+ Lv8: 3600
+ Lv9: 4000
+ Lv10: 4400
+ }
+ AfterCastActDelay: 1000
+ FixedCastTime: {
+ Lv1: 200
+ Lv2: 300
+ Lv3: 400
+ Lv4: 500
+ Lv5: 600
+ Lv6: 700
+ Lv7: 800
+ Lv8: 900
+ Lv9: 1000
+ Lv10: 1100
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 541
+ Name: "NJ_RAIGEKISAI"
+ Description: "Lightning Strike of Destruction"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 2
+ Lv3: 3
+ Lv4: 3
+ Lv5: 4
+ Lv6: 4
+ Lv7: 5
+ Lv8: 5
+ Lv9: 6
+ Lv10: 6
+ }
+ InterruptCast: true
+ CastTime: 3200
+ SkillData1: 100
+ FixedCastTime: 800
+ Requirements: {
+ SPCost: {
+ Lv1: 16
+ Lv2: 20
+ Lv3: 24
+ Lv4: 28
+ Lv5: 32
+ Lv6: 36
+ Lv7: 40
+ Lv8: 44
+ Lv9: 48
+ Lv10: 52
+ }
+// Items: {
+// Wind_Stone: 1
+// }
+ }
+ Unit: {
+ Id: 0x86
+ Range: {
+ Lv1: 3
+ Lv2: 3
+ Lv3: 4
+ Lv4: 4
+ Lv5: 5
+ Lv6: 5
+ Lv7: 6
+ Lv8: 6
+ Lv9: 7
+ Lv10: 7
+ }
+ Interval: 100
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 542
+ Name: "NJ_KAMAITACHI"
+ Description: "Kamaitachi"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ SplashRange: 3
+ InterruptCast: true
+ SkillInstances: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ CastTime: 3200
+ FixedCastTime: 800
+ Requirements: {
+ SPCost: {
+ Lv1: 24
+ Lv2: 28
+ Lv3: 32
+ Lv4: 36
+ Lv5: 40
+ Lv6: 44
+ Lv7: 48
+ Lv8: 52
+ Lv9: 56
+ Lv10: 60
+ }
+// Items: {
+// Wind_Stone: 1
+// }
+ }
+},
+{
+ Id: 543
+ Name: "NJ_NEN"
+ Description: "Soul"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 4000
+ Lv2: 3200
+ Lv3: 2400
+ Lv4: 1600
+ Lv5: 800
+ Lv6: 800
+ Lv7: 800
+ Lv8: 800
+ Lv9: 800
+ Lv10: 800
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: {
+ Lv1: 1000
+ Lv2: 800
+ Lv3: 600
+ Lv4: 400
+ Lv5: 200
+ Lv6: 200
+ Lv7: 200
+ Lv8: 200
+ Lv9: 200
+ Lv10: 200
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 30
+ Lv3: 40
+ Lv4: 50
+ Lv5: 60
+ Lv6: 70
+ Lv7: 80
+ Lv8: 90
+ Lv9: 100
+ Lv10: 110
+ }
+ HPRateCost: -5
+ }
+},
+{
+ Id: 544
+ Name: "NJ_ISSEN"
+ Description: "Final Strike"
+ MaxLevel: 10
+ Range: -5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 55
+ Lv2: 60
+ Lv3: 65
+ Lv4: 70
+ Lv5: 75
+ Lv6: 80
+ Lv7: 85
+ Lv8: 90
+ Lv9: 95
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 653
+ Name: "NPC_EARTHQUAKE"
+ Description: "Earthquake"
+ MaxLevel: 10
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ IgnoreLandProtector: true
+ ShowSkillScale: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ SplashArea: true
+ SplitDamage: true
+ IgnoreDefense: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 7
+ Lv3: 9
+ Lv4: 11
+ Lv5: 13
+ Lv6: 5
+ Lv7: 7
+ Lv8: 9
+ Lv9: 11
+ Lv10: 13
+ }
+ SkillData1: 900
+ FixedCastTime: -1
+ Unit: {
+ Id: 0xc6
+ Range: {
+ Lv1: 5
+ Lv2: 7
+ Lv3: 9
+ Lv4: 11
+ Lv5: 13
+ Lv6: 5
+ Lv7: 7
+ Lv8: 9
+ Lv9: 11
+ Lv10: 13
+ }
+ Interval: 300
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 654
+ Name: "NPC_FIREBREATH"
+ Description: "Fire Breath"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ SplashRange: 5
+ SkillInstances: 14
+},
+{
+ Id: 655
+ Name: "NPC_ICEBREATH"
+ Description: "Ice Breath"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Water"
+ SplashRange: 5
+ SkillInstances: 14
+ SkillData2: 12000
+ FixedCastTime: -1
+},
+{
+ Id: 656
+ Name: "NPC_THUNDERBREATH"
+ Description: "Thunder Breath"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Wind"
+ SplashRange: 5
+ SkillInstances: 14
+},
+{
+ Id: 657
+ Name: "NPC_ACIDBREATH"
+ Description: "Acid Breath"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Poison"
+ SplashRange: 5
+ SkillInstances: 14
+ SkillData2: 60000
+ FixedCastTime: -1
+},
+{
+ Id: 658
+ Name: "NPC_DARKNESSBREATH"
+ Description: "Darkness Breath"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Dark"
+ SplashRange: 5
+ SkillInstances: 14
+},
+{
+ Id: 659
+ Name: "NPC_DRAGONFEAR"
+ Description: "Dragon Fear"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 5
+ Lv3: 8
+ Lv4: 11
+ Lv5: 14
+ Lv6: 17
+ Lv7: 20
+ Lv8: 23
+ Lv9: 26
+ Lv10: 29
+ }
+ SkillData2: {
+ Lv1: 5000
+ Lv2: 30000
+ Lv3: 30000
+ Lv4: 120000
+ Lv5: 120000
+ Lv6: 120000
+ Lv7: 120000
+ Lv8: 120000
+ Lv9: 120000
+ Lv10: 120000
+ }
+ FixedCastTime: -1
+},
+{
+ Id: 660
+ Name: "NPC_BLEEDING"
+ Description: "Bleeding"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData2: 120000
+ FixedCastTime: -1
+},
+{
+ Id: 661
+ Name: "NPC_PULSESTRIKE"
+ Description: "Pulse Strike"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 7
+ KnockBackTiles: 7
+},
+{
+ Id: 662
+ Name: "NPC_HELLJUDGEMENT"
+ Description: "Hell's Judgement"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 14
+ SkillData2: 30000
+ FixedCastTime: -1
+},
+{
+ Id: 663
+ Name: "NPC_WIDESILENCE"
+ Description: "Wide Silence"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 5
+ Lv3: 8
+ Lv4: 11
+ Lv5: 14
+ Lv6: 17
+ Lv7: 20
+ Lv8: 23
+ Lv9: 26
+ Lv10: 29
+ }
+ SkillData2: 30000
+ FixedCastTime: -1
+},
+{
+ Id: 664
+ Name: "NPC_WIDEFREEZE"
+ Description: "Wide Freeze"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 5
+ Lv3: 8
+ Lv4: 11
+ Lv5: 14
+ Lv6: 17
+ Lv7: 20
+ Lv8: 23
+ Lv9: 26
+ Lv10: 29
+ }
+ SkillData2: 12000
+ FixedCastTime: -1
+},
+{
+ Id: 665
+ Name: "NPC_WIDEBLEEDING"
+ Description: "Wide Bleeding"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 5
+ Lv3: 8
+ Lv4: 11
+ Lv5: 14
+ Lv6: 17
+ Lv7: 20
+ Lv8: 23
+ Lv9: 26
+ Lv10: 29
+ }
+ SkillData2: 120000
+ FixedCastTime: -1
+},
+{
+ Id: 666
+ Name: "NPC_WIDESTONE"
+ Description: "Wide Petrify"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 5
+ Lv3: 8
+ Lv4: 11
+ Lv5: 14
+ Lv6: 17
+ Lv7: 20
+ Lv8: 23
+ Lv9: 26
+ Lv10: 29
+ }
+ SkillData2: 20000
+ FixedCastTime: -1
+},
+{
+ Id: 667
+ Name: "NPC_WIDECONFUSE"
+ Description: "Wide Confusion"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 5
+ Lv3: 8
+ Lv4: 11
+ Lv5: 14
+ Lv6: 17
+ Lv7: 20
+ Lv8: 23
+ Lv9: 26
+ Lv10: 29
+ }
+ SkillData2: 30000
+ FixedCastTime: -1
+},
+{
+ Id: 668
+ Name: "NPC_WIDESLEEP"
+ Description: "Wide Sleep"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 5
+ Lv3: 8
+ Lv4: 11
+ Lv5: 14
+ Lv6: 17
+ Lv7: 20
+ Lv8: 23
+ Lv9: 26
+ Lv10: 29
+ }
+ SkillData2: 30000
+ FixedCastTime: -1
+},
+{
+ Id: 669
+ Name: "NPC_WIDESIGHT"
+ Description: "Wide Sight"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 5
+ SkillData1: 10000
+ FixedCastTime: -1
+},
+{
+ Id: 670
+ Name: "NPC_EVILLAND"
+ Description: "Evil Land"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Dark"
+ DamageType: {
+ NoDamage: true
+ IgnoreElement: true
+ IgnoreDefCards: true
+ }
+ SkillData1: 30000
+ SkillData2: 30000
+ FixedCastTime: -1
+ Unit: {
+ Id: 0xc7
+ Layout: 1
+ Range: {
+ Lv1: 4
+ Lv2: 7
+ Lv3: 10
+ Lv4: 13
+ Lv5: 16
+ Lv6: 19
+ Lv7: 22
+ Lv8: 25
+ Lv9: 28
+ Lv10: 31
+ }
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_NOOVERLAP: true
+ }
+ }
+},
+{
+ Id: 671
+ Name: "NPC_MAGICMIRROR"
+ Description: "Magic Mirror"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 30000
+ FixedCastTime: -1
+},
+{
+ Id: 672
+ Name: "NPC_SLOWCAST"
+ Description: "Slow Cast"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 5
+ Lv3: 8
+ Lv4: 11
+ Lv5: 14
+ Lv6: 17
+ Lv7: 20
+ Lv8: 23
+ Lv9: 26
+ Lv10: 29
+ }
+ SkillData2: 30000
+ FixedCastTime: -1
+},
+{
+ Id: 673
+ Name: "NPC_CRITICALWOUND"
+ Description: "Critical Wounds"
+ MaxLevel: 5
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData2: 30000
+ FixedCastTime: -1
+},
+{
+ Id: 674
+ Name: "NPC_EXPULSION"
+ Description: "Expulsion"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ Element: "Ele_Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 675
+ Name: "NPC_STONESKIN"
+ Description: "Stone Skin"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 30000
+ FixedCastTime: -1
+},
+{
+ Id: 676
+ Name: "NPC_ANTIMAGIC"
+ Description: "Anti Magic"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 30000
+ FixedCastTime: -1
+},
+{
+ Id: 677
+ Name: "NPC_WIDECURSE"
+ Description: "Wide Curse"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 5
+ Lv3: 8
+ Lv4: 11
+ Lv5: 14
+ Lv6: 17
+ Lv7: 20
+ Lv8: 23
+ Lv9: 26
+ Lv10: 29
+ }
+ SkillData2: 30000
+ FixedCastTime: -1
+},
+{
+ Id: 678
+ Name: "NPC_WIDESTUN"
+ Description: "Wide Stun"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 5
+ Lv3: 8
+ Lv4: 11
+ Lv5: 14
+ Lv6: 17
+ Lv7: 20
+ Lv8: 23
+ Lv9: 26
+ Lv10: 29
+ }
+ SkillData2: 5000
+ FixedCastTime: -1
+},
+{
+ Id: 679
+ Name: "NPC_VAMPIRE_GIFT"
+ Description: "Vampire Gift"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 7
+ Lv3: 9
+ Lv4: 11
+ Lv5: 13
+ Lv6: 13
+ Lv7: 13
+ Lv8: 13
+ Lv9: 13
+ Lv10: 13
+ }
+},
+{
+ Id: 680
+ Name: "NPC_WIDESOULDRAIN"
+ Description: "Wide Soul Drain"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ ShowSkillScale: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 7
+ Lv3: 9
+ Lv4: 11
+ Lv5: 13
+ Lv6: 13
+ Lv7: 13
+ Lv8: 13
+ Lv9: 13
+ Lv10: 13
+ }
+},
+{
+ Id: 681
+ Name: "ALL_INCCARRY"
+ Description: "Increase Weight Limit R"
+ MaxLevel: 10
+ SkillInfo: {
+ Quest: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 682
+ Name: "NPC_TALK"
+ Description: "Talk"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+},
+{
+ Id: 683
+ Name: "NPC_HELLPOWER"
+ Description: "Hell Power"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ Element: "Ele_Weapon"
+ SkillData2: 300000
+ FixedCastTime: -1
+},
+{
+ Id: 684
+ Name: "NPC_WIDEHELLDIGNITY"
+ Description: "Hell Dignity"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ SkillData2: 300000
+ FixedCastTime: -1
+},
+{
+ Id: 685
+ Name: "NPC_INVINCIBLE"
+ Description: "Invincible"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+},
+{
+ Id: 686
+ Name: "NPC_INVINCIBLEOFF"
+ Description: "Invincible off"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 60000
+ FixedCastTime: -1
+},
+{
+ Id: 687
+ Name: "NPC_ALLHEAL"
+ Description: "Full Heal"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+},
+{
+ Id: 688
+ Name: "GM_SANDMAN"
+ Description: "GM Sandman"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 689
+ Name: "CASH_BLESSING"
+ Description: "Party Blessing"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 80000
+ Lv3: 100000
+ Lv4: 120000
+ Lv5: 140000
+ Lv6: 160000
+ Lv7: 180000
+ Lv8: 200000
+ Lv9: 220000
+ Lv10: 240000
+ }
+ FixedCastTime: -1
+},
+{
+ Id: 690
+ Name: "CASH_INCAGI"
+ Description: "Party Increase AGI"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 80000
+ Lv3: 100000
+ Lv4: 120000
+ Lv5: 140000
+ Lv6: 160000
+ Lv7: 180000
+ Lv8: 200000
+ Lv9: 220000
+ Lv10: 240000
+ }
+ FixedCastTime: -1
+},
+{
+ Id: 691
+ Name: "CASH_ASSUMPTIO"
+ Description: "Party Assumptio"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 40000
+ Lv3: 60000
+ Lv4: 80000
+ Lv5: 100000
+ Lv6: 120000
+ Lv7: 140000
+ Lv8: 160000
+ Lv9: 180000
+ Lv10: 200000
+ }
+ FixedCastTime: -1
+},
+{
+ Id: 692
+ Name: "ALL_CATCRY"
+ Description: "Cat Cry"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 50
+ }
+},
+{
+ Id: 693
+ Name: "ALL_PARTYFLEE"
+ Description: "Party Flee"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+},
+{
+ Id: 694
+ Name: "ALL_ANGEL_PROTECT"
+ Description: "Angel's Protection"
+ MaxLevel: 1
+ Range: 6
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NPC: true
+ NoCastSelf: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillData1: 30000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 695
+ Name: "ALL_DREAM_SUMMERNIGHT"
+ Description: "Summer Night Dream"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 12000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 697
+ Name: "ALL_REVERSEORCISH"
+ Description: "Reverse Orcish"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 1200000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 698
+ Name: "ALL_WEWISH"
+ Description: "Christmas Carol"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NPC: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 20000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 1001
+ Name: "KN_CHARGEATK"
+ Description: "Charge Attack"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ CastTime: 250
+ FixedCastTime: 250
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 1002
+ Name: "CR_SHRINK"
+ Description: "Shrink"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ KnockBackTiles: 2
+ SkillData1: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 15
+ State: "Shield"
+ }
+},
+{
+ Id: 1003
+ Name: "AS_SONICACCEL"
+ Description: "Sonic Acceleration"
+ MaxLevel: 1
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 1004
+ Name: "AS_VENOMKNIFE"
+ Description: "Throw Venom Knife"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ IgnoreCards: true
+ }
+ SkillData2: {
+ Lv1: 15000
+ Lv2: 20000
+ Lv3: 25000
+ Lv4: 30000
+ Lv5: 35000
+ Lv6: 40000
+ Lv7: 45000
+ Lv8: 50000
+ Lv9: 55000
+ Lv10: 60000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 15
+ AmmoTypes: {
+ A_DAGGER: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 1005
+ Name: "RG_CLOSECONFINE"
+ Description: "Close Confine"
+ MaxLevel: 1
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 25
+ }
+},
+{
+ Id: 1006
+ Name: "WZ_SIGHTBLASTER"
+ Description: "Sight Blaster"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ SplashRange: 1
+ InterruptCast: true
+ KnockBackTiles: 3
+ CastTime: 1280
+ SkillData1: 120000
+ FixedCastTime: 320
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 1007
+ Name: "SA_CREATECON"
+ Description: "Create Elemental Converter"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 30
+ }
+},
+{
+ Id: 1008
+ Name: "SA_ELEMENTWATER"
+ Description: "Elemental Change Water"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 1800000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 30
+// Items: {
+// Elemental_Water: 1
+// }
+ }
+},
+{
+ Id: 1009
+ Name: "HT_PHANTASMIC"
+ Description: "Phantasmic Arrow"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ KnockBackTiles: 3
+ Requirements: {
+ SPCost: 10
+ WeaponTypes: {
+ Bows: true
+ }
+ }
+},
+{
+ Id: 1010
+ Name: "BA_PANGVOICE"
+ Description: "Pang Voice"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ CastTime: 800
+ AfterCastActDelay: 2000
+ SkillData1: 17000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: 20
+ }
+},
+{
+ Id: 1011
+ Name: "DC_WINKCHARM"
+ Description: "Wink of Charm"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ CastTime: 800
+ AfterCastActDelay: 2000
+ SkillData1: 10000
+ SkillData2: 17000
+ FixedCastTime: 200
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 1012
+ Name: "BS_UNFAIRLYTRICK"
+ Description: "Unfair Trick"
+ MaxLevel: 1
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 1013
+ Name: "BS_GREED"
+ Description: "Greed"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 2
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 1014
+ Name: "PR_REDEMPTIO"
+ Description: "Redemptio"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 14
+ NumberOfHits: 0
+ InterruptCast: true
+ CastTime: 3200
+ FixedCastTime: 800
+ CastTimeOptions: {
+ IgnoreDex: true
+ }
+ Requirements: {
+ SPCost: 400
+ }
+},
+{
+ Id: 1015
+ Name: "MO_KITRANSLATION"
+ Description: "Ki Translation"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ Quest: true
+ PartyOnly: true
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: 600000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 40
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 1016
+ Name: "MO_BALKYOUNG"
+ Description: "Ki Explosion"
+ MaxLevel: 1
+ Range: -1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ KnockBackTiles: 5
+ AfterCastActDelay: 2000
+ SkillData2: 5000
+ FixedCastTime: -1
+ Requirements: {
+ HPCost: 10
+ SPCost: 20
+ }
+},
+{
+ Id: 1017
+ Name: "SA_ELEMENTGROUND"
+ Description: "Elemental Change Earth"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 1800000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 30
+// Items: {
+// Elemental_Earth: 1
+// }
+ }
+},
+{
+ Id: 1018
+ Name: "SA_ELEMENTFIRE"
+ Description: "Elemental Change Fire"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 1800000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 30
+// Items: {
+// Elemental_Fire: 1
+// }
+ }
+},
+{
+ Id: 1019
+ Name: "SA_ELEMENTWIND"
+ Description: "Elemental Change Wind"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 1800000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 30
+// Items: {
+// Elemental_Wind: 1
+// }
+ }
+},
+{
+ Id: 2001
+ Name: "RK_ENCHANTBLADE"
+ Description: "Enchant Blade"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ SkillData1: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ }
+},
+{
+ Id: 2002
+ Name: "RK_SONICWAVE"
+ Description: "Sonic Wave"
+ MaxLevel: 5
+ Range: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 1000
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 35
+ Lv3: 40
+ Lv4: 45
+ Lv5: 50
+ Lv6: 55
+ Lv7: 60
+ Lv8: 65
+ Lv9: 70
+ Lv10: 75
+ }
+ }
+},
+{
+ Id: 2003
+ Name: "RK_DEATHBOUND"
+ Description: "Death Bound"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ KnockBackTiles: 3
+ AfterCastActDelay: 2000
+ SkillData1: 2000
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 28
+ Lv2: 31
+ Lv3: 34
+ Lv4: 37
+ Lv5: 40
+ Lv6: 43
+ Lv7: 46
+ Lv8: 49
+ Lv9: 52
+ Lv10: 55
+ }
+ }
+},
+{
+ Id: 2004
+ Name: "RK_HUNDREDSPEAR"
+ Description: "Hundred Spear"
+ MaxLevel: 10
+ Range: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -5
+ CastTime: {
+ Lv1: 1000
+ Lv2: 900
+ Lv3: 800
+ Lv4: 700
+ Lv5: 600
+ Lv6: 500
+ Lv7: 400
+ Lv8: 300
+ Lv9: 200
+ Lv10: 100
+ }
+ AfterCastActDelay: 500
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 60
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 2005
+ Name: "RK_WINDCUTTER"
+ Description: "Wind Cutter"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Wind"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ KnockBackTiles: 3
+ SkillData1: 15000
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 24
+ Lv3: 28
+ Lv4: 32
+ Lv5: 36
+ Lv6: 40
+ Lv7: 44
+ Lv8: 48
+ Lv9: 52
+ Lv10: 56
+ }
+ WeaponTypes: {
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 2006
+ Name: "RK_IGNITIONBREAK"
+ Description: "Ignition Break"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 5
+ CastTime: 1000
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 35
+ Lv2: 40
+ Lv3: 45
+ Lv4: 50
+ Lv5: 55
+ Lv6: 60
+ Lv7: 65
+ Lv8: 70
+ Lv9: 75
+ Lv10: 80
+ }
+ WeaponTypes: {
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 2007
+ Name: "RK_DRAGONTRAINING"
+ Description: "Dragon Training"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 2008
+ Name: "RK_DRAGONBREATH"
+ Description: "Dragon Breath"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 2
+ Lv5: 2
+ Lv6: 2
+ Lv7: 3
+ Lv8: 3
+ Lv9: 4
+ Lv10: 4
+ }
+ CastTime: {
+ Lv1: 0
+ Lv2: 0
+ Lv3: 0
+ Lv4: 1000
+ Lv5: 1000
+ Lv6: 1000
+ Lv7: 1500
+ Lv8: 1500
+ Lv9: 2000
+ Lv10: 2000
+ }
+ AfterCastActDelay: 2000
+ SkillData1: 10000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 35
+ Lv3: 40
+ Lv4: 45
+ Lv5: 50
+ Lv6: 55
+ Lv7: 60
+ Lv8: 65
+ Lv9: 70
+ Lv10: 75
+ }
+ State: "Dragon"
+ }
+},
+{
+ Id: 2009
+ Name: "RK_DRAGONHOWLING"
+ Description: "Dragon Howling"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ InterruptCast: true
+ SkillData1: 15000
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 30
+ State: "Dragon"
+ }
+},
+{
+ Id: 2010
+ Name: "RK_RUNEMASTERY"
+ Description: "Rune Mastery"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 2011
+ Name: "RK_MILLENNIUMSHIELD"
+ Description: "Millenium Shield"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 180000
+ SkillData2: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2012
+ Name: "RK_CRUSHSTRIKE"
+ Description: "Crush Strike"
+ MaxLevel: 1
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SplashRange: 0
+ InterruptCast: true
+ SkillData1: 180000
+ SkillData2: 30000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2013
+ Name: "RK_REFRESH"
+ Description: "Refresh"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 60000
+ SkillData2: 120000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2014
+ Name: "RK_GIANTGROWTH"
+ Description: "Giant Growth"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 180000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2015
+ Name: "RK_STONEHARDSKIN"
+ Description: "Stone Hard Skin"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 180000
+ SkillData2: 10000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2016
+ Name: "RK_VITALITYACTIVATION"
+ Description: "Vitality Activation"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 180000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2017
+ Name: "RK_STORMBLAST"
+ Description: "Storm Blast"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+ KnockBackTiles: 7
+ CastTime: 2000
+ AfterCastActDelay: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2018
+ Name: "RK_FIGHTINGSPIRIT"
+ Description: "Fighting Spirit"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+ SkillData1: 180000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2019
+ Name: "RK_ABUNDANCE"
+ Description: "Abundance"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 180000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2020
+ Name: "RK_PHANTOMTHRUST"
+ Description: "Phantom Thrust"
+ MaxLevel: 5
+ Range: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ InterruptCast: true
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 18
+ Lv3: 21
+ Lv4: 24
+ Lv5: 27
+ Lv6: 30
+ Lv7: 33
+ Lv8: 36
+ Lv9: 39
+ Lv10: 42
+ }
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 2021
+ Name: "GC_VENOMIMPRESS"
+ Description: "Venom Impress"
+ MaxLevel: 5
+ Range: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: {
+ Lv1: 3000
+ Lv2: 2500
+ Lv3: 2000
+ Lv4: 1500
+ Lv5: 1000
+ Lv6: 500
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 20000
+ Lv3: 30000
+ Lv4: 40000
+ Lv5: 50000
+ Lv6: 60000
+ Lv7: 70000
+ Lv8: 80000
+ Lv9: 90000
+ Lv10: 100000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 16
+ Lv3: 20
+ Lv4: 24
+ Lv5: 28
+ Lv6: 32
+ Lv7: 36
+ Lv8: 40
+ Lv9: 44
+ Lv10: 48
+ }
+ }
+},
+{
+ Id: 2022
+ Name: "GC_CROSSIMPACT"
+ Description: "Cross Impact"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -7
+ AfterCastActDelay: {
+ Lv1: 2500
+ Lv2: 2000
+ Lv3: 1500
+ Lv4: 1000
+ Lv5: 500
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 25
+ State: "Moveable"
+ }
+},
+{
+ Id: 2023
+ Name: "GC_DARKILLUSION"
+ Description: "Sudden Attack"
+ MaxLevel: 5
+ Range: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 1500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+ }
+},
+{
+ Id: 2024
+ Name: "GC_RESEARCHNEWPOISON"
+ Description: "Research New Poison"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 2025
+ Name: "GC_CREATENEWPOISON"
+ Description: "Create New Poison"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 2026
+ Name: "GC_ANTIDOTE"
+ Description: "Antidote"
+ MaxLevel: 1
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Guillotine_Antidote: 1
+// }
+ }
+},
+{
+ Id: 2027
+ Name: "GC_POISONINGWEAPON"
+ Description: "Poisoning Weapon"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 120000
+ Lv3: 180000
+ Lv4: 240000
+ Lv5: 300000
+ Lv6: 360000
+ Lv7: 420000
+ Lv8: 480000
+ Lv9: 540000
+ Lv10: 600000
+ }
+ SkillData2: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 24
+ Lv3: 28
+ Lv4: 32
+ Lv5: 36
+ Lv6: 40
+ Lv7: 44
+ Lv8: 48
+ Lv9: 52
+ Lv10: 56
+ }
+ }
+},
+{
+ Id: 2028
+ Name: "GC_WEAPONBLOCKING"
+ Description: "Weapon Blocking"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 2000
+ SkillData1: 180000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 36
+ Lv3: 32
+ Lv4: 28
+ Lv5: 24
+ Lv6: 20
+ Lv7: 16
+ Lv8: 12
+ Lv9: 8
+ Lv10: 4
+ }
+ }
+},
+{
+ Id: 2029
+ Name: "GC_COUNTERSLASH"
+ Description: "Counter Slash"
+ MaxLevel: 5
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ KnockBackTiles: 3
+ AfterCastActDelay: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 5
+ Lv2: 8
+ Lv3: 11
+ Lv4: 14
+ Lv5: 17
+ Lv6: 20
+ Lv7: 23
+ Lv8: 26
+ Lv9: 29
+ Lv10: 32
+ }
+ }
+},
+{
+ Id: 2030
+ Name: "GC_WEAPONCRUSH"
+ Description: "Weapon Crush"
+ MaxLevel: 5
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 20
+ }
+},
+{
+ Id: 2031
+ Name: "GC_VENOMPRESSURE"
+ Description: "Venom Pressure"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+ State: "PoisonWeapon"
+ }
+},
+{
+ Id: 2032
+ Name: "GC_POISONSMOKE"
+ Description: "Poison Smoke"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 1
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 6000
+ Lv2: 8000
+ Lv3: 10000
+ Lv4: 12000
+ Lv5: 14000
+ Lv6: 16000
+ Lv7: 18000
+ Lv8: 20000
+ Lv9: 22000
+ Lv10: 24000
+ }
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 40
+ State: "PoisonWeapon"
+ }
+ Unit: {
+ Id: 0xe1
+ Layout: 2
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2033
+ Name: "GC_CLOAKINGEXCEED"
+ Description: "Cloaking Exceed"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 45
+ }
+},
+{
+ Id: 2034
+ Name: "GC_PHANTOMMENACE"
+ Description: "Phantom Menace"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 30
+ }
+},
+{
+ Id: 2035
+ Name: "GC_HALLUCINATIONWALK"
+ Description: "Hallucination Walk"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 35000
+ Lv3: 40000
+ Lv4: 45000
+ Lv5: 50000
+ Lv6: 55000
+ Lv7: 60000
+ Lv8: 65000
+ Lv9: 70000
+ Lv10: 75000
+ }
+ SkillData2: 25000
+ CoolDown: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 100
+ }
+},
+{
+ Id: 2036
+ Name: "GC_ROLLINGCUTTER"
+ Description: "Rolling Cutter"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 1
+ Lv5: 2
+ Lv6: 2
+ Lv7: 2
+ Lv8: 2
+ Lv9: 2
+ Lv10: 2
+ }
+ AfterCastActDelay: 200
+ SkillData1: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 5
+ WeaponTypes: {
+ Katars: true
+ }
+ }
+},
+{
+ Id: 2037
+ Name: "GC_CROSSRIPPERSLASHER"
+ Description: "Cross Ripper Slasher"
+ MaxLevel: 5
+ Range: {
+ Lv1: 9
+ Lv2: 10
+ Lv3: 11
+ Lv4: 12
+ Lv5: 13
+ Lv6: 14
+ Lv7: 15
+ Lv8: 16
+ Lv9: 17
+ Lv10: 18
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 24
+ Lv3: 28
+ Lv4: 32
+ Lv5: 36
+ Lv6: 40
+ Lv7: 44
+ Lv8: 48
+ Lv9: 52
+ Lv10: 56
+ }
+ WeaponTypes: {
+ Katars: true
+ }
+ State: "RollingCutter"
+ }
+},
+{
+ Id: 2038
+ Name: "AB_JUDEX"
+ Description: "Judex"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+ NumberOfHits: -3
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 500
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 23
+ Lv3: 26
+ Lv4: 29
+ Lv5: 32
+ Lv6: 35
+ Lv7: 38
+ Lv8: 41
+ Lv9: 44
+ Lv10: 47
+ }
+ }
+},
+{
+ Id: 2039
+ Name: "AB_ANCILLA"
+ Description: "Ancilla"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 30
+ SPRateCost: -30
+ }
+},
+{
+ Id: 2040
+ Name: "AB_ADORAMUS"
+ Description: "Adoramus"
+ MaxLevel: 10
+ Range: 11
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ NumberOfHits: -10
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 6000
+ Lv2: 7000
+ Lv3: 8000
+ Lv4: 9000
+ Lv5: 10000
+ Lv6: 11000
+ Lv7: 12000
+ Lv8: 13000
+ Lv9: 14000
+ Lv10: 15000
+ }
+ SkillData2: {
+ Lv1: 15000
+ Lv2: 20000
+ Lv3: 25000
+ Lv4: 30000
+ Lv5: 35000
+ Lv6: 40000
+ Lv7: 45000
+ Lv8: 50000
+ Lv9: 55000
+ Lv10: 60000
+ }
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 24
+ Lv3: 28
+ Lv4: 32
+ Lv5: 36
+ Lv6: 40
+ Lv7: 44
+ Lv8: 48
+ Lv9: 52
+ Lv10: 56
+ }
+// Items: {
+// Blue_Gemstone: 1
+// }
+ }
+},
+{
+ Id: 2041
+ Name: "AB_CLEMENTIA"
+ Description: "Crementia"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 7
+ Lv3: 15
+ Lv4: 15
+ Lv5: 15
+ Lv6: 15
+ Lv7: 15
+ Lv8: 15
+ Lv9: 15
+ Lv10: 15
+ }
+ InterruptCast: true
+ CastTime: 3000
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 180000
+ Lv3: 240000
+ Lv4: 300000
+ Lv5: 360000
+ Lv6: 420000
+ Lv7: 480000
+ Lv8: 540000
+ Lv9: 600000
+ Lv10: 660000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 280
+ Lv2: 320
+ Lv3: 360
+ Lv4: 400
+ Lv5: 440
+ Lv6: 480
+ Lv7: 520
+ Lv8: 560
+ Lv9: 600
+ Lv10: 640
+ }
+ }
+},
+{
+ Id: 2042
+ Name: "AB_CANTO"
+ Description: "Canto Candidus"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 7
+ Lv3: 15
+ Lv4: 15
+ Lv5: 15
+ Lv6: 15
+ Lv7: 15
+ Lv8: 15
+ Lv9: 15
+ Lv10: 15
+ }
+ InterruptCast: true
+ CastTime: 3000
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 180000
+ Lv3: 240000
+ Lv4: 300000
+ Lv5: 360000
+ Lv6: 420000
+ Lv7: 480000
+ Lv8: 540000
+ Lv9: 600000
+ Lv10: 660000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 200
+ Lv2: 220
+ Lv3: 240
+ Lv4: 260
+ Lv5: 280
+ Lv6: 300
+ Lv7: 320
+ Lv8: 340
+ Lv9: 360
+ Lv10: 380
+ }
+ }
+},
+{
+ Id: 2043
+ Name: "AB_CHEAL"
+ Description: "Coluceo Heal"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 7
+ Lv3: 15
+ Lv4: 15
+ Lv5: 15
+ Lv6: 15
+ Lv7: 15
+ Lv8: 15
+ Lv9: 15
+ Lv10: 15
+ }
+ InterruptCast: true
+ CastTime: 3000
+ CoolDown: 2000
+ FixedCastTime: {
+ Lv1: 1000
+ Lv2: 500
+ Lv3: -1
+ Lv4: -1
+ Lv5: -1
+ Lv6: -1
+ Lv7: -1
+ Lv8: -1
+ Lv9: -1
+ Lv10: -1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 200
+ Lv2: 220
+ Lv3: 240
+ Lv4: 260
+ Lv5: 280
+ Lv6: 300
+ Lv7: 320
+ Lv8: 340
+ Lv9: 360
+ Lv10: 380
+ }
+ }
+},
+{
+ Id: 2044
+ Name: "AB_EPICLESIS"
+ Description: "Epiclesis"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 1
+ CastTime: {
+ Lv1: 2000
+ Lv2: 2500
+ Lv3: 3000
+ Lv4: 3500
+ Lv5: 4000
+ Lv6: 4500
+ Lv7: 5000
+ Lv8: 5500
+ Lv9: 6000
+ Lv10: 6500
+ }
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 18000
+ Lv2: 21000
+ Lv3: 24000
+ Lv4: 27000
+ Lv5: 30000
+ Lv6: 33000
+ Lv7: 36000
+ Lv8: 39000
+ Lv9: 42000
+ Lv10: 45000
+ }
+ CoolDown: 60000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 300
+// Items: {
+// Ansila: 1
+// Holy_Water: 1
+// }
+ }
+ Unit: {
+ Id: 0xca
+ Range: 2
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2045
+ Name: "AB_PRAEFATIO"
+ Description: "Praefatio"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 15
+ InterruptCast: true
+ CastTime: 2000
+ SkillData1: 120000
+ CoolDown: {
+ Lv1: 13000
+ Lv2: 16000
+ Lv3: 19000
+ Lv4: 22000
+ Lv5: 25000
+ Lv6: 28000
+ Lv7: 31000
+ Lv8: 34000
+ Lv9: 37000
+ Lv10: 40000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 90
+ Lv2: 100
+ Lv3: 110
+ Lv4: 120
+ Lv5: 130
+ Lv6: 140
+ Lv7: 150
+ Lv8: 160
+ Lv9: 170
+ Lv10: 180
+ }
+ }
+},
+{
+ Id: 2046
+ Name: "AB_ORATIO"
+ Description: "Oratio"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 15
+ InterruptCast: true
+ CastTime: 4000
+ SkillData1: 30000
+ CoolDown: 2000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 35
+ Lv2: 38
+ Lv3: 41
+ Lv4: 44
+ Lv5: 47
+ Lv6: 50
+ Lv7: 53
+ Lv8: 56
+ Lv9: 59
+ Lv10: 62
+ }
+ }
+},
+{
+ Id: 2047
+ Name: "AB_LAUDAAGNUS"
+ Description: "Lauda Agnus"
+ MaxLevel: 4
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 15
+ InterruptCast: true
+ CastTime: 1000
+ SkillData1: 60000
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 60
+ Lv3: 70
+ Lv4: 80
+ Lv5: 90
+ Lv6: 100
+ Lv7: 110
+ Lv8: 120
+ Lv9: 130
+ Lv10: 140
+ }
+ }
+},
+{
+ Id: 2048
+ Name: "AB_LAUDARAMUS"
+ Description: "Lauda Ramus"
+ MaxLevel: 4
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 15
+ InterruptCast: true
+ CastTime: 1000
+ SkillData1: 60000
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 60
+ Lv3: 70
+ Lv4: 80
+ Lv5: 90
+ Lv6: 100
+ Lv7: 110
+ Lv8: 120
+ Lv9: 130
+ Lv10: 140
+ }
+ }
+},
+{
+ Id: 2049
+ Name: "AB_EUCHARISTICA"
+ Description: "Eucharistica"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 2050
+ Name: "AB_RENOVATIO"
+ Description: "Renovatio"
+ MaxLevel: 1
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 3000
+ SkillData1: 90000
+ CoolDown: 1000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 70
+ }
+},
+{
+ Id: 2051
+ Name: "AB_HIGHNESSHEAL"
+ Description: "Highness Heal"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ IgnoreDefense: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 100
+ Lv3: 130
+ Lv4: 160
+ Lv5: 190
+ Lv6: 220
+ Lv7: 250
+ Lv8: 280
+ Lv9: 310
+ Lv10: 340
+ }
+ }
+},
+{
+ Id: 2052
+ Name: "AB_CLEARANCE"
+ Description: "Clearance"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 4000
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 54
+ Lv2: 60
+ Lv3: 66
+ Lv4: 72
+ Lv5: 78
+ Lv6: 84
+ Lv7: 90
+ Lv8: 96
+ Lv9: 102
+ Lv10: 108
+ }
+ }
+},
+{
+ Id: 2053
+ Name: "AB_EXPIATIO"
+ Description: "Expiatio"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 180000
+ Lv3: 210000
+ Lv4: 240000
+ Lv5: 270000
+ Lv6: 300000
+ Lv7: 330000
+ Lv8: 360000
+ Lv9: 390000
+ Lv10: 420000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 35
+ Lv2: 40
+ Lv3: 45
+ Lv4: 50
+ Lv5: 55
+ Lv6: 60
+ Lv7: 65
+ Lv8: 70
+ Lv9: 75
+ Lv10: 80
+ }
+ }
+},
+{
+ Id: 2054
+ Name: "AB_DUPLELIGHT"
+ Description: "Duple Light"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 90000
+ Lv2: 120000
+ Lv3: 150000
+ Lv4: 180000
+ Lv5: 210000
+ Lv6: 240000
+ Lv7: 270000
+ Lv8: 300000
+ Lv9: 330000
+ Lv10: 360000
+ }
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 55
+ Lv2: 60
+ Lv3: 65
+ Lv4: 70
+ Lv5: 75
+ Lv6: 80
+ Lv7: 85
+ Lv8: 90
+ Lv9: 95
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 2055
+ Name: "AB_DUPLELIGHT_MELEE"
+ Description: "Duple Light Melee"
+ MaxLevel: 10
+ Range: -1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2056
+ Name: "AB_DUPLELIGHT_MAGIC"
+ Description: "Duple Light Magic"
+ MaxLevel: 10
+ Range: -1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2057
+ Name: "AB_SILENTIUM"
+ Description: "Silentium"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 4
+ Lv2: 5
+ Lv3: 6
+ Lv4: 7
+ Lv5: 8
+ Lv6: 9
+ Lv7: 10
+ Lv8: 11
+ Lv9: 12
+ Lv10: 13
+ }
+ InterruptCast: true
+ CastTime: 4000
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ CoolDown: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 64
+ Lv2: 68
+ Lv3: 72
+ Lv4: 76
+ Lv5: 80
+ Lv6: 84
+ Lv7: 88
+ Lv8: 92
+ Lv9: 96
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 2201
+ Name: "WL_WHITEIMPRISON"
+ Description: "White Imprison"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 6000
+ Lv2: 8000
+ Lv3: 10000
+ Lv4: 12000
+ Lv5: 14000
+ Lv6: 16000
+ Lv7: 18000
+ Lv8: 20000
+ Lv9: 22000
+ Lv10: 24000
+ }
+ SkillData2: 15000
+ CoolDown: 4000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 55
+ Lv3: 60
+ Lv4: 65
+ Lv5: 70
+ Lv6: 75
+ Lv7: 80
+ Lv8: 85
+ Lv9: 90
+ Lv10: 95
+ }
+ }
+},
+{
+ Id: 2202
+ Name: "WL_SOULEXPANSION"
+ Description: "Soul Expansion"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Ghost"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 2
+ Lv5: 2
+ Lv6: 2
+ Lv7: 2
+ Lv8: 2
+ Lv9: 2
+ Lv10: 2
+ }
+ NumberOfHits: -2
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 35
+ Lv3: 40
+ Lv4: 45
+ Lv5: 50
+ Lv6: 55
+ Lv7: 60
+ Lv8: 65
+ Lv9: 70
+ Lv10: 75
+ }
+ }
+},
+{
+ Id: 2203
+ Name: "WL_FROSTMISTY"
+ Description: "Frosty Misty"
+ MaxLevel: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 13
+ NumberOfHits: {
+ Lv1: -3
+ Lv2: -4
+ Lv3: -5
+ Lv4: -6
+ Lv5: -7
+ Lv6: -8
+ Lv7: -9
+ Lv8: -10
+ Lv9: -11
+ Lv10: -12
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2000
+ Lv2: 2500
+ Lv3: 3000
+ Lv4: 3500
+ Lv5: 4000
+ Lv6: 4500
+ Lv7: 5000
+ Lv8: 5500
+ Lv9: 6000
+ Lv10: 6500
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 40000
+ CoolDown: 4000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 48
+ Lv3: 56
+ Lv4: 64
+ Lv5: 72
+ Lv6: 80
+ Lv7: 88
+ Lv8: 96
+ Lv9: 104
+ Lv10: 112
+ }
+ }
+},
+{
+ Id: 2204
+ Name: "WL_JACKFROST"
+ Description: "Jack Frost"
+ MaxLevel: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 13
+ NumberOfHits: -5
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2000
+ Lv2: 2500
+ Lv3: 3000
+ Lv4: 3500
+ Lv5: 4000
+ Lv6: 4500
+ Lv7: 5000
+ Lv8: 5500
+ Lv9: 6000
+ Lv10: 6500
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 60
+ Lv3: 70
+ Lv4: 80
+ Lv5: 90
+ Lv6: 100
+ Lv7: 110
+ Lv8: 120
+ Lv9: 130
+ Lv10: 140
+ }
+ }
+},
+{
+ Id: 2205
+ Name: "WL_MARSHOFABYSS"
+ Description: "Marsh of Abyss"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 30000
+ CoolDown: {
+ Lv1: 2500
+ Lv2: 3000
+ Lv3: 3500
+ Lv4: 4000
+ Lv5: 4500
+ Lv6: 5000
+ Lv7: 5500
+ Lv8: 6000
+ Lv9: 6500
+ Lv10: 7000
+ }
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 42
+ Lv3: 44
+ Lv4: 46
+ Lv5: 48
+ Lv6: 50
+ Lv7: 52
+ Lv8: 54
+ Lv9: 56
+ Lv10: 58
+ }
+ }
+},
+{
+ Id: 2206
+ Name: "WL_RECOGNIZEDSPELL"
+ Description: "Recognized Spell"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 90000
+ Lv3: 120000
+ Lv4: 150000
+ Lv5: 180000
+ Lv6: 210000
+ Lv7: 240000
+ Lv8: 270000
+ Lv9: 300000
+ Lv10: 330000
+ }
+ CoolDown: {
+ Lv1: 50000
+ Lv2: 80000
+ Lv3: 110000
+ Lv4: 140000
+ Lv5: 170000
+ Lv6: 200000
+ Lv7: 230000
+ Lv8: 260000
+ Lv9: 290000
+ Lv10: 320000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 120
+ Lv3: 140
+ Lv4: 160
+ Lv5: 180
+ Lv6: 200
+ Lv7: 220
+ Lv8: 240
+ Lv9: 260
+ Lv10: 280
+ }
+ }
+},
+{
+ Id: 2207
+ Name: "WL_SIENNAEXECRATE"
+ Description: "Sienna Execrate"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 2
+ Lv4: 3
+ Lv5: 3
+ Lv6: 4
+ Lv7: 4
+ Lv8: 5
+ Lv9: 5
+ Lv10: 6
+ }
+ NumberOfHits: 0
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 12000
+ Lv3: 14000
+ Lv4: 16000
+ Lv5: 18000
+ Lv6: 20000
+ Lv7: 22000
+ Lv8: 24000
+ Lv9: 26000
+ Lv10: 28000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 32
+ Lv2: 34
+ Lv3: 36
+ Lv4: 38
+ Lv5: 40
+ Lv6: 42
+ Lv7: 44
+ Lv8: 46
+ Lv9: 48
+ Lv10: 50
+ }
+// Items: {
+// Red_Gemstone: 2
+// }
+ }
+},
+{
+ Id: 2208
+ Name: "WL_RADIUS"
+ Description: "Radius"
+ MaxLevel: 3
+ NumberOfHits: 0
+},
+{
+ Id: 2209
+ Name: "WL_STASIS"
+ Description: "Stasis"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 9
+ Lv2: 10
+ Lv3: 11
+ Lv4: 12
+ Lv5: 13
+ Lv6: 14
+ Lv7: 15
+ Lv8: 16
+ Lv9: 17
+ Lv10: 18
+ }
+ InterruptCast: true
+ CastTime: 3000
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ SkillData2: 1000
+ CoolDown: {
+ Lv1: 180000
+ Lv2: 190000
+ Lv3: 200000
+ Lv4: 210000
+ Lv5: 220000
+ Lv6: 230000
+ Lv7: 240000
+ Lv8: 250000
+ Lv9: 260000
+ Lv10: 270000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 60
+ Lv3: 70
+ Lv4: 80
+ Lv5: 90
+ Lv6: 100
+ Lv7: 110
+ Lv8: 120
+ Lv9: 130
+ Lv10: 140
+ }
+ }
+},
+{
+ Id: 2210
+ Name: "WL_DRAINLIFE"
+ Description: "Drain Life"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ InterruptCast: true
+ CastTime: 4000
+ CoolDown: 2000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 24
+ Lv3: 28
+ Lv4: 32
+ Lv5: 36
+ Lv6: 40
+ Lv7: 44
+ Lv8: 48
+ Lv9: 52
+ Lv10: 56
+ }
+ }
+},
+{
+ Id: 2211
+ Name: "WL_CRIMSONROCK"
+ Description: "Crimson Rock"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+ NumberOfHits: -7
+ InterruptCast: true
+ KnockBackTiles: 3
+ CastTime: 5000
+ AfterCastActDelay: 2000
+ SkillData1: 5000
+ CoolDown: 5000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 70
+ Lv3: 80
+ Lv4: 90
+ Lv5: 100
+ Lv6: 110
+ Lv7: 120
+ Lv8: 130
+ Lv9: 140
+ Lv10: 150
+ }
+ }
+},
+{
+ Id: 2212
+ Name: "WL_HELLINFERNO"
+ Description: "Hell Inferno"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ InterruptCast: true
+ CastTime: 3000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 35
+ Lv2: 40
+ Lv3: 45
+ Lv4: 50
+ Lv5: 55
+ Lv6: 60
+ Lv7: 65
+ Lv8: 70
+ Lv9: 75
+ Lv10: 80
+ }
+ }
+},
+{
+ Id: 2213
+ Name: "WL_COMET"
+ Description: "Comet"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ NumberOfHits: -20
+ InterruptCast: true
+ KnockBackTiles: 2
+ CastTime: {
+ Lv1: 10000
+ Lv2: 11000
+ Lv3: 12000
+ Lv4: 13000
+ Lv5: 14000
+ Lv6: 15000
+ Lv7: 16000
+ Lv8: 17000
+ Lv9: 18000
+ Lv10: 19000
+ }
+ SkillData1: 100
+ SkillData2: 42000
+ CoolDown: 60000
+ FixedCastTime: {
+ Lv1: 1000
+ Lv2: 1500
+ Lv3: 2000
+ Lv4: 2500
+ Lv5: 3000
+ Lv6: 3500
+ Lv7: 4000
+ Lv8: 4500
+ Lv9: 5000
+ Lv10: 5500
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 480
+ Lv2: 560
+ Lv3: 640
+ Lv4: 720
+ Lv5: 800
+ Lv6: 880
+ Lv7: 960
+ Lv8: 1040
+ Lv9: 1120
+ Lv10: 1200
+ }
+// Items: {
+// Red_Gemstone: 2
+// }
+ }
+ Unit: {
+ Id: 0x86
+ Range: 8
+ Interval: 100
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2214
+ Name: "WL_CHAINLIGHTNING"
+ Description: "Chain Lightning"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ SplashRange: 3
+ InterruptCast: true
+ CastTime: {
+ Lv1: 3500
+ Lv2: 4000
+ Lv3: 4500
+ Lv4: 5000
+ Lv5: 5500
+ Lv6: 6000
+ Lv7: 6500
+ Lv8: 7000
+ Lv9: 7500
+ Lv10: 8000
+ }
+ SkillData1: 100
+ CoolDown: 3000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 90
+ Lv3: 100
+ Lv4: 110
+ Lv5: 120
+ Lv6: 130
+ Lv7: 140
+ Lv8: 150
+ Lv9: 160
+ Lv10: 170
+ }
+ }
+},
+{
+ Id: 2215
+ Name: "WL_CHAINLIGHTNING_ATK"
+ Description: "Chain Lightning Attack"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2216
+ Name: "WL_EARTHSTRAIN"
+ Description: "Earth Strain"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ NumberOfHits: {
+ Lv1: -6
+ Lv2: -7
+ Lv3: -8
+ Lv4: -9
+ Lv5: -10
+ Lv6: -11
+ Lv7: -12
+ Lv8: -13
+ Lv9: -14
+ Lv10: -15
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2000
+ Lv2: 3000
+ Lv3: 4000
+ Lv4: 5000
+ Lv5: 6000
+ Lv6: 7000
+ Lv7: 8000
+ Lv8: 9000
+ Lv9: 10000
+ Lv10: 11000
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 100
+ SkillData2: {
+ Lv1: 75000
+ Lv2: 90000
+ Lv3: 105000
+ Lv4: 120000
+ Lv5: 135000
+ Lv6: 150000
+ Lv7: 165000
+ Lv8: 180000
+ Lv9: 195000
+ Lv10: 210000
+ }
+ CoolDown: 10000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 78
+ Lv3: 86
+ Lv4: 94
+ Lv5: 102
+ Lv6: 110
+ Lv7: 118
+ Lv8: 126
+ Lv9: 134
+ Lv10: 142
+ }
+ }
+ Unit: {
+ Id: 0xcb
+ Layout: -1
+ Interval: 100
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2217
+ Name: "WL_TETRAVORTEX"
+ Description: "Tetra Vortex"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ InterruptCast: true
+ CastTime: {
+ Lv1: 5000
+ Lv2: 6000
+ Lv3: 7000
+ Lv4: 8000
+ Lv5: 9000
+ Lv6: 10000
+ Lv7: 11000
+ Lv8: 12000
+ Lv9: 13000
+ Lv10: 14000
+ }
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 15000
+ Lv2: 120000
+ Lv3: 40000
+ Lv4: 5000
+ Lv5: 5000
+ Lv6: 5000
+ Lv7: 5000
+ Lv8: 5000
+ Lv9: 5000
+ Lv10: 5000
+ }
+ CoolDown: 15000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 120
+ Lv2: 150
+ Lv3: 180
+ Lv4: 210
+ Lv5: 240
+ Lv6: 270
+ Lv7: 300
+ Lv8: 330
+ Lv9: 360
+ Lv10: 390
+ }
+ }
+},
+{
+ Id: 2218
+ Name: "WL_TETRAVORTEX_FIRE"
+ Description: "Tetra Vortex Fire"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2219
+ Name: "WL_TETRAVORTEX_WATER"
+ Description: "Tetra Vortex Water"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2220
+ Name: "WL_TETRAVORTEX_WIND"
+ Description: "Tetra Vortex Wind"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2221
+ Name: "WL_TETRAVORTEX_GROUND"
+ Description: "Tetra Vortex Earth"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2222
+ Name: "WL_SUMMONFB"
+ Description: "Summon Fire Ball"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 160000
+ Lv3: 200000
+ Lv4: 240000
+ Lv5: 280000
+ Lv6: 320000
+ Lv7: 360000
+ Lv8: 400000
+ Lv9: 440000
+ Lv10: 480000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 12
+ Lv3: 14
+ Lv4: 16
+ Lv5: 18
+ Lv6: 20
+ Lv7: 22
+ Lv8: 24
+ Lv9: 26
+ Lv10: 28
+ }
+ }
+},
+{
+ Id: 2223
+ Name: "WL_SUMMONBL"
+ Description: "Summon Lightning Ball"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 160000
+ Lv3: 200000
+ Lv4: 240000
+ Lv5: 280000
+ Lv6: 320000
+ Lv7: 360000
+ Lv8: 400000
+ Lv9: 440000
+ Lv10: 480000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 12
+ Lv3: 14
+ Lv4: 16
+ Lv5: 18
+ Lv6: 20
+ Lv7: 22
+ Lv8: 24
+ Lv9: 26
+ Lv10: 28
+ }
+ }
+},
+{
+ Id: 2224
+ Name: "WL_SUMMONWB"
+ Description: "Summon Water Ball"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 160000
+ Lv3: 200000
+ Lv4: 240000
+ Lv5: 280000
+ Lv6: 320000
+ Lv7: 360000
+ Lv8: 400000
+ Lv9: 440000
+ Lv10: 480000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 12
+ Lv3: 14
+ Lv4: 16
+ Lv5: 18
+ Lv6: 20
+ Lv7: 22
+ Lv8: 24
+ Lv9: 26
+ Lv10: 28
+ }
+ }
+},
+{
+ Id: 2225
+ Name: "WL_SUMMON_ATK_FIRE"
+ Description: "Summon Attack Fire"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ SkillInstances: 1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2226
+ Name: "WL_SUMMON_ATK_WIND"
+ Description: "Summon Attack Wind"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ SkillInstances: 1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2227
+ Name: "WL_SUMMON_ATK_WATER"
+ Description: "Summon Attack Water"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ SkillInstances: 1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2228
+ Name: "WL_SUMMON_ATK_GROUND"
+ Description: "Summon Attack Earth"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ SkillInstances: 1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2229
+ Name: "WL_SUMMONSTONE"
+ Description: "Summon Stone"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ SkillData1: {
+ Lv1: 120000
+ Lv2: 160000
+ Lv3: 200000
+ Lv4: 240000
+ Lv5: 280000
+ Lv6: 320000
+ Lv7: 360000
+ Lv8: 400000
+ Lv9: 440000
+ Lv10: 480000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 12
+ Lv3: 14
+ Lv4: 16
+ Lv5: 18
+ Lv6: 20
+ Lv7: 22
+ Lv8: 24
+ Lv9: 26
+ Lv10: 28
+ }
+ }
+},
+{
+ Id: 2230
+ Name: "WL_RELEASE"
+ Description: "Release"
+ MaxLevel: 2
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ InterruptCast: true
+ Requirements: {
+ SPCost: {
+ Lv1: 3
+ Lv2: 20
+ Lv3: 37
+ Lv4: 54
+ Lv5: 71
+ Lv6: 88
+ Lv7: 105
+ Lv8: 122
+ Lv9: 139
+ Lv10: 156
+ }
+ }
+},
+{
+ Id: 2231
+ Name: "WL_READING_SB"
+ Description: "Reading Spellbook"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 5000
+ AfterCastActDelay: 500
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 2232
+ Name: "WL_FREEZE_SP"
+ Description: "Freeze Spell"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 2233
+ Name: "RA_ARROWSTORM"
+ Description: "Arrow Storm"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 3
+ Lv3: 3
+ Lv4: 3
+ Lv5: 3
+ Lv6: 4
+ Lv7: 4
+ Lv8: 4
+ Lv9: 4
+ Lv10: 5
+ }
+ NumberOfHits: -3
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2000
+ Lv2: 2200
+ Lv3: 2400
+ Lv4: 2600
+ Lv5: 2800
+ Lv6: 3000
+ Lv7: 3200
+ Lv8: 3400
+ Lv9: 3600
+ Lv10: 3800
+ }
+ CoolDown: {
+ Lv1: 5000
+ Lv2: 4800
+ Lv3: 4600
+ Lv4: 4400
+ Lv5: 4200
+ Lv6: 4000
+ Lv7: 3800
+ Lv8: 3600
+ Lv9: 3400
+ Lv10: 3200
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 32
+ Lv3: 34
+ Lv4: 36
+ Lv5: 38
+ Lv6: 40
+ Lv7: 42
+ Lv8: 44
+ Lv9: 46
+ Lv10: 48
+ }
+ WeaponTypes: {
+ Bows: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 10
+ }
+},
+{
+ Id: 2234
+ Name: "RA_FEARBREEZE"
+ Description: "Fear Breeze"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 90000
+ Lv3: 120000
+ Lv4: 150000
+ Lv5: 180000
+ Lv6: 210000
+ Lv7: 240000
+ Lv8: 270000
+ Lv9: 300000
+ Lv10: 330000
+ }
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 55
+ Lv2: 60
+ Lv3: 65
+ Lv4: 70
+ Lv5: 75
+ Lv6: 80
+ Lv7: 85
+ Lv8: 90
+ Lv9: 95
+ Lv10: 100
+ }
+ WeaponTypes: {
+ Bows: true
+ }
+ }
+},
+{
+ Id: 2235
+ Name: "RA_RANGERMAIN"
+ Description: "Ranger Main"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 2236
+ Name: "RA_AIMEDBOLT"
+ Description: "Aimed Bolt"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ InterruptCast: true
+ CastTime: 4000
+ AfterCastActDelay: 1000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 32
+ Lv3: 34
+ Lv4: 36
+ Lv5: 38
+ Lv6: 40
+ Lv7: 42
+ Lv8: 44
+ Lv9: 46
+ Lv10: 48
+ }
+ WeaponTypes: {
+ Bows: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 2237
+ Name: "RA_DETONATOR"
+ Description: "Detonator"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 3
+ SkillData1: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 15
+ }
+},
+{
+ Id: 2238
+ Name: "RA_ELECTRICSHOCKER"
+ Description: "Electric Shocker"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 2
+ SkillInstances: 3
+ SkillData1: 15000
+ SkillData2: {
+ Lv1: 20000
+ Lv2: 22000
+ Lv3: 24000
+ Lv4: 26000
+ Lv5: 28000
+ Lv6: 30000
+ Lv7: 32000
+ Lv8: 34000
+ Lv9: 36000
+ Lv10: 38000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 35
+// Items: {
+// Special_Alloy_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0xd8
+ Range: 2
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 2239
+ Name: "RA_CLUSTERBOMB"
+ Description: "Cluster Bomb"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ AllowReproduce: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 3
+ SkillInstances: 3
+ SkillData1: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 20
+// Items: {
+// Special_Alloy_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0xd9
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 2240
+ Name: "RA_WUGMASTERY"
+ Description: "Warg Mastery"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 5
+// Items: {
+// Wolfs_Flute: 0
+// }
+ }
+},
+{
+ Id: 2241
+ Name: "RA_WUGRIDER"
+ Description: "Warg Rider"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 2
+ }
+},
+{
+ Id: 2242
+ Name: "RA_WUGDASH"
+ Description: "Warg Dash"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 4
+ State: "Moveable"
+ }
+},
+{
+ Id: 2243
+ Name: "RA_WUGSTRIKE"
+ Description: "Warg Strike"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 22
+ Lv3: 24
+ Lv4: 26
+ Lv5: 28
+ Lv6: 30
+ Lv7: 32
+ Lv8: 34
+ Lv9: 36
+ Lv10: 38
+ }
+ }
+},
+{
+ Id: 2244
+ Name: "RA_WUGBITE"
+ Description: "Warg Bite"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 5000
+ Lv6: 6000
+ Lv7: 7000
+ Lv8: 8000
+ Lv9: 9000
+ Lv10: 10000
+ }
+ CoolDown: {
+ Lv1: 4000
+ Lv2: 6000
+ Lv3: 8000
+ Lv4: 10000
+ Lv5: 12000
+ Lv6: 14000
+ Lv7: 16000
+ Lv8: 18000
+ Lv9: 20000
+ Lv10: 22000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 42
+ Lv3: 44
+ Lv4: 46
+ Lv5: 48
+ Lv6: 50
+ Lv7: 52
+ Lv8: 54
+ Lv9: 56
+ Lv10: 58
+ }
+ State: "Warg"
+ }
+},
+{
+ Id: 2245
+ Name: "RA_TOOTHOFWUG"
+ Description: "Tooth of Warg"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 2246
+ Name: "RA_SENSITIVEKEEN"
+ Description: "Sensitive Keen"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ AfterCastActDelay: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 12
+ State: "Warg"
+ }
+},
+{
+ Id: 2247
+ Name: "RA_CAMOUFLAGE"
+ Description: "Camouflage"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 2248
+ Name: "RA_RESEARCHTRAP"
+ Description: "Research Trap"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 2249
+ Name: "RA_MAGENTATRAP"
+ Description: "Magenta Trap"
+ MaxLevel: 1
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 2
+ SkillInstances: 1
+ AfterCastActDelay: 2000
+ SkillData1: 15000
+ SkillData2: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Special_Alloy_Trap: 1
+// Boody_Red: 1
+// }
+ }
+ Unit: {
+ Id: 0xd2
+ Range: 2
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOPC: true
+ }
+ }
+},
+{
+ Id: 2250
+ Name: "RA_COBALTTRAP"
+ Description: "Cobalt Trap"
+ MaxLevel: 1
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 2
+ SkillInstances: 1
+ AfterCastActDelay: 2000
+ SkillData1: 15000
+ SkillData2: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Special_Alloy_Trap: 1
+// Crystal_Blue: 1
+// }
+ }
+ Unit: {
+ Id: 0xd3
+ Range: 2
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOPC: true
+ }
+ }
+},
+{
+ Id: 2251
+ Name: "RA_MAIZETRAP"
+ Description: "Maize Trap"
+ MaxLevel: 1
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 2
+ SkillInstances: 1
+ AfterCastActDelay: 2000
+ SkillData1: 15000
+ SkillData2: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Special_Alloy_Trap: 1
+// Yellow_Live: 1
+// }
+ }
+ Unit: {
+ Id: 0xd4
+ Range: 2
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOPC: true
+ }
+ }
+},
+{
+ Id: 2252
+ Name: "RA_VERDURETRAP"
+ Description: "Verdure Trap"
+ MaxLevel: 1
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Wind"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 2
+ SkillInstances: 1
+ AfterCastActDelay: 2000
+ SkillData1: 15000
+ SkillData2: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Special_Alloy_Trap: 1
+// Wind_Of_Verdure: 1
+// }
+ }
+ Unit: {
+ Id: 0xd5
+ Range: 2
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOPC: true
+ }
+ }
+},
+{
+ Id: 2253
+ Name: "RA_FIRINGTRAP"
+ Description: "Firing Trap"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ AllowReproduce: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 2
+ SkillInstances: 2
+ SkillData1: 15000
+ SkillData2: 40000
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Special_Alloy_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0xd6
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ }
+ }
+},
+{
+ Id: 2254
+ Name: "RA_ICEBOUNDTRAP"
+ Description: "Icebound Trap"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ AllowReproduce: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Water"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 2
+ SkillInstances: 2
+ SkillData1: 15000
+ SkillData2: 20000
+ Requirements: {
+ SPCost: 10
+// Items: {
+// Special_Alloy_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0xd7
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ }
+ }
+},
+{
+ Id: 2255
+ Name: "NC_MADOLICENCE"
+ Description: "Mado License"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 2256
+ Name: "NC_BOOSTKNUCKLE"
+ Description: "Boost Knuckle"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ CastTime: {
+ Lv1: 200
+ Lv2: 400
+ Lv3: 600
+ Lv4: 800
+ Lv5: 1000
+ Lv6: 1200
+ Lv7: 1400
+ Lv8: 1600
+ Lv9: 1800
+ Lv10: 2000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 3
+ Lv2: 6
+ Lv3: 9
+ Lv4: 12
+ Lv5: 15
+ Lv6: 18
+ Lv7: 21
+ Lv8: 24
+ Lv9: 27
+ Lv10: 30
+ }
+ State: "MadoGear"
+ }
+},
+{
+ Id: 2257
+ Name: "NC_PILEBUNKER"
+ Description: "Pile Bunker"
+ MaxLevel: 3
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 2000
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 50
+ State: "MadoGear"
+// Items: {
+// Pilebuncker: 0
+// Pilebuncker_S: 0
+// Pilebuncker_P: 0
+// Pilebuncker_T: 0
+// }
+ }
+},
+{
+ Id: 2258
+ Name: "NC_VULCANARM"
+ Description: "Vulcan Arm"
+ MaxLevel: 3
+ Range: 13
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ AfterCastActDelay: {
+ Lv1: 300
+ Lv2: 200
+ Lv3: 100
+ Lv4: 1
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 2
+ Lv2: 4
+ Lv3: 6
+ Lv4: 8
+ Lv5: 10
+ Lv6: 12
+ Lv7: 14
+ Lv8: 16
+ Lv9: 18
+ Lv10: 20
+ }
+ State: "MadoGear"
+// Items: {
+// Vulcan_Bullet: 1
+// }
+ }
+},
+{
+ Id: 2259
+ Name: "NC_FLAMELAUNCHER"
+ Description: "Flame Launcher"
+ MaxLevel: 3
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ SplashRange: 2
+ SkillInstances: 5
+ CastTime: {
+ Lv1: 500
+ Lv2: 1000
+ Lv3: 1500
+ Lv4: 2000
+ Lv5: 2500
+ Lv6: 3000
+ Lv7: 3500
+ Lv8: 4000
+ Lv9: 4500
+ Lv10: 5000
+ }
+ AfterCastActDelay: {
+ Lv1: 1500
+ Lv2: 1000
+ Lv3: 500
+ Lv4: 1
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData1: {
+ Lv1: 7000
+ Lv2: 14000
+ Lv3: 21000
+ Lv4: 28000
+ Lv5: 35000
+ Lv6: 42000
+ Lv7: 49000
+ Lv8: 56000
+ Lv9: 63000
+ Lv10: 70000
+ }
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: 20
+ State: "MadoGear"
+// Items: {
+// Flame_Thrower: 0
+// Magic_Gear_Fuel: 1
+// }
+ }
+},
+{
+ Id: 2260
+ Name: "NC_COLDSLOWER"
+ Description: "Cold Slower"
+ MaxLevel: 3
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Water"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 4
+ Lv4: 5
+ Lv5: 6
+ Lv6: 7
+ Lv7: 8
+ Lv8: 9
+ Lv9: 10
+ Lv10: 11
+ }
+ CastTime: 1000
+ AfterCastActDelay: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 5000
+ Lv6: 6000
+ Lv7: 7000
+ Lv8: 8000
+ Lv9: 9000
+ Lv10: 10000
+ }
+ SkillData1: {
+ Lv1: 7000
+ Lv2: 14000
+ Lv3: 21000
+ Lv4: 28000
+ Lv5: 35000
+ Lv6: 42000
+ Lv7: 49000
+ Lv8: 56000
+ Lv9: 63000
+ Lv10: 70000
+ }
+ SkillData2: 40000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 20
+ State: "MadoGear"
+// Items: {
+// Magic_Gear_Fuel: 1
+// Liquid_Condensed_Bullet: 1
+// }
+ }
+},
+{
+ Id: 2261
+ Name: "NC_ARMSCANNON"
+ Description: "Arm Cannon"
+ MaxLevel: 3
+ Range: {
+ Lv1: 9
+ Lv2: 11
+ Lv3: 13
+ Lv4: 15
+ Lv5: 17
+ Lv6: 19
+ Lv7: 21
+ Lv8: 23
+ Lv9: 25
+ Lv10: 27
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 2
+ Lv3: 1
+ Lv4: 1
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ CastTime: {
+ Lv1: 1400
+ Lv2: 1600
+ Lv3: 1800
+ Lv4: 2000
+ Lv5: 2200
+ Lv6: 2400
+ Lv7: 2600
+ Lv8: 2800
+ Lv9: 3000
+ Lv10: 3200
+ }
+ AfterCastActDelay: {
+ Lv1: 500
+ Lv2: 1000
+ Lv3: 2000
+ Lv4: 2000
+ Lv5: 2000
+ Lv6: 2000
+ Lv7: 2000
+ Lv8: 2000
+ Lv9: 2000
+ Lv10: 2000
+ }
+ FixedCastTime: {
+ Lv1: 600
+ Lv2: 400
+ Lv3: 200
+ Lv4: 1
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ AmmoTypes: {
+ A_CANNONBALL: true
+ }
+ AmmoAmount: 1
+ State: "MadoGear"
+// Items: {
+// Magic_Gear_Fuel: 1
+// }
+ }
+},
+{
+ Id: 2262
+ Name: "NC_ACCELERATION"
+ Description: "Acceleration"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 90000
+ Lv3: 120000
+ Lv4: 150000
+ Lv5: 180000
+ Lv6: 210000
+ Lv7: 240000
+ Lv8: 270000
+ Lv9: 300000
+ Lv10: 330000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 40
+ Lv3: 60
+ Lv4: 80
+ Lv5: 100
+ Lv6: 120
+ Lv7: 140
+ Lv8: 160
+ Lv9: 180
+ Lv10: 200
+ }
+ State: "MadoGear"
+// Items: {
+// Accelerator: 0
+// Magic_Gear_Fuel: 1
+// }
+ }
+},
+{
+ Id: 2263
+ Name: "NC_HOVERING"
+ Description: "Hovering"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 90000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 25
+ State: "MadoGear"
+// Items: {
+// Hovering_Booster: 0
+// Magic_Gear_Fuel: 1
+// }
+ }
+},
+{
+ Id: 2264
+ Name: "NC_F_SIDESLIDE"
+ Description: "Front-Side Slide"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ KnockBackTiles: 7
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 5
+ State: "MadoGear"
+// Items: {
+// Magic_Gear_Fuel: 1
+// }
+ }
+},
+{
+ Id: 2265
+ Name: "NC_B_SIDESLIDE"
+ Description: "Back-Side Slide"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ KnockBackTiles: 7
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 5
+ State: "MadoGear"
+// Items: {
+// Magic_Gear_Fuel: 1
+// }
+ }
+},
+{
+ Id: 2266
+ Name: "NC_MAINFRAME"
+ Description: "Mainframe Restructure"
+ MaxLevel: 4
+ NumberOfHits: 0
+},
+{
+ Id: 2267
+ Name: "NC_SELFDESTRUCTION"
+ Description: "Self Destruction"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ IgnoreDefCards: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 4
+ Lv4: 5
+ Lv5: 6
+ Lv6: 7
+ Lv7: 8
+ Lv8: 9
+ Lv9: 10
+ Lv10: 11
+ }
+ KnockBackTiles: 5
+ CastTime: {
+ Lv1: 2000
+ Lv2: 1500
+ Lv3: 1000
+ Lv4: 500
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ CoolDown: 300000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: 1
+ State: "MadoGear"
+// Items: {
+// Suicidal_Device: 0
+// Magic_Gear_Fuel: 3
+// }
+ }
+},
+{
+ Id: 2268
+ Name: "NC_SHAPESHIFT"
+ Description: "Shape Shift"
+ MaxLevel: 4
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 2000
+ SkillData1: 300000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: 100
+ State: "MadoGear"
+// Items: {
+// Scarlet_Pts: 1
+// Lime_Green_Pts: 1
+// Yellow_Wish_Pts: 1
+// Indigo_Pts: 1
+// Magic_Gear_Fuel: 2
+// Shape_Shifter: 0
+// }
+ }
+},
+{
+ Id: 2269
+ Name: "NC_EMERGENCYCOOL"
+ Description: "Emergency Cool"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 500
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 20
+ State: "MadoGear"
+// Items: {
+// Cooling_Device: 0
+// Magic_Gear_Fuel: 1
+// }
+ }
+},
+{
+ Id: 2270
+ Name: "NC_INFRAREDSCAN"
+ Description: "Infrared Scan"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 7
+ InterruptCast: true
+ AfterCastActDelay: 500
+ SkillData1: 3000
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 45
+ State: "MadoGear"
+ }
+},
+{
+ Id: 2271
+ Name: "NC_ANALYZE"
+ Description: "Analyze"
+ MaxLevel: 3
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 20000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: 30
+ State: "MadoGear"
+// Items: {
+// Magic_Gear_Fuel: 1
+// }
+ }
+},
+{
+ Id: 2272
+ Name: "NC_MAGNETICFIELD"
+ Description: "Magnetic Field"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 2
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 4000
+ Lv2: 6000
+ Lv3: 8000
+ Lv4: 10000
+ Lv5: 12000
+ Lv6: 14000
+ Lv7: 16000
+ Lv8: 18000
+ Lv9: 20000
+ Lv10: 22000
+ }
+ CoolDown: {
+ Lv1: 20000
+ Lv2: 15000
+ Lv3: 10000
+ Lv4: 5000
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 70
+ Lv3: 80
+ Lv4: 90
+ Lv5: 100
+ Lv6: 110
+ Lv7: 120
+ Lv8: 130
+ Lv9: 140
+ Lv10: 150
+ }
+ State: "MadoGear"
+// Items: {
+// Mag_Field_Generator: 0
+// Magic_Gear_Fuel: 2
+// }
+ }
+},
+{
+ Id: 2273
+ Name: "NC_NEUTRALBARRIER"
+ Description: "Neutral Barrier"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ CoolDown: 90000
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 90
+ Lv3: 100
+ Lv4: 110
+ Lv5: 120
+ Lv6: 130
+ Lv7: 140
+ Lv8: 150
+ Lv9: 160
+ Lv10: 170
+ }
+ State: "MadoGear"
+// Items: {
+// Barrier_Builder: 0
+// Magic_Gear_Fuel: 1
+// }
+ }
+ Unit: {
+ Id: 0xe2
+ Layout: 2
+ Interval: 500
+ Target: "Friend"
+ }
+},
+{
+ Id: 2274
+ Name: "NC_STEALTHFIELD"
+ Description: "Stealth Field"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 15000
+ Lv2: 20000
+ Lv3: 25000
+ Lv4: 30000
+ Lv5: 35000
+ Lv6: 40000
+ Lv7: 45000
+ Lv8: 50000
+ Lv9: 55000
+ Lv10: 60000
+ }
+ CoolDown: {
+ Lv1: 20000
+ Lv2: 15000
+ Lv3: 10000
+ Lv4: 5000
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 100
+ Lv3: 120
+ Lv4: 140
+ Lv5: 160
+ Lv6: 180
+ Lv7: 200
+ Lv8: 220
+ Lv9: 240
+ Lv10: 260
+ }
+ State: "MadoGear"
+// Items: {
+// Camouflage_Generator: 0
+// Magic_Gear_Fuel: 2
+// }
+ }
+ Unit: {
+ Id: 0xe3
+ Layout: 2
+ Interval: 500
+ Target: "All"
+ }
+},
+{
+ Id: 2275
+ Name: "NC_REPAIR"
+ Description: "Repair"
+ MaxLevel: 5
+ Range: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 200
+ Lv2: 300
+ Lv3: 400
+ Lv4: 500
+ Lv5: 600
+ Lv6: 700
+ Lv7: 800
+ Lv8: 900
+ Lv9: 1000
+ Lv10: 1100
+ }
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 25
+ Lv2: 30
+ Lv3: 35
+ Lv4: 40
+ Lv5: 45
+ Lv6: 50
+ Lv7: 55
+ Lv8: 60
+ Lv9: 65
+ Lv10: 70
+ }
+ State: "MadoGear"
+// Items: {
+// Repair_Kit: 0
+// }
+ }
+},
+{
+ Id: 2276
+ Name: "NC_TRAININGAXE"
+ Description: "Axe Training"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 2277
+ Name: "NC_RESEARCHFE"
+ Description: "Research Fire/Earth"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 2278
+ Name: "NC_AXEBOOMERANG"
+ Description: "Axe Boomerang"
+ MaxLevel: 5
+ Range: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ KnockBackTiles: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 4
+ Lv4: 5
+ Lv5: 6
+ Lv6: 7
+ Lv7: 8
+ Lv8: 9
+ Lv9: 10
+ Lv10: 11
+ }
+ CoolDown: {
+ Lv1: 5000
+ Lv2: 4500
+ Lv3: 4000
+ Lv4: 3500
+ Lv5: 3000
+ Lv6: 2500
+ Lv7: 2000
+ Lv8: 1500
+ Lv9: 1000
+ Lv10: 500
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 22
+ Lv3: 24
+ Lv4: 26
+ Lv5: 28
+ Lv6: 30
+ Lv7: 32
+ Lv8: 34
+ Lv9: 36
+ Lv10: 38
+ }
+ WeaponTypes: {
+ 1HAxes: true
+ 2HAxes: true
+ }
+ }
+},
+{
+ Id: 2279
+ Name: "NC_POWERSWING"
+ Description: "Power Swing"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 1000
+ SkillData1: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 22
+ Lv3: 24
+ Lv4: 26
+ Lv5: 28
+ Lv6: 30
+ Lv7: 32
+ Lv8: 34
+ Lv9: 36
+ Lv10: 38
+ }
+ }
+},
+{
+ Id: 2280
+ Name: "NC_AXETORNADO"
+ Description: "Axe Tornado"
+ MaxLevel: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 2
+ Lv3: 3
+ Lv4: 3
+ Lv5: 3
+ Lv6: 3
+ Lv7: 3
+ Lv8: 3
+ Lv9: 3
+ Lv10: 3
+ }
+ NumberOfHits: -3
+ AfterCastActDelay: 500
+ CoolDown: {
+ Lv1: 4000
+ Lv2: 3500
+ Lv3: 3000
+ Lv4: 2500
+ Lv5: 2000
+ Lv6: 1500
+ Lv7: 1000
+ Lv8: 500
+ Lv9: 1
+ Lv10: 1
+ }
+ FixedCastTime: -1
+ Requirements: {
+ HPCost: {
+ Lv1: 20
+ Lv2: 40
+ Lv3: 60
+ Lv4: 80
+ Lv5: 100
+ Lv6: 120
+ Lv7: 140
+ Lv8: 160
+ Lv9: 180
+ Lv10: 200
+ }
+ SPCost: {
+ Lv1: 18
+ Lv2: 20
+ Lv3: 22
+ Lv4: 24
+ Lv5: 26
+ Lv6: 28
+ Lv7: 30
+ Lv8: 32
+ Lv9: 34
+ Lv10: 36
+ }
+ WeaponTypes: {
+ 1HAxes: true
+ 2HAxes: true
+ }
+ }
+},
+{
+ Id: 2281
+ Name: "NC_SILVERSNIPER"
+ Description: "FAW - Silver Sniper"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 2
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ FixedCastTime: {
+ Lv1: 1800
+ Lv2: 1600
+ Lv3: 1400
+ Lv4: 1200
+ Lv5: 1000
+ Lv6: 800
+ Lv7: 600
+ Lv8: 400
+ Lv9: 200
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 25
+ Lv2: 30
+ Lv3: 35
+ Lv4: 40
+ Lv5: 45
+ Lv6: 50
+ Lv7: 55
+ Lv8: 60
+ Lv9: 65
+ Lv10: 70
+ }
+// Items: {
+// Portable_Furnace: 0
+// Oridecon_Hammer: 0
+// Iron: 1
+// Steel: 2
+// }
+ }
+},
+{
+ Id: 2282
+ Name: "NC_MAGICDECOY"
+ Description: "FAW - Magic Decoy"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 2
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ FixedCastTime: {
+ Lv1: 1800
+ Lv2: 1600
+ Lv3: 1400
+ Lv4: 1200
+ Lv5: 1000
+ Lv6: 800
+ Lv7: 600
+ Lv8: 400
+ Lv9: 200
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+// Items: {
+// Portable_Furnace: 0
+// Oridecon_Hammer: 0
+// Iron: 2
+// Brigan: 1
+// }
+ }
+},
+{
+ Id: 2283
+ Name: "NC_DISJOINT"
+ Description: "FAW Removal"
+ MaxLevel: 1
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 15
+// Items: {
+// Monkey_Wrench: 1
+// }
+ }
+},
+{
+ Id: 2284
+ Name: "SC_FATALMENACE"
+ Description: "Fatal Menace"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+ }
+},
+{
+ Id: 2285
+ Name: "SC_REPRODUCE"
+ Description: "Reproduce"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ }
+},
+{
+ Id: 2286
+ Name: "SC_AUTOSHADOWSPELL"
+ Description: "Auto Shadow Spell"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 4000
+ Lv2: 3600
+ Lv3: 3200
+ Lv4: 2800
+ Lv5: 2400
+ Lv6: 2000
+ Lv7: 1600
+ Lv8: 1200
+ Lv9: 800
+ Lv10: 400
+ }
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 80000
+ Lv3: 100000
+ Lv4: 120000
+ Lv5: 140000
+ Lv6: 160000
+ Lv7: 180000
+ Lv8: 200000
+ Lv9: 220000
+ Lv10: 300000
+ }
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ }
+},
+{
+ Id: 2287
+ Name: "SC_SHADOWFORM"
+ Description: "Shadow Form"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 40000
+ Lv3: 50000
+ Lv4: 60000
+ Lv5: 70000
+ Lv6: 80000
+ Lv7: 90000
+ Lv8: 100000
+ Lv9: 110000
+ Lv10: 120000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 50
+ Lv3: 60
+ Lv4: 70
+ Lv5: 80
+ Lv6: 90
+ Lv7: 100
+ Lv8: 110
+ Lv9: 120
+ Lv10: 130
+ }
+ }
+},
+{
+ Id: 2288
+ Name: "SC_TRIANGLESHOT"
+ Description: "Triangle Shot"
+ MaxLevel: 10
+ Range: {
+ Lv1: 7
+ Lv2: 7
+ Lv3: 7
+ Lv4: 9
+ Lv5: 9
+ Lv6: 9
+ Lv7: 9
+ Lv8: 11
+ Lv9: 11
+ Lv10: 11
+ }
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -3
+ InterruptCast: true
+ KnockBackTiles: 3
+ CastTime: 1000
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 24
+ Lv3: 26
+ Lv4: 28
+ Lv5: 30
+ Lv6: 32
+ Lv7: 34
+ Lv8: 36
+ Lv9: 38
+ Lv10: 40
+ }
+ WeaponTypes: {
+ Bows: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 3
+ }
+},
+{
+ Id: 2289
+ Name: "SC_BODYPAINT"
+ Description: "Body Painting"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 2
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 7000
+ Lv3: 9000
+ Lv4: 11000
+ Lv5: 13000
+ Lv6: 15000
+ Lv7: 17000
+ Lv8: 19000
+ Lv9: 21000
+ Lv10: 23000
+ }
+ SkillData2: 10000
+ CoolDown: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 15
+ Lv3: 20
+ Lv4: 25
+ Lv5: 30
+ Lv6: 35
+ Lv7: 40
+ Lv8: 45
+ Lv9: 50
+ Lv10: 55
+ }
+// Items: {
+// Paint_Brush: 0
+// Surface_Paint: 1
+// }
+ }
+},
+{
+ Id: 2290
+ Name: "SC_INVISIBILITY"
+ Description: "Invisibility"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: 60000
+ CoolDown: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 100
+ }
+},
+{
+ Id: 2291
+ Name: "SC_DEADLYINFECT"
+ Description: "Deadly Infect"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 44
+ Lv3: 48
+ Lv4: 52
+ Lv5: 56
+ Lv6: 60
+ Lv7: 64
+ Lv8: 68
+ Lv9: 72
+ Lv10: 76
+ }
+ }
+},
+{
+ Id: 2292
+ Name: "SC_ENERVATION"
+ Description: "Masquerade - Enervation"
+ MaxLevel: 3
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+// Items: {
+// Face_Paint: 1
+// Makeover_Brush: 0
+// }
+ }
+},
+{
+ Id: 2293
+ Name: "SC_GROOMY"
+ Description: "Masquerade - Gloomy"
+ MaxLevel: 3
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+// Items: {
+// Face_Paint: 1
+// Makeover_Brush: 0
+// }
+ }
+},
+{
+ Id: 2294
+ Name: "SC_IGNORANCE"
+ Description: "Masquerade - Ignorance"
+ MaxLevel: 3
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+// Items: {
+// Face_Paint: 1
+// Makeover_Brush: 0
+// }
+ }
+},
+{
+ Id: 2295
+ Name: "SC_LAZINESS"
+ Description: "Masquerade - Laziness"
+ MaxLevel: 3
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+// Items: {
+// Face_Paint: 1
+// Makeover_Brush: 0
+// }
+ }
+},
+{
+ Id: 2296
+ Name: "SC_UNLUCKY"
+ Description: "Masquerade - Unlucky"
+ MaxLevel: 3
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+// Items: {
+// Face_Paint: 1
+// Makeover_Brush: 0
+// }
+ }
+},
+{
+ Id: 2297
+ Name: "SC_WEAKNESS"
+ Description: "Masquerade - Weakness"
+ MaxLevel: 3
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+// Items: {
+// Face_Paint: 1
+// Makeover_Brush: 0
+// }
+ }
+},
+{
+ Id: 2298
+ Name: "SC_STRIPACCESSARY"
+ Description: "Strip Accessory"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 70000
+ Lv3: 80000
+ Lv4: 90000
+ Lv5: 100000
+ Lv6: 110000
+ Lv7: 120000
+ Lv8: 130000
+ Lv9: 140000
+ Lv10: 150000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 18
+ Lv3: 21
+ Lv4: 24
+ Lv5: 27
+ Lv6: 30
+ Lv7: 33
+ Lv8: 36
+ Lv9: 39
+ Lv10: 42
+ }
+ }
+},
+{
+ Id: 2299
+ Name: "SC_MANHOLE"
+ Description: "Man Hole"
+ MaxLevel: 3
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 3
+ CastTime: 1000
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 10000
+ Lv3: 15000
+ Lv4: 20000
+ Lv5: 25000
+ Lv6: 30000
+ Lv7: 35000
+ Lv8: 40000
+ Lv9: 45000
+ Lv10: 50000
+ }
+ SkillData2: {
+ Lv1: 5000
+ Lv2: 10000
+ Lv3: 15000
+ Lv4: 20000
+ Lv5: 25000
+ Lv6: 30000
+ Lv7: 35000
+ Lv8: 40000
+ Lv9: 45000
+ Lv10: 50000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+// Items: {
+// Paint_Brush: 0
+// Surface_Paint: 1
+// }
+ }
+ Unit: {
+ Id: 0xcc
+ Range: 1
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 2300
+ Name: "SC_DIMENSIONDOOR"
+ Description: "Dimension Door"
+ MaxLevel: 3
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 1
+ CastTime: 1000
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 4000
+ Lv2: 8000
+ Lv3: 12000
+ Lv4: 16000
+ Lv5: 20000
+ Lv6: 24000
+ Lv7: 28000
+ Lv8: 32000
+ Lv9: 36000
+ Lv10: 40000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 36
+ Lv3: 42
+ Lv4: 48
+ Lv5: 54
+ Lv6: 60
+ Lv7: 66
+ Lv8: 72
+ Lv9: 78
+ Lv10: 84
+ }
+// Items: {
+// Paint_Brush: 0
+// Surface_Paint: 1
+// }
+ }
+ Unit: {
+ Id: 0xcd
+ Range: 1
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 2301
+ Name: "SC_CHAOSPANIC"
+ Description: "Chaos Panic"
+ MaxLevel: 3
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 2
+ InterruptCast: true
+ SkillInstances: 1
+ CastTime: 2000
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 10000
+ Lv3: 15000
+ Lv4: 20000
+ Lv5: 25000
+ Lv6: 30000
+ Lv7: 35000
+ Lv8: 40000
+ Lv9: 45000
+ Lv10: 50000
+ }
+ SkillData2: {
+ Lv1: 4000
+ Lv2: 8000
+ Lv3: 12000
+ Lv4: 16000
+ Lv5: 20000
+ Lv6: 24000
+ Lv7: 28000
+ Lv8: 32000
+ Lv9: 36000
+ Lv10: 40000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 36
+ Lv3: 42
+ Lv4: 48
+ Lv5: 54
+ Lv6: 60
+ Lv7: 66
+ Lv8: 72
+ Lv9: 78
+ Lv10: 84
+ }
+// Items: {
+// Paint_Brush: 0
+// Surface_Paint: 2
+// }
+ }
+ Unit: {
+ Id: 0xce
+ Layout: 2
+ Interval: -1
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ UF_NOOVERLAP: true
+ UF_RANGEDSINGLEUNIT: true
+ }
+ }
+},
+{
+ Id: 2302
+ Name: "SC_MAELSTROM"
+ Description: "Maelstrom"
+ MaxLevel: 3
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 2
+ InterruptCast: true
+ SkillInstances: 1
+ CastTime: 2000
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 7000
+ Lv2: 14000
+ Lv3: 21000
+ Lv4: 28000
+ Lv5: 35000
+ Lv6: 42000
+ Lv7: 49000
+ Lv8: 56000
+ Lv9: 63000
+ Lv10: 70000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 55
+ Lv3: 60
+ Lv4: 65
+ Lv5: 70
+ Lv6: 75
+ Lv7: 80
+ Lv8: 85
+ Lv9: 90
+ Lv10: 95
+ }
+// Items: {
+// Paint_Brush: 0
+// Surface_Paint: 2
+// }
+ }
+ Unit: {
+ Id: 0xcf
+ Layout: 2
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_RANGEDSINGLEUNIT: true
+ }
+ }
+},
+{
+ Id: 2303
+ Name: "SC_BLOODYLUST"
+ Description: "Bloody Lust"
+ MaxLevel: 3
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 10000
+ Lv3: 15000
+ Lv4: 20000
+ Lv5: 25000
+ Lv6: 30000
+ Lv7: 35000
+ Lv8: 40000
+ Lv9: 45000
+ Lv10: 50000
+ }
+ CoolDown: 180000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 70
+ Lv3: 80
+ Lv4: 90
+ Lv5: 100
+ Lv6: 110
+ Lv7: 120
+ Lv8: 130
+ Lv9: 140
+ Lv10: 150
+ }
+// Items: {
+// Paint_Brush: 0
+// Surface_Paint: 2
+// }
+ }
+ Unit: {
+ Id: 0xd0
+ Layout: 3
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ UF_RANGEDSINGLEUNIT: true
+ }
+ }
+},
+{
+ Id: 2304
+ Name: "SC_FEINTBOMB"
+ Description: "Feint Bomb"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ CastTime: 1000
+ SkillData1: 1000
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 24
+ Lv2: 28
+ Lv3: 32
+ Lv4: 36
+ Lv5: 40
+ Lv6: 44
+ Lv7: 48
+ Lv8: 52
+ Lv9: 56
+ Lv10: 60
+ }
+// Items: {
+// Paint_Brush: 0
+// Surface_Paint: 1
+// }
+ }
+ Unit: {
+ Id: 0xd1
+ Range: 2
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2307
+ Name: "LG_CANNONSPEAR"
+ Description: "Cannon Spear"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SplashRange: 2
+ SkillInstances: 10
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 16
+ Lv3: 20
+ Lv4: 24
+ Lv5: 28
+ Lv6: 32
+ Lv7: 36
+ Lv8: 40
+ Lv9: 44
+ Lv10: 48
+ }
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 2308
+ Name: "LG_BANISHINGPOINT"
+ Description: "Banishing Point"
+ MaxLevel: 10
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 20
+ Lv3: 20
+ Lv4: 20
+ Lv5: 20
+ Lv6: 25
+ Lv7: 25
+ Lv8: 25
+ Lv9: 25
+ Lv10: 25
+ }
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 2309
+ Name: "LG_TRAMPLE"
+ Description: "Trample"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 2
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 45
+ Lv3: 60
+ Lv4: 75
+ Lv5: 90
+ Lv6: 105
+ Lv7: 120
+ Lv8: 135
+ Lv9: 150
+ Lv10: 165
+ }
+ }
+},
+{
+ Id: 2310
+ Name: "LG_SHIELDPRESS"
+ Description: "Shield Press"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ SkillData1: {
+ Lv1: 5500
+ Lv2: 6000
+ Lv3: 6500
+ Lv4: 7000
+ Lv5: 7500
+ }
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 12
+ Lv3: 14
+ Lv4: 16
+ Lv5: 18
+ Lv6: 20
+ Lv7: 22
+ Lv8: 24
+ Lv9: 26
+ Lv10: 28
+ }
+ State: "Shield"
+ }
+},
+{
+ Id: 2311
+ Name: "LG_REFLECTDAMAGE"
+ Description: "Reflect Damage"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 3
+ SkillData1: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 80
+ Lv3: 100
+ Lv4: 120
+ Lv5: 140
+ Lv6: 160
+ Lv7: 180
+ Lv8: 200
+ Lv9: 220
+ Lv10: 240
+ }
+ State: "Shield"
+ }
+},
+{
+ Id: 2312
+ Name: "LG_PINPOINTATTACK"
+ Description: "Pinpoint Attack"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 1000
+ SkillData1: 5000
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 50
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 2313
+ Name: "LG_FORCEOFVANGUARD"
+ Description: "Force of Vanguard"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 30
+ }
+},
+{
+ Id: 2314
+ Name: "LG_RAGEBURST"
+ Description: "Rage Burst"
+ MaxLevel: 1
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ AfterCastActDelay: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 150
+ }
+},
+{
+ Id: 2315
+ Name: "LG_SHIELDSPELL"
+ Description: "Shield Spell"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ Element: {
+ Lv1: "Ele_Neutral"
+ Lv2: "Ele_Holy"
+ Lv3: "Ele_Neutral"
+ }
+ DamageType: {
+ SplashArea: true
+ }
+ InterruptCast: true
+ KnockBackTiles: {
+ Lv1: 2
+ Lv2: 0
+ Lv3: 0
+ Lv4: 0
+ Lv5: 0
+ Lv6: 0
+ Lv7: 0
+ Lv8: 0
+ Lv9: 0
+ Lv10: 0
+ }
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 50
+ State: "Shield"
+ }
+},
+{
+ Id: 2316
+ Name: "LG_EXEEDBREAK"
+ Description: "Exceed Break"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 5000
+ Lv2: 5500
+ Lv3: 6000
+ Lv4: 6500
+ Lv5: 7000
+ Lv6: 7500
+ Lv7: 8000
+ Lv8: 8500
+ Lv9: 9000
+ Lv10: 9500
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 32
+ Lv3: 44
+ Lv4: 56
+ Lv5: 68
+ Lv6: 80
+ Lv7: 92
+ Lv8: 104
+ Lv9: 116
+ Lv10: 128
+ }
+ }
+},
+{
+ Id: 2317
+ Name: "LG_OVERBRAND"
+ Description: "Over Brand"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ InterruptCast: true
+ CastTime: 500
+ AfterCastActDelay: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 30
+ Lv3: 40
+ Lv4: 50
+ Lv5: 60
+ Lv6: 70
+ Lv7: 80
+ Lv8: 90
+ Lv9: 100
+ Lv10: 110
+ }
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 2318
+ Name: "LG_PRESTIGE"
+ Description: "Prestige"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ CoolDown: 60000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 75
+ Lv2: 80
+ Lv3: 85
+ Lv4: 90
+ Lv5: 95
+ Lv6: 100
+ Lv7: 105
+ Lv8: 110
+ Lv9: 115
+ Lv10: 120
+ }
+ }
+},
+{
+ Id: 2319
+ Name: "LG_BANDING"
+ Description: "Banding"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 3
+ SkillData1: -1
+ SkillData2: {
+ Lv1: 2000
+ Lv2: 4000
+ Lv3: 6000
+ Lv4: 8000
+ Lv5: 10000
+ Lv6: 12000
+ Lv7: 14000
+ Lv8: 16000
+ Lv9: 18000
+ Lv10: 20000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 36
+ Lv3: 42
+ Lv4: 48
+ Lv5: 54
+ Lv6: 60
+ Lv7: 66
+ Lv8: 72
+ Lv9: 78
+ Lv10: 84
+ }
+ }
+ Unit: {
+ Id: 0xec
+ Range: 3
+ Interval: 5000
+ Target: "All"
+ }
+},
+{
+ Id: 2320
+ Name: "LG_MOONSLASHER"
+ Description: "Moon Slasher"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ CoolDown: {
+ Lv1: 6000
+ Lv2: 5000
+ Lv3: 4000
+ Lv4: 3000
+ Lv5: 2000
+ Lv6: 1000
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 24
+ Lv3: 28
+ Lv4: 32
+ Lv5: 36
+ Lv6: 40
+ Lv7: 44
+ Lv8: 48
+ Lv9: 52
+ Lv10: 56
+ }
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 2321
+ Name: "LG_RAYOFGENESIS"
+ Description: "Ray of Genesis"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Holy"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 5
+ NumberOfHits: -7
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2000
+ Lv2: 2500
+ Lv3: 3000
+ Lv4: 3500
+ Lv5: 4000
+ Lv6: 4500
+ Lv7: 5000
+ Lv8: 5500
+ Lv9: 6000
+ Lv10: 6500
+ }
+ AfterCastActDelay: 2000
+ SkillData1: 10000
+ CoolDown: 5000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 65
+ Lv3: 70
+ Lv4: 75
+ Lv5: 80
+ Lv6: 85
+ Lv7: 90
+ Lv8: 95
+ Lv9: 100
+ Lv10: 105
+ }
+ }
+},
+{
+ Id: 2322
+ Name: "LG_PIETY"
+ Description: "Piety"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 1
+ InterruptCast: true
+ CastTime: {
+ Lv1: 3000
+ Lv2: 2500
+ Lv3: 2000
+ Lv4: 1500
+ Lv5: 1000
+ Lv6: 500
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 80000
+ Lv3: 100000
+ Lv4: 120000
+ Lv5: 140000
+ Lv6: 160000
+ Lv7: 180000
+ Lv8: 200000
+ Lv9: 220000
+ Lv10: 240000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+// Items: {
+// Holy_Water: 2
+// }
+ }
+},
+{
+ Id: 2323
+ Name: "LG_EARTHDRIVE"
+ Description: "Earth Drive"
+ MaxLevel: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Earth"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ NumberOfHits: -5
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 3000
+ Lv2: 6000
+ Lv3: 9000
+ Lv4: 12000
+ Lv5: 15000
+ Lv6: 18000
+ Lv7: 21000
+ Lv8: 24000
+ Lv9: 27000
+ Lv10: 30000
+ }
+ CoolDown: {
+ Lv1: 7000
+ Lv2: 6000
+ Lv3: 5000
+ Lv4: 4000
+ Lv5: 3000
+ Lv6: 2000
+ Lv7: 1000
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 52
+ Lv2: 60
+ Lv3: 68
+ Lv4: 76
+ Lv5: 84
+ Lv6: 92
+ Lv7: 100
+ Lv8: 108
+ Lv9: 116
+ Lv10: 124
+ }
+ State: "Shield"
+ }
+},
+{
+ Id: 2324
+ Name: "LG_HESPERUSLIT"
+ Description: "Hesperus Lit"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 3
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 3000
+ CoolDown: 20000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 90
+ Lv3: 100
+ Lv4: 110
+ Lv5: 120
+ Lv6: 130
+ Lv7: 140
+ Lv8: 150
+ Lv9: 160
+ Lv10: 170
+ }
+ WeaponTypes: {
+ 1HSpears: true
+ 2HSpears: true
+ }
+ }
+},
+{
+ Id: 2325
+ Name: "LG_INSPIRATION"
+ Description: "Inspiration"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ CoolDown: {
+ Lv1: 540000
+ Lv2: 480000
+ Lv3: 420000
+ Lv4: 360000
+ Lv5: 300000
+ Lv6: 240000
+ Lv7: 180000
+ Lv8: 120000
+ Lv9: 60000
+ Lv10: 1
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 90
+ Lv3: 100
+ Lv4: 110
+ Lv5: 120
+ Lv6: 130
+ Lv7: 140
+ Lv8: 150
+ Lv9: 160
+ Lv10: 170
+ }
+ }
+},
+{
+ Id: 2519
+ Name: "LG_OVERBRAND_BRANDISH"
+ Description: "Over Brand"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ InterruptCast: true
+ KnockBackTiles: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+},
+{
+ Id: 2326
+ Name: "SR_DRAGONCOMBO"
+ Description: "Dragon Combo"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -2
+ SkillData1: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ }
+},
+{
+ Id: 2327
+ Name: "SR_SKYNETBLOW"
+ Description: "Sky Net Blow"
+ MaxLevel: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ NumberOfHits: -3
+ KnockBackTiles: 3
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 8
+ Lv2: 9
+ Lv3: 10
+ Lv4: 11
+ Lv5: 12
+ Lv6: 13
+ Lv7: 14
+ Lv8: 15
+ Lv9: 16
+ Lv10: 17
+ }
+ }
+},
+{
+ Id: 2328
+ Name: "SR_EARTHSHAKER"
+ Description: "Earth Shaker"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ SkillData1: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 2000
+ Lv4: 3000
+ Lv5: 3000
+ }
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 36
+ Lv2: 40
+ Lv3: 44
+ Lv4: 48
+ Lv5: 52
+ Lv6: 56
+ Lv7: 60
+ Lv8: 64
+ Lv9: 68
+ Lv10: 72
+ }
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 2329
+ Name: "SR_FALLENEMPIRE"
+ Description: "Fallen Empire"
+ MaxLevel: 5
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -2
+ SkillData1: {
+ Lv1: 500
+ Lv2: 1000
+ Lv3: 1500
+ Lv4: 2000
+ Lv5: 2500
+ Lv6: 3000
+ Lv7: 3500
+ Lv8: 4000
+ Lv9: 4500
+ Lv10: 5000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 30
+ Lv3: 40
+ Lv4: 50
+ Lv5: 60
+ Lv6: 70
+ Lv7: 80
+ Lv8: 90
+ Lv9: 100
+ Lv10: 110
+ }
+ SpiritSphereCost: 2
+ }
+},
+{
+ Id: 2330
+ Name: "SR_TIGERCANNON"
+ Description: "Tiger Cannon"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 1
+ Lv5: 1
+ Lv6: 2
+ Lv7: 2
+ Lv8: 2
+ Lv9: 2
+ Lv10: 2
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1100
+ Lv2: 1200
+ Lv3: 1300
+ Lv4: 1400
+ Lv5: 1500
+ Lv6: 1600
+ Lv7: 1700
+ Lv8: 1800
+ Lv9: 1900
+ Lv10: 2000
+ }
+ AfterCastActDelay: 1000
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ HPRateCost: {
+ Lv1: -12
+ Lv2: -14
+ Lv3: -16
+ Lv4: -18
+ Lv5: -20
+ Lv6: -22
+ Lv7: -24
+ Lv8: -26
+ Lv9: -28
+ Lv10: -30
+ }
+ SPRateCost: {
+ Lv1: -6
+ Lv2: -7
+ Lv3: -8
+ Lv4: -9
+ Lv5: -10
+ Lv6: -11
+ Lv7: -12
+ Lv8: -13
+ Lv9: -14
+ Lv10: -15
+ }
+ State: "ExplosionSpirits"
+ SpiritSphereCost: 2
+ }
+},
+{
+ Id: 2331
+ Name: "SR_HELLGATE"
+ Description: "Hell Gate"
+ MaxLevel: 10
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2332
+ Name: "SR_RAMPAGEBLASTER"
+ Description: "Rampage Blaster"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+ AfterCastActDelay: 1000
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 150
+ }
+},
+{
+ Id: 2333
+ Name: "SR_CRESCENTELBOW"
+ Description: "Crescent Elbow"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 3000
+ Lv2: 4000
+ Lv3: 5000
+ Lv4: 6000
+ Lv5: 7000
+ Lv6: 8000
+ Lv7: 9000
+ Lv8: 10000
+ Lv9: 11000
+ Lv10: 12000
+ }
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 80
+ SpiritSphereCost: 2
+ }
+},
+{
+ Id: 2334
+ Name: "SR_CURSEDCIRCLE"
+ Description: "Cursed Circle"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 3000
+ Lv2: 4000
+ Lv3: 5000
+ Lv4: 6000
+ Lv5: 7000
+ Lv6: 8000
+ Lv7: 9000
+ Lv8: 10000
+ Lv9: 11000
+ Lv10: 12000
+ }
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 60
+ Lv3: 80
+ Lv4: 100
+ Lv5: 120
+ Lv6: 140
+ Lv7: 160
+ Lv8: 180
+ Lv9: 200
+ Lv10: 220
+ }
+ HPRateCost: {
+ Lv1: -1
+ Lv2: -2
+ Lv3: -3
+ Lv4: -4
+ Lv5: -5
+ Lv6: -6
+ Lv7: -7
+ Lv8: -8
+ Lv9: -9
+ Lv10: -10
+ }
+ }
+},
+{
+ Id: 2335
+ Name: "SR_LIGHTNINGWALK"
+ Description: "Lightning Walk"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 6000
+ Lv3: 7000
+ Lv4: 8000
+ Lv5: 9000
+ Lv6: 10000
+ Lv7: 11000
+ Lv8: 12000
+ Lv9: 13000
+ Lv10: 14000
+ }
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 70
+ Lv3: 60
+ Lv4: 50
+ Lv5: 40
+ Lv6: 30
+ Lv7: 20
+ Lv8: 10
+ Lv9: 1
+ Lv10: 1
+ }
+ HPRateCost: {
+ Lv1: -5
+ Lv2: -4
+ Lv3: -3
+ Lv4: -2
+ Lv5: -1
+ Lv6: 0
+ Lv7: 1
+ Lv8: 2
+ Lv9: 3
+ Lv10: 4
+ }
+ }
+},
+{
+ Id: 2336
+ Name: "SR_KNUCKLEARROW"
+ Description: "Knuckle Arrow"
+ MaxLevel: 5
+ Range: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ KnockBackTiles: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 4
+ Lv4: 5
+ Lv5: 6
+ Lv6: 7
+ Lv7: 8
+ Lv8: 9
+ Lv9: 10
+ Lv10: 11
+ }
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 15
+ Lv3: 20
+ Lv4: 25
+ Lv5: 30
+ Lv6: 35
+ Lv7: 40
+ Lv8: 45
+ Lv9: 50
+ Lv10: 55
+ }
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 2337
+ Name: "SR_WINDMILL"
+ Description: "Windmill"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 500
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 45
+ }
+},
+{
+ Id: 2338
+ Name: "SR_RAISINGDRAGON"
+ Description: "Raising Dragon"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ CoolDown: 30000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 120
+ }
+},
+{
+ Id: 2339
+ Name: "SR_GENTLETOUCH"
+ Description: "Gentle Touch"
+ MaxLevel: 5
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2340
+ Name: "SR_ASSIMILATEPOWER"
+ Description: "Assimilate Power"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 2
+ AfterCastActDelay: 1000
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 2341
+ Name: "SR_POWERVELOCITY"
+ Description: "Power Velocity"
+ MaxLevel: 1
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1500
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: 50
+ SpiritSphereCost: 5
+ }
+},
+{
+ Id: 2342
+ Name: "SR_CRESCENTELBOW_AUTOSPELL"
+ Description: "Crescent Elbow Autospell"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreDefense: true
+ }
+ KnockBackTiles: 7
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2343
+ Name: "SR_GATEOFHELL"
+ Description: "Gate of Hell"
+ MaxLevel: 10
+ Range: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 3
+ Lv5: 4
+ Lv6: 4
+ Lv7: 5
+ Lv8: 5
+ Lv9: 6
+ Lv10: 7
+ }
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ NumberOfHits: -7
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ AfterCastActDelay: {
+ Lv1: 100
+ Lv2: 200
+ Lv3: 300
+ Lv4: 400
+ Lv5: 500
+ Lv6: 600
+ Lv7: 700
+ Lv8: 800
+ Lv9: 900
+ Lv10: 1000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 11
+ Lv2: 12
+ Lv3: 13
+ Lv4: 14
+ Lv5: 15
+ Lv6: 16
+ Lv7: 17
+ Lv8: 18
+ Lv9: 19
+ Lv10: 20
+ }
+ SPRateCost: {
+ Lv1: -11
+ Lv2: -12
+ Lv3: -13
+ Lv4: -14
+ Lv5: -15
+ Lv6: -16
+ Lv7: -17
+ Lv8: -18
+ Lv9: -19
+ Lv10: -20
+ }
+ SpiritSphereCost: 5
+ }
+},
+{
+ Id: 2344
+ Name: "SR_GENTLETOUCH_QUIET"
+ Description: "Gentle Touch - Quiet"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 7000
+ Lv3: 9000
+ Lv4: 11000
+ Lv5: 13000
+ Lv6: 15000
+ Lv7: 17000
+ Lv8: 19000
+ Lv9: 21000
+ Lv10: 23000
+ }
+ CoolDown: {
+ Lv1: 1000
+ Lv2: 1500
+ Lv3: 2000
+ Lv4: 2500
+ Lv5: 3000
+ Lv6: 3500
+ Lv7: 4000
+ Lv8: 4500
+ Lv9: 5000
+ Lv10: 5500
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+ }
+},
+{
+ Id: 2345
+ Name: "SR_GENTLETOUCH_CURE"
+ Description: "Gentle Touch - Cure"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ CoolDown: {
+ Lv1: 1000
+ Lv2: 1500
+ Lv3: 2000
+ Lv4: 2500
+ Lv5: 3000
+ Lv6: 3500
+ Lv7: 4000
+ Lv8: 4500
+ Lv9: 5000
+ Lv10: 5500
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 50
+ Lv3: 60
+ Lv4: 70
+ Lv5: 80
+ Lv6: 90
+ Lv7: 100
+ Lv8: 110
+ Lv9: 120
+ Lv10: 130
+ }
+ SpiritSphereCost: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ }
+},
+{
+ Id: 2346
+ Name: "SR_GENTLETOUCH_ENERGYGAIN"
+ Description: "Gentle Touch - Energy Gain"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: 240000
+ FixedCastTime: {
+ Lv1: 1000
+ Lv2: 1500
+ Lv3: 2000
+ Lv4: 2500
+ Lv5: 3000
+ Lv6: 3500
+ Lv7: 4000
+ Lv8: 4500
+ Lv9: 5000
+ Lv10: 5500
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 50
+ Lv3: 60
+ Lv4: 70
+ Lv5: 80
+ Lv6: 90
+ Lv7: 100
+ Lv8: 110
+ Lv9: 120
+ Lv10: 130
+ }
+ HPRateCost: {
+ Lv1: -1
+ Lv2: -2
+ Lv3: -3
+ Lv4: -4
+ Lv5: -5
+ Lv6: -6
+ Lv7: -7
+ Lv8: -8
+ Lv9: -9
+ Lv10: -10
+ }
+ }
+},
+{
+ Id: 2347
+ Name: "SR_GENTLETOUCH_CHANGE"
+ Description: "Gentle Touch - Change"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: 240000
+ CoolDown: {
+ Lv1: 200000
+ Lv2: 180000
+ Lv3: 160000
+ Lv4: 140000
+ Lv5: 120000
+ Lv6: 100000
+ Lv7: 80000
+ Lv8: 60000
+ Lv9: 40000
+ Lv10: 20000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 50
+ Lv3: 60
+ Lv4: 70
+ Lv5: 80
+ Lv6: 90
+ Lv7: 100
+ Lv8: 110
+ Lv9: 120
+ Lv10: 130
+ }
+ HPRateCost: {
+ Lv1: -2
+ Lv2: -4
+ Lv3: -6
+ Lv4: -8
+ Lv5: -10
+ Lv6: -12
+ Lv7: -14
+ Lv8: -16
+ Lv9: -18
+ Lv10: -20
+ }
+ SpiritSphereCost: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ }
+},
+{
+ Id: 2348
+ Name: "SR_GENTLETOUCH_REVITALIZE"
+ Description: "Gentle Touch - Revitalize"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: 240000
+ CoolDown: {
+ Lv1: 200000
+ Lv2: 180000
+ Lv3: 160000
+ Lv4: 140000
+ Lv5: 120000
+ Lv6: 100000
+ Lv7: 80000
+ Lv8: 60000
+ Lv9: 40000
+ Lv10: 20000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 50
+ Lv3: 60
+ Lv4: 70
+ Lv5: 80
+ Lv6: 90
+ Lv7: 100
+ Lv8: 110
+ Lv9: 120
+ Lv10: 130
+ }
+ SpiritSphereCost: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ }
+},
+{
+ Id: 2350
+ Name: "WA_SWING_DANCE"
+ Description: "Swing Dance"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 2000
+ SkillData1: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 96
+ Lv2: 112
+ Lv3: 128
+ Lv4: 144
+ Lv5: 160
+ Lv6: 176
+ Lv7: 192
+ Lv8: 208
+ Lv9: 224
+ Lv10: 240
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2351
+ Name: "WA_SYMPHONY_OF_LOVER"
+ Description: "Symphony of Lovers"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 2000
+ SkillData1: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 69
+ Lv3: 78
+ Lv4: 87
+ Lv5: 96
+ Lv6: 105
+ Lv7: 114
+ Lv8: 123
+ Lv9: 132
+ Lv10: 141
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2352
+ Name: "WA_MOONLIT_SERENADE"
+ Description: "Moonlit Serenade"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 2000
+ SkillData1: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 84
+ Lv2: 96
+ Lv3: 108
+ Lv4: 120
+ Lv5: 134
+ Lv6: 134
+ Lv7: 134
+ Lv8: 134
+ Lv9: 134
+ Lv10: 134
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2381
+ Name: "MI_RUSH_WINDMILL"
+ Description: "Windmill Rush Attack"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 2000
+ SkillData1: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 82
+ Lv2: 88
+ Lv3: 94
+ Lv4: 100
+ Lv5: 106
+ Lv6: 112
+ Lv7: 118
+ Lv8: 124
+ Lv9: 130
+ Lv10: 136
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2382
+ Name: "MI_ECHOSONG"
+ Description: "Echo Song"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 2000
+ SkillData1: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 86
+ Lv2: 92
+ Lv3: 98
+ Lv4: 104
+ Lv5: 110
+ Lv6: 116
+ Lv7: 122
+ Lv8: 128
+ Lv9: 134
+ Lv10: 140
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2383
+ Name: "MI_HARMONIZE"
+ Description: "Harmonize"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: 60000
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 75
+ Lv3: 80
+ Lv4: 85
+ Lv5: 90
+ Lv6: 95
+ Lv7: 100
+ Lv8: 105
+ Lv9: 110
+ Lv10: 115
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2412
+ Name: "WM_LESSON"
+ Description: "Lesson"
+ MaxLevel: 10
+ NumberOfHits: 0
+},
+{
+ Id: 2413
+ Name: "WM_METALICSOUND"
+ Description: "Metallic Sound"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Weapon"
+ NumberOfHits: {
+ Lv1: -2
+ Lv2: -2
+ Lv3: -3
+ Lv4: -3
+ Lv5: -4
+ Lv6: -4
+ Lv7: -5
+ Lv8: -5
+ Lv9: -6
+ Lv10: -6
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1500
+ Lv3: 2000
+ Lv4: 2500
+ Lv5: 3000
+ Lv6: 3500
+ Lv7: 4000
+ Lv8: 4500
+ Lv9: 5000
+ Lv10: 5500
+ }
+ AfterCastActDelay: 1000
+ CoolDown: {
+ Lv1: 2000
+ Lv2: 2500
+ Lv3: 3000
+ Lv4: 3500
+ Lv5: 4000
+ Lv6: 4500
+ Lv7: 5000
+ Lv8: 5500
+ Lv9: 6000
+ Lv10: 6500
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 64
+ Lv2: 68
+ Lv3: 72
+ Lv4: 76
+ Lv5: 80
+ Lv6: 84
+ Lv7: 88
+ Lv8: 92
+ Lv9: 96
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 2414
+ Name: "WM_REVERBERATION"
+ Description: "Reverberation"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ AllowReproduce: true
+ }
+ Element: "Ele_Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: 1
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1100
+ Lv2: 1200
+ Lv3: 1300
+ Lv4: 1400
+ Lv5: 1500
+ Lv6: 1600
+ Lv7: 1700
+ Lv8: 1800
+ Lv9: 1900
+ Lv10: 2000
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 9000
+ Lv2: 10000
+ Lv3: 11000
+ Lv4: 12000
+ Lv5: 13000
+ Lv6: 14000
+ Lv7: 15000
+ Lv8: 16000
+ Lv9: 17000
+ Lv10: 18000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 28
+ Lv2: 32
+ Lv3: 38
+ Lv4: 42
+ Lv5: 48
+ Lv6: 52
+ Lv7: 58
+ Lv8: 62
+ Lv9: 68
+ Lv10: 72
+ }
+ }
+ Unit: {
+ Id: 0xda
+ Interval: -1
+ Target: "Enemy"
+ }
+},
+{
+ Id: 2415
+ Name: "WM_REVERBERATION_MELEE"
+ Description: "Reverberation Melee"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2416
+ Name: "WM_REVERBERATION_MAGIC"
+ Description: "Reverberation Magic"
+ MaxLevel: 5
+ AttackType: "Magic"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2417
+ Name: "WM_DOMINION_IMPULSE"
+ Description: "Dominion Impulse"
+ MaxLevel: 1
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 5
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 2418
+ Name: "WM_SEVERE_RAINSTORM"
+ Description: "Severe Rainstorm"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1500
+ Lv2: 2000
+ Lv3: 2500
+ Lv4: 3000
+ Lv5: 3500
+ Lv6: 4000
+ Lv7: 4500
+ Lv8: 5000
+ Lv9: 5500
+ Lv10: 6000
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 3400
+ CoolDown: {
+ Lv1: 5000
+ Lv2: 5500
+ Lv3: 6000
+ Lv4: 6500
+ Lv5: 7000
+ Lv6: 7500
+ Lv7: 8000
+ Lv8: 8500
+ Lv9: 9000
+ Lv10: 9500
+ }
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 90
+ Lv3: 100
+ Lv4: 110
+ Lv5: 120
+ Lv6: 130
+ Lv7: 140
+ Lv8: 150
+ Lv9: 160
+ Lv10: 170
+ }
+ WeaponTypes: {
+ Bows: true
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 20
+ }
+ Unit: {
+ Id: 0xdb
+ Range: 5
+ Interval: 300
+ Target: "Enemy"
+ Flag: {
+ UF_DUALMODE: true
+ }
+ }
+},
+{
+ Id: 2419
+ Name: "WM_POEMOFNETHERWORLD"
+ Description: "Poem of The Netherworld"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 1
+ InterruptCast: true
+ SkillInstances: 5
+ CastTime: 3000
+ SkillData1: {
+ Lv1: 9000
+ Lv2: 11000
+ Lv3: 13000
+ Lv4: 15000
+ Lv5: 17000
+ Lv6: 19000
+ Lv7: 21000
+ Lv8: 23000
+ Lv9: 25000
+ Lv10: 27000
+ }
+ SkillData2: {
+ Lv1: 8000
+ Lv2: 10000
+ Lv3: 12000
+ Lv4: 14000
+ Lv5: 16000
+ Lv6: 18000
+ Lv7: 20000
+ Lv8: 22000
+ Lv9: 24000
+ Lv10: 26000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 16
+ Lv3: 20
+ Lv4: 24
+ Lv5: 28
+ Lv6: 32
+ Lv7: 36
+ Lv8: 40
+ Lv9: 44
+ Lv10: 48
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+// Items: {
+// Protect_Neck_Candy: 1
+// }
+ }
+ Unit: {
+ Id: 0xde
+ Range: 1
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_NOFOOTSET: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2420
+ Name: "WM_VOICEOFSIREN"
+ Description: "Voice of Siren"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 4
+ Lv4: 5
+ Lv5: 6
+ Lv6: 7
+ Lv7: 8
+ Lv8: 9
+ Lv9: 10
+ Lv10: 11
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2000
+ Lv2: 2200
+ Lv3: 2400
+ Lv4: 2600
+ Lv5: 2800
+ Lv6: 3000
+ Lv7: 3200
+ Lv8: 3400
+ Lv9: 3600
+ Lv10: 3800
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 15000
+ Lv2: 18000
+ Lv3: 21000
+ Lv4: 24000
+ Lv5: 27000
+ Lv6: 30000
+ Lv7: 33000
+ Lv8: 36000
+ Lv9: 39000
+ Lv10: 42000
+ }
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 48
+ Lv2: 56
+ Lv3: 64
+ Lv4: 72
+ Lv5: 80
+ Lv6: 88
+ Lv7: 96
+ Lv8: 104
+ Lv9: 112
+ Lv10: 120
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2421
+ Name: "WM_DEADHILLHERE"
+ Description: "Valley of Death"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 3000
+ Lv2: 2500
+ Lv3: 2000
+ Lv4: 1500
+ Lv5: 1000
+ Lv6: 500
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ AfterCastActDelay: 1000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 53
+ Lv3: 56
+ Lv4: 59
+ Lv5: 62
+ Lv6: 65
+ Lv7: 68
+ Lv8: 71
+ Lv9: 74
+ Lv10: 77
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+// Items: {
+// Heartbroken_Tears: 1
+// }
+ }
+},
+{
+ Id: 2422
+ Name: "WM_LULLABY_DEEPSLEEP"
+ Description: "Deep Sleep Lullaby"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ CoolDown: 10000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 90
+ Lv3: 100
+ Lv4: 110
+ Lv5: 120
+ Lv6: 130
+ Lv7: 140
+ Lv8: 150
+ Lv9: 160
+ Lv10: 170
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2423
+ Name: "WM_SIRCLEOFNATURE"
+ Description: "Circle of Nature's Sound"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ SkillData1: 60000
+ CoolDown: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 42
+ Lv2: 46
+ Lv3: 50
+ Lv4: 54
+ Lv5: 58
+ Lv6: 62
+ Lv7: 66
+ Lv8: 70
+ Lv9: 74
+ Lv10: 78
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2424
+ Name: "WM_RANDOMIZESPELL"
+ Description: "Improvised Song"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ }
+},
+{
+ Id: 2425
+ Name: "WM_GLOOMYDAY"
+ Description: "Gloomy Day"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ CoolDown: 10000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 75
+ Lv3: 90
+ Lv4: 105
+ Lv5: 120
+ Lv6: 135
+ Lv7: 150
+ Lv8: 165
+ Lv9: 180
+ Lv10: 195
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2426
+ Name: "WM_GREAT_ECHO"
+ Description: "Great Echo"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 3
+ Lv4: 4
+ Lv5: 4
+ Lv6: 5
+ Lv7: 5
+ Lv8: 6
+ Lv9: 6
+ Lv10: 7
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2000
+ Lv2: 2200
+ Lv3: 2400
+ Lv4: 2600
+ Lv5: 2800
+ Lv6: 3000
+ Lv7: 3200
+ Lv8: 3400
+ Lv9: 3600
+ Lv10: 3800
+ }
+ AfterCastActDelay: 1000
+ CoolDown: 10000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 90
+ Lv3: 100
+ Lv4: 110
+ Lv5: 120
+ Lv6: 130
+ Lv7: 140
+ Lv8: 150
+ Lv9: 160
+ Lv10: 170
+ }
+// Items: {
+// Protect_Neck_Candy: 1
+// }
+ }
+},
+{
+ Id: 2427
+ Name: "WM_SONG_OF_MANA"
+ Description: "Song of Mana"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 60000
+ Lv3: 90000
+ Lv4: 120000
+ Lv5: 150000
+ Lv6: 180000
+ Lv7: 210000
+ Lv8: 240000
+ Lv9: 270000
+ Lv10: 300000
+ }
+ CoolDown: 90000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 120
+ Lv2: 140
+ Lv3: 160
+ Lv4: 180
+ Lv5: 200
+ Lv6: 220
+ Lv7: 240
+ Lv8: 260
+ Lv9: 280
+ Lv10: 300
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2428
+ Name: "WM_DANCE_WITH_WUG"
+ Description: "Dance With A Warg"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1500
+ Lv2: 2000
+ Lv3: 2500
+ Lv4: 3000
+ Lv5: 3500
+ Lv6: 4000
+ Lv7: 4500
+ Lv8: 5000
+ Lv9: 5500
+ Lv10: 6000
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 60000
+ Lv3: 90000
+ Lv4: 120000
+ Lv5: 150000
+ Lv6: 180000
+ Lv7: 210000
+ Lv8: 240000
+ Lv9: 270000
+ Lv10: 300000
+ }
+ CoolDown: 90000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 120
+ Lv2: 140
+ Lv3: 160
+ Lv4: 180
+ Lv5: 200
+ Lv6: 220
+ Lv7: 240
+ Lv8: 260
+ Lv9: 280
+ Lv10: 300
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2429
+ Name: "WM_SOUND_OF_DESTRUCTION"
+ Description: "Sound of Destruction"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: {
+ Lv1: 4
+ Lv2: 4
+ Lv3: 5
+ Lv4: 5
+ Lv5: 6
+ Lv6: 6
+ Lv7: 7
+ Lv8: 7
+ Lv9: 8
+ Lv10: 8
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 0
+ Lv2: 500
+ Lv3: 1000
+ Lv4: 1500
+ Lv5: 2000
+ Lv6: 2500
+ Lv7: 3000
+ Lv8: 3500
+ Lv9: 4000
+ Lv10: 4500
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 5000
+ CoolDown: {
+ Lv1: 6000
+ Lv2: 7000
+ Lv3: 8000
+ Lv4: 9000
+ Lv5: 10000
+ Lv6: 11000
+ Lv7: 12000
+ Lv8: 13000
+ Lv9: 14000
+ Lv10: 15000
+ }
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 60
+ Lv3: 70
+ Lv4: 80
+ Lv5: 90
+ Lv6: 100
+ Lv7: 110
+ Lv8: 120
+ Lv9: 130
+ Lv10: 140
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2430
+ Name: "WM_SATURDAY_NIGHT_FEVER"
+ Description: "Saturday Night Fever"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 5000
+ Lv6: 6000
+ Lv7: 7000
+ Lv8: 8000
+ Lv9: 9000
+ Lv10: 10000
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ SkillData2: 3000
+ CoolDown: 180000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 150
+ Lv2: 160
+ Lv3: 170
+ Lv4: 180
+ Lv5: 190
+ Lv6: 200
+ Lv7: 210
+ Lv8: 220
+ Lv9: 230
+ Lv10: 240
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2431
+ Name: "WM_LERADS_DEW"
+ Description: "Lerad's Dew"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 5
+ Lv3: 6
+ Lv4: 6
+ Lv5: 7
+ Lv6: 7
+ Lv7: 8
+ Lv8: 8
+ Lv9: 9
+ Lv10: 9
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ CoolDown: 180000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 120
+ Lv2: 130
+ Lv3: 140
+ Lv4: 150
+ Lv5: 160
+ Lv6: 170
+ Lv7: 180
+ Lv8: 190
+ Lv9: 200
+ Lv10: 210
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2432
+ Name: "WM_MELODYOFSINK"
+ Description: "Melody of Sink"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 5
+ Lv3: 6
+ Lv4: 6
+ Lv5: 7
+ Lv6: 7
+ Lv7: 8
+ Lv8: 8
+ Lv9: 9
+ Lv10: 9
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ CoolDown: 180000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 120
+ Lv2: 130
+ Lv3: 140
+ Lv4: 150
+ Lv5: 160
+ Lv6: 170
+ Lv7: 180
+ Lv8: 190
+ Lv9: 200
+ Lv10: 210
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2433
+ Name: "WM_BEYOND_OF_WARCRY"
+ Description: "Warcry of Beyond"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 5
+ Lv3: 6
+ Lv4: 6
+ Lv5: 7
+ Lv6: 7
+ Lv7: 8
+ Lv8: 8
+ Lv9: 9
+ Lv10: 9
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ CoolDown: 180000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 120
+ Lv2: 130
+ Lv3: 140
+ Lv4: 150
+ Lv5: 160
+ Lv6: 170
+ Lv7: 180
+ Lv8: 190
+ Lv9: 200
+ Lv10: 210
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2434
+ Name: "WM_UNLIMITED_HUMMING_VOICE"
+ Description: "Unlimited Humming Voice"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 5
+ Lv3: 6
+ Lv4: 6
+ Lv5: 7
+ Lv6: 7
+ Lv7: 8
+ Lv8: 8
+ Lv9: 9
+ Lv10: 9
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 90000
+ Lv3: 120000
+ Lv4: 150000
+ Lv5: 180000
+ Lv6: 210000
+ Lv7: 240000
+ Lv8: 270000
+ Lv9: 300000
+ Lv10: 330000
+ }
+ CoolDown: {
+ Lv1: 110000
+ Lv2: 120000
+ Lv3: 130000
+ Lv4: 140000
+ Lv5: 150000
+ Lv6: 160000
+ Lv7: 170000
+ Lv8: 180000
+ Lv9: 190000
+ Lv10: 200000
+ }
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 120
+ Lv2: 130
+ Lv3: 140
+ Lv4: 150
+ Lv5: 160
+ Lv6: 170
+ Lv7: 180
+ Lv8: 190
+ Lv9: 200
+ Lv10: 210
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+ }
+},
+{
+ Id: 2443
+ Name: "SO_FIREWALK"
+ Description: "Fire Walk"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ InterruptCast: true
+ SkillInstances: {
+ Lv1: 8
+ Lv2: 10
+ Lv3: 12
+ Lv4: 14
+ Lv5: 16
+ Lv6: 18
+ Lv7: 20
+ Lv8: 22
+ Lv9: 24
+ Lv10: 25
+ }
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: 12000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 34
+ Lv3: 38
+ Lv4: 42
+ Lv5: 46
+ Lv6: 50
+ Lv7: 54
+ Lv8: 58
+ Lv9: 62
+ Lv10: 66
+ }
+ }
+ Unit: {
+ Id: 0xe7
+ Interval: 750
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOOVERLAP: true
+ }
+ }
+},
+{
+ Id: 2444
+ Name: "SO_ELECTRICWALK"
+ Description: "Electric Walk"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ InterruptCast: true
+ SkillInstances: {
+ Lv1: 8
+ Lv2: 10
+ Lv3: 12
+ Lv4: 14
+ Lv5: 16
+ Lv6: 18
+ Lv7: 20
+ Lv8: 22
+ Lv9: 24
+ Lv10: 25
+ }
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: 12000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 34
+ Lv3: 38
+ Lv4: 42
+ Lv5: 46
+ Lv6: 50
+ Lv7: 54
+ Lv8: 58
+ Lv9: 62
+ Lv10: 66
+ }
+ }
+ Unit: {
+ Id: 0xdd
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOOVERLAP: true
+ }
+ }
+},
+{
+ Id: 2445
+ Name: "SO_SPELLFIST"
+ Description: "Spell Fist"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 25000
+ Lv3: 30000
+ Lv4: 35000
+ Lv5: 40000
+ Lv6: 45000
+ Lv7: 50000
+ Lv8: 55000
+ Lv9: 60000
+ Lv10: 65000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 44
+ Lv3: 48
+ Lv4: 52
+ Lv5: 56
+ Lv6: 60
+ Lv7: 64
+ Lv8: 68
+ Lv9: 72
+ Lv10: 76
+ }
+ }
+},
+{
+ Id: 2446
+ Name: "SO_EARTHGRAVE"
+ Description: "Earth Grave"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ NumberOfHits: -3
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2200
+ Lv2: 2400
+ Lv3: 2600
+ Lv4: 2800
+ Lv5: 3000
+ Lv6: 3200
+ Lv7: 3400
+ Lv8: 3600
+ Lv9: 3800
+ Lv10: 4000
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 500
+ SkillData2: {
+ Lv1: 8000
+ Lv2: 11000
+ Lv3: 14000
+ Lv4: 17000
+ Lv5: 20000
+ Lv6: 23000
+ Lv7: 26000
+ Lv8: 29000
+ Lv9: 32000
+ Lv10: 35000
+ }
+ CoolDown: 5000
+ FixedCastTime: {
+ Lv1: 1800
+ Lv2: 1600
+ Lv3: 1400
+ Lv4: 1200
+ Lv5: 1000
+ Lv6: 800
+ Lv7: 600
+ Lv8: 400
+ Lv9: 200
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 62
+ Lv2: 70
+ Lv3: 78
+ Lv4: 86
+ Lv5: 94
+ Lv6: 102
+ Lv7: 110
+ Lv8: 118
+ Lv9: 126
+ Lv10: 134
+ }
+ }
+ Unit: {
+ Id: 0x86
+ Range: {
+ Lv1: 3
+ Lv2: 3
+ Lv3: 3
+ Lv4: 4
+ Lv5: 4
+ Lv6: 4
+ Lv7: 4
+ Lv8: 4
+ Lv9: 4
+ Lv10: 4
+ }
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2447
+ Name: "SO_DIAMONDDUST"
+ Description: "Diamond Dust"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ NumberOfHits: -5
+ InterruptCast: true
+ CastTime: {
+ Lv1: 5000
+ Lv2: 5500
+ Lv3: 6000
+ Lv4: 6500
+ Lv5: 7000
+ Lv6: 7500
+ Lv7: 8000
+ Lv8: 8500
+ Lv9: 9000
+ Lv10: 9500
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 500
+ SkillData2: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ CoolDown: 5000
+ FixedCastTime: {
+ Lv1: 800
+ Lv2: 600
+ Lv3: 400
+ Lv4: 200
+ Lv5: -1
+ Lv6: -1
+ Lv7: -1
+ Lv8: -1
+ Lv9: -1
+ Lv10: -1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 56
+ Lv3: 62
+ Lv4: 68
+ Lv5: 74
+ Lv6: 80
+ Lv7: 86
+ Lv8: 92
+ Lv9: 98
+ Lv10: 104
+ }
+ }
+ Unit: {
+ Id: 0x86
+ Range: {
+ Lv1: 3
+ Lv2: 3
+ Lv3: 3
+ Lv4: 4
+ Lv5: 4
+ Lv6: 4
+ Lv7: 4
+ Lv8: 4
+ Lv9: 4
+ Lv10: 4
+ }
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2448
+ Name: "SO_POISON_BUSTER"
+ Description: "Poison Buster"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Poison"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 1
+ Lv5: 2
+ Lv6: 2
+ Lv7: 2
+ Lv8: 2
+ Lv9: 2
+ Lv10: 2
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2200
+ Lv2: 3400
+ Lv3: 4600
+ Lv4: 5800
+ Lv5: 6000
+ Lv6: 6000
+ Lv7: 6000
+ Lv8: 6000
+ Lv9: 6000
+ Lv10: 6000
+ }
+ AfterCastActDelay: 1000
+ CoolDown: 2000
+ FixedCastTime: {
+ Lv1: 800
+ Lv2: 600
+ Lv3: 400
+ Lv4: 200
+ Lv5: -1
+ Lv6: -1
+ Lv7: -1
+ Lv8: -1
+ Lv9: -1
+ Lv10: -1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 90
+ Lv3: 110
+ Lv4: 130
+ Lv5: 150
+ Lv6: 170
+ Lv7: 190
+ Lv8: 210
+ Lv9: 230
+ Lv10: 250
+ }
+ }
+},
+{
+ Id: 2449
+ Name: "SO_PSYCHIC_WAVE"
+ Description: "Psychic Wave"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ InterruptCast: true
+ CastTime: {
+ Lv1: 8000
+ Lv2: 9000
+ Lv3: 10000
+ Lv4: 11000
+ Lv5: 12000
+ Lv6: 13000
+ Lv7: 14000
+ Lv8: 15000
+ Lv9: 16000
+ Lv10: 17000
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 1200
+ Lv2: 1700
+ Lv3: 2200
+ Lv4: 2700
+ Lv5: 3200
+ Lv6: 3700
+ Lv7: 4200
+ Lv8: 4700
+ Lv9: 5200
+ Lv10: 5700
+ }
+ CoolDown: 5000
+ FixedCastTime: {
+ Lv1: 1000
+ Lv2: 900
+ Lv3: 800
+ Lv4: 700
+ Lv5: 600
+ Lv6: 500
+ Lv7: 400
+ Lv8: 300
+ Lv9: 200
+ Lv10: 100
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 48
+ Lv2: 56
+ Lv3: 64
+ Lv4: 70
+ Lv5: 78
+ Lv6: 78
+ Lv7: 78
+ Lv8: 78
+ Lv9: 78
+ Lv10: 78
+ }
+ }
+ Unit: {
+ Id: 0xdf
+ Range: {
+ Lv1: 3
+ Lv2: 3
+ Lv3: 4
+ Lv4: 4
+ Lv5: 5
+ Lv6: 5
+ Lv7: 6
+ Lv8: 6
+ Lv9: 7
+ Lv10: 7
+ }
+ Interval: 500
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2450
+ Name: "SO_CLOUD_KILL"
+ Description: "Cloud Kill"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Poison"
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2300
+ Lv2: 2500
+ Lv3: 2700
+ Lv4: 2900
+ Lv5: 3100
+ Lv6: 3300
+ Lv7: 3500
+ Lv8: 3700
+ Lv9: 3900
+ Lv10: 4100
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 8000
+ Lv2: 10000
+ Lv3: 12000
+ Lv4: 14000
+ Lv5: 16000
+ Lv6: 18000
+ Lv7: 20000
+ Lv8: 22000
+ Lv9: 24000
+ Lv10: 26000
+ }
+ SkillData2: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 5000
+ FixedCastTime: {
+ Lv1: 700
+ Lv2: 500
+ Lv3: 300
+ Lv4: 100
+ Lv5: -1
+ Lv6: -1
+ Lv7: -1
+ Lv8: -1
+ Lv9: -1
+ Lv10: -1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 48
+ Lv2: 56
+ Lv3: 64
+ Lv4: 70
+ Lv5: 78
+ Lv6: 78
+ Lv7: 78
+ Lv8: 78
+ Lv9: 78
+ Lv10: 78
+ }
+// Items: {
+// Red_Gemstone: 2
+// }
+ }
+ Unit: {
+ Id: 0xe0
+ Layout: 3
+ Interval: 500
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2451
+ Name: "SO_STRIKING"
+ Description: "Striking"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: 60000
+ CoolDown: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 50
+ Lv2: 55
+ Lv3: 60
+ Lv4: 65
+ Lv5: 70
+ Lv6: 75
+ Lv7: 80
+ Lv8: 85
+ Lv9: 90
+ Lv10: 95
+ }
+ }
+},
+{
+ Id: 2452
+ Name: "SO_WARMER"
+ Description: "Warmer"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2200
+ Lv2: 2400
+ Lv3: 2600
+ Lv4: 2800
+ Lv5: 3000
+ Lv6: 3200
+ Lv7: 3400
+ Lv8: 3600
+ Lv9: 3800
+ Lv10: 4000
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 40000
+ Lv2: 45000
+ Lv3: 50000
+ Lv4: 55000
+ Lv5: 60000
+ Lv6: 65000
+ Lv7: 70000
+ Lv8: 75000
+ Lv9: 80000
+ Lv10: 85000
+ }
+ SkillData2: 30000
+ CoolDown: {
+ Lv1: 35000
+ Lv2: 40000
+ Lv3: 45000
+ Lv4: 50000
+ Lv5: 55000
+ Lv6: 60000
+ Lv7: 65000
+ Lv8: 70000
+ Lv9: 75000
+ Lv10: 80000
+ }
+ FixedCastTime: {
+ Lv1: 1800
+ Lv2: 1600
+ Lv3: 1400
+ Lv4: 1200
+ Lv5: 1000
+ Lv6: 800
+ Lv7: 600
+ Lv8: 400
+ Lv9: 200
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 52
+ Lv3: 64
+ Lv4: 76
+ Lv5: 88
+ Lv6: 100
+ Lv7: 112
+ Lv8: 124
+ Lv9: 136
+ Lv10: 148
+ }
+ }
+ Unit: {
+ Id: 0xe4
+ Range: 3
+ Interval: 3000
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2453
+ Name: "SO_VACUUM_EXTREME"
+ Description: "Vacuum Extreme"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1500
+ Lv3: 2000
+ Lv4: 2500
+ Lv5: 3000
+ Lv6: 3500
+ Lv7: 4000
+ Lv8: 4500
+ Lv9: 5000
+ Lv10: 5500
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 4000
+ Lv2: 6000
+ Lv3: 8000
+ Lv4: 10000
+ Lv5: 12000
+ Lv6: 14000
+ Lv7: 16000
+ Lv8: 18000
+ Lv9: 20000
+ Lv10: 22000
+ }
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 34
+ Lv2: 42
+ Lv3: 50
+ Lv4: 58
+ Lv5: 66
+ Lv6: 74
+ Lv7: 82
+ Lv8: 90
+ Lv9: 98
+ Lv10: 106
+ }
+ }
+ Unit: {
+ Id: 0xeb
+ Range: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ Interval: 500
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2454
+ Name: "SO_VARETYR_SPEAR"
+ Description: "Varetyr Spear"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2200
+ Lv2: 2400
+ Lv3: 2600
+ Lv4: 2800
+ Lv5: 3000
+ Lv6: 3200
+ Lv7: 3400
+ Lv8: 3600
+ Lv9: 3800
+ Lv10: 4000
+ }
+ AfterCastActDelay: 1000
+ SkillData2: {
+ Lv1: 2200
+ Lv2: 2400
+ Lv3: 2600
+ Lv4: 2800
+ Lv5: 3000
+ Lv6: 3200
+ Lv7: 3400
+ Lv8: 3600
+ Lv9: 3800
+ Lv10: 4000
+ }
+ CoolDown: 2000
+ FixedCastTime: {
+ Lv1: 1800
+ Lv2: 1600
+ Lv3: 1400
+ Lv4: 1200
+ Lv5: 1000
+ Lv6: 800
+ Lv7: 600
+ Lv8: 400
+ Lv9: 200
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 55
+ Lv2: 62
+ Lv3: 69
+ Lv4: 76
+ Lv5: 83
+ Lv6: 90
+ Lv7: 97
+ Lv8: 104
+ Lv9: 111
+ Lv10: 118
+ }
+ }
+},
+{
+ Id: 2455
+ Name: "SO_ARRULLO"
+ Description: "Arrullo"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 2200
+ Lv2: 2400
+ Lv3: 2600
+ Lv4: 2800
+ Lv5: 3000
+ Lv6: 3200
+ Lv7: 3400
+ Lv8: 3600
+ Lv9: 3800
+ Lv10: 4000
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 8000
+ Lv2: 10000
+ Lv3: 12000
+ Lv4: 14000
+ Lv5: 16000
+ Lv6: 18000
+ Lv7: 20000
+ Lv8: 22000
+ Lv9: 24000
+ Lv10: 26000
+ }
+ CoolDown: {
+ Lv1: 5000
+ Lv2: 6000
+ Lv3: 7000
+ Lv4: 8000
+ Lv5: 9000
+ Lv6: 10000
+ Lv7: 11000
+ Lv8: 12000
+ Lv9: 13000
+ Lv10: 14000
+ }
+ FixedCastTime: {
+ Lv1: 800
+ Lv2: 600
+ Lv3: 400
+ Lv4: 200
+ Lv5: -1
+ Lv6: -1
+ Lv7: -1
+ Lv8: -1
+ Lv9: -1
+ Lv10: -1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 35
+ Lv3: 40
+ Lv4: 45
+ Lv5: 50
+ Lv6: 55
+ Lv7: 60
+ Lv8: 65
+ Lv9: 70
+ Lv10: 75
+ }
+// Items: {
+// Yellow_Gemstone: 1
+// }
+ }
+},
+{
+ Id: 2456
+ Name: "SO_EL_CONTROL"
+ Description: "Spirit Control"
+ MaxLevel: 4
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ CoolDown: 5000
+ Requirements: {
+ SPCost: 10
+ State: "ElementalSpirit"
+ }
+},
+{
+ Id: 2457
+ Name: "SO_SUMMON_AGNI"
+ Description: "Summon Fire Spirit Agni"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 5000
+ Lv6: 6000
+ Lv7: 7000
+ Lv8: 8000
+ Lv9: 9000
+ Lv10: 10000
+ }
+ SkillData1: {
+ Lv1: 600000
+ Lv2: 900000
+ Lv3: 1200000
+ Lv4: 1500000
+ Lv5: 1800000
+ Lv6: 2100000
+ Lv7: 2400000
+ Lv8: 2700000
+ Lv9: 3000000
+ Lv10: 3300000
+ }
+ CoolDown: 60000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 150
+ Lv3: 200
+ Lv4: 250
+ Lv5: 300
+ Lv6: 350
+ Lv7: 400
+ Lv8: 450
+ Lv9: 500
+ Lv10: 550
+ }
+// Items: {
+// Boody_Red: 3
+// Boody_Red: 6
+// Flame_Heart: 1
+// }
+ }
+},
+{
+ Id: 2458
+ Name: "SO_SUMMON_AQUA"
+ Description: "Summon Water Spirit Aqua"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 5000
+ Lv6: 6000
+ Lv7: 7000
+ Lv8: 8000
+ Lv9: 9000
+ Lv10: 10000
+ }
+ SkillData1: {
+ Lv1: 600000
+ Lv2: 900000
+ Lv3: 1200000
+ Lv4: 1500000
+ Lv5: 1800000
+ Lv6: 2100000
+ Lv7: 2400000
+ Lv8: 2700000
+ Lv9: 3000000
+ Lv10: 3300000
+ }
+ CoolDown: 60000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 150
+ Lv3: 200
+ Lv4: 250
+ Lv5: 300
+ Lv6: 350
+ Lv7: 400
+ Lv8: 450
+ Lv9: 500
+ Lv10: 550
+ }
+// Items: {
+// Crystal_Blue: 3
+// Crystal_Blue: 6
+// Mistic_Frozen: 1
+// }
+ }
+},
+{
+ Id: 2459
+ Name: "SO_SUMMON_VENTUS"
+ Description: "Summon Wind Spirit Ventus"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ Element: "Ele_Wind"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 5000
+ Lv6: 6000
+ Lv7: 7000
+ Lv8: 8000
+ Lv9: 9000
+ Lv10: 10000
+ }
+ SkillData1: {
+ Lv1: 600000
+ Lv2: 900000
+ Lv3: 1200000
+ Lv4: 1500000
+ Lv5: 1800000
+ Lv6: 2100000
+ Lv7: 2400000
+ Lv8: 2700000
+ Lv9: 3000000
+ Lv10: 3300000
+ }
+ CoolDown: 60000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 150
+ Lv3: 200
+ Lv4: 250
+ Lv5: 300
+ Lv6: 350
+ Lv7: 400
+ Lv8: 450
+ Lv9: 500
+ Lv10: 550
+ }
+// Items: {
+// Wind_Of_Verdure: 3
+// Wind_Of_Verdure: 6
+// Rough_Wind: 1
+// }
+ }
+},
+{
+ Id: 2460
+ Name: "SO_SUMMON_TERA"
+ Description: "Summon Earth Spirit Tera"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 5000
+ Lv6: 6000
+ Lv7: 7000
+ Lv8: 8000
+ Lv9: 9000
+ Lv10: 10000
+ }
+ SkillData1: {
+ Lv1: 600000
+ Lv2: 900000
+ Lv3: 1200000
+ Lv4: 1500000
+ Lv5: 1800000
+ Lv6: 2100000
+ Lv7: 2400000
+ Lv8: 2700000
+ Lv9: 3000000
+ Lv10: 3300000
+ }
+ CoolDown: 60000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 150
+ Lv3: 200
+ Lv4: 250
+ Lv5: 300
+ Lv6: 350
+ Lv7: 400
+ Lv8: 450
+ Lv9: 500
+ Lv10: 550
+ }
+// Items: {
+// Yellow_Live: 3
+// Yellow_Live: 6
+// Great_Nature: 1
+// }
+ }
+},
+{
+ Id: 2461
+ Name: "SO_EL_ACTION"
+ Description: "Elemental Action"
+ MaxLevel: 1
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 5000
+ Requirements: {
+ SPCost: 50
+ State: "ElementalSpirit"
+ }
+},
+{
+ Id: 2462
+ Name: "SO_EL_ANALYSIS"
+ Description: "Four Spirit Analysis"
+ MaxLevel: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 20
+ Lv3: 30
+ Lv4: 40
+ Lv5: 50
+ Lv6: 60
+ Lv7: 70
+ Lv8: 80
+ Lv9: 90
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 2463
+ Name: "SO_EL_SYMPATHY"
+ Description: "Spirit Sympathy"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 2464
+ Name: "SO_EL_CURE"
+ Description: "Spirit Recovery"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 10
+ State: "ElementalSpirit"
+ }
+},
+{
+ Id: 2465
+ Name: "SO_FIRE_INSIGNIA"
+ Description: "Fire Insignia"
+ MaxLevel: 3
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 1
+ CastTime: 1000
+ SkillData1: 60000
+ CoolDown: 60000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 30
+ Lv3: 38
+ Lv4: 46
+ Lv5: 54
+ Lv6: 62
+ Lv7: 70
+ Lv8: 78
+ Lv9: 86
+ Lv10: 94
+ }
+// Items: {
+// Scarlet_Pts: 1
+// Scarlet_Pts: 2
+// Scarlet_Pts: 3
+// }
+ }
+ Unit: {
+ Id: 0xf1
+ Range: 1
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2466
+ Name: "SO_WATER_INSIGNIA"
+ Description: "Water Insignia"
+ MaxLevel: 3
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 1
+ CastTime: 1000
+ SkillData1: 60000
+ CoolDown: 60000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 30
+ Lv3: 38
+ Lv4: 46
+ Lv5: 54
+ Lv6: 62
+ Lv7: 70
+ Lv8: 78
+ Lv9: 86
+ Lv10: 94
+ }
+// Items: {
+// Indigo_Pts: 1
+// Indigo_Pts: 2
+// Indigo_Pts: 3
+// }
+ }
+ Unit: {
+ Id: 0xf2
+ Range: 1
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2467
+ Name: "SO_WIND_INSIGNIA"
+ Description: "Wind Insignia"
+ MaxLevel: 3
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 1
+ CastTime: 1000
+ SkillData1: 60000
+ CoolDown: 60000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 30
+ Lv3: 38
+ Lv4: 46
+ Lv5: 54
+ Lv6: 62
+ Lv7: 70
+ Lv8: 78
+ Lv9: 86
+ Lv10: 94
+ }
+// Items: {
+// Yellow_Wish_Pts: 1
+// Yellow_Wish_Pts: 2
+// Yellow_Wish_Pts: 3
+// }
+ }
+ Unit: {
+ Id: 0xf3
+ Range: 1
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2468
+ Name: "SO_EARTH_INSIGNIA"
+ Description: "Earth Insignia"
+ MaxLevel: 3
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 1
+ CastTime: 1000
+ SkillData1: 60000
+ CoolDown: 60000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 30
+ Lv3: 38
+ Lv4: 46
+ Lv5: 54
+ Lv6: 62
+ Lv7: 70
+ Lv8: 78
+ Lv9: 86
+ Lv10: 94
+ }
+// Items: {
+// Lime_Green_Pts: 1
+// Lime_Green_Pts: 2
+// Lime_Green_Pts: 3
+// }
+ }
+ Unit: {
+ Id: 0xf4
+ Range: 1
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 2474
+ Name: "GN_TRAINING_SWORD"
+ Description: "Sword Training"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 2475
+ Name: "GN_REMODELING_CART"
+ Description: "Cart Remodeling"
+ MaxLevel: 5
+ NumberOfHits: 0
+},
+{
+ Id: 2476
+ Name: "GN_CART_TORNADO"
+ Description: "Cart Tornado"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ KnockBackTiles: 2
+ AfterCastActDelay: 500
+ SkillData1: 5000
+ CoolDown: {
+ Lv1: 0
+ Lv2: 500
+ Lv3: 1000
+ Lv4: 1500
+ Lv5: 2000
+ Lv6: 2500
+ Lv7: 3000
+ Lv8: 3500
+ Lv9: 4000
+ Lv10: 4500
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 30
+ State: "Cart"
+ }
+},
+{
+ Id: 2477
+ Name: "GN_CARTCANNON"
+ Description: "Cart Cannon"
+ MaxLevel: 5
+ Range: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1500
+ Lv3: 2000
+ Lv4: 2500
+ Lv5: 3000
+ Lv6: 3500
+ Lv7: 4000
+ Lv8: 4500
+ Lv9: 5000
+ Lv10: 5500
+ }
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 42
+ Lv3: 44
+ Lv4: 46
+ Lv5: 48
+ Lv6: 50
+ Lv7: 52
+ Lv8: 54
+ Lv9: 56
+ Lv10: 58
+ }
+ AmmoTypes: {
+ A_CANNONBALL: true
+ }
+ AmmoAmount: 1
+ State: "Cart"
+ }
+},
+{
+ Id: 2478
+ Name: "GN_CARTBOOST"
+ Description: "Cart Boost"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1500
+ AfterCastActDelay: 500
+ SkillData1: 90000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 24
+ Lv3: 28
+ Lv4: 32
+ Lv5: 36
+ Lv6: 40
+ Lv7: 44
+ Lv8: 48
+ Lv9: 52
+ Lv10: 56
+ }
+ State: "Cart"
+ }
+},
+{
+ Id: 2479
+ Name: "GN_THORNS_TRAP"
+ Description: "Thorn Trap"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ AllowReproduce: true
+ }
+ AttackType: "Misc"
+ InterruptCast: true
+ SkillInstances: 5
+ CastTime: 1500
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 12000
+ Lv3: 14000
+ Lv4: 16000
+ Lv5: 18000
+ Lv6: 20000
+ Lv7: 22000
+ Lv8: 24000
+ Lv9: 26000
+ Lv10: 28000
+ }
+ SkillData2: 20000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 26
+ Lv3: 30
+ Lv4: 34
+ Lv5: 38
+ Lv6: 42
+ Lv7: 46
+ Lv8: 50
+ Lv9: 54
+ Lv10: 58
+ }
+// Items: {
+// Seed_Of_Horny_Plant: 1
+// }
+ }
+ Unit: {
+ Id: 0xe5
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 2480
+ Name: "GN_BLOOD_SUCKER"
+ Description: "Blood Sucker"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 3
+ CastTime: 1500
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 22000
+ Lv3: 24000
+ Lv4: 26000
+ Lv5: 28000
+ Lv6: 30000
+ Lv7: 32000
+ Lv8: 34000
+ Lv9: 36000
+ Lv10: 38000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 35
+ Lv3: 40
+ Lv4: 45
+ Lv5: 50
+ Lv6: 55
+ Lv7: 60
+ Lv8: 65
+ Lv9: 70
+ Lv10: 75
+ }
+// Items: {
+// Bloodsuck_Plant_Seed: 1
+// }
+ }
+},
+{
+ Id: 2481
+ Name: "GN_SPORE_EXPLOSION"
+ Description: "Spore Explosion"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: 1500
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 2000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 3000
+ Lv5: 4000
+ Lv6: 4000
+ Lv7: 5000
+ Lv8: 5000
+ Lv9: 6000
+ Lv10: 6000
+ }
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 55
+ Lv2: 60
+ Lv3: 65
+ Lv4: 70
+ Lv5: 75
+ Lv6: 80
+ Lv7: 85
+ Lv8: 90
+ Lv9: 95
+ Lv10: 100
+ }
+// Items: {
+// Bomb_Mushroom_Spore: 1
+// }
+ }
+},
+{
+ Id: 2482
+ Name: "GN_WALLOFTHORN"
+ Description: "Wall of Thorns"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: -1
+ InterruptCast: true
+ SkillInstances: 1
+ KnockBackTiles: 2
+ CastTime: 1500
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 11000
+ Lv3: 12000
+ Lv4: 13000
+ Lv5: 14000
+ Lv6: 15000
+ Lv7: 16000
+ Lv8: 17000
+ Lv9: 18000
+ Lv10: 19000
+ }
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 50
+ Lv3: 60
+ Lv4: 70
+ Lv5: 80
+ Lv6: 90
+ Lv7: 100
+ Lv8: 110
+ Lv9: 120
+ Lv10: 130
+ }
+// Items: {
+// Seed_Of_Horny_Plant: 1
+// }
+ }
+ Unit: {
+ Id: [ 0xe6, 0x7f ]
+ Layout: -1
+ Range: 2
+ Interval: -1
+ Target: "All"
+ }
+},
+{
+ Id: 2483
+ Name: "GN_CRAZYWEED"
+ Description: "Crazy Weed"
+ MaxLevel: 10
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 4
+ InterruptCast: true
+ CastTime: {
+ Lv1: 3000
+ Lv2: 3500
+ Lv3: 4000
+ Lv4: 4500
+ Lv5: 5000
+ Lv6: 5500
+ Lv7: 6000
+ Lv8: 6500
+ Lv9: 7000
+ Lv10: 7500
+ }
+ AfterCastActDelay: 500
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 24
+ Lv2: 28
+ Lv3: 32
+ Lv4: 36
+ Lv5: 40
+ Lv6: 44
+ Lv7: 48
+ Lv8: 52
+ Lv9: 56
+ Lv10: 60
+ }
+// Items: {
+// Seed_Of_Horny_Plant: 1
+// }
+ }
+},
+{
+ Id: 2484
+ Name: "GN_CRAZYWEED_ATK"
+ Description: "Crazy Weed Attack"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Earth"
+ SkillData1: 100
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+ Unit: {
+ Id: 0x86
+ Range: 2
+ Interval: 100
+ Target: "Enemy"
+ Flag: {
+ UF_SKILL: true
+ }
+ }
+},
+{
+ Id: 2485
+ Name: "GN_DEMONIC_FIRE"
+ Description: "Demonic Fire"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ InterruptCast: true
+ CastTime: {
+ Lv1: 3000
+ Lv2: 3500
+ Lv3: 4000
+ Lv4: 4500
+ Lv5: 5000
+ Lv6: 5500
+ Lv7: 6000
+ Lv8: 6500
+ Lv9: 7000
+ Lv10: 7500
+ }
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 12000
+ Lv3: 14000
+ Lv4: 16000
+ Lv5: 18000
+ Lv6: 20000
+ Lv7: 22000
+ Lv8: 24000
+ Lv9: 26000
+ Lv10: 28000
+ }
+ SkillData2: {
+ Lv1: 8000
+ Lv2: 16000
+ Lv3: 24000
+ Lv4: 32000
+ Lv5: 40000
+ Lv6: 48000
+ Lv7: 56000
+ Lv8: 64000
+ Lv9: 72000
+ Lv10: 80000
+ }
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 24
+ Lv2: 28
+ Lv3: 32
+ Lv4: 36
+ Lv5: 40
+ Lv6: 44
+ Lv7: 48
+ Lv8: 52
+ Lv9: 56
+ Lv10: 60
+ }
+// Items: {
+// Fire_Bottle: 1
+// }
+ }
+ Unit: {
+ Id: 0xe7
+ Range: 3
+ Interval: 2000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ UF_SKILL: true
+ }
+ }
+},
+{
+ Id: 2486
+ Name: "GN_FIRE_EXPANSION"
+ Description: "Fire Expansion"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 35
+ Lv3: 40
+ Lv4: 45
+ Lv5: 50
+ Lv6: 55
+ Lv7: 60
+ Lv8: 65
+ Lv9: 70
+ Lv10: 75
+ }
+// Items: {
+// Oil_Bottle: 1
+// Explosive_Powder: 1
+// Smoke_Powder: 1
+// Tear_Gas: 1
+// Acid_Bottle: 1
+// }
+ }
+},
+{
+ Id: 2487
+ Name: "GN_FIRE_EXPANSION_SMOKE_POWDER"
+ Description: "Fire Expansion Smoke Powder"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 12000
+ Lv3: 14000
+ Lv4: 16000
+ Lv5: 18000
+ Lv6: 20000
+ Lv7: 22000
+ Lv8: 24000
+ Lv9: 26000
+ Lv10: 28000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+ Unit: {
+ Id: 0xe8
+ Range: 3
+ Interval: 1000
+ Target: "Enemy"
+ }
+},
+{
+ Id: 2488
+ Name: "GN_FIRE_EXPANSION_TEAR_GAS"
+ Description: "Fire Expansion Tear Gas"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 12000
+ Lv3: 14000
+ Lv4: 16000
+ Lv5: 18000
+ Lv6: 20000
+ Lv7: 22000
+ Lv8: 24000
+ Lv9: 26000
+ Lv10: 28000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+ Unit: {
+ Id: 0xe9
+ Range: 3
+ Interval: 1000
+ Target: "Enemy"
+ }
+},
+{
+ Id: 2489
+ Name: "GN_FIRE_EXPANSION_ACID"
+ Description: "Fire Expansion Acid"
+ MaxLevel: 10
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2490
+ Name: "GN_HELLS_PLANT"
+ Description: "Hell's Plant"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ AllowReproduce: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 1
+ InterruptCast: true
+ SkillInstances: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 4
+ Lv4: 5
+ Lv5: 6
+ Lv6: 7
+ Lv7: 8
+ Lv8: 9
+ Lv9: 10
+ Lv10: 11
+ }
+ CastTime: {
+ Lv1: 3000
+ Lv2: 3500
+ Lv3: 4000
+ Lv4: 4500
+ Lv5: 5000
+ Lv6: 5500
+ Lv7: 6000
+ Lv8: 6500
+ Lv9: 7000
+ Lv10: 7500
+ }
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 14000
+ Lv2: 21000
+ Lv3: 28000
+ Lv4: 35000
+ Lv5: 42000
+ Lv6: 49000
+ Lv7: 56000
+ Lv8: 63000
+ Lv9: 70000
+ Lv10: 77000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+// Items: {
+// MenEater_Plant_Bottle: 1
+// }
+ }
+ Unit: {
+ Id: 0xea
+ Range: 1
+ Interval: 1000
+ Target: "All"
+ Flag: {
+ UF_NOREITERATION: true
+ }
+ }
+},
+{
+ Id: 2491
+ Name: "GN_HELLS_PLANT_ATK"
+ Description: "Hell's Plant Attack"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ IgnoreFlee: true
+ IgnoreDefCards: true
+ }
+ SkillData1: 20000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2492
+ Name: "GN_MANDRAGORA"
+ Description: "Howling of Mandragora"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 6
+ Lv4: 7
+ Lv5: 7
+ Lv6: 8
+ Lv7: 8
+ Lv8: 9
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+// Items: {
+// Mandragora_Flowerpot: 1
+// }
+ }
+},
+{
+ Id: 2493
+ Name: "GN_SLINGITEM"
+ Description: "Sling Item"
+ MaxLevel: 1
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CoolDown: 1000
+ Requirements: {
+ SPCost: 4
+ AmmoTypes: {
+ A_THROWWEAPON: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 2494
+ Name: "GN_CHANGEMATERIAL"
+ Description: "Change Material"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 2495
+ Name: "GN_MIX_COOKING"
+ Description: "Mix Cooking"
+ MaxLevel: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 5
+ Lv2: 40
+ Lv3: 75
+ Lv4: 110
+ Lv5: 145
+ Lv6: 180
+ Lv7: 215
+ Lv8: 250
+ Lv9: 285
+ Lv10: 320
+ }
+ }
+},
+{
+ Id: 2496
+ Name: "GN_MAKEBOMB"
+ Description: "Create Bomb"
+ MaxLevel: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 5
+ Lv2: 40
+ Lv3: 75
+ Lv4: 110
+ Lv5: 145
+ Lv6: 180
+ Lv7: 215
+ Lv8: 250
+ Lv9: 285
+ Lv10: 320
+ }
+ }
+},
+{
+ Id: 2497
+ Name: "GN_S_PHARMACY"
+ Description: "Special Pharmacy"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 12
+ }
+},
+{
+ Id: 2498
+ Name: "GN_SLINGITEM_RANGEMELEEATK"
+ Description: "Sling Item Attack"
+ MaxLevel: 1
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ SkillData1: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2515
+ Name: "AB_SECRAMENT"
+ Description: "Secrament"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 500
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 90000
+ Lv3: 120000
+ Lv4: 150000
+ Lv5: 180000
+ Lv6: 210000
+ Lv7: 240000
+ Lv8: 270000
+ Lv9: 300000
+ Lv10: 330000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 120
+ Lv3: 140
+ Lv4: 160
+ Lv5: 180
+ Lv6: 200
+ Lv7: 220
+ Lv8: 240
+ Lv9: 260
+ Lv10: 280
+ }
+ }
+},
+{
+ Id: 2516
+ Name: "WM_SEVERE_RAINSTORM_MELEE"
+ Description: "Severe Rainstorm Melee"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 5
+},
+{
+ Id: 2517
+ Name: "SR_HOWLINGOFLION"
+ Description: "Howling of Lion"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ CastTime: 1000
+ SkillData1: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ CoolDown: 10000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ SpiritSphereCost: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ }
+},
+{
+ Id: 2518
+ Name: "SR_RIDEINLIGHTNING"
+ Description: "Ride In Lightening"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ AllowReproduce: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 2
+ Lv3: 3
+ Lv4: 3
+ Lv5: 4
+ Lv6: 4
+ Lv7: 5
+ Lv8: 5
+ Lv9: 6
+ Lv10: 6
+ }
+ CastTime: {
+ Lv1: 1000
+ Lv2: 2000
+ Lv3: 3000
+ Lv4: 4000
+ Lv5: 5000
+ Lv6: 6000
+ Lv7: 7000
+ Lv8: 8000
+ Lv9: 9000
+ Lv10: 10000
+ }
+ AfterCastActDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 50
+ Lv3: 60
+ Lv4: 70
+ Lv5: 80
+ Lv6: 90
+ Lv7: 100
+ Lv8: 110
+ Lv9: 120
+ Lv10: 130
+ }
+ SpiritSphereCost: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ }
+},
+{
+ Id: 2534
+ Name: "RETURN_TO_ELDICASTES"
+ Description: "Return To Eldicastes"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ CastTime: 3000
+ CoolDown: 300000
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ SkillDelayOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2535
+ Name: "ALL_BUYING_STORE"
+ Description: "Open Buying Store"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 1
+// Items: {
+// Buy_Market_Permit: 1
+// }
+ }
+},
+{
+ Id: 2536
+ Name: "ALL_GUARDIAN_RECALL"
+ Description: "Guardian's Recall"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ CastTime: 3000
+ CoolDown: 300000
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ SkillDelayOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2537
+ Name: "ALL_ODINS_POWER"
+ Description: "Odin's Power"
+ MaxLevel: 2
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: 60000
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 100
+ Lv3: 130
+ Lv4: 160
+ Lv5: 190
+ Lv6: 220
+ Lv7: 250
+ Lv8: 280
+ Lv9: 310
+ Lv10: 340
+ }
+ }
+},
+{
+ Id: 2544
+ Name: "MC_CARTDECORATE"
+ Description: "Change Cart 2"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 40
+ State: "Cart"
+ }
+},
+{
+ Id: 2551
+ Name: "RL_GLITTERING_GREED"
+ Description: "Flip The Coin Greed"
+ MaxLevel: 10
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2552
+ Name: "RL_RICHS_COIN"
+ Description: "Rich's Coin"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 2553
+ Name: "RL_MASS_SPIRAL"
+ Description: "Mass Spiral"
+ MaxLevel: 5
+ Range: 15
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 84
+ Lv3: 88
+ Lv4: 92
+ Lv5: 96
+ Lv6: 100
+ Lv7: 104
+ Lv8: 108
+ Lv9: 112
+ Lv10: 116
+ }
+ }
+},
+{
+ Id: 2554
+ Name: "RL_BANISHING_BUSTER"
+ Description: "Banishing Buster"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ Requirements: {
+ SPCost: {
+ Lv1: 55
+ Lv2: 60
+ Lv3: 65
+ Lv4: 70
+ Lv5: 75
+ Lv6: 80
+ Lv7: 85
+ Lv8: 90
+ Lv9: 95
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 2555
+ Name: "RL_B_TRAP"
+ Description: "Bind Trap"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillInstances: 3
+ CoolDown: {
+ Lv1: 10000
+ Lv2: 11000
+ Lv3: 12000
+ Lv4: 13000
+ Lv5: 14000
+ Lv6: 15000
+ Lv7: 16000
+ Lv8: 17000
+ Lv9: 18000
+ Lv10: 19000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 32
+ Lv3: 34
+ Lv4: 36
+ Lv5: 38
+ Lv6: 40
+ Lv7: 42
+ Lv8: 44
+ Lv9: 46
+ Lv10: 48
+ }
+ }
+ Unit: {
+ Id: 0x104
+ Range: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 2
+ Lv4: 3
+ Lv5: 3
+ Lv6: 4
+ Lv7: 4
+ Lv8: 5
+ Lv9: 5
+ Lv10: 6
+ }
+ Interval: 500
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 2556
+ Name: "RL_FLICKER"
+ Description: "Flicker"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ Requirements: {
+ SPCost: 2
+ }
+},
+{
+ Id: 2557
+ Name: "RL_S_STORM"
+ Description: "Shatter Storm"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ Requirements: {
+ SPCost: {
+ Lv1: 55
+ Lv2: 60
+ Lv3: 65
+ Lv4: 70
+ Lv5: 75
+ Lv6: 80
+ Lv7: 85
+ Lv8: 90
+ Lv9: 95
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 2558
+ Name: "RL_E_CHAIN"
+ Description: "Eternal Chain"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 45
+ }
+},
+{
+ Id: 2559
+ Name: "RL_QD_SHOT"
+ Description: "Quick Draw Shot"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 2560
+ Name: "RL_C_MARKER"
+ Description: "Crimson Marker"
+ MaxLevel: 1
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillInstances: 3
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 2561
+ Name: "RL_FIREDANCE"
+ Description: "Fire Dance"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 15
+ Lv3: 20
+ Lv4: 25
+ Lv5: 30
+ Lv6: 35
+ Lv7: 40
+ Lv8: 45
+ Lv9: 50
+ Lv10: 55
+ }
+ }
+},
+{
+ Id: 2562
+ Name: "RL_H_MINE"
+ Description: "Howling Mine"
+ MaxLevel: 5
+ Range: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 45
+ Lv2: 50
+ Lv3: 55
+ Lv4: 60
+ Lv5: 65
+ Lv6: 70
+ Lv7: 75
+ Lv8: 80
+ Lv9: 85
+ Lv10: 90
+ }
+ }
+},
+{
+ Id: 2563
+ Name: "RL_P_ALTER"
+ Description: "Platinum Alter"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 24
+ Lv3: 28
+ Lv4: 32
+ Lv5: 36
+ Lv6: 40
+ Lv7: 44
+ Lv8: 48
+ Lv9: 52
+ Lv10: 56
+ }
+ }
+},
+{
+ Id: 2564
+ Name: "RL_FALLEN_ANGEL"
+ Description: "Fallen Angel"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 90
+ }
+},
+{
+ Id: 2565
+ Name: "RL_R_TRIP"
+ Description: "Round Trip"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 4
+ Lv4: 5
+ Lv5: 6
+ Lv6: 7
+ Lv7: 8
+ Lv8: 9
+ Lv9: 10
+ Lv10: 11
+ }
+ KnockBackTiles: 3
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ }
+},
+{
+ Id: 2566
+ Name: "RL_D_TAIL"
+ Description: "Dragon Tail"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 70
+ Lv3: 80
+ Lv4: 90
+ Lv5: 100
+ Lv6: 110
+ Lv7: 120
+ Lv8: 130
+ Lv9: 140
+ Lv10: 150
+ }
+ }
+},
+{
+ Id: 2567
+ Name: "RL_FIRE_RAIN"
+ Description: "Fire Rain"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: 70
+ }
+},
+{
+ Id: 2568
+ Name: "RL_HEAT_BARREL"
+ Description: "Heat Barrel"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+ }
+},
+{
+ Id: 2569
+ Name: "RL_AM_BLAST"
+ Description: "Anti-Material Blast"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 84
+ Lv3: 88
+ Lv4: 92
+ Lv5: 96
+ Lv6: 100
+ Lv7: 104
+ Lv8: 108
+ Lv9: 112
+ Lv10: 116
+ }
+ }
+},
+{
+ Id: 2570
+ Name: "RL_SLUGSHOT"
+ Description: "Slug Shot"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ KnockBackTiles: 6
+ Requirements: {
+ SPCost: {
+ Lv1: 55
+ Lv2: 60
+ Lv3: 65
+ Lv4: 70
+ Lv5: 75
+ Lv6: 80
+ Lv7: 85
+ Lv8: 90
+ Lv9: 95
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 2571
+ Name: "RL_HAMMER_OF_GOD"
+ Description: "Hammer of God"
+ MaxLevel: 5
+ Range: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 80
+ Lv3: 90
+ Lv4: 100
+ Lv5: 110
+ Lv6: 120
+ Lv7: 130
+ Lv8: 140
+ Lv9: 150
+ Lv10: 160
+ }
+ }
+},
+{
+ Id: 2572
+ Name: "RL_R_TRIP_PLUSATK"
+ Description: "Round Trip Plus Attack"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2573
+ Name: "RL_B_FLICKER_ATK"
+ Description: "Bind Flicker Attack"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 2574
+ Name: "RL_GLITTERING_GREED_ATK"
+ Description: "Flip The Coin Greed Attack"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 3001
+ Name: "KO_YAMIKUMO"
+ Description: "Yamikumo"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillData1: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 3002
+ Name: "KO_RIGHT"
+ Description: "Right Hand Mastery"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 3003
+ Name: "KO_LEFT"
+ Description: "Left Hand Mastery"
+ MaxLevel: 5
+ AttackType: "Weapon"
+ NumberOfHits: 0
+},
+{
+ Id: 3004
+ Name: "KO_JYUMONJIKIRI"
+ Description: "Cross Strike"
+ MaxLevel: 5
+ Range: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -2
+ AfterCastActDelay: 500
+ SkillData1: 3000
+ CoolDown: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 12
+ Lv3: 14
+ Lv4: 16
+ Lv5: 18
+ Lv6: 20
+ Lv7: 22
+ Lv8: 24
+ Lv9: 26
+ Lv10: 28
+ }
+ WeaponTypes: {
+ DWDaggers: true
+ DWSwords: true
+ DWDaggerSword: true
+ }
+ }
+},
+{
+ Id: 3005
+ Name: "KO_SETSUDAN"
+ Description: "Soul Sever"
+ MaxLevel: 5
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 16
+ Lv3: 20
+ Lv4: 24
+ Lv5: 28
+ Lv6: 32
+ Lv7: 36
+ Lv8: 40
+ Lv9: 44
+ Lv10: 48
+ }
+ }
+},
+{
+ Id: 3006
+ Name: "KO_BAKURETSU"
+ Description: "Bakuretsu Kunai"
+ MaxLevel: 5
+ Range: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ NumberOfHits: 0
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1400
+ Lv3: 1800
+ Lv4: 2200
+ Lv5: 2600
+ Lv6: 3000
+ Lv7: 3400
+ Lv8: 3800
+ Lv9: 4200
+ Lv10: 4600
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 100
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+// Items: {
+// Explosive_Kunai: 1
+// }
+ }
+ Unit: {
+ Id: 0x86
+ Range: 2
+ Interval: 100
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 3007
+ Name: "KO_HAPPOKUNAI"
+ Description: "Happo Kunai"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: {
+ Lv1: 4
+ Lv2: 4
+ Lv3: 4
+ Lv4: 4
+ Lv5: 5
+ Lv6: 5
+ Lv7: 5
+ Lv8: 5
+ Lv9: 5
+ Lv10: 5
+ }
+ NumberOfHits: 0
+ AfterCastActDelay: 500
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 8
+ Lv2: 9
+ Lv3: 10
+ Lv4: 11
+ Lv5: 12
+ Lv6: 13
+ Lv7: 14
+ Lv8: 15
+ Lv9: 16
+ Lv10: 17
+ }
+ AmmoTypes: {
+ A_KUNAI: true
+ }
+ AmmoAmount: 8
+ }
+},
+{
+ Id: 3008
+ Name: "KO_MUCHANAGE"
+ Description: "Mucha Nage"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ SplashArea: true
+ IgnoreElement: true
+ }
+ SplashRange: 2
+ NumberOfHits: -10
+ CastTime: 1000
+ SkillData1: 100
+ CoolDown: 10000
+ Requirements: {
+ SPCost: 50
+ ZenyCost: {
+ Lv1: 10000
+ Lv2: 20000
+ Lv3: 30000
+ Lv4: 40000
+ Lv5: 50000
+ Lv6: 60000
+ Lv7: 70000
+ Lv8: 80000
+ Lv9: 90000
+ Lv10: 100000
+ }
+ }
+ Unit: {
+ Id: 0x86
+ Range: 2
+ Interval: 100
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 3009
+ Name: "KO_HUUMARANKA"
+ Description: "Huuma Shuriken Ranka"
+ MaxLevel: 5
+ Range: {
+ Lv1: 9
+ Lv2: 10
+ Lv3: 11
+ Lv4: 12
+ Lv5: 13
+ Lv6: 14
+ Lv7: 15
+ Lv8: 16
+ Lv9: 17
+ Lv10: 18
+ }
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+ NumberOfHits: -5
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 100
+ CoolDown: 3000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 24
+ Lv2: 28
+ Lv3: 32
+ Lv4: 36
+ Lv5: 40
+ Lv6: 44
+ Lv7: 48
+ Lv8: 52
+ Lv9: 56
+ Lv10: 60
+ }
+ WeaponTypes: {
+ FuumaShurikens: true
+ }
+ }
+ Unit: {
+ Id: 0x86
+ Range: 3
+ Interval: 100
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 3010
+ Name: "KO_MAKIBISHI"
+ Description: "Makibishi"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SkillData1: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ SkillData2: 10000
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 9
+ Lv2: 12
+ Lv3: 15
+ Lv4: 18
+ Lv5: 21
+ Lv6: 24
+ Lv7: 27
+ Lv8: 30
+ Lv9: 33
+ Lv10: 36
+ }
+// Items: {
+// Makibishi: {
+// Lv1: 3
+// Lv2: 4
+// Lv3: 5
+// Lv4: 6
+// Lv5: 7
+// }
+// }
+ }
+ Unit: {
+ Id: 0xfc
+ Interval: 5000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 3011
+ Name: "KO_MEIKYOUSISUI"
+ Description: "Meikyo Shisui"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ InterruptCast: true
+ CastTime: 3000
+ SkillData1: 10000
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 100
+ }
+},
+{
+ Id: 3012
+ Name: "KO_ZANZOU"
+ Description: "Zanzou"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillInstances: 1
+ KnockBackTiles: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 27000
+ Lv3: 24000
+ Lv4: 21000
+ Lv5: 18000
+ Lv6: 15000
+ Lv7: 12000
+ Lv8: 9000
+ Lv9: 6000
+ Lv10: 3000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 44
+ Lv3: 48
+ Lv4: 52
+ Lv5: 56
+ Lv6: 60
+ Lv7: 64
+ Lv8: 68
+ Lv9: 72
+ Lv10: 76
+ }
+ }
+},
+{
+ Id: 3013
+ Name: "KO_KYOUGAKU"
+ Description: "Kyougaku"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ CastTime: {
+ Lv1: 3000
+ Lv2: 2500
+ Lv3: 2000
+ Lv4: 1500
+ Lv5: 1000
+ Lv6: 500
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 44
+ Lv3: 48
+ Lv4: 52
+ Lv5: 56
+ Lv6: 60
+ Lv7: 64
+ Lv8: 68
+ Lv9: 72
+ Lv10: 76
+ }
+ }
+},
+{
+ Id: 3014
+ Name: "KO_JYUSATSU"
+ Description: "Jyusatsu"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ CastTime: {
+ Lv1: 3000
+ Lv2: 2500
+ Lv3: 2000
+ Lv4: 1500
+ Lv5: 1000
+ Lv6: 500
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 8000
+ Lv2: 10000
+ Lv3: 12000
+ Lv4: 14000
+ Lv5: 16000
+ Lv6: 18000
+ Lv7: 20000
+ Lv8: 22000
+ Lv9: 24000
+ Lv10: 26000
+ }
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 44
+ Lv3: 48
+ Lv4: 52
+ Lv5: 56
+ Lv6: 60
+ Lv7: 64
+ Lv8: 68
+ Lv9: 72
+ Lv10: 76
+ }
+ }
+},
+{
+ Id: 3015
+ Name: "KO_KAHU_ENTEN"
+ Description: "Kahu Enten"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 2000
+ SkillData1: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 20
+// Items: {
+// Charm_Fire: 1
+// }
+ }
+},
+{
+ Id: 3016
+ Name: "KO_HYOUHU_HUBUKI"
+ Description: "Hyouhu Hubuki"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ Element: "Ele_Water"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 2000
+ SkillData1: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 20
+// Items: {
+// Charm_Ice: 1
+// }
+ }
+},
+{
+ Id: 3017
+ Name: "KO_KAZEHU_SEIRAN"
+ Description: "Kazehu Seiran"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ Element: "Ele_Wind"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 2000
+ SkillData1: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 20
+// Items: {
+// Charm_Wind: 1
+// }
+ }
+},
+{
+ Id: 3018
+ Name: "KO_DOHU_KOUKAI"
+ Description: "Dohu Koukai"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ Element: "Ele_Earth"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 2000
+ SkillData1: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 20
+// Items: {
+// Charm_Earth: 1
+// }
+ }
+},
+{
+ Id: 3019
+ Name: "KO_KAIHOU"
+ Description: "Technique Kaihou"
+ MaxLevel: 5
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 3020
+ Name: "KO_ZENKAI"
+ Description: "Zenkai"
+ MaxLevel: 1
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ NumberOfHits: 3
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 10000
+ SkillData2: 10000
+ Requirements: {
+ SPCost: 30
+ }
+ Unit: {
+ Id: 0xf8
+ Range: 3
+ Interval: 500
+ Target: "All"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 3021
+ Name: "KO_GENWAKU"
+ Description: "Genwaku"
+ MaxLevel: 5
+ Range: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 3000
+ Lv2: 2500
+ Lv3: 2000
+ Lv4: 1500
+ Lv5: 1000
+ Lv6: 500
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ AfterCastActDelay: 1000
+ SkillData1: 5000
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 44
+ Lv3: 48
+ Lv4: 52
+ Lv5: 56
+ Lv6: 60
+ Lv7: 64
+ Lv8: 68
+ Lv9: 72
+ Lv10: 76
+ }
+ }
+},
+{
+ Id: 3022
+ Name: "KO_IZAYOI"
+ Description: "Izayoi"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ CoolDown: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 75
+ Lv3: 80
+ Lv4: 85
+ Lv5: 90
+ Lv6: 95
+ Lv7: 100
+ Lv8: 105
+ Lv9: 110
+ Lv10: 115
+ }
+ }
+},
+{
+ Id: 3023
+ Name: "KG_KAGEHUMI"
+ Description: "Kagehumi"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 3
+ Lv3: 4
+ Lv4: 5
+ Lv5: 6
+ Lv6: 7
+ Lv7: 8
+ Lv8: 9
+ Lv9: 10
+ Lv10: 11
+ }
+ NumberOfHits: 0
+ SkillData1: {
+ Lv1: 5000
+ Lv2: 6000
+ Lv3: 7000
+ Lv4: 8000
+ Lv5: 9000
+ Lv6: 10000
+ Lv7: 11000
+ Lv8: 12000
+ Lv9: 13000
+ Lv10: 14000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 65
+ Lv3: 70
+ Lv4: 75
+ Lv5: 80
+ Lv6: 85
+ Lv7: 90
+ Lv8: 95
+ Lv9: 100
+ Lv10: 105
+ }
+ }
+},
+{
+ Id: 3024
+ Name: "KG_KYOMU"
+ Description: "Kyomu"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 20000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 50
+// Items: {
+// Shadow_Orb: 1
+// }
+ }
+},
+{
+ Id: 3025
+ Name: "KG_KAGEMUSYA"
+ Description: "Kagemusha"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 90000
+ Lv3: 120000
+ Lv4: 150000
+ Lv5: 180000
+ Lv6: 210000
+ Lv7: 240000
+ Lv8: 270000
+ Lv9: 300000
+ Lv10: 330000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 25
+ Lv2: 30
+ Lv3: 35
+ Lv4: 40
+ Lv5: 45
+ Lv6: 50
+ Lv7: 55
+ Lv8: 60
+ Lv9: 65
+ Lv10: 70
+ }
+// Items: {
+// Shadow_Orb: 1
+// }
+ }
+},
+{
+ Id: 3026
+ Name: "OB_ZANGETSU"
+ Description: "Zangetsu"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1500
+ Lv3: 2000
+ Lv4: 2500
+ Lv5: 3000
+ Lv6: 3500
+ Lv7: 4000
+ Lv8: 4500
+ Lv9: 5000
+ Lv10: 5500
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 75000
+ Lv3: 90000
+ Lv4: 105000
+ Lv5: 120000
+ Lv6: 135000
+ Lv7: 150000
+ Lv8: 165000
+ Lv9: 180000
+ Lv10: 195000
+ }
+ CoolDown: 30000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 70
+ Lv3: 80
+ Lv4: 90
+ Lv5: 100
+ Lv6: 110
+ Lv7: 120
+ Lv8: 130
+ Lv9: 140
+ Lv10: 150
+ }
+ }
+},
+{
+ Id: 3027
+ Name: "OB_OBOROGENSOU"
+ Description: "Oboro Gensou"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 15000
+ Requirements: {
+ SPCost: {
+ Lv1: 55
+ Lv2: 60
+ Lv3: 65
+ Lv4: 70
+ Lv5: 75
+ Lv6: 80
+ Lv7: 85
+ Lv8: 90
+ Lv9: 95
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 3028
+ Name: "OB_OBOROGENSOU_TRANSITION_ATK"
+ Description: "Hazy Moonlight Illusion Transition Attack"
+ MaxLevel: 1
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 3
+},
+{
+ Id: 3029
+ Name: "OB_AKAITSUKI"
+ Description: "Akaitsuki"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1500
+ Lv3: 2000
+ Lv4: 2500
+ Lv5: 3000
+ Lv6: 3500
+ Lv7: 4000
+ Lv8: 4500
+ Lv9: 5000
+ Lv10: 5500
+ }
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ CoolDown: 30000
+ FixedCastTime: 2000
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 30
+ Lv3: 40
+ Lv4: 50
+ Lv5: 60
+ Lv6: 70
+ Lv7: 80
+ Lv8: 90
+ Lv9: 100
+ Lv10: 110
+ }
+ }
+},
+{
+ Id: 3031
+ Name: "ECL_SNOWFLIP"
+ Description: "Snow Flip"
+ MaxLevel: 1
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 5000
+},
+{
+ Id: 3032
+ Name: "ECL_PEONYMAMY"
+ Description: "Peony Mamy"
+ MaxLevel: 1
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 5000
+},
+{
+ Id: 3033
+ Name: "ECL_SADAGUI"
+ Description: "Sadagui"
+ MaxLevel: 1
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 5000
+},
+{
+ Id: 3034
+ Name: "ECL_SEQUOIADUST"
+ Description: "Sequoia Dust"
+ MaxLevel: 1
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 5000
+},
+{
+ Id: 3035
+ Name: "ECLAGE_RECALL"
+ Description: "Return To Eclage"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 300000
+ FixedCastTime: 3000
+},
+{
+ Id: 5001
+ Name: "GC_DARKCROW"
+ Description: "Dark Claw"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 3
+ AfterCastActDelay: 1500
+ SkillData1: 5000
+ CoolDown: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 34
+ Lv3: 46
+ Lv4: 58
+ Lv5: 70
+ Lv6: 82
+ Lv7: 94
+ Lv8: 106
+ Lv9: 118
+ Lv10: 130
+ }
+ }
+},
+{
+ Id: 5002
+ Name: "RA_UNLIMIT"
+ Description: "Unlimited"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 500
+ SkillData1: 60000
+ CoolDown: 300000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 120
+ Lv3: 140
+ Lv4: 160
+ Lv5: 180
+ Lv6: 200
+ Lv7: 220
+ Lv8: 240
+ Lv9: 260
+ Lv10: 280
+ }
+ }
+},
+{
+ Id: 5003
+ Name: "GN_ILLUSIONDOPING"
+ Description: "Illusion Doping"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 4
+ Lv2: 5
+ Lv3: 6
+ Lv4: 7
+ Lv5: 8
+ Lv6: 9
+ Lv7: 10
+ Lv8: 11
+ Lv9: 12
+ Lv10: 13
+ }
+ SkillData1: 10000
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 70
+ Lv3: 80
+ Lv4: 90
+ Lv5: 100
+ Lv6: 110
+ Lv7: 120
+ Lv8: 130
+ Lv9: 140
+ Lv10: 150
+ }
+// Items: {
+// Alchol: 1
+// }
+ }
+},
+{
+ Id: 5004
+ Name: "RK_DRAGONBREATH_WATER"
+ Description: "Dragon Breath - Water"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Water"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 2
+ Lv5: 2
+ Lv6: 2
+ Lv7: 3
+ Lv8: 3
+ Lv9: 4
+ Lv10: 4
+ }
+ CastTime: {
+ Lv1: 0
+ Lv2: 0
+ Lv3: 0
+ Lv4: 1000
+ Lv5: 1000
+ Lv6: 1000
+ Lv7: 1500
+ Lv8: 1500
+ Lv9: 2000
+ Lv10: 2000
+ }
+ AfterCastActDelay: 2000
+ SkillData1: 10000
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 35
+ Lv3: 40
+ Lv4: 45
+ Lv5: 50
+ Lv6: 55
+ Lv7: 60
+ Lv8: 65
+ Lv9: 70
+ Lv10: 75
+ }
+ State: "Dragon"
+ }
+},
+{
+ Id: 5005
+ Name: "RK_LUXANIMA"
+ Description: "Lux Anima"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 3
+ SkillData1: 60000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 5006
+ Name: "NC_MAGMA_ERUPTION"
+ Description: "Magma Eruption"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Fire"
+ SkillInstances: 3
+ CastTime: 1000
+ SkillData1: 10000
+ SkillData2: 42000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 70
+ Lv3: 80
+ Lv4: 90
+ Lv5: 100
+ Lv6: 110
+ Lv7: 120
+ Lv8: 130
+ Lv9: 140
+ Lv10: 150
+ }
+ }
+ Unit: {
+ Id: 0x101
+ Range: 3
+ Interval: 2000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 5007
+ Name: "WM_FRIGG_SONG"
+ Description: "Frigg's Song"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ SkillData1: 60000
+ Requirements: {
+ SPCost: {
+ Lv1: 200
+ Lv2: 230
+ Lv3: 260
+ Lv4: 290
+ Lv5: 320
+ Lv6: 350
+ Lv7: 380
+ Lv8: 410
+ Lv9: 440
+ Lv10: 470
+ }
+ WeaponTypes: {
+ Instruments: true
+ Whips: true
+ }
+// Items: {
+// Heartbroken_Tears: 1
+// }
+ }
+},
+{
+ Id: 5008
+ Name: "SO_ELEMENTAL_SHIELD"
+ Description: "Elemental Shield"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 15
+ CastTime: 1000
+ SkillData1: 10000
+ CoolDown: 10000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 120
+ State: "ElementalSpirit"
+// Items: {
+// Blue_Gemstone: 1
+// }
+ }
+ Unit: {
+ Id: 0x7e
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_DEFNOTENEMY: true
+ UF_NOREITERATION: true
+ }
+ }
+},
+{
+ Id: 5009
+ Name: "SR_FLASHCOMBO"
+ Description: "Flash Combo"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 4000
+ SkillData1: 4000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 65
+ SpiritSphereCost: {
+ Lv1: 5
+ Lv2: 5
+ Lv3: 4
+ Lv4: 4
+ Lv5: 3
+ Lv6: 3
+ Lv7: 2
+ Lv8: 2
+ Lv9: 1
+ Lv10: 1
+ }
+ }
+},
+{
+ Id: 5010
+ Name: "SC_ESCAPE"
+ Description: "Emergency Escape"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 1000
+ CoolDown: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 26
+ Lv3: 22
+ Lv4: 18
+ Lv5: 14
+ Lv6: 10
+ Lv7: 6
+ Lv8: 2
+ Lv9: 1
+ Lv10: 1
+ }
+// Items: {
+// Special_Alloy_Trap: 1
+// }
+ }
+ Unit: {
+ Id: 0xfe
+ Range: 2
+ Interval: -1
+ Target: "Enemy"
+ }
+},
+{
+ Id: 5011
+ Name: "AB_OFFERTORIUM"
+ Description: "Offertorium"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 4000
+ SkillData1: 90000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 60
+ Lv3: 90
+ Lv4: 120
+ Lv5: 150
+ Lv6: 180
+ Lv7: 210
+ Lv8: 240
+ Lv9: 270
+ Lv10: 300
+ }
+ }
+},
+{
+ Id: 5012
+ Name: "WL_TELEKINESIS_INTENSE"
+ Description: "Intense Telekinesis"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 1000
+ SkillData1: 60000
+ CoolDown: 300000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 150
+ Lv3: 200
+ Lv4: 250
+ Lv5: 300
+ Lv6: 350
+ Lv7: 400
+ Lv8: 450
+ Lv9: 500
+ Lv10: 550
+ }
+ }
+},
+{
+ Id: 5013
+ Name: "LG_KINGS_GRACE"
+ Description: "King's Grace"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 5
+ CastTime: 1000
+ SkillData1: 5000
+ CoolDown: {
+ Lv1: 100000
+ Lv2: 90000
+ Lv3: 80000
+ Lv4: 70000
+ Lv5: 60000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 200
+ Lv2: 180
+ Lv3: 160
+ Lv4: 140
+ Lv5: 120
+ Lv6: 100
+ Lv7: 80
+ Lv8: 60
+ Lv9: 40
+ Lv10: 20
+ }
+ }
+},
+{
+ Id: 5014
+ Name: "ALL_FULL_THROTTLE"
+ Description: "Full Throttle"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 10000
+ Lv2: 15000
+ Lv3: 20000
+ Lv4: 25000
+ Lv5: 30000
+ Lv6: 35000
+ Lv7: 40000
+ Lv8: 45000
+ Lv9: 50000
+ Lv10: 55000
+ }
+ SkillData2: 10000
+ CoolDown: 1800000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 5018
+ Name: "SU_BASIC_SKILL"
+ Description: "New Basic Skill"
+ MaxLevel: 1
+ NumberOfHits: 0
+},
+{
+ Id: 5019
+ Name: "SU_BITE"
+ Description: "Bite"
+ MaxLevel: 1
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 5020
+ Name: "SU_HIDE"
+ Description: "Hide"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: -1
+ CoolDown: 15000
+ Requirements: {
+ SPCost: 30
+ }
+},
+{
+ Id: 5021
+ Name: "SU_SCRATCH"
+ Description: "Scratch"
+ MaxLevel: 3
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 10000
+ CoolDown: {
+ Lv1: 3000
+ Lv2: 2000
+ Lv3: 1000
+ Lv4: 1
+ Lv5: 1
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+ }
+},
+{
+ Id: 5022
+ Name: "SU_STOOP"
+ Description: "Stoop"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 6000
+ CoolDown: 15000
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 5023
+ Name: "SU_LOPE"
+ Description: "Lope"
+ MaxLevel: 3
+ Range: {
+ Lv1: 6
+ Lv2: 10
+ Lv3: 14
+ Lv4: 18
+ Lv5: 22
+ Lv6: 26
+ Lv7: 30
+ Lv8: 34
+ Lv9: 38
+ Lv10: 42
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 500
+ AfterCastActDelay: 1000
+ CoolDown: {
+ Lv1: 2000
+ Lv2: 4000
+ Lv3: 6000
+ Lv4: 8000
+ Lv5: 10000
+ Lv6: 12000
+ Lv7: 14000
+ Lv8: 16000
+ Lv9: 18000
+ Lv10: 20000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 30
+ Lv3: 30
+ Lv4: 30
+ Lv5: 30
+ Lv6: 30
+ Lv7: 30
+ Lv8: 30
+ Lv9: 30
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 5024
+ Name: "SU_SPRITEMABLE"
+ Description: "Spirit Marble"
+ MaxLevel: 1
+ NumberOfHits: 0
+},
+{
+ Id: 5025
+ Name: "SU_POWEROFLAND"
+ Description: "Power of Land"
+ MaxLevel: 1
+ NumberOfHits: 0
+},
+{
+ Id: 5026
+ Name: "SU_SV_STEMSPEAR"
+ Description: "Silvervine Stem Spear"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: {
+ Lv1: "Ele_Earth"
+ Lv2: "Ele_Fire"
+ Lv3: "Ele_Water"
+ Lv4: "Ele_Wind"
+ Lv5: "Ele_Ghost"
+ }
+ InterruptCast: true
+ CastTime: 2500
+ AfterCastActDelay: 1000
+ SkillData1: 10000
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 40
+ Lv3: 40
+ Lv4: 40
+ Lv5: 40
+ Lv6: 40
+ Lv7: 40
+ Lv8: 40
+ Lv9: 40
+ Lv10: 40
+ }
+ }
+},
+{
+ Id: 5027
+ Name: "SU_CN_POWDERING"
+ Description: "Catnip Powdering"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 3
+ Lv2: 3
+ Lv3: 5
+ Lv4: 5
+ Lv5: 7
+ }
+ InterruptCast: true
+ SkillInstances: 1
+ CastTime: 1500
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 3000
+ Lv2: 4000
+ Lv3: 5000
+ Lv4: 6000
+ Lv5: 7000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 36
+ Lv3: 32
+ Lv4: 28
+ Lv5: 24
+ }
+// Items: {
+// Catnip_Fruit: 1
+// }
+ }
+ Unit: {
+ Id: 0x106
+ Layout: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ }
+ Interval: -1
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ UF_RANGEDSINGLEUNIT: true
+ }
+ }
+},
+{
+ Id: 5028
+ Name: "SU_CN_METEOR"
+ Description: "Catnip Meteor"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ SplashRange: {
+ Lv1: 3
+ Lv2: 3
+ Lv3: 5
+ Lv4: 5
+ Lv5: 7
+ }
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ }
+ InterruptCast: true
+ CastTime: 6000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 1500
+ Lv2: 2000
+ Lv3: 2500
+ Lv4: 3000
+ Lv5: 3500
+ }
+ SkillData2: 20000
+ CoolDown: {
+ Lv1: 2000
+ Lv2: 3000
+ Lv3: 4000
+ Lv4: 5000
+ Lv5: 6000
+
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 35
+ Lv3: 50
+ Lv4: 65
+ Lv5: 80
+ }
+// Items: {
+// Catnip_Fruit: 1
+// }
+ }
+ Unit: {
+ Id: 0x86
+ Range: 1
+ Interval: 500
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 5029
+ Name: "SU_SV_ROOTTWIST"
+ Description: "Silvervine Root Twist"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillInstances: 1
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 7000
+ Lv2: 9000
+ Lv3: 11000
+ Lv4: 13000
+ Lv5: 15000
+ Lv6: 17000
+ Lv7: 19000
+ Lv8: 21000
+ Lv9: 23000
+ Lv10: 25000
+ }
+ CoolDown: 3000
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 12
+ Lv3: 14
+ Lv4: 16
+ Lv5: 18
+ Lv6: 20
+ Lv7: 22
+ Lv8: 24
+ Lv9: 26
+ Lv10: 28
+ }
+ }
+ Unit: {
+ Id: 0x107
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 5030
+ Name: "SU_SV_ROOTTWIST_ATK"
+ Description: "Silver Vine Root Twist Attack"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Poison"
+ DamageType: {
+ IgnoreElement: true
+ IgnoreDefense: true
+ }
+ SkillInstances: 1
+ AfterCastActDelay: 1000
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 5031
+ Name: "SU_POWEROFLIFE"
+ Description: "Power of Life"
+ MaxLevel: 1
+ NumberOfHits: 0
+},
+{
+ Id: 5032
+ Name: "SU_SCAROFTAROU"
+ Description: "Scar of Tarou"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ InterruptCast: true
+ CastTime: 500
+ AfterCastActDelay: 1000
+ SkillData1: 9000
+ SkillData2: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 14
+ Lv3: 18
+ Lv4: 22
+ Lv5: 26
+ Lv6: 30
+ Lv7: 34
+ Lv8: 38
+ Lv9: 42
+ Lv10: 46
+ }
+ }
+},
+{
+ Id: 5033
+ Name: "SU_PICKYPECK"
+ Description: "Picky Peck"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -5
+ InterruptCast: true
+ CastTime: 2500
+ AfterCastActDelay: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 19
+ Lv3: 28
+ Lv4: 37
+ Lv5: 46
+ Lv6: 55
+ Lv7: 64
+ Lv8: 73
+ Lv9: 82
+ Lv10: 91
+ }
+ }
+},
+{
+ Id: 5034
+ Name: "SU_PICKYPECK_DOUBLE_ATK"
+ Description: "Picky Peck Double Attack"
+ MaxLevel: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: -5
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 5035
+ Name: "SU_ARCLOUSEDASH"
+ Description: "Arclouse Dash"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2500
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 70000
+ Lv3: 80000
+ Lv4: 90000
+ Lv5: 100000
+ Lv6: 110000
+ Lv7: 120000
+ Lv8: 130000
+ Lv9: 140000
+ Lv10: 150000
+ }
+ CoolDown: 10000
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 20
+ Lv3: 28
+ Lv4: 36
+ Lv5: 44
+ Lv6: 52
+ Lv7: 60
+ Lv8: 68
+ Lv9: 76
+ Lv10: 84
+ }
+ }
+},
+{
+ Id: 5036
+ Name: "SU_LUNATICCARROTBEAT"
+ Description: "Lunatic Carrot Beat"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ InterruptCast: true
+ CastTime: 3000
+ AfterCastActDelay: 1000
+ SkillData1: 1000
+ CoolDown: 8000
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 25
+ Lv3: 35
+ Lv4: 45
+ Lv5: 55
+ Lv6: 65
+ Lv7: 75
+ Lv8: 85
+ Lv9: 95
+ Lv10: 105
+ }
+ }
+},
+{
+ Id: 5037
+ Name: "SU_POWEROFSEA"
+ Description: "Power of Sea"
+ MaxLevel: 1
+ NumberOfHits: 0
+},
+{
+ Id: 5038
+ Name: "SU_TUNABELLY"
+ Description: "Tuna Belly"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 1000
+ CoolDown: {
+ Lv1: 8000
+ Lv2: 10000
+ Lv3: 12000
+ Lv4: 14000
+ Lv5: 16000
+ Lv6: 18000
+ Lv7: 20000
+ Lv8: 22000
+ Lv9: 24000
+ Lv10: 26000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 30
+ Lv3: 40
+ Lv4: 50
+ Lv5: 60
+ Lv6: 70
+ Lv7: 80
+ Lv8: 90
+ Lv9: 100
+ Lv10: 110
+ }
+ }
+},
+{
+ Id: 5039
+ Name: "SU_TUNAPARTY"
+ Description: "Tuna Party"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 30000
+ CoolDown: 20000
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 30
+ Lv3: 40
+ Lv4: 50
+ Lv5: 60
+ Lv6: 70
+ Lv7: 80
+ Lv8: 90
+ Lv9: 100
+ Lv10: 110
+ }
+ }
+},
+{
+ Id: 5040
+ Name: "SU_BUNCHOFSHRIMP"
+ Description: "Bunch of Shrimp"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 90000
+ Lv3: 120000
+ Lv4: 150000
+ Lv5: 180000
+ Lv6: 210000
+ Lv7: 240000
+ Lv8: 270000
+ Lv9: 300000
+ Lv10: 330000
+ }
+ CoolDown: 10000
+ Requirements: {
+ SPCost: {
+ Lv1: 44
+ Lv2: 48
+ Lv3: 52
+ Lv4: 56
+ Lv5: 60
+ Lv6: 64
+ Lv7: 68
+ Lv8: 72
+ Lv9: 76
+ Lv10: 80
+ }
+// Items: {
+// Prawn: 1
+// }
+ }
+},
+{
+ Id: 5041
+ Name: "SU_FRESHSHRIMP"
+ Description: "Fresh Shrimp"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ SkillData1: 120000
+ CoolDown: 7000
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 24
+ Lv3: 26
+ Lv4: 28
+ Lv5: 30
+ Lv6: 32
+ Lv7: 34
+ Lv8: 36
+ Lv9: 38
+ Lv10: 40
+ }
+ }
+},
+{
+ Id: 5042
+ Name: "SU_CN_METEOR_ATK"
+ Description: ""
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ AttackType: "Magic"
+ InterruptCast: true
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 35
+ Lv3: 50
+ Lv4: 65
+ Lv5: 80
+ }
+// Items: {
+// Catnip_Fruit: 1
+// }
+ }
+},
+{
+ Id: 5043
+ Name: "SU_LUNATICCARROTBEAT2"
+ Description: "Lunatic Carrot Beat 2"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Chorus: true
+ }
+ AttackType: "Weapon"
+ InterruptCast: true
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8001
+ Name: "HLIF_HEAL"
+ Description: "Healing Touch"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 13
+ Lv2: 16
+ Lv3: 19
+ Lv4: 22
+ Lv5: 25
+ Lv6: 28
+ Lv7: 31
+ Lv8: 34
+ Lv9: 37
+ Lv10: 40
+ }
+// Items: {
+// Red_Slim_Potion: 1
+// }
+ }
+},
+{
+ Id: 8002
+ Name: "HLIF_AVOID"
+ Description: "Avoid"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ AfterCastActDelay: 35000
+ SkillData1: {
+ Lv1: 40000
+ Lv2: 35000
+ Lv3: 30000
+ Lv4: 25000
+ Lv5: 20000
+ Lv6: 15000
+ Lv7: 10000
+ Lv8: 5000
+ Lv9: 1
+ Lv10: 1
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+ }
+},
+{
+ Id: 8003
+ Name: "HLIF_BRAIN"
+ Description: "Brain Surgery"
+ MaxLevel: 5
+ SplashRange: 1
+ NumberOfHits: 0
+},
+{
+ Id: 8004
+ Name: "HLIF_CHANGE"
+ Description: "Change"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ AfterCastActDelay: {
+ Lv1: 600000
+ Lv2: 900000
+ Lv3: 1200000
+ Lv4: 1500000
+ Lv5: 1800000
+ Lv6: 2100000
+ Lv7: 2400000
+ Lv8: 2700000
+ Lv9: 3000000
+ Lv10: 3300000
+ }
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 120000
+ Lv3: 180000
+ Lv4: 240000
+ Lv5: 300000
+ Lv6: 360000
+ Lv7: 420000
+ Lv8: 480000
+ Lv9: 540000
+ Lv10: 600000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 100
+ }
+},
+{
+ Id: 8005
+ Name: "HAMI_CASTLE"
+ Description: "Castling"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ CoolDown: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 8006
+ Name: "HAMI_DEFENCE"
+ Description: "Defense"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillData1: {
+ Lv1: 40000
+ Lv2: 35000
+ Lv3: 30000
+ Lv4: 25000
+ Lv5: 20000
+ Lv6: 15000
+ Lv7: 10000
+ Lv8: 5000
+ Lv9: 1
+ Lv10: 1
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+ }
+},
+{
+ Id: 8007
+ Name: "HAMI_SKIN"
+ Description: "Adamantium Skin"
+ MaxLevel: 5
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 8008
+ Name: "HAMI_BLOODLUST"
+ Description: "Bloodlust"
+ MaxLevel: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 180000
+ Lv3: 300000
+ Lv4: 420000
+ Lv5: 540000
+ Lv6: 660000
+ Lv7: 780000
+ Lv8: 900000
+ Lv9: 1020000
+ Lv10: 1140000
+ }
+ SkillData2: {
+ Lv1: 300000
+ Lv2: 600000
+ Lv3: 900000
+ Lv4: 1200000
+ Lv5: 1500000
+ Lv6: 1800000
+ Lv7: 2100000
+ Lv8: 2400000
+ Lv9: 2700000
+ Lv10: 3000000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 120
+ }
+},
+{
+ Id: 8009
+ Name: "HFLI_MOON"
+ Description: "Moonlight"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ NumberOfHits: {
+ Lv1: -1
+ Lv2: -2
+ Lv3: -2
+ Lv4: -2
+ Lv5: -3
+ Lv6: -3
+ Lv7: -3
+ Lv8: -3
+ Lv9: -3
+ Lv10: -3
+ }
+ AfterCastWalkDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 4
+ Lv2: 8
+ Lv3: 12
+ Lv4: 16
+ Lv5: 20
+ Lv6: 24
+ Lv7: 28
+ Lv8: 32
+ Lv9: 36
+ Lv10: 40
+ }
+ }
+},
+{
+ Id: 8010
+ Name: "HFLI_FLEET"
+ Description: "Fleeting Move"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 55000
+ Lv3: 50000
+ Lv4: 45000
+ Lv5: 40000
+ Lv6: 35000
+ Lv7: 30000
+ Lv8: 25000
+ Lv9: 20000
+ Lv10: 15000
+ }
+ SkillData2: {
+ Lv1: 60000
+ Lv2: 70000
+ Lv3: 80000
+ Lv4: 90000
+ Lv5: 120000
+ Lv6: 120000
+ Lv7: 120000
+ Lv8: 120000
+ Lv9: 120000
+ Lv10: 120000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+ }
+},
+{
+ Id: 8011
+ Name: "HFLI_SPEED"
+ Description: "Speed"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 55000
+ Lv3: 50000
+ Lv4: 45000
+ Lv5: 40000
+ Lv6: 35000
+ Lv7: 30000
+ Lv8: 25000
+ Lv9: 20000
+ Lv10: 15000
+ }
+ SkillData2: {
+ Lv1: 60000
+ Lv2: 70000
+ Lv3: 80000
+ Lv4: 90000
+ Lv5: 120000
+ Lv6: 120000
+ Lv7: 120000
+ Lv8: 120000
+ Lv9: 120000
+ Lv10: 120000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 40
+ Lv3: 50
+ Lv4: 60
+ Lv5: 70
+ Lv6: 80
+ Lv7: 90
+ Lv8: 100
+ Lv9: 110
+ Lv10: 120
+ }
+ }
+},
+{
+ Id: 8012
+ Name: "HFLI_SBR44"
+ Description: "S.B.R.44"
+ MaxLevel: 3
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ NumberOfHits: 0
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8013
+ Name: "HVAN_CAPRICE"
+ Description: "Caprice"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ NumberOfHits: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 3
+ Lv4: 4
+ Lv5: 5
+ Lv6: 6
+ Lv7: 7
+ Lv8: 8
+ Lv9: 9
+ Lv10: 10
+ }
+ AfterCastActDelay: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 22
+ Lv2: 24
+ Lv3: 26
+ Lv4: 28
+ Lv5: 30
+ Lv6: 32
+ Lv7: 34
+ Lv8: 36
+ Lv9: 38
+ Lv10: 40
+ }
+ }
+},
+{
+ Id: 8014
+ Name: "HVAN_CHAOTIC"
+ Description: "Benediction of Chaos"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ AfterCastActDelay: 1000
+ AfterCastWalkDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 8015
+ Name: "HVAN_INSTRUCT"
+ Description: "Instruct"
+ MaxLevel: 5
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 8016
+ Name: "HVAN_EXPLOSION"
+ Description: "Bio Explosion"
+ MaxLevel: 3
+ Range: 4
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ IgnoreElement: true
+ IgnoreFlee: true
+ IgnoreDefCards: true
+ }
+ SplashRange: 4
+ AfterCastWalkDelay: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8018
+ Name: "MH_SUMMON_LEGION"
+ Description: "Summon Legion"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 1600
+ Lv2: 1400
+ Lv3: 1200
+ Lv4: 1000
+ Lv5: 800
+ Lv6: 600
+ Lv7: 400
+ Lv8: 200
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ FixedCastTime: {
+ Lv1: 400
+ Lv2: 600
+ Lv3: 800
+ Lv4: 1000
+ Lv5: 1200
+ Lv6: 1400
+ Lv7: 1600
+ Lv8: 1800
+ Lv9: 2000
+ Lv10: 2200
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 80
+ Lv3: 100
+ Lv4: 120
+ Lv5: 140
+ Lv6: 160
+ Lv7: 180
+ Lv8: 200
+ Lv9: 220
+ Lv10: 240
+ }
+ }
+},
+{
+ Id: 8019
+ Name: "MH_NEEDLE_OF_PARALYZE"
+ Description: "Needle of Paralyze"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Poison"
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1100
+ Lv3: 1200
+ Lv4: 1300
+ Lv5: 1400
+ Lv6: 1500
+ Lv7: 1600
+ Lv8: 1700
+ Lv9: 1800
+ Lv10: 1900
+ }
+ SkillData1: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ FixedCastTime: {
+ Lv1: 500
+ Lv2: 400
+ Lv3: 300
+ Lv4: 200
+ Lv5: 100
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 48
+ Lv2: 60
+ Lv3: 72
+ Lv4: 84
+ Lv5: 96
+ Lv6: 108
+ Lv7: 120
+ Lv8: 132
+ Lv9: 144
+ Lv10: 156
+ }
+ }
+},
+{
+ Id: 8020
+ Name: "MH_POISON_MIST"
+ Description: "Poison Mist"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Poison"
+ SkillInstances: 1
+ CastTime: {
+ Lv1: 500
+ Lv2: 700
+ Lv3: 900
+ Lv4: 1100
+ Lv5: 1300
+ Lv6: 1500
+ Lv7: 1700
+ Lv8: 1900
+ Lv9: 2100
+ Lv10: 2300
+ }
+ SkillData1: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ SkillData2: {
+ Lv1: 4000
+ Lv2: 6000
+ Lv3: 8000
+ Lv4: 10000
+ Lv5: 12000
+ Lv6: 14000
+ Lv7: 16000
+ Lv8: 18000
+ Lv9: 20000
+ Lv10: 22000
+ }
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 65
+ Lv2: 75
+ Lv3: 85
+ Lv4: 95
+ Lv5: 105
+ Lv6: 115
+ Lv7: 125
+ Lv8: 135
+ Lv9: 145
+ Lv10: 155
+ }
+ }
+ Unit: {
+ Id: 0xf5
+ Range: 3
+ Interval: 2300
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 8021
+ Name: "MH_PAIN_KILLER"
+ Description: "Pain Killer"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ SkillData1: {
+ Lv1: 20000
+ Lv2: 30000
+ Lv3: 40000
+ Lv4: 50000
+ Lv5: 60000
+ Lv6: 70000
+ Lv7: 80000
+ Lv8: 90000
+ Lv9: 100000
+ Lv10: 110000
+ }
+ FixedCastTime: {
+ Lv1: 1000
+ Lv2: 800
+ Lv3: 600
+ Lv4: 400
+ Lv5: 200
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 48
+ Lv2: 52
+ Lv3: 56
+ Lv4: 60
+ Lv5: 64
+ Lv6: 68
+ Lv7: 72
+ Lv8: 76
+ Lv9: 80
+ Lv10: 84
+ }
+ }
+},
+{
+ Id: 8022
+ Name: "MH_LIGHT_OF_REGENE"
+ Description: "Light of Regene"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SplashRange: 0
+ SkillData1: {
+ Lv1: 360000
+ Lv2: 420000
+ Lv3: 480000
+ Lv4: 540000
+ Lv5: 600000
+ Lv6: 660000
+ Lv7: 720000
+ Lv8: 780000
+ Lv9: 840000
+ Lv10: 900000
+ }
+ FixedCastTime: {
+ Lv1: 1600
+ Lv2: 1400
+ Lv3: 1200
+ Lv4: 1000
+ Lv5: 800
+ Lv6: 600
+ Lv7: 400
+ Lv8: 200
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 50
+ Lv3: 60
+ Lv4: 70
+ Lv5: 80
+ Lv6: 90
+ Lv7: 100
+ Lv8: 110
+ Lv9: 120
+ Lv10: 130
+ }
+ }
+},
+{
+ Id: 8023
+ Name: "MH_OVERED_BOOST"
+ Description: "Overed Boost"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SplashRange: 0
+ CastTime: {
+ Lv1: 800
+ Lv2: 700
+ Lv3: 600
+ Lv4: 500
+ Lv5: 400
+ Lv6: 300
+ Lv7: 200
+ Lv8: 100
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: {
+ Lv1: 200
+ Lv2: 300
+ Lv3: 400
+ Lv4: 500
+ Lv5: 600
+ Lv6: 700
+ Lv7: 800
+ Lv8: 900
+ Lv9: 1000
+ Lv10: 1100
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 70
+ Lv2: 90
+ Lv3: 110
+ Lv4: 130
+ Lv5: 150
+ Lv6: 170
+ Lv7: 190
+ Lv8: 210
+ Lv9: 230
+ Lv10: 250
+ }
+ }
+},
+{
+ Id: 8024
+ Name: "MH_ERASER_CUTTER"
+ Description: "Eraser Cutter"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: {
+ Lv1: "Ele_Wind"
+ Lv2: "Ele_Neutral"
+ Lv3: "Ele_Wind"
+ Lv4: "Ele_Neutral"
+ Lv5: "Ele_Wind"
+ }
+ NumberOfHits: -6
+ InterruptCast: true
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1500
+ Lv3: 2000
+ Lv4: 2500
+ Lv5: 3000
+ Lv6: 3500
+ Lv7: 4000
+ Lv8: 4500
+ Lv9: 5000
+ Lv10: 5500
+ }
+ AfterCastActDelay: 2000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 25
+ Lv2: 30
+ Lv3: 35
+ Lv4: 40
+ Lv5: 45
+ Lv6: 50
+ Lv7: 55
+ Lv8: 60
+ Lv9: 65
+ Lv10: 70
+ }
+ }
+},
+{
+ Id: 8025
+ Name: "MH_XENO_SLASHER"
+ Description: "Xeno Slasher"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Magic"
+ Element: {
+ Lv1: "Ele_Wind"
+ Lv2: "Ele_Neutral"
+ Lv3: "Ele_Wind"
+ Lv4: "Ele_Neutral"
+ Lv5: "Ele_Wind"
+ }
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 2
+ Lv2: 2
+ Lv3: 3
+ Lv4: 3
+ Lv5: 4
+ Lv6: 4
+ Lv7: 5
+ Lv8: 5
+ Lv9: 6
+ Lv10: 6
+ }
+ NumberOfHits: -6
+ CastTime: {
+ Lv1: 1500
+ Lv2: 2500
+ Lv3: 3500
+ Lv4: 4500
+ Lv5: 5500
+ Lv6: 6500
+ Lv7: 7500
+ Lv8: 8500
+ Lv9: 9500
+ Lv10: 10500
+ }
+ AfterCastActDelay: 5000
+ SkillData1: 500
+ FixedCastTime: 500
+ Requirements: {
+ SPCost: {
+ Lv1: 90
+ Lv2: 100
+ Lv3: 110
+ Lv4: 120
+ Lv5: 130
+ Lv6: 140
+ Lv7: 150
+ Lv8: 160
+ Lv9: 170
+ Lv10: 180
+ }
+ }
+ Unit: {
+ Id: 0x86
+ Range: {
+ Lv1: 2
+ Lv2: 2
+ Lv3: 3
+ Lv4: 3
+ Lv5: 4
+ Lv6: 4
+ Lv7: 5
+ Lv8: 5
+ Lv9: 6
+ Lv10: 6
+ }
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 8026
+ Name: "MH_SILENT_BREEZE"
+ Description: "Silent Breeze"
+ MaxLevel: 5
+ Range: {
+ Lv1: 5
+ Lv2: 5
+ Lv3: 7
+ Lv4: 7
+ Lv5: 9
+ Lv6: 9
+ Lv7: 11
+ Lv8: 11
+ Lv9: 13
+ Lv10: 13
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ SkillData1: {
+ Lv1: 9000
+ Lv2: 12000
+ Lv3: 15000
+ Lv4: 18000
+ Lv5: 21000
+ Lv6: 24000
+ Lv7: 27000
+ Lv8: 30000
+ Lv9: 33000
+ Lv10: 36000
+ }
+ FixedCastTime: {
+ Lv1: 1000
+ Lv2: 800
+ Lv3: 600
+ Lv4: 400
+ Lv5: 200
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 45
+ Lv2: 54
+ Lv3: 63
+ Lv4: 72
+ Lv5: 81
+ Lv6: 90
+ Lv7: 99
+ Lv8: 108
+ Lv9: 117
+ Lv10: 126
+ }
+ }
+},
+{
+ Id: 8027
+ Name: "MH_STYLE_CHANGE"
+ Description: "Style Change"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 35
+ }
+},
+{
+ Id: 8028
+ Name: "MH_SONIC_CRAW"
+ Description: "Sonic Claw"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+ State: "MH_Fighting"
+ }
+},
+{
+ Id: 8029
+ Name: "MH_SILVERVEIN_RUSH"
+ Description: "Silver Bain Rush"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 15
+ Lv3: 20
+ Lv4: 25
+ Lv5: 30
+ Lv6: 35
+ Lv7: 40
+ Lv8: 45
+ Lv9: 50
+ Lv10: 55
+ }
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 8030
+ Name: "MH_MIDNIGHT_FRENZY"
+ Description: "Midnight Frenzy"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 8
+ Lv2: 16
+ Lv3: 24
+ Lv4: 32
+ Lv5: 40
+ Lv6: 48
+ Lv7: 56
+ Lv8: 64
+ Lv9: 72
+ Lv10: 80
+ }
+ SpiritSphereCost: 2
+ }
+},
+{
+ Id: 8031
+ Name: "MH_STAHL_HORN"
+ Description: "Steel Horn"
+ MaxLevel: 5
+ Range: {
+ Lv1: 5
+ Lv2: 6
+ Lv3: 7
+ Lv4: 8
+ Lv5: 9
+ Lv6: 10
+ Lv7: 11
+ Lv8: 12
+ Lv9: 13
+ Lv10: 14
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ KnockBackTiles: 3
+ CastTime: {
+ Lv1: 800
+ Lv2: 600
+ Lv3: 400
+ Lv4: 200
+ Lv5: 0
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData1: 5000
+ FixedCastTime: {
+ Lv1: 200
+ Lv2: 400
+ Lv3: 600
+ Lv4: 800
+ Lv5: 1000
+ Lv6: 1200
+ Lv7: 1400
+ Lv8: 1600
+ Lv9: 1800
+ Lv10: 2000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 40
+ Lv2: 45
+ Lv3: 50
+ Lv4: 55
+ Lv5: 60
+ Lv6: 65
+ Lv7: 70
+ Lv8: 75
+ Lv9: 80
+ Lv10: 85
+ }
+ }
+},
+{
+ Id: 8032
+ Name: "MH_GOLDENE_FERSE"
+ Description: "Golden Heel"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 1000
+ Lv2: 1200
+ Lv3: 1400
+ Lv4: 1600
+ Lv5: 1800
+ Lv6: 2000
+ Lv7: 2200
+ Lv8: 2400
+ Lv9: 2600
+ Lv10: 2800
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 65
+ Lv3: 70
+ Lv4: 75
+ Lv5: 80
+ Lv6: 85
+ Lv7: 90
+ Lv8: 95
+ Lv9: 100
+ Lv10: 105
+ }
+ }
+},
+{
+ Id: 8033
+ Name: "MH_STEINWAND"
+ Description: "Stone Wall"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: 1000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 80
+ Lv2: 90
+ Lv3: 100
+ Lv4: 110
+ Lv5: 120
+ Lv6: 130
+ Lv7: 140
+ Lv8: 150
+ Lv9: 160
+ Lv10: 170
+ }
+ }
+ Unit: {
+ Id: 0x7e
+ Interval: -1
+ Target: "All"
+ Flag: {
+ UF_DEFNOTENEMY: true
+ UF_NOREITERATION: true
+ }
+ }
+},
+{
+ Id: 8034
+ Name: "MH_HEILIGE_STANGE"
+ Description: "Holy Pole"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Holy"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 1
+ Lv5: 2
+ Lv6: 2
+ Lv7: 2
+ Lv8: 2
+ Lv9: 2
+ Lv10: 2
+ }
+ CastTime: {
+ Lv1: 200
+ Lv2: 400
+ Lv3: 600
+ Lv4: 800
+ Lv5: 1000
+ Lv6: 1200
+ Lv7: 1400
+ Lv8: 1600
+ Lv9: 1800
+ Lv10: 2000
+ }
+ FixedCastTime: {
+ Lv1: 1800
+ Lv2: 1600
+ Lv3: 1400
+ Lv4: 1200
+ Lv5: 1000
+ Lv6: 800
+ Lv7: 600
+ Lv8: 400
+ Lv9: 200
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 68
+ Lv3: 76
+ Lv4: 84
+ Lv5: 100
+ Lv6: 100
+ Lv7: 100
+ Lv8: 100
+ Lv9: 100
+ Lv10: 100
+ }
+ }
+},
+{
+ Id: 8035
+ Name: "MH_ANGRIFFS_MODUS"
+ Description: "Attack Mode"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 200
+ Lv2: 400
+ Lv3: 600
+ Lv4: 800
+ Lv5: 1000
+ Lv6: 1200
+ Lv7: 1400
+ Lv8: 1600
+ Lv9: 1800
+ Lv10: 2000
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 65
+ Lv3: 70
+ Lv4: 75
+ Lv5: 80
+ Lv6: 85
+ Lv7: 90
+ Lv8: 95
+ Lv9: 100
+ Lv10: 105
+ }
+ }
+},
+{
+ Id: 8036
+ Name: "MH_TINDER_BREAKER"
+ Description: "Tinder Breaker"
+ MaxLevel: 5
+ Range: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 25
+ Lv3: 30
+ Lv4: 35
+ Lv5: 40
+ Lv6: 45
+ Lv7: 50
+ Lv8: 55
+ Lv9: 60
+ Lv10: 65
+ }
+ State: "MH_Grappling"
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 8037
+ Name: "MH_CBC"
+ Description: "Continual Break Combo"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 10
+ Lv2: 20
+ Lv3: 30
+ Lv4: 40
+ Lv5: 50
+ Lv6: 60
+ Lv7: 70
+ Lv8: 80
+ Lv9: 90
+ Lv10: 100
+ }
+ SpiritSphereCost: 1
+ }
+},
+{
+ Id: 8038
+ Name: "MH_EQC"
+ Description: "Eternal Quick Combo"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ }
+ AttackType: "Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 24
+ Lv2: 28
+ Lv3: 32
+ Lv4: 36
+ Lv5: 40
+ Lv6: 44
+ Lv7: 48
+ Lv8: 52
+ Lv9: 56
+ Lv10: 60
+ }
+ SpiritSphereCost: 2
+ }
+},
+{
+ Id: 8039
+ Name: "MH_MAGMA_FLOW"
+ Description: "Magma Flow"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 2
+ Lv5: 2
+ Lv6: 2
+ Lv7: 2
+ Lv8: 2
+ Lv9: 2
+ Lv10: 2
+ }
+ CastTime: {
+ Lv1: 2000
+ Lv2: 2500
+ Lv3: 3000
+ Lv4: 3500
+ Lv5: 4000
+ Lv6: 4500
+ Lv7: 5000
+ Lv8: 5500
+ Lv9: 6000
+ Lv10: 6500
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: {
+ Lv1: 2000
+ Lv2: 1500
+ Lv3: 1000
+ Lv4: 500
+ Lv5: -1
+ Lv6: -1
+ Lv7: -1
+ Lv8: -1
+ Lv9: -1
+ Lv10: -1
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 34
+ Lv2: 38
+ Lv3: 42
+ Lv4: 46
+ Lv5: 50
+ Lv6: 54
+ Lv7: 58
+ Lv8: 62
+ Lv9: 66
+ Lv10: 70
+ }
+ }
+},
+{
+ Id: 8040
+ Name: "MH_GRANITIC_ARMOR"
+ Description: "Granitic Armor"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 6000
+ Lv2: 5500
+ Lv3: 5000
+ Lv4: 4500
+ Lv5: 4000
+ Lv6: 3500
+ Lv7: 3000
+ Lv8: 2500
+ Lv9: 2000
+ Lv10: 1500
+ }
+ SkillData1: 60000
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 54
+ Lv2: 58
+ Lv3: 62
+ Lv4: 66
+ Lv5: 70
+ Lv6: 74
+ Lv7: 78
+ Lv8: 82
+ Lv9: 86
+ Lv10: 90
+ }
+ }
+},
+{
+ Id: 8041
+ Name: "MH_LAVA_SLIDE"
+ Description: "Lava Slide"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ }
+ SkillInstances: 1
+ CastTime: {
+ Lv1: 6000
+ Lv2: 5500
+ Lv3: 5000
+ Lv4: 4500
+ Lv5: 4000
+ Lv6: 3500
+ Lv7: 3000
+ Lv8: 2500
+ Lv9: 2000
+ Lv10: 1500
+ }
+ SkillData1: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 30
+ Lv2: 35
+ Lv3: 40
+ Lv4: 45
+ Lv5: 50
+ Lv6: 55
+ Lv7: 60
+ Lv8: 65
+ Lv9: 70
+ Lv10: 75
+ }
+ }
+ Unit: {
+ Id: 0xf6
+ Layout: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 3
+ Lv6: 3
+ Lv7: 4
+ Lv8: 4
+ Lv9: 5
+ Lv10: 5
+ }
+ Interval: 2000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 8042
+ Name: "MH_PYROCLASTIC"
+ Description: "Pyroclastic"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ CastTime: {
+ Lv1: 5000
+ Lv2: 4500
+ Lv3: 4000
+ Lv4: 3500
+ Lv5: 3000
+ Lv6: 2500
+ Lv7: 2000
+ Lv8: 1500
+ Lv9: 1000
+ Lv10: 500
+ }
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 90000
+ Lv3: 120000
+ Lv4: 150000
+ Lv5: 180000
+ Lv6: 210000
+ Lv7: 240000
+ Lv8: 270000
+ Lv9: 300000
+ Lv10: 330000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 28
+ Lv3: 36
+ Lv4: 44
+ Lv5: 52
+ Lv6: 60
+ Lv7: 68
+ Lv8: 76
+ Lv9: 84
+ Lv10: 92
+ }
+ }
+},
+{
+ Id: 8043
+ Name: "MH_VOLCANIC_ASH"
+ Description: "Volcanic Ash"
+ MaxLevel: 5
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillInstances: 3
+ CastTime: {
+ Lv1: 5000
+ Lv2: 4500
+ Lv3: 4000
+ Lv4: 3500
+ Lv5: 3000
+ Lv6: 2500
+ Lv7: 2000
+ Lv8: 1500
+ Lv9: 1000
+ Lv10: 500
+ }
+ SkillData1: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ FixedCastTime: 1000
+ Requirements: {
+ SPCost: {
+ Lv1: 60
+ Lv2: 65
+ Lv3: 70
+ Lv4: 75
+ Lv5: 80
+ Lv6: 85
+ Lv7: 90
+ Lv8: 95
+ Lv9: 100
+ Lv10: 105
+ }
+ }
+ Unit: {
+ Id: 0xf7
+ Layout: 1
+ Interval: -1
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ UF_RANGEDSINGLEUNIT: true
+ }
+ }
+},
+{
+ Id: 8201
+ Name: "MS_BASH"
+ Description: "Bash"
+ MaxLevel: 10
+ Range: -1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ Requirements: {
+ SPCost: {
+ Lv1: 8
+ Lv2: 8
+ Lv3: 8
+ Lv4: 8
+ Lv5: 8
+ Lv6: 15
+ Lv7: 15
+ Lv8: 15
+ Lv9: 15
+ Lv10: 15
+ }
+ WeaponTypes: {
+ NoWeapon: true
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Staves: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
+ GrenadeLaunchers: true
+ FuumaShurikens: true
+ }
+ }
+},
+{
+ Id: 8202
+ Name: "MS_MAGNUM"
+ Description: "Magnum_Break"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ KnockBackTiles: 2
+ AfterCastActDelay: 1500
+ AfterCastWalkDelay: 2000
+ SkillData1: 2000
+ SkillData2: 10000
+ Requirements: {
+ HPCost: {
+ Lv1: 20
+ Lv2: 20
+ Lv3: 19
+ Lv4: 19
+ Lv5: 18
+ Lv6: 18
+ Lv7: 17
+ Lv8: 17
+ Lv9: 16
+ Lv10: 16
+ }
+ SPCost: 30
+ }
+},
+{
+ Id: 8203
+ Name: "MS_BOWLINGBASH"
+ Description: "Bowling_Bash"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 1
+ KnockBackTiles: 1
+ CastTime: 700
+ AfterCastActDelay: 2500
+ Requirements: {
+ SPCost: {
+ Lv1: 13
+ Lv2: 14
+ Lv3: 15
+ Lv4: 16
+ Lv5: 17
+ Lv6: 18
+ Lv7: 19
+ Lv8: 20
+ Lv9: 21
+ Lv10: 22
+ }
+ }
+},
+{
+ Id: 8204
+ Name: "MS_PARRYING"
+ Description: "Parry"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 15000
+ Lv2: 20000
+ Lv3: 25000
+ Lv4: 30000
+ Lv5: 35000
+ Lv6: 40000
+ Lv7: 45000
+ Lv8: 50000
+ Lv9: 55000
+ Lv10: 60000
+ }
+ Requirements: {
+ SPCost: 50
+ }
+},
+{
+ Id: 8205
+ Name: "MS_REFLECTSHIELD"
+ Description: "Shield_Reflect"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ SkillData1: 300000
+ Requirements: {
+ SPCost: {
+ Lv1: 35
+ Lv2: 40
+ Lv3: 45
+ Lv4: 50
+ Lv5: 55
+ Lv6: 60
+ Lv7: 65
+ Lv8: 70
+ Lv9: 75
+ Lv10: 80
+ }
+ }
+},
+{
+ Id: 8206
+ Name: "MS_BERSERK"
+ Description: "Frenzy"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 300000
+ SkillData2: 15000
+ Requirements: {
+ SPCost: 100
+ }
+},
+{
+ Id: 8207
+ Name: "MA_DOUBLE"
+ Description: "Double_Strafe"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 2
+ AfterCastActDelay: 1000
+ SkillData1: 100
+ Requirements: {
+ SPCost: 12
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 8208
+ Name: "MA_SHOWER"
+ Description: "Arrow_Shower"
+ MaxLevel: 10
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ IgnoreLandProtector: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ SplashRange: 2
+ KnockBackTiles: 2
+ AfterCastActDelay: 1200
+ SkillData1: 100
+ Requirements: {
+ SPCost: 15
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+ Unit: {
+ Id: 0x86
+ Range: 2
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_SKILL: true
+ }
+ }
+},
+{
+ Id: 8209
+ Name: "MA_SKIDTRAP"
+ Description: "Skid_Trap"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ KnockBackTiles: {
+ Lv1: 6
+ Lv2: 7
+ Lv3: 8
+ Lv4: 9
+ Lv5: 10
+ Lv6: 11
+ Lv7: 12
+ Lv8: 13
+ Lv9: 14
+ Lv10: 15
+ }
+ SkillData1: {
+ Lv1: 300000
+ Lv2: 240000
+ Lv3: 180000
+ Lv4: 120000
+ Lv5: 60000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ Requirements: {
+ SPCost: 10
+ }
+ Unit: {
+ Id: 0x90
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 8210
+ Name: "MA_LANDMINE"
+ Description: "Land_Mine"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ Element: "Ele_Earth"
+ DamageType: {
+ IgnoreFlee: true
+ }
+ SkillData1: {
+ Lv1: 200000
+ Lv2: 160000
+ Lv3: 120000
+ Lv4: 80000
+ Lv5: 40000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData2: 5000
+ Requirements: {
+ SPCost: 10
+ }
+ Unit: {
+ Id: 0x93
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 8211
+ Name: "MA_SANDMAN"
+ Description: "Sandman"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 2
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 120000
+ Lv3: 90000
+ Lv4: 60000
+ Lv5: 30000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData2: {
+ Lv1: 12000
+ Lv2: 14000
+ Lv3: 16000
+ Lv4: 18000
+ Lv5: 20000
+ Lv6: 22000
+ Lv7: 24000
+ Lv8: 26000
+ Lv9: 28000
+ Lv10: 30000
+ }
+ Requirements: {
+ SPCost: 12
+ }
+ Unit: {
+ Id: 0x95
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 8212
+ Name: "MA_FREEZINGTRAP"
+ Description: "Freezing_Trap"
+ MaxLevel: 5
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Trap: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Water"
+ DamageType: {
+ SplashArea: true
+ IgnoreFlee: true
+ }
+ SplashRange: 1
+ SkillData1: {
+ Lv1: 150000
+ Lv2: 120000
+ Lv3: 90000
+ Lv4: 60000
+ Lv5: 30000
+ Lv6: 1
+ Lv7: 1
+ Lv8: 1
+ Lv9: 1
+ Lv10: 1
+ }
+ SkillData2: {
+ Lv1: 3000
+ Lv2: 6000
+ Lv3: 9000
+ Lv4: 12000
+ Lv5: 15000
+ Lv6: 18000
+ Lv7: 21000
+ Lv8: 24000
+ Lv9: 27000
+ Lv10: 30000
+ }
+ Requirements: {
+ SPCost: 10
+ }
+ Unit: {
+ Id: 0x97
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOREITERATION: true
+ UF_NOFOOTSET: true
+ }
+ }
+},
+{
+ Id: 8213
+ Name: "MA_REMOVETRAP"
+ Description: "Remove_Trap"
+ MaxLevel: 1
+ Range: 2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Trap: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 8214
+ Name: "MA_CHARGEARROW"
+ Description: "Arrow_Repel"
+ MaxLevel: 1
+ Range: -9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ SplashArea: true
+ }
+ KnockBackTiles: 6
+ CastTime: 750
+ AfterCastActDelay: 1000
+ FixedCastTime: 750
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: 15
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 8215
+ Name: "MA_SHARPSHOOTING"
+ Description: "Focused_Arrow_Strike"
+ MaxLevel: 5
+ Range: 9
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ SplashRange: 2
+ InterruptCast: true
+ SkillInstances: 13
+ CastTime: 1000
+ AfterCastActDelay: 2500
+ FixedCastTime: 1000
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 21
+ Lv3: 24
+ Lv4: 27
+ Lv5: 30
+ Lv6: 33
+ Lv7: 36
+ Lv8: 39
+ Lv9: 42
+ Lv10: 45
+ }
+ AmmoTypes: {
+ A_ARROW: true
+ }
+ AmmoAmount: 1
+ }
+},
+{
+ Id: 8216
+ Name: "ML_PIERCE"
+ Description: "Pierce"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 3
+ Requirements: {
+ SPCost: 7
+ }
+},
+{
+ Id: 8217
+ Name: "ML_BRANDISH"
+ Description: "Brandish_Spear"
+ MaxLevel: 10
+ Range: -2
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ KnockBackTiles: 3
+ CastTime: 350
+ AfterCastActDelay: 1200
+ FixedCastTime: 350
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: 12
+ }
+},
+{
+ Id: 8218
+ Name: "ML_SPIRALPIERCE"
+ Description: "Spiral_Pierce"
+ MaxLevel: 5
+ Range: 5
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ DamageType: {
+ IgnoreDefense: true
+ }
+ NumberOfHits: 5
+ CastTime: {
+ Lv1: 150
+ Lv2: 250
+ Lv3: 350
+ Lv4: 450
+ Lv5: 500
+ Lv6: 500
+ Lv7: 500
+ Lv8: 500
+ Lv9: 500
+ Lv10: 500
+ }
+ AfterCastActDelay: 2500
+ SkillData2: 1000
+ FixedCastTime: {
+ Lv1: 150
+ Lv2: 250
+ Lv3: 350
+ Lv4: 450
+ Lv5: 500
+ Lv6: 500
+ Lv7: 500
+ Lv8: 500
+ Lv9: 500
+ Lv10: 500
+ }
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 18
+ Lv2: 21
+ Lv3: 24
+ Lv4: 27
+ Lv5: 30
+ Lv6: 33
+ Lv7: 36
+ Lv8: 39
+ Lv9: 42
+ Lv10: 45
+ }
+ }
+},
+{
+ Id: 8219
+ Name: "ML_DEFENDER"
+ Description: "Defending_Aura"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ AfterCastActDelay: 800
+ SkillData1: 180000
+ Requirements: {
+ SPCost: 30
+ State: "Shield"
+ }
+},
+{
+ Id: 8220
+ Name: "ML_AUTOGUARD"
+ Description: "Guard"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 300000
+ Requirements: {
+ SPCost: {
+ Lv1: 12
+ Lv2: 14
+ Lv3: 16
+ Lv4: 18
+ Lv5: 20
+ Lv6: 22
+ Lv7: 24
+ Lv8: 26
+ Lv9: 28
+ Lv10: 30
+ }
+ }
+},
+{
+ Id: 8221
+ Name: "ML_DEVOTION"
+ Description: "Sacrifice"
+ MaxLevel: 5
+ Range: {
+ Lv1: 7
+ Lv2: 8
+ Lv3: 9
+ Lv4: 10
+ Lv5: 11
+ Lv6: 12
+ Lv7: 13
+ Lv8: 14
+ Lv9: 15
+ Lv10: 16
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoCastSelf: true
+ PartyOnly: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1500
+ SkillData2: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: 1500
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: 25
+ }
+},
+{
+ Id: 8222
+ Name: "MER_MAGNIFICAT"
+ Description: "Magnificat"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: -1
+ InterruptCast: true
+ CastTime: 3200
+ AfterCastActDelay: 2000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 45000
+ Lv3: 60000
+ Lv4: 75000
+ Lv5: 90000
+ Lv6: 105000
+ Lv7: 120000
+ Lv8: 135000
+ Lv9: 150000
+ Lv10: 165000
+ }
+ FixedCastTime: 800
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 8223
+ Name: "MER_QUICKEN"
+ Description: "Two-Hand_Quicken"
+ MaxLevel: 10
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 60000
+ Lv3: 90000
+ Lv4: 120000
+ Lv5: 150000
+ Lv6: 180000
+ Lv7: 210000
+ Lv8: 240000
+ Lv9: 270000
+ Lv10: 300000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 14
+ Lv2: 18
+ Lv3: 22
+ Lv4: 26
+ Lv5: 30
+ Lv6: 34
+ Lv7: 38
+ Lv8: 42
+ Lv9: 46
+ Lv10: 50
+ }
+ }
+},
+{
+ Id: 8224
+ Name: "MER_SIGHT"
+ Description: "Sight"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 3
+ InterruptCast: true
+ SkillData1: 10000
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 8225
+ Name: "MER_CRASH"
+ Description: "Crash"
+ MaxLevel: 5
+ Range: 1
+ Hit: "BDT_MULTIHIT"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Weapon"
+ NumberOfHits: 3
+ CastTime: 1000
+ AfterCastActDelay: 2000
+ SkillData2: 5000
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 8226
+ Name: "MER_REGAIN"
+ Description: "Regain"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoEnemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 8227
+ Name: "MER_TENDER"
+ Description: "Tender"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoEnemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 8228
+ Name: "MER_BENEDICTION"
+ Description: "Benediction"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoEnemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 8229
+ Name: "MER_RECUPERATE"
+ Description: "Recuperate"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoEnemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 8230
+ Name: "MER_MENTALCURE"
+ Description: "Mental_Cure"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoEnemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 8231
+ Name: "MER_COMPRESS"
+ Description: "Compress"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ NoEnemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 8232
+ Name: "MER_PROVOKE"
+ Description: "Provoke"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 30000
+ Requirements: {
+ SPCost: {
+ Lv1: 4
+ Lv2: 5
+ Lv3: 6
+ Lv4: 7
+ Lv5: 8
+ Lv6: 9
+ Lv7: 10
+ Lv8: 11
+ Lv9: 12
+ Lv10: 13
+ }
+ }
+},
+{
+ Id: 8233
+ Name: "MER_AUTOBERSERK"
+ Description: "Berserk"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 5
+ }
+},
+{
+ Id: 8234
+ Name: "MER_DECAGI"
+ Description: "Decrease_AGI"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 800
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 40000
+ Lv2: 50000
+ Lv3: 60000
+ Lv4: 70000
+ Lv5: 80000
+ Lv6: 90000
+ Lv7: 100000
+ Lv8: 110000
+ Lv9: 120000
+ Lv10: 130000
+ }
+ FixedCastTime: 200
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 15
+ Lv2: 17
+ Lv3: 19
+ Lv4: 21
+ Lv5: 23
+ Lv6: 25
+ Lv7: 27
+ Lv8: 29
+ Lv9: 31
+ Lv10: 33
+ }
+ }
+},
+{
+ Id: 8235
+ Name: "MER_SCAPEGOAT"
+ Description: "Scapegoat"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 3000
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: 10
+ HPRateCost: 100
+ }
+},
+{
+ Id: 8236
+ Name: "MER_LEXDIVINA"
+ Description: "Lex_Divina"
+ MaxLevel: 10
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ NumberOfHits: 0
+ InterruptCast: true
+ AfterCastActDelay: 3000
+ SkillData1: {
+ Lv1: 30000
+ Lv2: 35000
+ Lv3: 40000
+ Lv4: 45000
+ Lv5: 50000
+ Lv6: 60000
+ Lv7: 60000
+ Lv8: 60000
+ Lv9: 60000
+ Lv10: 60000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 20
+ Lv3: 20
+ Lv4: 20
+ Lv5: 20
+ Lv6: 18
+ Lv7: 16
+ Lv8: 14
+ Lv9: 12
+ Lv10: 10
+ }
+ }
+},
+{
+ Id: 8237
+ Name: "MER_ESTIMATION"
+ Description: "Sense"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 8238
+ Name: "MER_KYRIE"
+ Description: "Kyrie Eleison"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 2000
+ AfterCastActDelay: 2000
+ SkillData1: 120000
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 20
+ Lv2: 20
+ Lv3: 20
+ Lv4: 25
+ Lv5: 25
+ Lv6: 25
+ Lv7: 30
+ Lv8: 30
+ Lv9: 30
+ Lv10: 35
+ }
+ }
+},
+{
+ Id: 8239
+ Name: "MER_BLESSING"
+ Description: "Blessing"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 80000
+ Lv3: 100000
+ Lv4: 120000
+ Lv5: 140000
+ Lv6: 160000
+ Lv7: 180000
+ Lv8: 200000
+ Lv9: 220000
+ Lv10: 240000
+ }
+ Requirements: {
+ SPCost: {
+ Lv1: 28
+ Lv2: 32
+ Lv3: 36
+ Lv4: 40
+ Lv5: 44
+ Lv6: 48
+ Lv7: 52
+ Lv8: 56
+ Lv9: 60
+ Lv10: 64
+ }
+ }
+},
+{
+ Id: 8240
+ Name: "MER_INCAGI"
+ Description: "Increase Agility"
+ MaxLevel: 10
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ CastTime: 1000
+ AfterCastActDelay: 1000
+ SkillData1: {
+ Lv1: 60000
+ Lv2: 80000
+ Lv3: 100000
+ Lv4: 120000
+ Lv5: 140000
+ Lv6: 160000
+ Lv7: 180000
+ Lv8: 200000
+ Lv9: 220000
+ Lv10: 240000
+ }
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ HPCost: 15
+ SPCost: {
+ Lv1: 18
+ Lv2: 21
+ Lv3: 24
+ Lv4: 27
+ Lv5: 30
+ Lv6: 33
+ Lv7: 36
+ Lv8: 39
+ Lv9: 42
+ Lv10: 45
+ }
+ }
+},
+{
+ Id: 8401
+ Name: "EL_CIRCLE_OF_FIRE"
+ Description: "Circle of Fire"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ KnockBackTiles: 2
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 8402
+ Name: "EL_FIRE_CLOAK"
+ Description: "Fire Cloak"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 60
+ }
+},
+{
+ Id: 8403
+ Name: "EL_FIRE_MANTLE"
+ Description: "Fire Mantle"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ SkillInstances: 3
+ KnockBackTiles: 2
+ SkillData1: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 80
+ }
+ Unit: {
+ Id: 0xed
+ Layout: -1
+ Range: 1
+ Interval: 1000
+ Target: "Enemy"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ }
+ }
+},
+{
+ Id: 8404
+ Name: "EL_WATER_SCREEN"
+ Description: "Water Screen"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 8405
+ Name: "EL_WATER_DROP"
+ Description: "Water Drop"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 60
+ }
+},
+{
+ Id: 8406
+ Name: "EL_WATER_BARRIER"
+ Description: "Water Barrier"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 80
+ }
+ Unit: {
+ Id: 0xee
+ Layout: 1
+ Interval: -1
+ Target: "Friend"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ UF_RANGEDSINGLEUNIT: true
+ }
+ }
+},
+{
+ Id: 8407
+ Name: "EL_WIND_STEP"
+ Description: "Wind Step"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ KnockBackTiles: 5
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 8408
+ Name: "EL_WIND_CURTAIN"
+ Description: "Wind Curtain"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 60
+ }
+},
+{
+ Id: 8409
+ Name: "EL_ZEPHYR"
+ Description: "Zephyr"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 80
+ }
+ Unit: {
+ Id: 0xef
+ Range: 1
+ Interval: -1
+ Target: "Friend"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ UF_RANGEDSINGLEUNIT: true
+ }
+ }
+},
+{
+ Id: 8410
+ Name: "EL_SOLID_SKIN"
+ Description: "Solid Skin"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 8411
+ Name: "EL_STONE_SHIELD"
+ Description: "Stone Shield"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 60
+ }
+},
+{
+ Id: 8412
+ Name: "EL_POWER_OF_GAIA"
+ Description: "Power of Gaia"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 80
+ }
+ Unit: {
+ Id: 0xf0
+ Range: 1
+ Interval: -1
+ Target: "Friend"
+ Flag: {
+ UF_NOOVERLAP: true
+ UF_PATHCHECK: true
+ UF_RANGEDSINGLEUNIT: true
+ }
+ }
+},
+{
+ Id: 8413
+ Name: "EL_PYROTECHNIC"
+ Description: "Pyrotechnic"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8414
+ Name: "EL_HEATER"
+ Description: "Heater"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8415
+ Name: "EL_TROPIC"
+ Description: "Tropic"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8416
+ Name: "EL_AQUAPLAY"
+ Description: "Aqua Play"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8417
+ Name: "EL_COOLER"
+ Description: "Cooler"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8418
+ Name: "EL_CHILLY_AIR"
+ Description: "Cool Air"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8419
+ Name: "EL_GUST"
+ Description: "Gust"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8420
+ Name: "EL_BLAST"
+ Description: "Blast"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8421
+ Name: "EL_WILD_STORM"
+ Description: "Wild Storm"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8422
+ Name: "EL_PETROLOGY"
+ Description: "Petrology"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8423
+ Name: "EL_CURSED_SOIL"
+ Description: "Cursed Soil"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8424
+ Name: "EL_UPHEAVAL"
+ Description: "Upheaval"
+ MaxLevel: 1
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Self: true
+ }
+ DamageType: {
+ NoDamage: true
+ }
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8425
+ Name: "EL_FIRE_ARROW"
+ Description: "Fire Arrow"
+ MaxLevel: 1
+ Range: 6
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 8426
+ Name: "EL_FIRE_BOMB"
+ Description: "Fire Bomb"
+ MaxLevel: 1
+ Range: 6
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ SplashRange: 1
+ Requirements: {
+ SPCost: 60
+ }
+},
+{
+ Id: 8427
+ Name: "EL_FIRE_BOMB_ATK"
+ Description: "Fire Bomb Attack"
+ MaxLevel: 1
+ Range: 6
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ SplashRange: 1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8428
+ Name: "EL_FIRE_WAVE"
+ Description: "Fire Wave"
+ MaxLevel: 1
+ Range: 6
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ SplashRange: 1
+ Requirements: {
+ SPCost: 80
+ }
+},
+{
+ Id: 8429
+ Name: "EL_FIRE_WAVE_ATK"
+ Description: "Fire Wave Attack"
+ MaxLevel: 1
+ Range: 6
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Fire"
+ SplashRange: 1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8430
+ Name: "EL_ICE_NEEDLE"
+ Description: "Ice Needle"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 8431
+ Name: "EL_WATER_SCREW"
+ Description: "Water Screw"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Water"
+ SplashRange: 1
+ Requirements: {
+ SPCost: 60
+ }
+},
+{
+ Id: 8432
+ Name: "EL_WATER_SCREW_ATK"
+ Description: "Water Screw Attack"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Water"
+ SplashRange: 1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8433
+ Name: "EL_TIDAL_WEAPON"
+ Description: "Tidal Weapon"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Water"
+ SplashRange: 1
+ SkillData1: -1
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 80
+ }
+},
+{
+ Id: 8434
+ Name: "EL_WIND_SLASH"
+ Description: "Wind Slasher"
+ MaxLevel: 1
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Wind"
+ CastTime: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 8435
+ Name: "EL_HURRICANE"
+ Description: "Hurricane Rage"
+ MaxLevel: 1
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Wind"
+ SplashRange: 1
+ CastTime: 1000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 60
+ }
+},
+{
+ Id: 8436
+ Name: "EL_HURRICANE_ATK"
+ Description: "Hurricane Rage Attack"
+ MaxLevel: 1
+ Range: 7
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8437
+ Name: "EL_TYPOON_MIS"
+ Description: "Typhoon Missile"
+ MaxLevel: 1
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Wind"
+ SplashRange: 1
+ CastTime: 1000
+ SkillData1: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 80
+ }
+},
+{
+ Id: 8438
+ Name: "EL_TYPOON_MIS_ATK"
+ Description: "Typhoon Missile Attack"
+ MaxLevel: 1
+ Range: 11
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Wind"
+ SplashRange: 1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8439
+ Name: "EL_STONE_HAMMER"
+ Description: "Stone Hammer"
+ MaxLevel: 1
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Earth"
+ SkillData1: 5000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 40
+ }
+},
+{
+ Id: 8440
+ Name: "EL_ROCK_CRUSHER"
+ Description: "Rock Launcher"
+ MaxLevel: 1
+ Range: 3
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Earth"
+ SplashRange: 1
+ SkillData1: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 60
+ }
+},
+{
+ Id: 8441
+ Name: "EL_ROCK_CRUSHER_ATK"
+ Description: "Rock Launcher Attack"
+ MaxLevel: 1
+ Range: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Magic"
+ Element: "Ele_Earth"
+ SplashRange: 1
+ SkillData1: 15000
+ FixedCastTime: -1
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 8442
+ Name: "EL_STONE_RAIN"
+ Description: "Stone Rain"
+ MaxLevel: 1
+ Range: 9
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Enemy: true
+ }
+ AttackType: "Weapon"
+ Element: "Ele_Earth"
+ SplashRange: 1
+ NumberOfHits: -5
+ Requirements: {
+ SPCost: 80
+ }
+},
+{
+ Id: 10000
+ Name: "GD_APPROVAL"
+ Description: "Official Guild Approval"
+ MaxLevel: 1
+ SkillInfo: {
+ Guild: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 10001
+ Name: "GD_KAFRACONTRACT"
+ Description: "Kafra Contract"
+ MaxLevel: 1
+ SkillInfo: {
+ Guild: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 10002
+ Name: "GD_GUARDRESEARCH"
+ Description: "Guardian Research"
+ MaxLevel: 1
+ SkillInfo: {
+ Guild: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 10003
+ Name: "GD_GUARDUP"
+ Description: "Strengthen Guardians"
+ MaxLevel: 1
+ SkillInfo: {
+ Guild: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 10004
+ Name: "GD_EXTENSION"
+ Description: "Guild Extension"
+ MaxLevel: 10
+ SkillInfo: {
+ Guild: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 10005
+ Name: "GD_GLORYGUILD"
+ Description: "Guild's Glory"
+ MaxLevel: 1
+ SkillInfo: {
+ Guild: true
+ }
+ NumberOfHits: 0
+},
+{
+ Id: 10006
+ Name: "GD_LEADERSHIP"
+ Description: "Great Leadership"
+ MaxLevel: 1
+ SkillInfo: {
+ Guild: true
+ }
+ SplashRange: 2
+ NumberOfHits: 0
+ SkillData1: 300000
+ FixedCastTime: -1
+ Unit: {
+ Id: 0xc1
+ Layout: 2
+ Interval: -1
+ Target: "Sameguild"
+ Flag: {
+ UF_NOMOB: true
+ }
+ }
+},
+{
+ Id: 10007
+ Name: "GD_GLORYWOUNDS"
+ Description: "Glorious Wounds"
+ MaxLevel: 1
+ SkillInfo: {
+ Guild: true
+ }
+ SplashRange: 2
+ NumberOfHits: 0
+ SkillData1: 300000
+ FixedCastTime: -1
+ Unit: {
+ Id: 0xc2
+ Layout: 2
+ Interval: -1
+ Target: "Sameguild"
+ Flag: {
+ UF_NOMOB: true
+ }
+ }
+},
+{
+ Id: 10008
+ Name: "GD_SOULCOLD"
+ Description: "Cold Heart"
+ MaxLevel: 1
+ SkillInfo: {
+ Guild: true
+ }
+ SplashRange: 2
+ NumberOfHits: 0
+ SkillData1: 300000
+ FixedCastTime: -1
+ Unit: {
+ Id: 0xc3
+ Layout: 2
+ Interval: -1
+ Target: "Sameguild"
+ Flag: {
+ UF_NOMOB: true
+ }
+ }
+},
+{
+ Id: 10009
+ Name: "GD_HAWKEYES"
+ Description: "Sharp Gaze"
+ MaxLevel: 1
+ SkillInfo: {
+ Guild: true
+ }
+ SplashRange: 2
+ NumberOfHits: 0
+ SkillData1: 300000
+ FixedCastTime: -1
+ Unit: {
+ Id: 0xc4
+ Layout: 2
+ Interval: -1
+ Target: "Sameguild"
+ Flag: {
+ UF_NOMOB: true
+ }
+ }
+},
+{
+ Id: 10010
+ Name: "GD_BATTLEORDER"
+ Description: "Battle Orders"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Guild: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 15
+ NumberOfHits: 0
+ InterruptCast: true
+ SkillData1: 180000
+ SkillData2: 300000
+ FixedCastTime: -1
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 10011
+ Name: "GD_REGENERATION"
+ Description: "Regeneration"
+ MaxLevel: 3
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Guild: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 15
+ NumberOfHits: 0
+ InterruptCast: true
+ SkillData1: 60000
+ SkillData2: 300000
+ FixedCastTime: -1
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 10012
+ Name: "GD_RESTORE"
+ Description: "Restoration"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Guild: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ SplashRange: 15
+ NumberOfHits: 0
+ InterruptCast: true
+ SkillData2: 300000
+ FixedCastTime: 10000
+ CastTimeOptions: {
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 10013
+ Name: "GD_EMERGENCYCALL"
+ Description: "Urgent Call"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Guild: true
+ }
+ DamageType: {
+ NoDamage: true
+ SplashArea: true
+ }
+ NumberOfHits: 0
+ InterruptCast: true
+ SkillData2: 300000
+ FixedCastTime: 5000
+ CastTimeOptions: {
+ IgnoreDex: true
+ IgnoreStatusEffect: true
+ IgnoreItemBonus: true
+ }
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 10014
+ Name: "GD_DEVELOPMENT"
+ Description: "Permanent Development"
+ MaxLevel: 1
+ SkillInfo: {
+ Guild: true
+ }
+ NumberOfHits: 0
+},
+///////////////////////////////////////////////////
+// TMW/TMW2/Evol Skills
+{
+ Id: 20000
+ Name: "EVOL_MASS_PROVOKE"
+ Description: "Mass provoke"
+ MaxLevel: 10
+ Range: {
+ Lv1: 1
+ Lv2: 2
+ Lv3: 2
+ Lv4: 3
+ Lv5: 3
+ Lv6: 4
+ Lv7: 4
+ Lv8: 5
+ Lv9: 5
+ Lv10: 6
+ }
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Place: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Misc"
+ DamageType: {
+ NoDamage: true
+ }
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 1
+ Lv4: 2
+ Lv5: 2
+ Lv6: 2
+ Lv7: 3
+ Lv8: 3
+ Lv9: 3
+ Lv10: 4
+ }
+
+ InterruptCast: true
+ CastTime: 10000
+ AfterCastActDelay: 100
+ SkillData2: 3000
+ CoolDown: 1000
+ FixedCastTime: -1
+ TargetMiscEffect: "EFFECT_PROVOKE"
+ Requirements: {
+ SPCost: 8
+ }
+},
+{
+ Id: 20001
+ Name: "EVOL_PHYSICAL_SHIELD"
+ Description: "Physical Shield"
+ MaxLevel: 5
+ Hit: "BDT_SKILL"
+ SkillType: {
+ Friend: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ InterruptCast: true
+ AfterCastActDelay: 1000
+ AfterCastWalkDelay: 1000
+ SkillData1: 20000
+ CoolDown: 5000
+ Requirements: {
+ SPCost: 14
+ Items: {
+ HardSpike: 1
+ }
+ }
+},
+{
+ Id: 20002
+ Name: "TMW2_FAKESKILL"
+ Description: "Resync"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+},
+{
+ Id: 20003
+ Name: "SKILL_POOL"
+ Description: "Focus"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20004
+ Name: "SKILL_MALLARDS_EYE"
+ Description: "Mallard Eye"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20005
+ Name: "SKILL_BRAWLING"
+ Description: "Brawling"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20006
+ Name: "SKILL_SPEED"
+ Description: "Speed"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20007
+ Name: "SKILL_RESIST_POISON"
+ Description: "Resist Status Condition"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20008
+ Name: "SKILL_ASTRAL_SOUL"
+ Description: "Astral Soul"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20009
+ Name: "SKILL_RAGING"
+ Description: "Raging"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20010
+ Name: "SKILL_MAGIC"
+ Description: "Basic Magic"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20011
+ Name: "SKILL_MAGIC_LIFE"
+ Description: "Life Magic"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20012
+ Name: "SKILL_MAGIC_WAR"
+ Description: "War Magic"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20013
+ Name: "SKILL_MAGIC_TRANSMUTE"
+ Description: "Transmute Magic"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20014
+ Name: "SKILL_MAGIC_NATURE"
+ Description: "Nature Magic"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20015
+ Name: "SKILL_MAGIC_ASTRAL"
+ Description: "Astral Magic"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+{
+ Id: 20016
+ Name: "SKILL_MAGIC_DARK"
+ Description: "Dark Magic"
+ MaxLevel: 10
+ SkillType: {
+ Passive: true
+ }
+},
+///////////////////////////////////////////////////
+// 20017~20020 reserved (expansion)
+{
+ Id: 20020
+ Name: "EVOL_AREA_PROVOKE"
+ Description: "Itenplz"
+ MaxLevel: 10
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 1000
+ Requirements: {
+ SPCost: 3
+ }
+},
+{
+ Id: 20021
+ Name: "SKILL_ABIZIT"
+ Description: "Abizit"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 1000
+ Requirements: {
+ SPCost: 1
+ }
+},
+{
+ Id: 20022
+ Name: "SKILL_FLAR"
+ Description: "Flar"
+ MaxLevel: 10
+ Range: 5
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 500
+ Requirements: {
+ SPCost: 10
+ Items: {
+ SulphurPowder: 0
+ }
+ }
+},
+{
+ Id: 20023
+ Name: "SKILL_CONFRINGO"
+ Description: "Confringo"
+ MaxLevel: 10
+ Range: 8
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 500
+ Requirements: {
+ SPCost: 3
+ }
+},
+{
+ Id: 20024
+ Name: "SKILL_MONSTERINFO"
+ Description: "Miteyo"
+ MaxLevel: 1
+ Range: 15
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 500
+ Requirements: {
+ SPCost: 3
+ }
+},
+{
+ Id: 20025
+ Name: "SKILL_MODRIPHOO"
+ Description: "Modriphoo"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 2000
+ Requirements: {
+ SPCost: 4
+ Items: {
+ Root: 0
+ AlizarinHerb: 0
+ }
+ }
+},
+{
+ Id: 20026
+ Name: "SKILL_MODRISUMP"
+ Description: "Modrisump"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 2000
+ Requirements: {
+ SPCost: 4
+ Items: {
+ Root: 0
+ CobaltHerb: 0
+ }
+ }
+},
+{
+ Id: 20027
+ Name: "SKILL_MODRIYIKAM"
+ Description: "Modriykam"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 2000
+ Requirements: {
+ SPCost: 4
+ Items: {
+ Root: 0
+ GambogeHerb: 0
+ }
+ }
+},
+{
+ Id: 20028
+ Name: "SKILL_MODRILAX"
+ Description: "Modrilax"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 2000
+ Requirements: {
+ SPCost: 4
+ Items: {
+ Root: 0
+ MauveHerb: 0
+ }
+ }
+},
+{
+ Id: 20029
+ Name: "SKILL_LUM"
+ Description: "Lum"
+ MaxLevel: 9
+ Range: {
+ Lv1: 6
+ Lv2: 7
+ Lv3: 8
+ Lv4: 9
+ Lv5: 10
+ Lv6: 11
+ Lv7: 12
+ Lv8: 13
+ Lv9: 14
+ Lv10: 15
+ }
+ SkillType: {
+ Friend: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 500
+ Requirements: {
+ SPCost: 6
+ Items: {
+ Lifestone: 0
+ }
+ }
+},
+{
+ Id: 20030
+ Name: "SKILL_INMA"
+ Description: "Inma"
+ MaxLevel: 9
+ Range: {
+ Lv1: 3
+ Lv2: 4
+ Lv3: 5
+ Lv4: 6
+ Lv5: 7
+ Lv6: 8
+ Lv7: 9
+ Lv8: 10
+ Lv9: 11
+ Lv10: 12
+ }
+ SkillType: {
+ Friend: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 500
+ Requirements: {
+ SPCost: 10
+ }
+},
+{
+ Id: 20031
+ Name: "SKILL_KALAKARENK"
+ Description: "Kalakarenk"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 20000
+ Requirements: {
+ SPCost: 39
+ Items: {
+ Root: 0
+ WhiteFur: 0
+ }
+ }
+},
+{
+ Id: 20032
+ Name: "SKILL_KALBOO"
+ Description: "Kalboo"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 20000
+ Requirements: {
+ SPCost: 35
+ Items: {
+ Root: 0
+ MoubooFigurine: 0
+ }
+ }
+},
+{
+ Id: 20033
+ Name: "SKILL_KALGINA"
+ Description: "Kalgina"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 20000
+ Requirements: {
+ SPCost: 35
+ Items: {
+ Root: 0
+ PinkAntenna: 0
+ }
+ }
+},
+{
+ Id: 20034
+ Name: "SKILL_KALRENK"
+ Description: "Kalrenk"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 20000
+ Requirements: {
+ SPCost: 33
+ Items: {
+ Root: 0
+ HardSpike: 0
+ }
+ }
+},
+{
+ Id: 20035
+ Name: "SKILL_HALHISS"
+ Description: "Halhiss"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 15000
+ Requirements: {
+ SPCost: 40
+ Items: {
+ DarkCrystal: 0
+ SnakeEgg: 0
+ }
+ }
+},
+{
+ Id: 20036
+ Name: "SKILL_HELORP"
+ Description: "Helorp"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 15000
+ Requirements: {
+ SPCost: 35
+ Items: {
+ DarkCrystal: 0
+ SmallMushroom: 0
+ }
+ }
+},
+{
+ Id: 20037
+ Name: "SKILL_KAFLOSH"
+ Description: "Kaflosh"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 8000
+ Requirements: {
+ SPCost: 47
+ Items: {
+ BottleOfWater: 0
+ }
+ }
+},
+{
+ Id: 20038
+ Name: "SKILL_BETSANC"
+ Description: "Betsanc"
+ MaxLevel: 9
+ Range: 9
+ SkillType: {
+ Friend: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 3500
+ Requirements: {
+ SPCost: 14
+ Items: {
+ HardSpike: 0
+ }
+ }
+},
+{
+ Id: 20039
+ Name: "SKILL_ASORM"
+ Description: "Asorm"
+ MaxLevel: 9
+ Range: 9
+ SkillType: {
+ Friend: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ DamageType: {
+ NoDamage: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 3000
+ Requirements: {
+ SPCost: 15
+ Items: {
+ SmallMushroom: 0
+ }
+ }
+},
+{
+ Id: 20040
+ Name: "SKILL_CHIZA"
+ Description: "Chiza"
+ MaxLevel: 10
+ Range: 2
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ Element: "Ele_Neutral"
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 500
+ Requirements: {
+ SPCost: 9
+ }
+},
+{
+ Id: 20041
+ Name: "SKILL_INGRAV"
+ Description: "Ingrav"
+ MaxLevel: 10
+ Range: 8
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ Element: "Ele_Nature"
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 1000
+ Requirements: {
+ SPCost: 20
+ Items: {
+ IronPowder: 0
+ }
+ }
+},
+{
+ Id: 20042
+ Name: "SKILL_UPMARMU"
+ Description: "Uparmu"
+ MaxLevel: 10
+ Range: 1
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ Element: "Ele_Fire"
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 500
+ Requirements: {
+ SPCost: 20
+ Items: {
+ Beer: 0
+ }
+ WeaponTypes: {
+ NoWeapon: true
+ }
+ }
+},
+{
+ Id: 20043
+ Name: "SKILL_PHLEX"
+ Description: "Phlex"
+ MaxLevel: 10
+ Range: 4
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ Element: "Ele_Dark"
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 500
+ Requirements: {
+ SPCost: 15
+ Items: {
+ Root: 0
+ }
+ }
+},
+{
+ Id: 20044
+ Name: "SKILL_FRILLYAR"
+ Description: "Frillyar"
+ MaxLevel: 10
+ Range: 4
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ Element: "Ele_Neutral"
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 2000
+ Requirements: {
+ SPCost: 25
+ Items: {
+ SulphurPowder: 0
+ }
+ }
+},
+{
+ Id: 20045
+ Name: "SKILL_JOYPLIM"
+ Description: "Joyplim"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 200
+ Requirements: {
+ SPCost: 13
+ Items: {
+ GingerBreadMan: 0
+ }
+ }
+},
+{
+ Id: 20046
+ Name: "SKILL_KALMURK"
+ Description: "Kalmurk"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 20000
+ Requirements: {
+ SPCost: 21
+ Items: {
+ Root: 0
+ MaggotSlime: 0
+ }
+ }
+},
+{
+ Id: 20047
+ Name: "SKILL_PARUM"
+ Description: "Parum"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 4000
+ Requirements: {
+ SPCost: 5
+ Items: {
+ RawLog: 0
+ }
+ }
+},
+{
+ Id: 20048
+ Name: "SKILL_KULARZUFRILL"
+ Description: "Kularzufrill"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 4000
+ Requirements: {
+ SPCost: 8
+ Items: {
+ RawLog: 0
+ }
+ }
+},
+{
+ Id: 20049
+ Name: "SKILL_ZUKMINBIRF"
+ Description: "Zukminbirf"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 5000
+ Requirements: {
+ SPCost: 8
+ Items: {
+ IronOre: 0
+ }
+ }
+},
+{
+ Id: 20050
+ Name: "SKILL_PATMUPLOO"
+ Description: "Patmuploo"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 5000
+ Requirements: {
+ SPCost: 25
+ Items: {
+ CottonCloth: 0
+ }
+ }
+},
+{
+ Id: 20051
+ Name: "SKILL_PATVILOREE"
+ Description: "Patviloree"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 5000
+ Requirements: {
+ SPCost: 25
+ Items: {
+ CottonCloth: 0
+ }
+ }
+},
+{
+ Id: 20052
+ Name: "SKILL_PATLOREE"
+ Description: "Patloree"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 5000
+ Requirements: {
+ SPCost: 25
+ Items: {
+ CottonCloth: 0
+ }
+ }
+},
+{
+ Id: 20053
+ Name: "SKILL_GOLE"
+ Description: "Gole"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 4000
+ Requirements: {
+ SPCost: 4
+ Items: {
+ PileOfAsh: 0
+ }
+ }
+},
+{
+ Id: 20054
+ Name: "SKILL_MANPAHIL"
+ Description: "Manpahil"
+ MaxLevel: 9
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ CoolDown: 4000
+ Requirements: {
+ SPCost: 15
+ Items: {
+ BugLeg: 0
+ MaggotSlime: 0
+ MauveHerb: 0
+ AlizarinHerb: 0
+ CobaltHerb: 0
+ GambogeHerb: 0
+ }
+ }
+},
+{
+ Id: 20055
+ Name: "SKILL_CHIPCHIP"
+ Description: "Chipchip"
+ MaxLevel: 10
+ Range: 1
+ SkillType: {
+ Enemy: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+ Hit: "BDT_SKILL"
+ AttackType: "Magic"
+ Element: "Ele_Neutral"
+ DamageType: {
+ NoDamage: true
+ }
+ CoolDown: 1000
+ Requirements: {
+ SPCost: 23
+ }
+},
+{
+ Id: 20056
+ Name: "SKILL_REAPERCRY"
+ Description: "Reapercry"
+ MaxLevel: 1
+ SkillType: {
+ Self: true
+ }
+ SkillInfo: {
+ Quest: true
+ }
+},
+)
+
diff --git a/db/pre-re/skill_tree.conf b/db/pre-re/skill_tree.conf
new file mode 100644
index 00000000..17e4e794
--- /dev/null
+++ b/db/pre-re/skill_tree.conf
@@ -0,0 +1,136 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//================= More Information =================
+// http://herc.ws/board/topic/1188-skill-tree-db-redesign/
+//================ Structure Example =================
+/*
+Job_Name: { // Job names as in src/map/pc.c (they are hardcoded at the moment so if you want to add a new job you should add it there)
+ inherit: ( "Other_Job_Name" ); // Base job from which this job will inherit its skill tree. NV_TRICKDEAD inheritance is skipped for non-novices from the source
+
+ skills: { // SKILL_NAMEs come from the Name (16th column) value in db/re/skill_db.txt
+ SKILL_NAME1: Max_Level // Use this for skills that don't have other skill prerequisite; Max_Level is a numeric value that should match your client side files
+ SKILL_NAME2: { // Use this for skills which have other skills as prerequisites
+ MaxLevel: Max_Level // Max_Level is a numeric value that should match your client side files
+ SKILL_NAME_PREREQUISITE: Level_Prerequisite // The prerequisite skill and min level for having this skill available. Should also match your client side files
+ SKILL_NAME_PREREQUISITE2: Level_Prerequisite2 // You can add as many prerequisite skills as you want. Minimum of 1 if you add a skill this way
+ }
+}
+*/
+//====================================================
+
+Talpan: {
+ skills: {
+ // Critical Skills
+ NV_BASIC: 0
+ TMW2_FAKESKILL: 0
+
+ // Active Basic Skills
+ AM_CALLHOMUN: 0
+ AM_REST: 0
+ AM_RESURRECTHOMUN: 0
+
+ // Passive Basic Skills
+ ALL_INCCARRY: 0
+ MC_DISCOUNT: 0
+ MC_OVERCHARGE: 0
+
+ //AC_SHOWER: 0
+ //MG_FIREWALL: 0
+
+ // Base Class
+ SKILL_MAGIC: 0
+ SKILL_MAGIC_LIFE: 0
+ SKILL_MAGIC_WAR: 0
+ SKILL_MAGIC_TRANSMUTE: 0
+ SKILL_MAGIC_NATURE: 0
+ SKILL_MAGIC_ASTRAL: 0
+ SKILL_MAGIC_DARK: 0
+
+ // Focus Skills
+ SKILL_POOL: 0
+ SKILL_MALLARDS_EYE: 0
+ SKILL_BRAWLING: 0
+ SKILL_SPEED: 0
+ SKILL_RESIST_POISON: 0
+ SKILL_ASTRAL_SOUL: 0
+ SKILL_RAGING: 0
+
+ // Level 0
+ SKILL_CONFRINGO: 9
+ SKILL_REAPERCRY: 0
+
+ // Level 1
+ SKILL_ABIZIT: 1
+ SKILL_MONSTERINFO: 1
+ EVOL_AREA_PROVOKE: 9
+ SKILL_FLAR: 9
+ SKILL_MODRIPHOO: 9
+ SKILL_MODRISUMP: 9
+ SKILL_MODRIYIKAM: 9
+ SKILL_MODRILAX: 9
+ SKILL_LUM: 9
+ SKILL_CHIZA: 9
+ SKILL_PARUM: 9
+ SKILL_GOLE: 9
+
+ // Level 2
+ SKILL_INMA: 9
+ SKILL_JOYPLIM: 9
+ SKILL_CHIPCHIP: 9
+ SKILL_KALAKARENK: 9
+ SKILL_KALBOO: 9
+ SKILL_KALGINA: 9
+ SKILL_KALRENK: 9
+ SKILL_HALHISS: 9
+ SKILL_HELORP: 9
+ SKILL_KAFLOSH: 9
+ SKILL_BETSANC: 9
+ SKILL_ASORM: 9
+ SKILL_INGRAV: 9
+ SKILL_UPMARMU: 9
+ SKILL_FRILLYAR: 9
+ SKILL_PHLEX: 9
+ SKILL_KULARZUFRILL: 9
+ SKILL_ZUKMINBIRF: 9
+ SKILL_PATMUPLOO: 9
+ SKILL_PATVILOREE: 9
+ SKILL_PATLOREE: 9
+ SKILL_MANPAHIL: 9
+
+ // Level 3
+ // Level 4
+ // Level 5
+ }
+}
+
+NoRace: {
+ inherit: ( "Talpan" );
+}
+
+Tritan: {
+ inherit: ( "Talpan" );
+}
+
+Ifriton: {
+ inherit: ( "Talpan" );
+}
+
+Gispaan: {
+ inherit: ( "Talpan" );
+}
+
+Sparron: {
+ inherit: ( "Talpan" );
+}
+
+Skellie: {
+ inherit: ( "Talpan" );
+}
+
diff --git a/db/pre-re/statpoint.txt b/db/pre-re/statpoint.txt
new file mode 100644
index 00000000..b61780d4
--- /dev/null
+++ b/db/pre-re/statpoint.txt
@@ -0,0 +1,255 @@
+48
+52
+56
+60
+64
+69
+74
+79
+84
+90
+96
+102
+108
+115
+122
+129
+136
+144
+152
+160
+168
+177
+186
+195
+204
+214
+224
+234
+244
+255
+266
+277
+288
+300
+312
+324
+336
+349
+362
+375
+388
+402
+416
+430
+444
+459
+474
+489
+504
+520
+536
+552
+568
+585
+602
+619
+636
+654
+672
+690
+708
+727
+746
+765
+784
+804
+824
+844
+864
+885
+906
+927
+948
+970
+992
+1014
+1036
+1059
+1082
+1105
+1128
+1152
+1176
+1200
+1224
+1249
+1274
+1299
+1324
+1350
+1376
+1402
+1428
+1455
+1482
+1509
+1536
+1564
+1592
+1620
+1648
+1677
+1706
+1735
+1764
+1794
+1824
+1854
+1884
+1915
+1946
+1977
+2008
+2040
+2072
+2104
+2136
+2169
+2202
+2235
+2268
+2302
+2336
+2370
+2404
+2439
+2474
+2509
+2544
+2580
+2616
+2652
+2688
+2725
+2762
+2799
+2836
+2874
+2912
+2950
+2988
+3027
+3066
+3105
+3144
+3184
+3224
+3264
+3304
+3345
+3386
+3427
+3468
+3510
+3552
+3594
+3636
+3679
+3722
+3765
+3808
+3852
+3896
+3940
+3984
+4029
+4074
+4119
+4164
+4210
+4256
+4302
+4348
+4395
+4442
+4489
+4536
+4584
+4632
+4680
+4728
+4777
+4826
+4875
+4924
+4974
+5024
+5074
+5124
+5175
+5226
+5277
+5328
+5380
+5432
+5484
+5536
+5589
+5642
+5695
+5748
+5802
+5856
+5910
+5964
+6019
+6074
+6129
+6184
+6240
+6296
+6352
+6408
+6465
+6522
+6579
+6636
+6694
+6752
+6810
+6868
+6927
+6986
+7045
+7104
+7164
+7224
+7284
+7344
+7405
+7466
+7527
+7588
+7650
+7712
+7774
+7836
+7899
+7962
+8025
+8088
+8152
+8216
+8280
+8344
+8409
+8474
+8539
+8604
+8670
+8736
+8802
+8868
+8935
+9002
diff --git a/db/produce_db.txt b/db/produce_db.txt
new file mode 100644
index 00000000..38eef6d6
--- /dev/null
+++ b/db/produce_db.txt
@@ -0,0 +1,9 @@
+// Item Produce Database
+//
+// Structure of Database:
+// ProduceItemID,ItemLV,RequireSkill,RequireSkillLv,MaterialID1,MaterialAmount1,......
+//
+// Comments:
+// If MaterialAmount = 0, then you just need that item in your inventory (guides)
+// For example, Mine Bottle is 7138,32,228,7131,0,713,1,1050,1,1051,1
+// 7131 is the Guide needed to create mine bottles and the amount needed of this item is 0 (.. ,7131,0, ..).
diff --git a/db/quest_db.conf b/db/quest_db.conf
new file mode 100644
index 00000000..fd7e29d3
--- /dev/null
+++ b/db/quest_db.conf
@@ -0,0 +1,78 @@
+quest_db: (
+// Quest Database
+/******************************************************************************
+ ************* Entry structure ************************************************
+ ******************************************************************************
+{
+ Id: Quest ID [int]
+ Name: Quest Name [string]
+ TimeLimit: Time Limit (seconds) [int, optional]
+ Targets: ( [array, optional]
+ {
+ MobId: Mob ID [int]
+ Count: [int]
+ },
+ ... (can repeated up to MAX_QUEST_OBJECTIVES times)
+ )
+ Drops: (
+ {
+ ItemId: Item ID to drop [int]
+ Rate: Drop rate [int]
+ MobId: Mob ID to match [int, optional]
+ },
+ ... (can be repeated)
+ )
+},
+******************************************************************************/
+// General Quests (0~19)
+{
+ Id: 0
+ Name: "General_Narrator"
+},
+{
+ Id: 1
+ Name: "General_Banker"
+},
+
+// Candor Quests (20~59)
+{
+ Id: 20
+ Name: "CandorQuest_Harasser"
+},
+{
+ Id: 21
+ Name: "CandorQuest_Valon"
+},
+{
+ Id: 22
+ Name: "CandorQuest_HideNSeek"
+},
+
+// Tonori Quests (60~99)
+
+// Argaes Quests (100~139)
+
+// Kaizei Quests (140~179)
+{
+ Id: 140
+ Name: "KaizeiQuest_Cindy"
+},
+
+// Magic Quests (180~219)
+{
+ Id: 180
+ Name: "MagicQuest_Healing"
+},
+
+// Misc Quests (220~259)
+{
+ Id: 220
+ Name: "Quest_Reapercry"
+},
+
+// Test Quests, Debug Quests, etc. (1000+)
+{
+ Id: 1000
+ Name: "Test_testing1"
+},
+)
diff --git a/db/re/level_penalty.txt b/db/re/level_penalty.txt
new file mode 100644
index 00000000..cf78bc7c
--- /dev/null
+++ b/db/re/level_penalty.txt
@@ -0,0 +1,14 @@
+// Experience & Drop Rate Modifier Database
+//
+// Structure of Database:
+// Type,Race,Level difference,Rate
+//
+// TYPE:
+// 1=experience, 2=item drop
+// RACE:
+// 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect,
+// 5=Fish, 6=Demon, 7=Demi-Human, 8=Angel, 9=Dragon,
+// 10=Boss monsters, 11=Normal monsters
+//
+// Note: RENEWAL_DROP and/or RENEWAL_EXP must be enabled.
+
diff --git a/db/roulette_db.conf b/db/roulette_db.conf
new file mode 100644
index 00000000..c7f6da08
--- /dev/null
+++ b/db/roulette_db.conf
@@ -0,0 +1,16 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//================= More Information =================
+//= http://herc.ws/board/ ???
+//====================================================
+// This file handles the Roulette, the format is <item>:<amount>
+// The first entry is the one that loses the game.
+//====================================================
+
diff --git a/db/sc_config.conf b/db/sc_config.conf
new file mode 100644
index 00000000..9fa7b758
--- /dev/null
+++ b/db/sc_config.conf
@@ -0,0 +1,3806 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2019-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//================= Description ===========================================
+// Configurations file for status effects
+//=========================================================================
+
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+SC_TYPE: {
+ // ================ Optional fields ===============================
+ Visible: (bool) SC can be visible for all players
+ Flags: {
+ NoDeathReset: (bool) SC cannot be removed by death.
+ NoSave: (bool) SC cannot be saved.
+ NoDispelReset: (bool) SC cannot be reset by dispell.
+ NoClearanceReset: (bool) SC cannot be reset by clearance.
+ Buff: (bool) SC considered as buff and be removed by Hermode and etc.
+ Debuff: (bool) SC considered as debuff and be removed by Gospel and etc.
+ NoMadoReset: (bool) SC cannot be reset when MADO Gear is taken off.
+ NoAllReset: (bool) SC cannot be reset by 'sc_end SC_ALL' and status change clear.
+ NoBoss: (bool) SC cannot be applied to boss monsters.
+ }
+ Icon: (string, defaults to SI_BLANK) The status icon attached to the SC
+}
+**************************************************************************/
+SC_CONFUSION: {
+ Flags: {
+ NoSave: true
+ NoBoss: true
+ }
+ Icon: "SI_CONFUSION"
+}
+SC_PROVOKE: {
+ Flags: {
+ Debuff: true
+ NoBoss: true
+ }
+ Icon: "SI_PROVOKE"
+}
+SC_ENDURE: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_ENDURE"
+}
+SC_HIDING: {
+ Flags: {
+ NoDispelReset: true
+ }
+ Icon: "SI_HIDING"
+}
+SC_CLOAKING: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ }
+ Icon: "SI_CLOAKING"
+}
+SC_TWOHANDQUICKEN: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_TWOHANDQUICKEN"
+}
+SC_CONCENTRATION: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_CONCENTRATION"
+}
+SC_ENCHANTPOISON: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_ENCHANTPOISON"
+}
+SC_POISONREACT: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_POISONREACT"
+}
+SC_QUAGMIRE: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Debuff: true
+ }
+ Icon: "SI_QUAGMIRE"
+}
+SC_ANGELUS: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_ANGELUS"
+}
+SC_BLESSING: {
+ Flags: {
+ Buff: true
+ NoMadoReset: true
+ NoBoss: true
+ }
+ Icon: "SI_BLESSING"
+}
+SC_INC_AGI: {
+ Flags: {
+ Buff: true
+ NoMadoReset: true
+ }
+}
+SC_DEC_AGI: {
+ Flags: {
+ NoSave: true
+ Debuff: true
+ NoBoss: true
+ }
+ Icon: "SI_DEC_AGI"
+}
+SC_SLOWPOISON: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SLOWPOISON"
+}
+SC_IMPOSITIO: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_IMPOSITIO"
+}
+SC_SUFFRAGIUM: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SUFFRAGIUM"
+}
+SC_ASPERSIO: {
+ Flags: {
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_ASPERSIO"
+}
+SC_BENEDICTIO: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_BENEDICTIO"
+}
+SC_KYRIE: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_KYRIE"
+}
+SC_MAGNIFICAT: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_MAGNIFICAT"
+}
+SC_GLORIA: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_GLORIA"
+}
+SC_LEXAETERNA: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_LEXAETERNA"
+}
+SC_ADRENALINE: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_ADRENALINE"
+}
+SC_WEAPONPERFECT: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_WEAPONPERFECT"
+}
+SC_OVERTHRUST: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_OVERTHRUST"
+}
+SC_MAXIMIZEPOWER: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_MAXIMIZE"
+}
+SC_TRICKDEAD: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_TRICKDEAD"
+}
+SC_SHOUT: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SHOUT"
+}
+SC_ENERGYCOAT: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_ENERGYCOAT"
+}
+SC_ATTHASTE_POTION1: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ATTHASTE_POTION1"
+}
+SC_ATTHASTE_POTION2: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ATTHASTE_POTION2"
+}
+SC_ATTHASTE_POTION3: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_ATTHASTE_POTION3"
+}
+SC_MOVHASTE_POTION: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MOVHASTE_POTION"
+}
+SC_BARRIER: {
+ Flags: {
+ Buff: true
+ }
+}
+SC_NOEQUIPWEAPON: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_NOEQUIPWEAPON"
+}
+SC_NOEQUIPSHIELD: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_NOEQUIPSHIELD"
+}
+SC_NOEQUIPARMOR: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_NOEQUIPARMOR"
+}
+SC_NOEQUIPHELM: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_NOEQUIPHELM"
+}
+SC_PROTECTWEAPON: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROTECTWEAPON"
+}
+SC_PROTECTSHIELD: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROTECTSHIELD"
+}
+SC_PROTECTARMOR: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROTECTARMOR"
+}
+SC_PROTECTHELM: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROTECTHELM"
+}
+SC_AUTOGUARD: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_AUTOGUARD"
+}
+SC_REFLECTSHIELD: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_REFLECTSHIELD"
+}
+SC_DEVOTION: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+}
+SC_PROVIDENCE: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_PROVIDENCE"
+}
+SC_DEFENDER: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_DEFENDER"
+}
+SC_MAGICROD: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+}
+SC_AUTOSPELL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_AUTOSPELL"
+}
+SC_SPEARQUICKEN: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SPEARQUICKEN"
+}
+SC_BLADESTOP: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+}
+SC_EXPLOSIONSPIRITS: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_EXPLOSIONSPIRITS"
+}
+SC_STEELBODY: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_STEELBODY"
+}
+SC_PROPERTYFIRE: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROPERTYFIRE"
+}
+SC_PROPERTYWATER: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROPERTYWATER"
+}
+SC_PROPERTYWIND: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROPERTYWIND"
+}
+SC_PROPERTYGROUND: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROPERTYGROUND"
+}
+SC_STOP: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_STOP"
+}
+SC_PROPERTYUNDEAD: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROPERTYUNDEAD"
+}
+SC_AURABLADE: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_AURABLADE"
+}
+SC_PARRYING: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PARRYING"
+}
+SC_LKCONCENTRATION: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_LKCONCENTRATION"
+}
+SC_TENSIONRELAX: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_TENSIONRELAX"
+}
+SC_BERSERK: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_BERSERK"
+}
+SC_SACRIFICE: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+}
+SC_GOSPEL: {
+ Flags: {
+ NoSave: true
+ Debuff: true
+ }
+}
+SC_SAFETYWALL: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+}
+SC_PNEUMA: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+}
+SC_ASSUMPTIO: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_ASSUMPTIO"
+}
+SC_BASILICA: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+}
+SC_VOLCANO: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_GROUNDMAGIC"
+}
+SC_DELUGE: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_GROUNDMAGIC"
+}
+SC_VIOLENTGALE: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_GROUNDMAGIC"
+}
+SC_MAGICPOWER: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_MAGICPOWER"
+}
+SC_EDP: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_EDP"
+}
+SC_TRUESIGHT: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_TRUESIGHT"
+}
+SC_WINDWALK: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_WINDWALK"
+}
+SC_MELTDOWN: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_MELTDOWN"
+}
+SC_CARTBOOST: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_CARTBOOST"
+}
+SC_BLOODING: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_BLOODING"
+}
+SC_JOINTBEAT: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Debuff: true
+ }
+ Icon: "SI_JOINTBEAT"
+}
+SC_MINDBREAKER: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+}
+SC_MEMORIZE: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+}
+SC_FOGWALL: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ NoBoss: true
+ }
+}
+SC_SPIDERWEB: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Debuff: true
+ }
+}
+SC_SUB_WEAPONPROPERTY: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ Buff: true
+ }
+}
+SC_RUN: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_RUN"
+}
+SC_STRUP: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_STRUP"
+}
+SC_PROPERTYDARK: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROPERTYDARK"
+}
+SC_ADRENALINE2: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_ADRENALINE2"
+}
+SC_PROPERTYTELEKINESIS: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROPERTYTELEKINESIS"
+}
+SC_SOULLINK: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SOULLINK"
+}
+SC_PLUSATTACKPOWER: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_PLUSATTACKPOWER"
+}
+SC_PLUSMAGICPOWER: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_PLUSMAGICPOWER"
+}
+SC_KAITE: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_KAITE"
+}
+SC_KAAHI: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_KAAHI"
+}
+SC_KAUPE: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_KAUPE"
+}
+SC_ONEHANDQUICKEN: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ONEHANDQUICKEN"
+}
+SC_PRESERVE: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_PRESERVE"
+}
+SC_CHASEWALK: {
+ Flags: {
+ NoDispelReset: true
+ }
+}
+SC_CHASEWALK2: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_INCSTR"
+}
+SC_MOVESLOW_POTION: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MOVESLOW_POTION"
+}
+SC_DOUBLECASTING: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_DOUBLECASTING"
+}
+SC_GRAVITATION: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ NoBoss: true
+ }
+}
+SC_OVERTHRUSTMAX: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_OVERTHRUSTMAX"
+}
+SC_TAROTCARD: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Debuff: true
+ }
+ Icon: "SI_TAROTCARD"
+}
+SC_CR_SHRINK: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_CR_SHRINK"
+}
+SC_WZ_SIGHTBLASTER: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_WZ_SIGHTBLASTER"
+}
+SC_RG_CCONFINE_M: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_RG_CCONFINE_M"
+}
+SC_RG_CCONFINE_S: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_RG_CCONFINE_S"
+}
+SC_NJ_UTSUSEMI: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_NJ_UTSUSEMI"
+}
+SC_NJ_BUNSINJYUTSU: {
+ Flags: {
+ NoSave: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_NJ_BUNSINJYUTSU"
+}
+SC_NJ_SUITON: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Debuff: true
+ NoBoss: true
+ }
+ Icon: "SI_NJ_SUITON"
+}
+SC_FOOD_STR: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_STR"
+}
+SC_FOOD_AGI: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_AGI"
+}
+SC_FOOD_VIT: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_VIT"
+}
+SC_FOOD_DEX: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_DEX"
+}
+SC_FOOD_INT: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_INT"
+}
+SC_FOOD_LUK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_LUK"
+}
+SC_FOOD_BASICAVOIDANCE: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_BASICAVOIDANCE"
+}
+SC_FOOD_BASICHIT: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_BASICHIT"
+}
+SC_FOOD_CRITICALSUCCESSVALUE: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_FOOD_CRITICALSUCCESSVALUE"
+}
+SC_CASH_PLUSEXP: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_CASH_PLUSEXP"
+}
+SC_CASH_DEATHPENALTY: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_CASH_DEATHPENALTY"
+}
+SC_CASH_RECEIVEITEM: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_CASH_RECEIVEITEM"
+}
+SC_CASH_BOSS_ALARM: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_CASH_BOSS_ALARM"
+}
+SC_FOOD_STR_CASH: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_STR_CASH"
+}
+SC_FOOD_AGI_CASH: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_AGI_CASH"
+}
+SC_FOOD_VIT_CASH: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_VIT_CASH"
+}
+SC_FOOD_DEX_CASH: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_DEX_CASH"
+}
+SC_FOOD_INT_CASH: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_INT_CASH"
+}
+SC_FOOD_LUK_CASH: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_FOOD_LUK_CASH"
+}
+SC_SAVAGE_STEAK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_SAVAGE_STEAK"
+}
+SC_COCKTAIL_WARG_BLOOD: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_COCKTAIL_WARG_BLOOD"
+}
+SC_MINOR_BBQ: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_MINOR_BBQ"
+}
+SC_SIROMA_ICE_TEA: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_SIROMA_ICE_TEA"
+}
+SC_DROCERA_HERB_STEAMED: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_DROCERA_HERB_STEAMED"
+}
+SC_PUTTI_TAILS_NOODLES: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_PUTTI_TAILS_NOODLES"
+}
+SC_MELON_BOMB: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_MELON_BOMB"
+}
+SC_BANANA_BOMB_SITDOWN_POSTDELAY: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_BANANA_BOMB_SITDOWN_POSTDELAY"
+}
+SC_BANANA_BOMB: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_BANANA_BOMB"
+}
+SC_PROMOTE_HEALTH_RESERCH: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_PROMOTE_HEALTH_RESERCH"
+}
+SC_ENERGY_DRINK_RESERCH: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_ENERGY_DRINK_RESERCH"
+}
+SC_EXTRACT_WHITE_POTION_Z: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_VITATA_500: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_EXTRACT_SALAMINE_JUICE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_BOOST500: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_FULL_SWING_K: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_MANA_PLUS: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_MUSTLE_M: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_LIFE_FORCE_F: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_MER_FLEE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MER_FLEE"
+}
+SC_MER_ATK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MER_ATK"
+}
+SC_MER_HP: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MER_HP"
+}
+SC_MER_SP: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MER_SP"
+}
+SC_MER_HIT: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MER_HIT"
+}
+SC_SLOWCAST: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SLOWCAST"
+}
+SC_CRITICALWOUND: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_CRITICALWOUND"
+}
+SC_MOVHASTE_HORSE: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MOVHASTE_HORSE"
+}
+SC_PROTECT_DEF: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROTECT_DEF"
+}
+SC_PROTECT_MDEF: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PROTECT_MDEF"
+}
+SC_HEALPLUS: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_HEALPLUS"
+}
+SC_S_LIFEPOTION: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_S_LIFEPOTION"
+}
+SC_L_LIFEPOTION: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_L_LIFEPOTION"
+}
+SC_CRITICALPERCENT: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_CRITICALPERCENT"
+}
+SC_PLUSAVOIDVALUE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_PLUSAVOIDVALUE"
+}
+SC_ATKER_ASPD: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ATKER_ASPD"
+}
+SC_TARGET_ASPD: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_TARGET_ASPD"
+}
+SC_ATKER_MOVESPEED: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ATKER_MOVESPEED"
+}
+SC_ATKER_BLOOD: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ATKER_BLOOD"
+}
+SC_TARGET_BLOOD: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_TARGET_BLOOD"
+}
+SC_ARMOR_PROPERTY: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ARMOR_PROPERTY"
+}
+SC_HELLPOWER: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_HELLPOWER"
+}
+SC_STEAMPACK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Debuff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_STEAMPACK"
+}
+SC_CASH_PLUSONLYJOBEXP: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_CASH_PLUSONLYJOBEXP"
+}
+SC_PARTYFLEE: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_PARTYFLEE"
+}
+SC_ANGEL_PROTECT: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ANGEL_PROTECT"
+}
+SC_ENCHANTBLADE: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_ENCHANTBLADE"
+}
+SC_DEATHBOUND: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_DEATHBOUND"
+}
+SC_REFRESH: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_REFRESH"
+}
+SC_GIANTGROWTH: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_GIANTGROWTH"
+}
+SC_STONEHARDSKIN: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_STONEHARDSKIN"
+}
+SC_VITALITYACTIVATION: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_VITALITYACTIVATION"
+}
+SC_FIGHTINGSPIRIT: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_FIGHTINGSPIRIT"
+}
+SC_ABUNDANCE: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_ABUNDANCE"
+}
+SC_EPICLESIS: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_EPICLESIS"
+}
+SC_ORATIO: {
+ Visible: true
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_ORATIO"
+}
+SC_LAUDAAGNUS: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_LAUDAAGNUS"
+}
+SC_LAUDARAMUS: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_LAUDARAMUS"
+}
+SC_CLOAKINGEXCEED: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_CLOAKINGEXCEED"
+}
+SC_HALLUCINATIONWALK: {
+ Visible: true
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_HALLUCINATIONWALK"
+}
+SC_HALLUCINATIONWALK_POSTDELAY: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_HALLUCINATIONWALK_POSTDELAY"
+}
+SC_RENOVATIO: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_RENOVATIO"
+}
+SC_WEAPONBLOCKING: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_WEAPONBLOCKING"
+}
+SC_ROLLINGCUTTER: {
+ Visible: true
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ROLLINGCUTTER"
+}
+SC_EXPIATIO: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_EXPIATIO"
+}
+SC_POISONINGWEAPON: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_POISONINGWEAPON"
+}
+SC_TOXIN: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_TOXIN"
+}
+SC_PARALYSE: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_PARALYSE"
+}
+SC_VENOMBLEED: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_VENOMBLEED"
+}
+SC_MAGICMUSHROOM: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_MAGICMUSHROOM"
+}
+SC_DEATHHURT: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_DEATHHURT"
+}
+SC_PYREXIA: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_PYREXIA"
+}
+SC_OBLIVIONCURSE: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_OBLIVIONCURSE"
+}
+SC_LEECHESEND: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_LEECHESEND"
+}
+SC_DUPLELIGHT: {
+ Visible: true
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_DUPLELIGHT"
+}
+SC_FEARBREEZE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_FEARBREEZE"
+}
+SC_ELECTRICSHOCKER: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_ELECTRICSHOCKER"
+}
+SC_MARSHOFABYSS: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_MARSHOFABYSS"
+}
+SC_RECOGNIZEDSPELL: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_RECOGNIZEDSPELL"
+}
+SC_WUGDASH: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_WUGDASH"
+}
+SC_WUGBITE: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoBoss: true
+ }
+}
+SC_CAMOUFLAGE: {
+ Visible: true
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_CAMOUFLAGE"
+}
+SC_ACCELERATION: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ACCELERATION"
+}
+SC_HOVERING: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_HOVERING"
+}
+SC_SUMMON1: {
+ Visible: true
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SPHERE_1"
+}
+SC_SUMMON2: {
+ Visible: true
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SPHERE_2"
+}
+SC_SUMMON3: {
+ Visible: true
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SPHERE_3"
+}
+SC_SUMMON4: {
+ Visible: true
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SPHERE_4"
+}
+SC_SUMMON5: {
+ Visible: true
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SPHERE_5"
+}
+SC_MVPCARD_TAOGUNKA: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ Debuff: true
+ }
+ Icon: "SI_MVPCARD_TAOGUNKA"
+}
+SC_MVPCARD_MISTRESS: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ Debuff: true
+ }
+ Icon: "SI_MVPCARD_MISTRESS"
+}
+SC_MVPCARD_ORCHERO: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ Debuff: true
+ }
+ Icon: "SI_MVPCARD_ORCHERO"
+}
+SC_MVPCARD_ORCLORD: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ Debuff: true
+ }
+ Icon: "SI_MVPCARD_ORCLORD"
+}
+SC_OVERHEAT_LIMITPOINT: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_OVERHEAT_LIMITPOINT"
+}
+SC_OVERHEAT: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_OVERHEAT"
+}
+SC_SHAPESHIFT: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SHAPESHIFT"
+}
+SC_INFRAREDSCAN: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_INFRAREDSCAN"
+}
+SC_MAGNETICFIELD: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_MAGNETICFIELD"
+}
+SC_NEUTRALBARRIER: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_NEUTRALBARRIER"
+}
+SC_NEUTRALBARRIER_MASTER: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_NEUTRALBARRIER_MASTER"
+}
+SC_STEALTHFIELD_MASTER: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_STEALTHFIELD_MASTER"
+}
+SC_MANU_ATK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MANU_ATK"
+}
+SC_MANU_DEF: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MANU_DEF"
+}
+SC_SPL_ATK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SPL_ATK"
+}
+SC_SPL_DEF: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SPL_DEF"
+}
+SC__REPRODUCE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_REPRODUCE"
+}
+SC_MANU_MATK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MANU_MATK"
+}
+SC_SPL_MATK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SPL_MATK"
+}
+SC_STR_SCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ Debuff: true
+ }
+ Icon: "SI_STR_SCROLL"
+}
+SC_INT_SCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ Debuff: true
+ }
+ Icon: "SI_INT_SCROLL"
+}
+SC_FORCEOFVANGUARD: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_FORCEOFVANGUARD"
+}
+SC_BUCHEDENOEL: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ Debuff: true
+ }
+ Icon: "SI_BUCHEDENOEL"
+}
+SC__AUTOSHADOWSPELL: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_AUTOSHADOWSPELL"
+}
+SC__SHADOWFORM: {
+ Visible: true
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SHADOWFORM"
+}
+SC_RAID: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+}
+SC_SHIELDSPELL_DEF: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SHIELDSPELL_DEF"
+}
+SC_SHIELDSPELL_MDEF: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SHIELDSPELL_MDEF"
+}
+SC_SHIELDSPELL_REF: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SHIELDSPELL_REF"
+}
+SC__BODYPAINT: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_BODYPAINT"
+}
+SC_EXEEDBREAK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_EXEEDBREAK"
+}
+SC_ADORAMUS: {
+ Flags: {
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_ADORAMUS"
+}
+SC_PRESTIGE: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_PRESTIGE"
+}
+SC__INVISIBILITY: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_INVISIBILITY"
+}
+SC__DEADLYINFECT: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_DEADLYINFECT"
+}
+SC_BANDING: {
+ Visible: true
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_BANDING"
+}
+SC_BANDING_DEFENCE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_BANDING_DEFENCE"
+}
+SC_EARTHDRIVE: {
+ Flags: {
+ NoDispelReset: true
+ Buff: true
+ }
+ Icon: "SI_EARTHDRIVE"
+}
+SC_INSPIRATION: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_INSPIRATION"
+}
+SC__ENERVATION: {
+ Flags: {
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_ENERVATION"
+}
+SC__GROOMY: {
+ Flags: {
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_GROOMY"
+}
+SC_RAISINGDRAGON: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_RAISINGDRAGON"
+}
+SC__IGNORANCE: {
+ Flags: {
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_IGNORANCE"
+}
+SC__LAZINESS: {
+ Flags: {
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_LAZINESS"
+}
+SC_LIGHTNINGWALK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_LIGHTNINGWALK"
+}
+SC_ACARAJE: {
+ Flags: {
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ACARAJE"
+}
+SC__UNLUCKY: {
+ Flags: {
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_UNLUCKY"
+}
+SC_CURSEDCIRCLE_ATKER: {
+ Visible: true
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_CURSEDCIRCLE_ATKER"
+}
+SC_CURSEDCIRCLE_TARGET: {
+ Visible: true
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_CURSEDCIRCLE_TARGET"
+}
+SC__WEAKNESS: {
+ Flags: {
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_WEAKNESS"
+}
+SC_CRESCENTELBOW: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_CRESCENTELBOW"
+}
+SC__STRIPACCESSARY: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_STRIPACCESSARY"
+}
+SC__MANHOLE: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_MANHOLE"
+}
+SC__BLOODYLUST: {
+ Flags: {
+ Debuff: true
+ }
+}
+SC_SWING: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SWINGDANCE"
+}
+SC_SYMPHONY_LOVE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SYMPHONYOFLOVERS"
+}
+SC_PROPERTYWALK: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_PROPERTYWALK"
+}
+SC_SPELLFIST: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SPELLFIST"
+}
+SC_NETHERWORLD: {
+ Flags: {
+ Buff: true
+ NoBoss: true
+ }
+ Icon: "SI_NETHERWORLD"
+}
+SC_SIREN: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SIREN"
+}
+SC_DEEP_SLEEP: {
+ Visible: true
+ Flags: {
+ NoSave: true
+ Debuff: true
+ NoBoss: true
+ }
+ Icon: "SI_DEEPSLEEP"
+}
+SC_SIRCLEOFNATURE: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SIRCLEOFNATURE"
+}
+SC_GLOOMYDAY: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_GLOOMYDAY"
+}
+SC_GLOOMYDAY_SK: {
+ Flags: {
+ Buff: true
+ }
+}
+SC_SONG_OF_MANA: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SONG_OF_MANA"
+}
+SC_DANCE_WITH_WUG: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_DANCEWITHWUG"
+}
+SC_RUSH_WINDMILL: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_RUSHWINDMILL"
+}
+SC_ECHOSONG: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ECHOSONG"
+}
+SC_HARMONIZE: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_HARMONIZE"
+}
+SC_MOONLIT_SERENADE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MOONLITSERENADE"
+}
+SC_SATURDAY_NIGHT_FEVER: {
+ Flags: {
+ Buff: true
+ }
+ Icon: "SI_SATURDAYNIGHTFEVER"
+}
+SC_SITDOWN_FORCE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+}
+SC_ANALYZE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_ANALYZE"
+}
+SC_LERADS_DEW: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_LERADSDEW"
+}
+SC_MELODYOFSINK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_MELODYOFSINK"
+}
+SC_BEYOND_OF_WARCRY: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_WARCRYOFBEYOND"
+}
+SC_UNLIMITED_HUMMING_VOICE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_UNLIMITEDHUMMINGVOICE"
+}
+SC_WARMER: {
+ Flags: {
+ NoSave: true
+ }
+}
+SC_VENOMIMPRESS: {
+ Visible: true
+ Flags: {
+ NoDispelReset: true
+ }
+ Icon: "SI_VENOMIMPRESS"
+}
+SC_FROSTMISTY: {
+ Visible: true
+ Flags: {
+ Debuff: true
+ NoBoss: true
+ }
+ Icon: "SI_FROSTMISTY"
+}
+SC_STOMACHACHE: {
+ Flags: {
+ Debuff: true
+ }
+ Icon: "SI_STOMACHACHE"
+}
+SC_MYSTERIOUS_POWDER: {
+ Flags: {
+ Debuff: true
+ }
+ Icon: "SI_MYSTERIOUS_POWDER"
+}
+SC_WATER_BARRIER: {
+ Flags: {
+ NoSave: true
+ }
+ Icon: "SI_WATER_BARRIER"
+}
+SC_ZEPHYR: {
+ Flags: {
+ NoSave: true
+ }
+ Icon: "SI_ZEPHYR"
+}
+SC_POWER_OF_GAIA: {
+ Flags: {
+ NoSave: true
+ }
+ Icon: "SI_POWER_OF_GAIA"
+}
+SC_FIRE_INSIGNIA: {
+ Flags: {
+ NoSave: true
+ }
+ Icon: "SI_FIRE_INSIGNIA"
+}
+SC_WATER_INSIGNIA: {
+ Flags: {
+ NoSave: true
+ }
+ Icon: "SI_WATER_INSIGNIA"
+}
+SC_WIND_INSIGNIA: {
+ Flags: {
+ NoSave: true
+ }
+ Icon: "SI_WIND_INSIGNIA"
+}
+SC_EARTH_INSIGNIA: {
+ Flags: {
+ NoSave: true
+ }
+ Icon: "SI_EARTH_INSIGNIA"
+}
+SC_MORA_BUFF: {
+ Flags: {
+ NoSave: true
+ }
+ Icon: "SI_MORA_BUFF"
+}
+SC_NEEDLE_OF_PARALYZE: {
+ Flags: {
+ NoDeathReset: true
+ NoBoss: true
+ }
+ Icon: "SI_NEEDLE_OF_PARALYZE"
+}
+SC_PAIN_KILLER: {
+ Flags: {
+ NoDeathReset: true
+ }
+ Icon: "SI_PAIN_KILLER"
+}
+SC_G_LIFEPOTION: {
+ Flags: {
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_G_LIFEPOTION"
+}
+SC_LIGHT_OF_REGENE: {
+ Flags: {
+ NoDeathReset: true
+ }
+ Icon: "SI_LIGHT_OF_REGENE"
+}
+SC_MAGIC_CANDY: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ NoMadoReset: true
+ }
+ Icon: "SI_MAGIC_CANDY"
+}
+SC_MONSTER_TRANSFORM: {
+ Visible: true
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_MONSTER_TRANSFORM"
+}
+SC_MTF_ASPD: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_MTF_RANGEATK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_MTF_MATK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_MTF_MLEATKED: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_MTF_CRIDAMAGE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_FULL_THROTTLE: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_FULL_THROTTLE"
+}
+SC_REBOUND: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_REBOUND"
+}
+SC_TELEKINESIS_INTENSE: {
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_TELEKINESIS_INTENSE"
+}
+SC_SKELSCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+}
+SC_DISTRUCTIONSCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+}
+SC_ROYALSCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+}
+SC_IMMUNITYSCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+}
+SC_MYSTICSCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+}
+SC_BATTLESCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+}
+SC_ARMORSCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+}
+SC_FREYJASCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+}
+SC_SOULSCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+}
+SC_QUEST_BUFF1: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_QUEST_BUFF1"
+}
+SC_QUEST_BUFF2: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_QUEST_BUFF2"
+}
+SC_QUEST_BUFF3: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_QUEST_BUFF3"
+}
+SC_GEFFEN_MAGIC1: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_GEFFEN_MAGIC1"
+}
+SC_GEFFEN_MAGIC2: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_GEFFEN_MAGIC2"
+}
+SC_GEFFEN_MAGIC3: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_GEFFEN_MAGIC3"
+}
+SC_OVERLAPEXPUP: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_OVERLAPEXPUP"
+}
+SC_M_LIFEPOTION: {
+ Flags: {
+ NoDispelReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_M_LIFEPOTION"
+}
+SC_LEADERSHIP: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+}
+SC_GLORYWOUNDS: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+}
+SC_SOULCOLD: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+}
+SC_HAWKEYES: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+}
+SC_GDSKILL_REGENERATION: {
+ Flags: {
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_ORCISH: {
+ Flags: {
+ NoSave: true
+ }
+}
+SC_WEIGHTOVER50: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_WEIGHTOVER50"
+}
+SC_WEIGHTOVER90: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_WEIGHTOVER90"
+}
+SC_WEDDING: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_XMAS: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_SUMMER: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_NOCHAT: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+}
+SC_FUSION: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_EARTHSCROLL: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_EARTHSCROLL"
+}
+SC_STORMKICK_READY: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_STORMKICK_ON"
+}
+SC_DOWNKICK_READY: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_DOWNKICK_ON"
+}
+SC_COUNTERKICK_READY: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_COUNTER_ON"
+}
+SC_TURNKICK_READY: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_TURNKICK_ON"
+}
+SC_DODGE_READY: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_DODGE_ON"
+}
+SC_JAILED: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+}
+SC_AUTOTRADE: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_DANCING: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+}
+SC_WHISTLE: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_ASSNCROS: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_POEMBRAGI: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_APPLEIDUN: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_HUMMING: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_DONTFORGETME: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_FORTUNE: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+SC_SERVICEFORYOU: {
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+}
+/*SC_INCSTR: {
+ // TODO: add this SC to Hercules upstream
+ Visible: true
+ Icon: "SI_INCSTR"
+}*/
+SC_INCAGI: {
+ Visible: true
+ Icon: "SI_INCAGI"
+}
+SC_INCVIT: {
+ Visible: true
+ Icon: "SI_INCVIT"
+}
+SC_INCINT: {
+ Visible: true
+ Icon: "SI_INCINT"
+}
+SC_INCDEX: {
+ Visible: true
+ Icon: "SI_INCDEX"
+}
+SC_INCLUK: {
+ Visible: true
+ Icon: "SI_INCLUK"
+}
+SC_INCFLEE: {
+ Visible: true
+ Icon: "SI_INCFLEE"
+}
+SC_WALKSPEED: {
+ Visible: true
+ Icon: "SI_INCWALKSPEED"
+}
+SC_INCMHPRATE: {
+ Visible: true
+ Icon: "SI_INCMHPRATE"
+}
+SC_INCMSPRATE: {
+ Visible: true
+ Icon: "SI_INCMSPRATE"
+}
+SC_INCHIT: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ }
+ Icon: "SI_INCHIT"
+}
+SC_PUSH_CART: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_ON_PUSH_CART"
+}
+SC_COLD: {
+ Visible: true
+ Flags: {
+ NoBoss: true
+ }
+ Icon: "SI_COLD"
+}
+SC_BLOOD_SUCKER: {
+ Visible: true
+ Flags: {
+ }
+ Icon: "SI_BLOODSUCKER"
+}
+SC_MOONSTAR: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_MOONSTAR"
+}
+SC_SUPER_STAR: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_SUPER_STAR"
+}
+SC_STRANGELIGHTS: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_STRANGELIGHTS"
+}
+SC_DECORATION_OF_MUSIC: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_DECORATION_OF_MUSIC"
+}
+SC_LJOSALFAR: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_LJOSALFAR"
+}
+SC_MERMAID_LONGING: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_MERMAID_LONGING"
+}
+SC_HAT_EFFECT: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_HAT_EFFECT"
+}
+SC_FLOWERSMOKE: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_FLOWERSMOKE"
+}
+SC_FSTONE: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_FSTONE"
+}
+SC_HAPPINESS_STAR: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_HAPPINESS_STAR"
+}
+SC_MAPLE_FALLS: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_MAPLE_FALLS"
+}
+SC_TIME_ACCESSORY: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_TIME_ACCESSORY"
+}
+SC_MAGICAL_FEATHER: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_MAGICAL_FEATHER"
+}
+SC_BLOSSOM_FLUTTERING: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_BLOSSOM_FLUTTERING"
+}
+SC_SPRITEMABLE: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_SPRITEMABLE"
+}
+SC_BITESCAR: {
+ Flags: {
+ NoDispelReset: true
+ NoBoss: true
+ }
+ Icon: "SI_BITESCAR"
+}
+SC_CLAN_INFO: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoSave: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_CLAN_INFO"
+}
+SC_ALL_RIDING: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_ALL_RIDING"
+}
+SC_DAILYSENDMAILCNT: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoMadoReset: true
+ NoAllReset: true
+ }
+ Icon: "SI_DAILYSENDMAILCNT"
+}
+SC_ATTHASTE_INFINITY: {
+ Icon: "SI_ATTHASTE_INFINITY"
+}
+SC_PYROCLASTIC: {
+ Icon: "SI_PYROCLASTIC"
+}
+SC_VACUUM_EXTREME: {
+ Icon: "SI_VACUUM_EXTREME"
+}
+SC_MOON_COMFORT: {
+ Icon: "SI_MOON_COMFORT"
+}
+SC_OFFERTORIUM: {
+ Icon: "SI_OFFERTORIUM"
+}
+SC_WIND_STEP: {
+ Icon: "SI_WIND_STEP"
+}
+SC_STEALTHFIELD: {
+ Icon: "SI_STEALTHFIELD"
+}
+SC_INVINCIBLE: {
+ Icon: "SI_INVINCIBLE"
+}
+SC_CURSED_SOIL: {
+ Icon: "SI_CURSED_SOIL"
+}
+SC_RIDING: {
+ Icon: "SI_RIDING"
+}
+SC_GRANITIC_ARMOR: {
+ Icon: "SI_GRANITIC_ARMOR"
+}
+SC_CURSED_SOIL_OPTION: {
+ Icon: "SI_CURSED_SOIL_OPTION"
+}
+SC_MOVHASTE_INFINITY: {
+ Icon: "SI_MOVHASTE_INFINITY"
+}
+SC_GOLDENE_FERSE: {
+ Icon: "SI_GOLDENE_FERSE"
+}
+SC_GS_ACCURACY: {
+ Icon: "SI_GS_ACCURACY"
+}
+SC_GENSOU: {
+ Icon: "SI_GENSOU"
+}
+SC_MAGMA_FLOW: {
+ Icon: "SI_MAGMA_FLOW"
+}
+SC_SHRIMP: {
+ Icon: "SI_SHRIMP"
+}
+SC_SPELLBOOK1: {
+ Icon: "SI_SPELLBOOK1"
+}
+SC_UNLIMIT: {
+ Icon: "SI_UNLIMIT"
+}
+SC_AQUAPLAY_OPTION: {
+ Icon: "SI_AQUAPLAY_OPTION"
+}
+SC_GS_GATLINGFEVER: {
+ Icon: "SI_GS_GATLINGFEVER"
+}
+SC_ROCK_CRUSHER_ATK: {
+ Icon: "SI_ROCK_CRUSHER_ATK"
+}
+SC_HEATER_OPTION: {
+ Icon: "SI_HEATER_OPTION"
+}
+SC_FALLENEMPIRE: {
+ Icon: "SI_FALLENEMPIRE"
+}
+SC_MANDRAGORA: {
+ Icon: "SI_MANDRAGORA"
+}
+SC_ANKLESNARE: {
+ Icon: "SI_ANKLESNARE"
+}
+SC_KAIZEL: {
+ Icon: "SI_KAIZEL"
+}
+SC_DC_WINKCHARM: {
+ Icon: "SI_DC_WINKCHARM"
+}
+SC_WUGRIDER: {
+ Icon: "SI_WUGRIDER"
+}
+SC_SPELLBOOK7: {
+ Icon: "SI_SPELLBOOK7"
+}
+SC_CATNIPPOWDER: {
+ Icon: "SI_CATNIPPOWDER"
+}
+SC_TIDAL_WEAPON_OPTION: {
+ Icon: "SI_TIDAL_WEAPON_OPTION"
+}
+SC_ANGRIFFS_MODUS: {
+ Icon: "SI_ANGRIFFS_MODUS"
+}
+SC_AUTOBERSERK: {
+ Icon: "SI_AUTOBERSERK"
+}
+SC_CRUCIS: {
+ Icon: "SI_CRUCIS"
+}
+SC_SECRAMENT: {
+ Icon: "SI_SECRAMENT"
+}
+SC_CRUSHSTRIKE: {
+ Icon: "SI_CRUSHSTRIKE"
+}
+SC_SPELLBOOK3: {
+ Icon: "SI_SPELLBOOK3"
+}
+SC_BLAST: {
+ Icon: "SI_BLAST"
+}
+SC_IZAYOI: {
+ Icon: "SI_IZAYOI"
+}
+SC_ODINS_POWER: {
+ Icon: "SI_ODINS_POWER"
+}
+SC_TING: {
+ Icon: "SI_TING"
+}
+SC_SIT: {
+ Icon: "SI_SIT"
+}
+SC_GS_MADNESSCANCEL: {
+ Icon: "SI_GS_MADNESSCANCEL"
+}
+SC_SV_ROOTTWIST: {
+ Icon: "SI_SV_ROOTTWIST"
+}
+SC_COOLER: {
+ Icon: "SI_COOLER"
+}
+SC_WIND_STEP_OPTION: {
+ Icon: "SI_WIND_STEP_OPTION"
+}
+SC_RESIST_PROPERTY_GROUND: {
+ Icon: "SI_RESIST_PROPERTY_GROUND"
+}
+SC_ILLUSIONDOPING: {
+ Icon: "SI_ILLUSIONDOPING"
+}
+SC_KO_JYUMONJIKIRI: {
+ Icon: "SI_KO_JYUMONJIKIRI"
+}
+SC_PHI_DEMON: {
+ Icon: "SI_PHI_DEMON"
+}
+SC_KYOUGAKU: {
+ Icon: "SI_KYOUGAKU"
+}
+SC_KAGEMUSYA: {
+ Icon: "SI_KAGEMUSYA"
+}
+SC_SPELLBOOK6: {
+ Icon: "SI_SPELLBOOK6"
+}
+SC_BLAST_OPTION: {
+ Icon: "SI_BLAST_OPTION"
+}
+SC_DARKCROW: {
+ Icon: "SI_DARKCROW"
+}
+SC_PYROTECHNIC: {
+ Icon: "SI_PYROTECHNIC"
+}
+SC_STAR_COMFORT: {
+ Icon: "SI_STAR_COMFORT"
+}
+SC_LG_REFLECTDAMAGE: {
+ Icon: "SI_LG_REFLECTDAMAGE"
+}
+SC_GENTLETOUCH_REVITALIZE: {
+ Icon: "SI_GENTLETOUCH_REVITALIZE"
+}
+SC_HEATER: {
+ Icon: "SI_HEATER"
+}
+SC_CIRCLE_OF_FIRE_OPTION: {
+ Icon: "SI_CIRCLE_OF_FIRE_OPTION"
+}
+SC_ROCK_CRUSHER: {
+ Icon: "SI_ROCK_CRUSHER"
+}
+SC_MOON: {
+ Icon: "SI_MOON"
+}
+SC_PETROLOGY: {
+ Icon: "SI_PETROLOGY"
+}
+SC_SUN_COMFORT: {
+ Icon: "SI_SUN_COMFORT"
+}
+SC_TROPIC_OPTION: {
+ Icon: "SI_TROPIC_OPTION"
+}
+SC_ARCLOUSEDASH: {
+ Icon: "SI_ARCLOUSEDASH"
+}
+SC_STRIKING: {
+ Icon: "SI_STRIKING"
+}
+SC_AQUAPLAY: {
+ Icon: "SI_AQUAPLAY"
+}
+SC_WATER_DROP: {
+ Icon: "SI_WATER_DROP"
+}
+SC_GM_BATTLE2: {
+ Icon: "SI_GM_BATTLE2"
+}
+SC_BROKENWEAPON: {
+ Icon: "SI_BROKENWEAPON"
+}
+SC_CUP_OF_BOZA: {
+ Icon: "SI_CUP_OF_BOZA"
+}
+SC_FRIGG_SONG: {
+ Icon: "SI_FRIGG_SONG"
+}
+SC_POSTDELAY: {
+ Icon: "SI_POSTDELAY"
+}
+SC_BROKENARMOR: {
+ Icon: "SI_BROKENARMOR"
+}
+SC_DRESS_UP: {
+ Icon: "SI_DRESS_UP"
+}
+SC_2011RWC: {
+ Icon: "SI_2011RWC"
+}
+SC_WATER_SCREEN_OPTION: {
+ Icon: "SI_WATER_SCREEN_OPTION"
+}
+SC_FIRE_CLOAK: {
+ Icon: "SI_FIRE_CLOAK"
+}
+SC_FALCON: {
+ Icon: "SI_FALCON"
+}
+SC_ZENKAI: {
+ Icon: "SI_ZENKAI"
+}
+SC_CLAIRVOYANCE: {
+ Icon: "SI_CLAIRVOYANCE"
+}
+SC_STONE_SHIELD: {
+ Icon: "SI_STONE_SHIELD"
+}
+SC_FIRE_EXPANSION_TEAR_GAS: {
+ Icon: "SI_FIRE_EXPANSION_TEAR_GAS"
+}
+SC_ZANGETSU: {
+ Icon: "SI_ZANGETSU"
+}
+SC_RESIST_PROPERTY_WIND: {
+ Icon: "SI_RESIST_PROPERTY_WIND"
+}
+SC_FLASHCOMBO: {
+ Icon: "SI_FLASHCOMBO"
+}
+SC_GUST_OPTION: {
+ Icon: "SI_GUST_OPTION"
+}
+SC_GENTLETOUCH_ENERGYGAIN: {
+ Icon: "SI_GENTLETOUCH_ENERGYGAIN"
+}
+SC_PYROTECHNIC_OPTION: {
+ Icon: "SI_PYROTECHNIC_OPTION"
+}
+SC_CIRCLE_OF_FIRE: {
+ Icon: "SI_CIRCLE_OF_FIRE"
+}
+SC_DEVIL1: {
+ Icon: "SI_DEVIL1"
+}
+SC_GS_ADJUSTMENT: {
+ Icon: "SI_GS_ADJUSTMENT"
+}
+SC_SPELLBOOK5: {
+ Icon: "SI_SPELLBOOK5"
+}
+SC_UPHEAVAL_OPTION: {
+ Icon: "SI_UPHEAVAL_OPTION"
+}
+SC_SUHIDE: {
+ Icon: "SI_SUHIDE"
+}
+SC_NJ_NEN: {
+ Icon: "SI_NJ_NEN"
+}
+SC_VOLCANIC_ASH: {
+ Icon: "SI_VOLCANIC_ASH"
+}
+SC_KYOMU: {
+ Icon: "SI_KYOMU"
+}
+SC_WILD_STORM: {
+ Icon: "SI_WILD_STORM"
+}
+SC_PETROLOGY_OPTION: {
+ Icon: "SI_PETROLOGY_OPTION"
+}
+SC_SPELLBOOK2: {
+ Icon: "SI_SPELLBOOK2"
+}
+SC_MYSTICPOWDER: {
+ Icon: "SI_MYSTICPOWDER"
+}
+SC_RESIST_PROPERTY_FIRE: {
+ Icon: "SI_RESIST_PROPERTY_FIRE"
+}
+SC_COOLER_OPTION: {
+ Icon: "SI_COOLER_OPTION"
+}
+SC_TROPIC: {
+ Icon: "SI_TROPIC"
+}
+SC_UPHEAVAL: {
+ Icon: "SI_UPHEAVAL"
+}
+SC_GENTLETOUCH_CHANGE: {
+ Icon: "SI_GENTLETOUCH_CHANGE"
+}
+SC_WATER_DROP_OPTION: {
+ Icon: "SI_WATER_DROP_OPTION"
+}
+SC_CHILLY_AIR_OPTION: {
+ Icon: "SI_CHILLY_AIR_OPTION"
+}
+SC_FENRIR_CARD: {
+ Icon: "SI_FENRIR_CARD"
+}
+SC_CLIENT_ONLY_EQUIP_ARROW: {
+ Icon: "SI_CLIENT_ONLY_EQUIP_ARROW"
+}
+SC_STASIS: {
+ Icon: "SI_STASIS"
+}
+SC_KINGS_GRACE: {
+ Icon: "SI_KINGS_GRACE"
+}
+SC_OVERED_BOOST: {
+ Icon: "SI_OVERED_BOOST"
+}
+SC_AKAITSUKI: {
+ Icon: "SI_AKAITSUKI"
+}
+SC_MARIONETTE: {
+ Icon: "SI_MARIONETTE"
+}
+SC_WIND_CURTAIN: {
+ Icon: "SI_WIND_CURTAIN"
+}
+SC_ON_PUSH_CART: {
+ Icon: "SI_ON_PUSH_CART"
+}
+SC_SPELLBOOK4: {
+ Icon: "SI_SPELLBOOK4"
+}
+SC_ILLUSION: {
+ Icon: "SI_ILLUSION"
+}
+SC_WIND_CURTAIN_OPTION: {
+ Icon: "SI_WIND_CURTAIN_OPTION"
+}
+SC_SU_STOOP: {
+ Icon: "SI_SU_STOOP"
+}
+SC_SOLID_SKIN_OPTION: {
+ Icon: "SI_SOLID_SKIN_OPTION"
+}
+SC_TUNAPARTY: {
+ Icon: "SI_TUNAPARTY"
+}
+SC_RESIST_PROPERTY_WATER: {
+ Icon: "SI_RESIST_PROPERTY_WATER"
+}
+SC_KG_KAGEHUMI: {
+ Icon: "SI_KG_KAGEHUMI"
+}
+SC_SMA_READY: {
+ Icon: "SI_SMA_READY"
+}
+SC_FIRE_CLOAK_OPTION: {
+ Icon: "SI_FIRE_CLOAK_OPTION"
+}
+SC_WATER_SCREEN: {
+ Icon: "SI_WATER_SCREEN"
+}
+SC_GM_BATTLE: {
+ Icon: "SI_GM_BATTLE"
+}
+SC_GUST: {
+ Icon: "SI_GUST"
+}
+SC_SOLID_SKIN: {
+ Icon: "SI_SOLID_SKIN"
+}
+SC_CHILLY_AIR: {
+ Icon: "SI_CHILLY_AIR"
+}
+SC_MEIKYOUSISUI: {
+ Icon: "SI_MEIKYOUSISUI"
+}
+SC_FIRE_EXPANSION_SMOKE_POWDER: {
+ Icon: "SI_FIRE_EXPANSION_SMOKE_POWDER"
+}
+SC_MARIONETTE_MASTER: {
+ Icon: "SI_MARIONETTE_MASTER"
+}
+SC_FRESHSHRIMP: {
+ Icon: "SI_FRESHSHRIMP"
+}
+SC_STONE_SHIELD_OPTION: {
+ Icon: "SI_STONE_SHIELD_OPTION"
+}
+SC_SWORDREJECT: {
+ Icon: "SI_SWORDREJECT"
+}
+SC_WILD_STORM_OPTION: {
+ Icon: "SI_WILD_STORM_OPTION"
+}
+SC_BABY: {
+ Icon: "SI_PROTECTEXP"
+}
+SC_EXTREMITYFIST2: {
+ Icon: "SI_EXTREMITYFIST"
+}
+SC_GN_CARTBOOST: {
+ Icon: "SI_CARTSBOOST"
+}
+SC_MIRACLE: {
+ Icon: "SI_SOULLINK"
+}
+SC_POISON: {
+ Icon: "SI_CLOUDKILL"
+}
+SC_SILENCE: {
+ Icon: "SI_SILENT_BREEZE"
+}
+SC_THORNS_TRAP: {
+ Icon: "SI_THORNTRAP"
+}
+SC_WARM: {
+ Icon: "SI_SG_SUN_WARM"
+}
+SC_COMA: {
+ Flags: {
+ NoBoss: true
+ }
+}
+SC_RICHMANKIM: {
+ Flags: {
+ NoBoss: true
+ }
+}
+SC_ROKISWEIL: {
+ Flags: {
+ NoBoss: true
+ }
+}
+SC_BURNING: {
+ Flags: {
+ NoBoss: true
+ }
+}
+SC_VACUUM_EXTREME: {
+ Flags: {
+ NoBoss: true
+ }
+}
+SC_FRESHSHRIMP: {
+ Flags: {
+ NoBoss: true
+ }
+}
+SC_SV_ROOTTWIST: {
+ Flags: {
+ NoBoss: true
+ }
+}
+SC_MADOGEAR: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ NoAllReset: true
+ NoBoss: true
+ }
+ Icon: "SI_MADOGEAR"
+}
+SC_POPECOOKIE: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_POPECOOKIE"
+}
+SC_VITALIZE_POTION: {
+ Flags: {
+ NoDispelReset: true
+ }
+ Icon: "SI_VITALIZE_POTION"
+}
+SC_SKF_MATK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SKF_MATK"
+}
+SC_SKF_ATK: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SKF_ATK"
+}
+SC_SKF_ASPD: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SKF_ASPD"
+}
+SC_SKF_CAST: {
+ Flags: {
+ NoDispelReset: true
+ NoClearanceReset: true
+ Buff: true
+ }
+ Icon: "SI_SKF_CAST"
+}
+SC_ALMIGHTY: {
+ Flags: {
+ NoDeathReset: true
+ NoDispelReset: true
+ NoClearanceReset: true
+ }
+ Icon: "SI_ALMIGHTY"
+}
+
+// evol effects
+SC_PHYSICAL_SHIELD: {
+ Visible: true
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_PHYSICAL_SHIELD"
+}
+SC_MDEFSET: {
+ Visible: true
+ Flags: {
+ NoSave: true
+ Buff: true
+ }
+ Icon: "SI_MDEFSET"
+}
+SC_HALT_REGENERATION: {
+ Visible: true
+ Flags: {
+ NoDeathReset: true
+ Debuff: true
+ }
+ Icon: "SI_HALT_REGENERATION"
+}
+
diff --git a/db/si_config.conf b/db/si_config.conf
new file mode 100644
index 00000000..bfbf92b3
--- /dev/null
+++ b/db/si_config.conf
@@ -0,0 +1,698 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2016-2020 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Script Constants Database
+//=========================================================================
+
+ comment__: "Status Effect Icons"
+ SI_BLANK: -1
+ SI_PROVOKE: 0
+ SI_ENDURE: 1
+ SI_TWOHANDQUICKEN: 2
+ SI_CONCENTRATION: 3
+ SI_HIDING: 4
+ SI_CLOAKING: 5
+ SI_ENCHANTPOISON: 6
+ SI_POISONREACT: 7
+ SI_QUAGMIRE: 8
+ SI_ANGELUS: 9
+ SI_BLESSING: 10
+ SI_CRUCIS: 11
+ SI_INC_AGI: 12
+ SI_DEC_AGI: 13
+ SI_SLOWPOISON: 14
+ SI_IMPOSITIO: 15
+ SI_SUFFRAGIUM: 16
+ SI_ASPERSIO: 17
+ SI_BENEDICTIO: 18
+ SI_KYRIE: 19
+ SI_MAGNIFICAT: 20
+ SI_GLORIA: 21
+ SI_LEXAETERNA: 22
+ SI_ADRENALINE: 23
+ SI_WEAPONPERFECT: 24
+ SI_OVERTHRUST: 25
+ SI_MAXIMIZE: 26
+ SI_RIDING: 27
+ SI_FALCON: 28
+ SI_TRICKDEAD: 29
+ SI_SHOUT: 30
+ SI_ENERGYCOAT: 31
+ SI_BROKENARMOR: 32
+ SI_BROKENWEAPON: 33
+ SI_ILLUSION: 34
+ SI_WEIGHTOVER50: 35
+ SI_WEIGHTOVER90: 36
+ SI_ATTHASTE_POTION1: 37
+ SI_ATTHASTE_POTION2: 38
+ SI_ATTHASTE_POTION3: 39
+ SI_ATTHASTE_INFINITY: 40
+ SI_MOVHASTE_POTION: 41
+ SI_MOVHASTE_INFINITY: 42
+ SI_ANKLESNARE: 45
+ SI_POSTDELAY: 46
+ SI_NOEQUIPWEAPON: 50
+ SI_NOEQUIPSHIELD: 51
+ SI_NOEQUIPARMOR: 52
+ SI_NOEQUIPHELM: 53
+ SI_PROTECTWEAPON: 54
+ SI_PROTECTSHIELD: 55
+ SI_PROTECTARMOR: 56
+ SI_PROTECTHELM: 57
+ SI_AUTOGUARD: 58
+ SI_REFLECTSHIELD: 59
+ SI_PROVIDENCE: 61
+ SI_DEFENDER: 62
+ SI_AUTOSPELL: 65
+ SI_SPEARQUICKEN: 68
+ SI_EXPLOSIONSPIRITS: 86
+ SI_STEELBODY: 87
+ SI_EXTREMITYFIST: 88
+ SI_PROPERTYFIRE: 90
+ SI_PROPERTYWATER: 91
+ SI_PROPERTYWIND: 92
+ SI_PROPERTYGROUND: 93
+ SI_STOP: 95
+ SI_PROPERTYUNDEAD: 97
+ SI_AURABLADE: 103
+ SI_PARRYING: 104
+ SI_LKCONCENTRATION: 105
+ SI_TENSIONRELAX: 106
+ SI_BERSERK: 107
+ SI_ASSUMPTIO: 110
+ SI_GROUNDMAGIC: 112
+ SI_MAGICPOWER: 113
+ SI_EDP: 114
+ SI_TRUESIGHT: 115
+ SI_WINDWALK: 116
+ SI_MELTDOWN: 117
+ SI_CARTBOOST: 118
+ SI_SWORDREJECT: 120
+ SI_MARIONETTE_MASTER: 121
+ SI_MARIONETTE: 122
+ SI_MOON: 123
+ SI_BLOODING: 124
+ SI_JOINTBEAT: 125
+ SI_PROTECTEXP: 130
+ SI_AUTOBERSERK: 132
+ SI_RUN: 133
+ SI_TING: 134
+ SI_STORMKICK_ON: 135
+ SI_STORMKICK_READY: 136
+ SI_DOWNKICK_ON: 137
+ SI_DOWNKICK_READY: 138
+ SI_TURNKICK_ON: 139
+ SI_TURNKICK_READY: 140
+ SI_COUNTER_ON: 141
+ SI_COUNTER_READY: 142
+ SI_DODGE_ON: 143
+ SI_DODGE_READY: 144
+ SI_STRUP: 145
+ SI_PROPERTYDARK: 146
+ SI_ADRENALINE2: 147
+ SI_PROPERTYTELEKINESIS: 148
+ SI_SOULLINK: 149
+ SI_PLUSATTACKPOWER: 150
+ SI_PLUSMAGICPOWER: 151
+ SI_DEVIL1: 152
+ SI_KAITE: 153
+ SI_KAIZEL: 156
+ SI_KAAHI: 157
+ SI_KAUPE: 158
+ SI_SMA_READY: 159
+ SI_SKE: 160
+ SI_ONEHANDQUICKEN: 161
+ SI_SG_SUN_WARM: 165
+ SI_SUN_COMFORT: 169
+ SI_MOON_COMFORT: 170
+ SI_STAR_COMFORT: 171
+ SI_PRESERVE: 181
+ SI_INCSTR: 182
+ SI_CLAIRVOYANCE: 184
+ SI_MOVESLOW_POTION: 185
+ SI_DOUBLECASTING: 186
+ SI_OVERTHRUSTMAX: 188
+ SI_TAROTCARD: 191
+ SI_CR_SHRINK: 197
+ SI_WZ_SIGHTBLASTER: 198
+ SI_DC_WINKCHARM: 199
+ SI_RG_CCONFINE_M: 200
+ SI_RG_CCONFINE_S: 201
+ SI_GS_MADNESSCANCEL: 203
+ SI_GS_GATLINGFEVER: 204
+ SI_EARTHSCROLL: 205
+ SI_NJ_UTSUSEMI: 206
+ SI_NJ_BUNSINJYUTSU: 207
+ SI_NJ_NEN: 208
+ SI_GS_ADJUSTMENT: 209
+ SI_GS_ACCURACY: 210
+ SI_NJ_SUITON: 211
+ SI_FOOD_STR: 241
+ SI_FOOD_AGI: 242
+ SI_FOOD_VIT: 243
+ SI_FOOD_DEX: 244
+ SI_FOOD_INT: 245
+ SI_FOOD_LUK: 246
+ SI_FOOD_BASICAVOIDANCE: 247
+ SI_FOOD_BASICHIT: 248
+ SI_FOOD_CRITICALSUCCESSVALUE: 249
+ SI_CASH_PLUSEXP: 250
+ SI_CASH_DEATHPENALTY: 251
+ SI_CASH_RECEIVEITEM: 252
+ SI_CASH_BOSS_ALARM: 253
+ SI_FOOD_STR_CASH: 271
+ SI_FOOD_AGI_CASH: 272
+ SI_FOOD_VIT_CASH: 273
+ SI_FOOD_DEX_CASH: 274
+ SI_FOOD_INT_CASH: 275
+ SI_FOOD_LUK_CASH: 276
+ SI_MER_FLEE: 277
+ SI_MER_ATK: 278
+ SI_MER_HP: 279
+ SI_MER_SP: 280
+ SI_MER_HIT: 281
+ SI_SLOWCAST: 282
+ SI_CRITICALWOUND: 286
+ SI_MOVHASTE_HORSE: 289
+ SI_PROTECT_DEF: 290
+ SI_PROTECT_MDEF: 291
+ SI_HEALPLUS: 292
+ SI_S_LIFEPOTION: 293
+ SI_L_LIFEPOTION: 294
+ SI_CRITICALPERCENT: 295
+ SI_PLUSAVOIDVALUE: 296
+ SI_ATKER_ASPD: 297
+ SI_TARGET_ASPD: 298
+ SI_ATKER_MOVESPEED: 299
+ SI_ATKER_BLOOD: 300
+ SI_TARGET_BLOOD: 301
+ SI_ARMOR_PROPERTY: 302
+ SI_HELLPOWER: 304
+ SI_STEAMPACK: 305
+ SI_INVINCIBLE: 311
+ SI_CASH_PLUSONLYJOBEXP: 312
+ SI_PARTYFLEE: 313
+ SI_ANGEL_PROTECT: 314
+ SI_ENCHANTBLADE: 316
+ SI_DEATHBOUND: 317
+ SI_REFRESH: 318
+ SI_GIANTGROWTH: 319
+ SI_STONEHARDSKIN: 320
+ SI_VITALITYACTIVATION: 321
+ SI_FIGHTINGSPIRIT: 322
+ SI_ABUNDANCE: 323
+ SI_REUSE_MILLENNIUMSHIELD: 324
+ SI_REUSE_CRUSHSTRIKE: 325
+ SI_REUSE_REFRESH: 326
+ SI_REUSE_STORMBLAST: 327
+ SI_VENOMIMPRESS: 328
+ SI_EPICLESIS: 329
+ SI_ORATIO: 330
+ SI_LAUDAAGNUS: 331
+ SI_LAUDARAMUS: 332
+ SI_CLOAKINGEXCEED: 333
+ SI_HALLUCINATIONWALK: 334
+ SI_HALLUCINATIONWALK_POSTDELAY: 335
+ SI_RENOVATIO: 336
+ SI_WEAPONBLOCKING: 337
+ SI_WEAPONBLOCKING_POSTDELAY: 338
+ SI_ROLLINGCUTTER: 339
+ SI_EXPIATIO: 340
+ SI_POISONINGWEAPON: 341
+ SI_TOXIN: 342
+ SI_PARALYSE: 343
+ SI_VENOMBLEED: 344
+ SI_MAGICMUSHROOM: 345
+ SI_DEATHHURT: 346
+ SI_PYREXIA: 347
+ SI_OBLIVIONCURSE: 348
+ SI_LEECHESEND: 349
+ SI_DUPLELIGHT: 350
+ SI_FROSTMISTY: 351
+ SI_FEARBREEZE: 352
+ SI_ELECTRICSHOCKER: 353
+ SI_MARSHOFABYSS: 354
+ SI_RECOGNIZEDSPELL: 355
+ SI_STASIS: 356
+ SI_WUGRIDER: 357
+ SI_WUGDASH: 358
+ SI_WUGBITE: 359
+ SI_CAMOUFLAGE: 360
+ SI_ACCELERATION: 361
+ SI_HOVERING: 362
+ SI_SPHERE_1: 363
+ SI_SPHERE_2: 364
+ SI_SPHERE_3: 365
+ SI_SPHERE_4: 366
+ SI_SPHERE_5: 367
+ SI_MVPCARD_TAOGUNKA: 368
+ SI_MVPCARD_MISTRESS: 369
+ SI_MVPCARD_ORCHERO: 370
+ SI_MVPCARD_ORCLORD: 371
+ SI_OVERHEAT_LIMITPOINT: 372
+ SI_OVERHEAT: 373
+ SI_SHAPESHIFT: 374
+ SI_INFRAREDSCAN: 375
+ SI_MAGNETICFIELD: 376
+ SI_NEUTRALBARRIER: 377
+ SI_NEUTRALBARRIER_MASTER: 378
+ SI_STEALTHFIELD: 379
+ SI_STEALTHFIELD_MASTER: 380
+ SI_MANU_ATK: 381
+ SI_MANU_DEF: 382
+ SI_SPL_ATK: 383
+ SI_SPL_DEF: 384
+ SI_REPRODUCE: 385
+ SI_MANU_MATK: 386
+ SI_SPL_MATK: 387
+ SI_STR_SCROLL: 388
+ SI_INT_SCROLL: 389
+ SI_LG_REFLECTDAMAGE: 390
+ SI_FORCEOFVANGUARD: 391
+ SI_BUCHEDENOEL: 392
+ SI_AUTOSHADOWSPELL: 393
+ SI_SHADOWFORM: 394
+ SI_RAID: 395
+ SI_SHIELDSPELL_DEF: 396
+ SI_SHIELDSPELL_MDEF: 397
+ SI_SHIELDSPELL_REF: 398
+ SI_BODYPAINT: 399
+ SI_EXEEDBREAK: 400
+ SI_ADORAMUS: 401
+ SI_PRESTIGE: 402
+ SI_INVISIBILITY: 403
+ SI_DEADLYINFECT: 404
+ SI_BANDING: 405
+ SI_EARTHDRIVE: 406
+ SI_INSPIRATION: 407
+ SI_ENERVATION: 408
+ SI_GROOMY: 409
+ SI_RAISINGDRAGON: 410
+ SI_IGNORANCE: 411
+ SI_LAZINESS: 412
+ SI_LIGHTNINGWALK: 413
+ SI_ACARAJE: 414
+ SI_UNLUCKY: 415
+ SI_CURSEDCIRCLE_ATKER: 416
+ SI_CURSEDCIRCLE_TARGET: 417
+ SI_WEAKNESS: 418
+ SI_CRESCENTELBOW: 419
+ SI_NOEQUIPACCESSARY: 420
+ SI_STRIPACCESSARY: 421
+ SI_MANHOLE: 422
+ SI_POPECOOKIE: 423
+ SI_FALLENEMPIRE: 424
+ SI_GENTLETOUCH_ENERGYGAIN: 425
+ SI_GENTLETOUCH_CHANGE: 426
+ SI_GENTLETOUCH_REVITALIZE: 427
+ SI_BLOODYLUST: 428
+ SI_SWINGDANCE: 429
+ SI_SYMPHONYOFLOVERS: 430
+ SI_PROPERTYWALK: 431
+ SI_SPELLFIST: 432
+ SI_NETHERWORLD: 433
+ SI_SIREN: 434
+ SI_DEEPSLEEP: 435
+ SI_SIRCLEOFNATURE: 436
+ SI_COLD: 437
+ SI_GLOOMYDAY: 438
+ SI_SONG_OF_MANA: 439
+ SI_CLOUDKILL: 440
+ SI_DANCEWITHWUG: 441
+ SI_RUSHWINDMILL: 442
+ SI_ECHOSONG: 443
+ SI_HARMONIZE: 444
+ SI_STRIKING: 445
+ SI_MOONLITSERENADE: 447
+ SI_SATURDAYNIGHTFEVER: 448
+ SI_SITDOWN_FORCE: 449
+ SI_ANALYZE: 450
+ SI_LERADSDEW: 451
+ SI_MELODYOFSINK: 452
+ SI_WARCRYOFBEYOND: 453
+ SI_UNLIMITEDHUMMINGVOICE: 454
+ SI_SPELLBOOK1: 455
+ SI_SPELLBOOK2: 456
+ SI_SPELLBOOK3: 457
+ SI_FREEZE_SP: 458
+ SI_GN_TRAINING_SWORD: 459
+ SI_GN_REMODELING_CART: 460
+ SI_CARTSBOOST: 461
+ SI_FIXEDCASTINGTM_REDUCE: 462
+ SI_THORNTRAP: 463
+ SI_BLOODSUCKER: 464
+ SI_SPORE_EXPLOSION: 465
+ SI_DEMONIC_FIRE: 466
+ SI_FIRE_EXPANSION_SMOKE_POWDER: 467
+ SI_FIRE_EXPANSION_TEAR_GAS: 468
+ SI_BLOCKING_PLAY: 469
+ SI_MANDRAGORA: 470
+ SI_ACTIVATE: 471
+ SI_SECRAMENT: 472
+ SI_ASSUMPTIO2: 473
+ SI_TK_SEVENWIND: 474
+ SI_LIMIT_ODINS_RECALL: 475
+ SI_STOMACHACHE: 476
+ SI_MYSTERIOUS_POWDER: 477
+ SI_MELON_BOMB: 478
+ SI_BANANA_BOMB_SITDOWN_POSTDELAY: 479
+ SI_PROMOTE_HEALTH_RESERCH: 480
+ SI_ENERGY_DRINK_RESERCH: 481
+ SI_EXTRACT_WHITE_POTION_Z: 482
+ SI_VITATA_500: 483
+ SI_EXTRACT_SALAMINE_JUICE: 484
+ SI_BOOST500: 485
+ SI_FULL_SWING_K: 486
+ SI_MANA_PLUS: 487
+ SI_MUSTLE_M: 488
+ SI_LIFE_FORCE_F: 489
+ SI_VACUUM_EXTREME: 490
+ SI_SAVAGE_STEAK: 491
+ SI_COCKTAIL_WARG_BLOOD: 492
+ SI_MINOR_BBQ: 493
+ SI_SIROMA_ICE_TEA: 494
+ SI_DROCERA_HERB_STEAMED: 495
+ SI_PUTTI_TAILS_NOODLES: 496
+ SI_BANANA_BOMB: 497
+ SI_SUMMON_AGNI: 498
+ SI_SPELLBOOK4: 499
+ SI_SPELLBOOK5: 500
+ SI_SPELLBOOK6: 501
+ SI_SPELLBOOK7: 502
+ SI_ELEMENTAL_AGGRESSIVE: 503
+ SI_RETURN_TO_ELDICASTES: 504
+ SI_BANDING_DEFENCE: 505
+ SI_SKELSCROLL: 506
+ SI_DISTRUCTIONSCROLL: 507
+ SI_ROYALSCROLL: 508
+ SI_IMMUNITYSCROLL: 509
+ SI_MYSTICSCROLL: 510
+ SI_BATTLESCROLL: 511
+ SI_ARMORSCROLL: 512
+ SI_FREYJASCROLL: 513
+ SI_SOULSCROLL: 514
+ SI_CIRCLE_OF_FIRE: 515
+ SI_CIRCLE_OF_FIRE_OPTION: 516
+ SI_FIRE_CLOAK: 517
+ SI_FIRE_CLOAK_OPTION: 518
+ SI_WATER_SCREEN: 519
+ SI_WATER_SCREEN_OPTION: 520
+ SI_WATER_DROP: 521
+ SI_WATER_DROP_OPTION: 522
+ SI_WIND_STEP: 523
+ SI_WIND_STEP_OPTION: 524
+ SI_WIND_CURTAIN: 525
+ SI_WIND_CURTAIN_OPTION: 526
+ SI_WATER_BARRIER: 527
+ SI_ZEPHYR: 528
+ SI_SOLID_SKIN: 529
+ SI_SOLID_SKIN_OPTION: 530
+ SI_STONE_SHIELD: 531
+ SI_STONE_SHIELD_OPTION: 532
+ SI_POWER_OF_GAIA: 533
+ SI_PYROTECHNIC: 539
+ SI_PYROTECHNIC_OPTION: 540
+ SI_HEATER: 541
+ SI_HEATER_OPTION: 542
+ SI_TROPIC: 543
+ SI_TROPIC_OPTION: 544
+ SI_AQUAPLAY: 545
+ SI_AQUAPLAY_OPTION: 546
+ SI_COOLER: 547
+ SI_COOLER_OPTION: 548
+ SI_CHILLY_AIR: 549
+ SI_CHILLY_AIR_OPTION: 550
+ SI_GUST: 551
+ SI_GUST_OPTION: 552
+ SI_BLAST: 553
+ SI_BLAST_OPTION: 554
+ SI_WILD_STORM: 555
+ SI_WILD_STORM_OPTION: 556
+ SI_PETROLOGY: 557
+ SI_PETROLOGY_OPTION: 558
+ SI_CURSED_SOIL: 559
+ SI_CURSED_SOIL_OPTION: 560
+ SI_UPHEAVAL: 561
+ SI_UPHEAVAL_OPTION: 562
+ SI_TIDAL_WEAPON: 563
+ SI_TIDAL_WEAPON_OPTION: 564
+ SI_ROCK_CRUSHER: 565
+ SI_ROCK_CRUSHER_ATK: 566
+ SI_FIRE_INSIGNIA: 567
+ SI_WATER_INSIGNIA: 568
+ SI_WIND_INSIGNIA: 569
+ SI_EARTH_INSIGNIA: 570
+ SI_EQUIPED_FLOOR: 571
+ SI_GUARDIAN_RECALL: 572
+ SI_MORA_BUFF: 573
+ SI_REUSE_LIMIT_G: 574
+ SI_REUSE_LIMIT_H: 575
+ SI_NEEDLE_OF_PARALYZE: 576
+ SI_PAIN_KILLER: 577
+ SI_G_LIFEPOTION: 578
+ SI_VITALIZE_POTION: 579
+ SI_LIGHT_OF_REGENE: 580
+ SI_OVERED_BOOST: 581
+ SI_SILENT_BREEZE: 582
+ SI_ODINS_POWER: 583
+ SI_STYLE_CHANGE: 584
+ SI_SONIC_CLAW_POSTDELAY: 585
+ SI_SILVERVEIN_RUSH_POSTDELAY: 596
+ SI_MIDNIGHT_FRENZY_POSTDELAY: 597
+ SI_GOLDENE_FERSE: 598
+ SI_ANGRIFFS_MODUS: 599
+ SI_TINDER_BREAKER: 600
+ SI_TINDER_BREAKER_POSTDELAY: 601
+ SI_CBC: 602
+ SI_CBC_POSTDELAY: 603
+ SI_EQC: 604
+ SI_MAGMA_FLOW: 605
+ SI_GRANITIC_ARMOR: 606
+ SI_PYROCLASTIC: 607
+ SI_VOLCANIC_ASH: 608
+ SI_SPIRITS_SAVEINFO1: 609
+ SI_SPIRITS_SAVEINFO2: 610
+ SI_MAGIC_CANDY: 611
+ SI_SEARCH_STORE_INFO: 612
+ SI_ALL_RIDING: 613
+ SI_ALL_RIDING_REUSE_LIMIT: 614
+ SI_MACRO: 615
+ SI_MACRO_POSTDELAY: 616
+ SI_BEER_BOTTLE_CAP: 617
+ SI_OVERLAPEXPUP: 618
+ SI_PC_IZ_DUN05: 619
+ SI_CRUSHSTRIKE: 620
+ SI_MONSTER_TRANSFORM: 621
+ SI_SIT: 622
+ SI_ONAIR: 623
+ SI_MTF_ASPD: 624
+ SI_MTF_RANGEATK: 625
+ SI_MTF_MATK: 626
+ SI_MTF_MLEATKED: 627
+ SI_MTF_CRIDAMAGE: 628
+ SI_REUSE_LIMIT_MTF: 629
+ SI_MACRO_PERMIT: 630
+ SI_MACRO_PLAY: 631
+ SI_SKF_CAST: 632
+ SI_SKF_ASPD: 633
+ SI_SKF_ATK: 634
+ SI_SKF_MATK: 635
+ SI_REWARD_PLUSONLYJOBEXP: 636
+ SI_HANDICAPSTATE_NORECOVER: 637
+ SI_SET_NUM_DEF: 638
+ SI_SET_NUM_MDEF: 639
+ SI_SET_PER_DEF: 640
+ SI_SET_PER_MDEF: 641
+ SI_PARTYBOOKING_SEARCH_DEALY: 642
+ SI_PARTYBOOKING_REGISTER_DEALY: 643
+ SI_PERIOD_TIME_CHECK_DETECT_SKILL: 644
+ SI_KO_JYUMONJIKIRI: 645
+ SI_MEIKYOUSISUI: 646
+ SI_ATTHASTE_CASH: 647
+ SI_EQUIPPED_DIVINE_ARMOR: 648
+ SI_EQUIPPED_HOLY_ARMOR: 649
+ SI_2011RWC: 650
+ SI_KYOUGAKU: 651
+ SI_IZAYOI: 652
+ SI_ZENKAI: 653
+ SI_KG_KAGEHUMI: 654
+ SI_KYOMU: 655
+ SI_KAGEMUSYA: 656
+ SI_ZANGETSU: 657
+ SI_PHI_DEMON: 658
+ SI_GENSOU: 659
+ SI_AKAITSUKI: 660
+ SI_TETANY: 661
+ SI_GM_BATTLE: 662
+ SI_GM_BATTLE2: 663
+ SI_2011RWC_SCROLL: 664
+ SI_ACTIVE_MONSTER_TRANSFORM: 665
+ SI_MYSTICPOWDER: 666
+ SI_ECLAGE_RECALL: 667
+ SI_ENTRY_QUEUE_APPLY_DELAY: 668
+ SI_REUSE_LIMIT_ECL: 669
+ SI_M_LIFEPOTION: 670
+ SI_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: 671
+ SI_UNKNOWN_NAME: 672
+ SI_ON_PUSH_CART: 673
+ SI_HAT_EFFECT: 674
+ SI_FLOWER_LEAF: 675
+ SI_RAY_OF_PROTECTION: 676
+ SI_GLASTHEIM_ATK: 677
+ SI_GLASTHEIM_DEF: 678
+ SI_GLASTHEIM_HEAL: 679
+ SI_GLASTHEIM_HIDDEN: 680
+ SI_GLASTHEIM_STATE: 681
+ SI_GLASTHEIM_ITEMDEF: 682
+ SI_GLASTHEIM_HPSP: 683
+ SI_HOMUN_SKILL_POSTDELAY: 684
+ SI_ALMIGHTY: 685
+ SI_GVG_GIANT: 686
+ SI_GVG_GOLEM: 687
+ SI_GVG_STUN: 688
+ SI_GVG_STONE: 689
+ SI_GVG_FREEZ: 690
+ SI_GVG_SLEEP: 691
+ SI_GVG_CURSE: 692
+ SI_GVG_SILENCE: 693
+ SI_GVG_BLIND: 694
+ SI_CLIENT_ONLY_EQUIP_ARROW: 695
+ SI_CLAN_INFO: 696
+ SI_JP_EVENT01: 697
+ SI_JP_EVENT02: 698
+ SI_JP_EVENT03: 699
+ SI_JP_EVENT04: 700
+ SI_TELEPORT_FIXEDCASTINGDELAY: 701
+ SI_GEFFEN_MAGIC1: 702
+ SI_GEFFEN_MAGIC2: 703
+ SI_GEFFEN_MAGIC3: 704
+ SI_QUEST_BUFF1: 705
+ SI_QUEST_BUFF2: 706
+ SI_QUEST_BUFF3: 707
+ SI_REUSE_LIMIT_RECALL: 708
+ SI_SAVEPOSITION: 709
+ SI_HANDICAPSTATE_ICEEXPLO: 710
+ SI_FENRIR_CARD: 711
+ SI_REUSE_LIMIT_ASPD_POTION: 712
+ SI_MAXPAIN: 713
+ SI_PC_STOP: 714
+ SI_FRIGG_SONG: 715
+ SI_OFFERTORIUM: 716
+ SI_TELEKINESIS_INTENSE: 717
+ SI_MOONSTAR: 718
+ SI_STRANGELIGHTS: 719
+ SI_FULL_THROTTLE: 720
+ SI_REBOUND: 721
+ SI_UNLIMIT: 722
+ SI_KINGS_GRACE: 723
+ SI_ITEM_ATKMAX: 724
+ SI_ITEM_ATKMIN: 725
+ SI_ITEM_MATKMAX: 726
+ SI_ITEM_MATKMIN: 727
+ SI_SUPER_STAR: 728
+ SI_HIGH_RANKER: 729
+ SI_DARKCROW: 730
+ SI_2013_VALENTINE1: 731
+ SI_2013_VALENTINE2: 732
+ SI_2013_VALENTINE3: 733
+ SI_ILLUSIONDOPING: 734
+ SI_CHILL: 736
+ SI_BURNT: 737
+ SI_FLASHCOMBO: 740
+ SI_CUP_OF_BOZA: 751
+ SI_B_TRAP: 752
+ SI_E_CHAIN: 753
+ SI_E_QD_SHOT_READY: 754
+ SI_C_MARKER: 755
+ SI_H_MINE: 756
+ SI_H_MINE_SPLASH: 757
+ SI_P_ALTER: 758
+ SI_HEAT_BARREL: 759
+ SI_ANTI_M_BLAST: 760
+ SI_SLUGSHOT: 761
+ SI_SWORDCLAN: 762
+ SI_ARCWANDCLAN: 763
+ SI_GOLDENMACECLAN: 764
+ SI_CROSSBOWCLAN: 765
+ SI_PACKING_ENVELOPE1: 766
+ SI_PACKING_ENVELOPE2: 767
+ SI_PACKING_ENVELOPE3: 768
+ SI_PACKING_ENVELOPE4: 769
+ SI_PACKING_ENVELOPE5: 770
+ SI_PACKING_ENVELOPE6: 771
+ SI_PACKING_ENVELOPE7: 772
+ SI_PACKING_ENVELOPE8: 773
+ SI_PACKING_ENVELOPE9: 774
+ SI_PACKING_ENVELOPE10: 775
+ SI_GLASTHEIM_TRANS: 776
+ SI_HEAT_BARREL_AFTER: 778
+ SI_DECORATION_OF_MUSIC: 779
+ SI_MTF_MHP: 793
+ SI_MTF_MSP: 794
+ SI_MTF_PUMPKIN: 795
+ SI_MTF_HITFLEE: 796
+ SI_FLOWERSMOKE: 822
+ SI_FSTONE: 823
+ SI_DAILYSENDMAILCNT: 824
+ SI_LJOSALFAR: 826
+ SI_HAPPINESS_STAR: 849
+ SI_DRESS_UP: 856
+ SI_MAPLE_FALLS: 857
+ SI_MERMAID_LONGING: 863
+ SI_MAGICAL_FEATHER: 864
+ SI_TIME_ACCESSORY: 872
+ SI_SU_STOOP: 893
+ SI_CATNIPPOWDER: 894
+ SI_BLOSSOM_FLUTTERING: 895
+ SI_SV_ROOTTWIST: 896
+ SI_RESIST_PROPERTY_WATER: 908
+ SI_RESIST_PROPERTY_GROUND: 909
+ SI_RESIST_PROPERTY_FIRE: 910
+ SI_RESIST_PROPERTY_WIND: 911
+ SI_BITESCAR: 917
+ SI_ARCLOUSEDASH: 918
+ SI_TUNAPARTY: 919
+ SI_SHRIMP: 920
+ SI_FRESHSHRIMP: 921
+ SI_SUHIDE: 933
+ SI_SPRITEMABLE: 937
+ SI_MADOGEAR: 1149
+ // Custom Status Icons
+ SI_PHYSICAL_SHIELD: 1500
+ SI_INCAGI: 1501
+ SI_INCVIT: 1502
+ SI_INCINT: 1503
+ SI_INCDEX: 1504
+ SI_INCLUK: 1505
+ SI_INCHIT: 1506
+ SI_INCFLEE: 1507
+ SI_INCWALKSPEED: 1508
+ SI_INCMHPRATE: 1509
+ SI_INCMSPRATE: 1510
+ SI_CONFUSION: 1511
+ SI_MDEFSET: 1512
+ SI_HALT_REGENERATION: 1513
+
diff --git a/db/skill_changematerial_db.txt b/db/skill_changematerial_db.txt
new file mode 100644
index 00000000..fabf5dfa
--- /dev/null
+++ b/db/skill_changematerial_db.txt
@@ -0,0 +1,11 @@
+// Change Material Database
+//
+// Structure of Database:
+// ProductID,BaseRate,MakeAmount1,MakeAmountRate1,MakeAmount2,MakeAmountRate2
+// MakeAmount3,MakeAmountRate3,MakeAmount4,MakeAmountRate4,MakeAmount5,MakeAmountRate5
+//====================================================
+// NOTE:
+// Up to 5 ID/Amount pairs can be specified.
+// Rate = n/10%
+//====================================================
+
diff --git a/db/skill_improvise_db.txt b/db/skill_improvise_db.txt
new file mode 100644
index 00000000..d130b858
--- /dev/null
+++ b/db/skill_improvise_db.txt
@@ -0,0 +1,12 @@
+// Improvise DB.
+// Database for skills that can be summoned trough Randomize Spell/Improvised Song (Minstrel/Wanderer Skill).
+// Format: SkillID,Rate
+//
+// 01. SkillID Skill ID to be casted by Randomize Spell.
+// 02. Rate Chance at which the skill is selected (1 = 0.01%, 10000 = 100%).
+//
+// NOTE: The skill is picked at random from the entire database and then tested for rate. If it
+// does not succeed at that rate, an another skill is picked and tested. This continues
+// until a skill succeeds.
+//
+
diff --git a/db/spellbook_db.txt b/db/spellbook_db.txt
new file mode 100644
index 00000000..f109eb5f
--- /dev/null
+++ b/db/spellbook_db.txt
@@ -0,0 +1,7 @@
+// Reading Spellbook Preserve Points Database
+//
+// Structure of Database:
+// SkillID,PreservePoints,Required Book
+//====================================================
+// To add more entries, increase MAX_SKILL_SPELLBOOK_DB in /src/map/skill.h.
+//====================================================
diff --git a/db/stylist_db.conf b/db/stylist_db.conf
new file mode 100644
index 00000000..193bba6c
--- /dev/null
+++ b/db/stylist_db.conf
@@ -0,0 +1,267 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2018 Hercules Dev Team
+//= Copyright (C) 2018 Asheraf
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Stylist Database
+//=========================================================================
+
+stylist_db: (
+ /**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ // ================ Mandatory fields ==============================
+ Type: TYPE (int)
+ Id: ID (int)
+ // ================ Optional fields ===============================
+ Zeny: zeny (int, defaults to 0)
+ ItemID: ItemID (int, defaults to 0)
+ BoxItemID: BoxItemID (int, defaults to 0)
+ AllowDoram: true/false (boolean, defaults to false)
+},
+**************************************************************************/
+{
+ Type: "LOOK_HAIR_COLOR"
+ Id: 1
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR_COLOR"
+ Id: 2
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR_COLOR"
+ Id: 3
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR_COLOR"
+ Id: 4
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR_COLOR"
+ Id: 5
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR_COLOR"
+ Id: 6
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR_COLOR"
+ Id: 7
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR_COLOR"
+ Id: 8
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 1
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 2
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 3
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 4
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 5
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 6
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 7
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 8
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 9
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 10
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 11
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 12
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 13
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 14
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 15
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 16
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 17
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 18
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 19
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 20
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 21
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 22
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 23
+ Zeny: 100000
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 24
+// ItemID: "New_Style_Coupon"
+// BoxItemID: "Beauty_Gift_Box"
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 25
+// ItemID: "New_Style_Coupon"
+// BoxItemID: "Beauty_Gift_Box"
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 26
+// ItemID: "New_Style_Coupon"
+// BoxItemID: "Beauty_Gift_Box"
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 27
+// ItemID: "New_Style_Coupon"
+// BoxItemID: "Beauty_Gift_Box"
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 28
+// ItemID: "Cash_Hair_Coupon"
+// BoxItemID: "Jeremy_Beauty_Coupon_Box"
+},
+{
+ Type: "LOOK_HAIR"
+ Id: 29
+// ItemID: "Cash_Hair_Coupon"
+// BoxItemID: "Jeremy_Beauty_Coupon_Box"
+},
+{
+ Type: "LOOK_CLOTHES_COLOR"
+ Id: 1
+// ItemID: "Clothing_Dye_Coupon2"
+// BoxItemID: "Clothing_Dye_Orig_Box"
+},
+{
+ Type: "LOOK_CLOTHES_COLOR"
+ Id: 2
+// ItemID: "Clothing_Dye_Coupon"
+// BoxItemID: "Clothing_Dye_Box"
+},
+{
+ Type: "LOOK_CLOTHES_COLOR"
+ Id: 3
+// ItemID: "Clothing_Dye_Coupon"
+// BoxItemID: "Clothing_Dye_Box"
+},
+{
+ Type: "LOOK_BODY2"
+ Id: 0
+// ItemID: "Costume_Change_Ticket"
+// BoxItemID: "Costume_Change_Ticket"
+},
+{
+ Type: "LOOK_BODY2"
+ Id: 1
+// ItemID: "Costume_Change_Ticket"
+// BoxItemID: "Costume_Change_Ticket"
+},
+)
diff --git a/db/translations.conf b/db/translations.conf
new file mode 100644
index 00000000..fc814463
--- /dev/null
+++ b/db/translations.conf
@@ -0,0 +1,20 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://herc.ws/board/
+//================= More Information =================
+//= http://herc.ws/board/topic/8687-hercules-ultimate-localization-design/
+//====================================================
+// Translations generated with —-generate-translations
+// should be pointed to here
+//====================================================
+
+translations: (
+ //"path/to/my/Language.po",
+ //"db/Spanish.po", //(Example)
+) \ No newline at end of file
diff --git a/langs/lang_de.old b/langs/lang_de.old
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/langs/lang_de.old
diff --git a/langs/lang_de.txt b/langs/lang_de.txt
new file mode 100644
index 00000000..a8134aee
--- /dev/null
+++ b/langs/lang_de.txt
@@ -0,0 +1,6673 @@
+Copyright (C) 2010-2015 Evol Online
+"Ah, you woke up. You washed ashore on the beach 3 days ago. You've been asleep since.
+
+
+"Come back and see me when the job is done."
+
+
+"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 '%s', which is the lay on hands magic."
+
+
+"Maybe I should go back to practicing '%s' until I can make potions properly." %%6
+
+
+"My little granddaughter Tanisha found you. Kaan was able to carry you to bed.
+
+
+"She hates maggots.
+
+
+"The first one for the mouboo was %s and the one for the pinkie was %s.
+
+
+"Welcome to the bank!
+
+
+"You're the person I brought here, right?
+
+
+##BHall Of Acorns: TOP15##b
+
+
+##BHall Of Fortune: TOP15##b
+
+
+##BHall Of Guild Level: TOP5##b
+
+
+##BHall Of Job Level: TOP15##b
+
+
+##BHall Of Lethality: TOP15##b
+
+
+##BHall Of Level: TOP15##b
+
+
+%%@
+
+
+%%A
+
+
+%%B
+
+
+%%C
+
+
+%%D
+
+
+%%E
+
+
+%%F
+
+
+%d out of 5 have been found.
+
+
+%s
+%s
+
+%s - Level %d (~%s HP, ~%s ATK)
+
+
+%s : %s
+
+
+(A mystical aura surrounds this stone. You feel mysteriously attracted to it. Something tells you to touch it. What do you do?)
+
+
+... Tulimshar in Tonori ... I'm a Talpan.
+
+
+1) Do not abuse other players. Insults, swearing, and the like are not to be directed towards a particular person or group.
+
+
+2) No bots – including ##Bany##b AFK activity or automated actions of any sort.
+
+
+3) No spamming or flooding (including messages, whispers, and trade requests).
+
+
+4) No begging.
+
+
+5) Speak ##Bonly##b English in the public chat.
+
+
+6) Treat others how you would like to be treated.
+
+
+7
+
+
+98... 99... 100!
+
+
+?
+
+
+@@
+@@
+
+A blissful day to thee, mortal!
+
+
+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 '%s' spell.
+
+
+A sunny and hot day,
+Ein heißer und sonniger Tag.
+
+A wicked mushroom will appear to fight for you. Usually.
+
+
+A-hoy matey!
+Ahoy Matrose!
+
+AFK botting will be determined by talking to players who are moving and/or attacking.
+
+
+AFKCap
+
+
+Aahna
+
+
+Aaron
+
+
+Abort
+Abbrechen
+
+Acorn
+Eichel
+
+ActivatedSulphur
+
+
+Add all focus skills
+
+
+Adrian
+
+
+After a while, you stumble across a section that appears to be written somewhat legibly. The author notes that he (or perhaps she?) is describing a completely new transmutation.
+
+
+After we finish talking, click on the clothes and press the equip button.
+
+
+Agostine
+
+
+Agostine Debug
+
+
+Ah, the Professors will get mad at me again...
+
+
+Ah, yes, your training...
+
+
+Ah.
+
+
+Ah... no beer? Oh well.
+
+
+Aidan
+
+
+Airlia
+
+
+Aisha
+
+
+Aisha looks around as she leans in and hushes you to silence. After a few seconds, she whispers to you:
+
+
+Akseli
+
+
+Alacrius
+
+
+Alan
+Alan
+
+Aldred
+
+
+Alice
+
+
+Alizarin Plant
+Alizarinkraut
+
+AlizarinHerb
+
+
+All monsters summoned!
+Alle Monster beschworen!
+
+All of my money.
+Mein ganzes Geld.
+
+All scoreboards are updated hourly.
+
+
+AmberChristmasSweater
+
+
+Amethyst
+Amethyst
+
+AmethystPowder
+
+
+AmethystRing
+
+
+Amrak
+
+
+And make sure to keep notes of your spells! Don't rely only on your skill tab (F5).
+
+
+And the first spell, to summon wicked mushrooms, is %s.
+
+
+Andra
+
+
+Angela
+
+
+Angela#house
+
+
+Angry Fire Goblin
+
+
+Angry Green Slime
+
+
+Angry Scorpion
+
+
+Angry Sea Slime
+
+
+AngryScorpionStinger
+
+
+Angus
+
+
+AniManOMat
+
+
+AnimalBones
+
+
+Anne
+
+
+AnniversaryHat
+
+
+Another Sneaky Bandit
+
+
+AntlerHat
+
+
+Antlers
+
+
+Anwar
+Anwar
+
+Anything else you can remember?
+
+
+Anything else?
+Noch irgendwas?
+
+AppleCake
+
+
+ApprenticeRobe
+
+
+AquaHint
+
+
+AquaOrnament
+
+
+AquaTicket
+
+
+Aradin
+
+
+Archant
+
+
+Archibald
+
+
+Ardra
+
+
+Are you read for another spell?
+
+
+Arkim
+
+
+Arr!
+
+
+Arr, I'm bored!
+
+
+Arrow
+
+
+Arvo
+
+
+As she opens her hands again, the leaves have turned into ten golden crystals.
+
+
+As the power of your magic grows so will the spells you can cast.
+
+
+As you look at the sword, you suddenly hear a voice in your head!
+
+
+As you want!
+Wie du willst!
+
+Ashley
+
+
+AssassinBoots
+
+
+AssassinGloves
+
+
+AssassinPants
+
+
+AssassinShirt
+
+
+Astral Soul
+
+
+AstralCube
+
+
+At this point, the river deepens, slowing down to a leisurely pace. In its center you notice an unusual stone, waves breaking around it.
+
+
+Auldsbel places the logs next to his hut.
+
+
+Auldsbel the Wizard
+
+
+Auldsbel#_M
+
+
+Aureole
+
+
+Automated following will be determined by observation.
+
+
+AutumnMask
+
+
+Avalia
+
+
+Axe
+Axt
+
+AxeHat
+
+
+Ayasha
+
+
+AyashaDebug
+
+
+Azul Slime
+
+
+Back
+
+
+Baktar
+
+
+Ball Lightning
+
+
+Bandana
+Kopftuch
+
+Bandit
+Bandit
+
+Bandit Lord
+Banditenlord
+
+BanditHood
+
+
+BansheeBow
+
+
+Banu
+Banu
+
+Bar Rules
+
+
+Barbara Grey
+
+
+Bard
+Barde
+
+Bardiche
+
+
+Barkeeper
+
+
+Barrel#0
+
+
+Barrel#1
+
+
+Barrel#2
+
+
+Barrel#3
+
+
+Barrel#4
+
+
+Barrel#5
+
+
+Barrel#6
+
+
+Barrel#7
+
+
+Bartender
+
+
+Bartender#Casino
+
+
+Bartender#Duels
+
+
+Basil
+
+
+BastardSword
+
+
+Bat
+
+
+BatTeeth
+
+
+BatWing
+
+
+Battle Master#Duels
+
+
+BeanieCopter
+
+
+Bee
+Biene
+
+Beer
+Bier
+
+BeetleJuice
+
+
+Before you stands a beautiful woman, dressed in dark purple robes and wearing a witch's hat.
+
+
+Beheader
+
+
+Ben
+
+
+Bennet
+
+
+BentNeedle
+
+
+Beret
+
+
+Bernard
+Bernard
+
+Beware of what thou wishest for, mortal...
+
+
+Birrod
+
+
+Black Scorpion
+Schwarzer Skorpion
+
+BlackBeret
+
+
+BlackBoots
+
+
+BlackBowlerHat
+
+
+BlackBowlerHatBrown
+
+
+BlackContributor
+
+
+BlackCottonBoots
+
+
+BlackCottonCloth
+
+
+BlackCottonGloves
+
+
+BlackCottonHeadband
+
+
+BlackCottonShirt
+
+
+BlackCottonShorts
+
+
+BlackCottonSkirt
+
+
+BlackCottonTrousers
+
+
+BlackCowboyHat
+
+
+BlackDesertHat
+
+
+BlackDye
+
+
+BlackEvokersRobeBlue
+
+
+BlackFineDress
+
+
+BlackJack
+
+
+BlackMiniskirt
+
+
+BlackPearl
+
+
+BlackRabbitEars
+
+
+BlackRose
+
+
+BlackScorpionStinger
+
+
+BlackShades
+
+
+BlackShortTankTop
+
+
+BlackSilkRobe
+
+
+BlackSorcererBlack
+
+
+BlackSorcererDBlue
+
+
+BlackSorcererDGreen
+
+
+BlackSorcererGreen
+
+
+BlackSorcererLBlue
+
+
+BlackSorcererOrange
+
+
+BlackSorcererPink
+
+
+BlackSorcererPurple
+
+
+BlackSorcererRed
+
+
+BlackSorcererWhite
+
+
+BlackSorcererYellow
+
+
+BlackTankTop
+
+
+BlackTurtleneck
+
+
+BlackVNeckSweater
+
+
+BlackWizardHat
+
+
+BlackWizardRobe
+
+
+Blacksmith
+Schmied
+
+BlacksmithsAxe
+
+
+Blackwin
+
+
+BlinkingEvil
+
+
+BlinkingEvilBlue
+
+
+BlinkingEvilHalloween
+
+
+BlinkingEvilPink
+
+
+BlinkingEvilRed
+
+
+BlinkingEvilYellow
+
+
+BlinkingHocus
+
+
+BloodInk
+
+
+BloodWine
+
+
+Bloodstone
+
+
+Blossom
+
+
+Blue Slime
+
+
+Blue Spark
+
+
+BlueChristmasSweater
+
+
+BlueDottedWrap
+
+
+BlueEasterEgg
+
+
+BlueEggshellHat
+
+
+BlueHint
+
+
+BlueHitchhikersTowel
+
+
+BlueOrnament
+
+
+BluePowder
+
+
+BluePresentBox
+
+
+BluePresentHat
+
+
+BlueRose
+
+
+BlueRoseHat
+
+
+BlueTicket
+
+
+BlueWolfHelmet
+
+
+BlueWrap
+
+
+Blueberries
+Blaubeeren
+
+Bluepar
+
+
+Body type %i
+
+
+Bone
+Knochen
+
+BoneArrows
+
+
+BoneDarts
+
+
+BoneKnife
+
+
+Bones
+
+
+BookPage
+
+
+Bookshelf
+
+
+Boots
+Stiefel
+
+Boss points: %s
+
+
+BottleOfSand
+
+
+BottleOfWater
+
+
+Bow
+
+
+BowlerHat
+
+
+BowlerHatBrown
+
+
+Bracco
+
+
+BrainStem
+
+
+Brawling
+
+
+Bring me ten bug legs, and I will reveal its invocation to you.
+
+
+Brodomir
+
+
+BrokenDoll
+
+
+BrokenFourLeafAmulet
+
+
+BromenalBoots
+
+
+BromenalChest
+
+
+BromenalFourLeafAmulet
+
+
+BromenalGloves
+
+
+BromenalHelmet
+
+
+BromenalLegs
+
+
+BromenalShield
+
+
+Browsing through the books, you come across a manuscript entitled 'Notes of Potaffe, On Transmutation.'
+
+
+Bryant
+
+
+BucketHat
+
+
+BugLeg
+
+
+BullHelmet
+
+
+BunchOfParsley
+
+
+Bunkmaster Daban
+
+
+Bunkmaster Phict
+
+
+BunnyEars
+
+
+But alas, thou need more magical power for that.
+
+
+But be warned: you won't be able to use advanced healing magic until you are more capable in your regular magic usage.
+
+
+But remember, the game isn't fun when you already know what to do. Use it well or you will lose interest in playing The Mana World! Please help by reporting anything that is unclear, outdated or that needs to be seen on our forums at %s.
+
+
+Butterfly
+Schmetterling
+
+Button#mine-1
+
+
+Button#mine-2
+
+
+Button#mine-3
+
+
+Bye for now.
+Bis bald!
+
+Bye then!
+Dann, Tschüss!
+
+Bye!
+Bye!
+
+Bye.
+Ade.
+
+CactusDrink
+
+
+CactusPotion
+
+
+Cake
+
+
+Can you do something with my color?
+Kannst du etwas mit meiner Farbe machen?
+
+Can you please go away?
+Würdest du bitte weg gehen?
+
+Can't talk right now, I'm on patrol duty.
+Kann nicht reden, bin auf Patrouille.
+
+Candide
+
+
+Candied Slime
+
+
+CandleHelmet
+
+
+Candor Dock
+
+
+Candor Koga
+
+
+Candy
+
+
+CandyCane
+
+
+CandyPumpkin
+
+
+Cap
+
+
+Capitão Mirc
+
+
+CaptainsHat
+
+
+CaramelApple
+
+
+CaramelCandy
+
+
+CarbonGasMask
+
+
+Caretaker
+
+
+CashiersShade
+
+
+CasinoCoins
+
+
+CatEars
+
+
+Caul
+
+
+Cave Maggot
+Höhlenmade
+
+Cave Snake
+
+
+CaveSnakeEgg
+
+
+CaveSnakeLamp
+
+
+CaveSnakeTongue
+
+
+Celestia
+Celestia
+
+Celestia BackDoor
+
+
+Celestia Door
+
+
+Cerhan
+
+
+ChainmailShirt
+
+
+Changing your body type will send you back to the character selection screen.
+
+
+Charda
+
+
+Ched
+
+
+Cheers!
+Prost!
+
+Chef Armand
+
+
+Chef#dimond
+
+
+Chef#graveyard
+
+
+ChefHat
+
+
+Cherry
+
+
+CherryCake
+
+
+Chest#DemonMask
+
+
+Chest#boring
+
+
+Chest#illia
+
+
+Chest#keshlam
+
+
+Chest#sword
+
+
+ChicSantaHat
+
+
+ChickenLeg
+
+
+Chief Warrick
+
+
+ChocolateBar
+
+
+ChocolateCake
+
+
+ChocolateMouboo
+
+
+ChristmasElfHat
+
+
+ChristmasTreeHat
+
+
+Cindy
+
+
+Cindy#house
+
+
+Circlet
+
+
+Clauquer
+
+
+ClosedChristmasBox
+
+
+Clover Patch
+
+
+CloverHat
+
+
+Coal
+Kohle
+
+Cobalt Plant
+Kobaltpflanze
+
+CobaltHerb
+
+
+CoinBag
+
+
+Come back when thou art stronger.
+
+
+Command not permitted on this map! Check npc/functions/weather.conf
+
+
+ConcentrationPotion
+
+
+Connor
+
+
+Constable Bob
+
+
+Constable Perry Graf
+
+
+Contributor
+
+
+Cooky
+
+
+Copper Slime
+
+
+CottonBoots
+
+
+CottonCloth
+
+
+CottonGloves
+
+
+CottonHeadband
+
+
+CottonShirt
+
+
+CottonShorts
+
+
+CottonSkirt
+
+
+CottonTrousers
+
+
+CranberryLollipop
+
+
+Crastur the Ugly
+
+
+CrescentRod
+
+
+CrimsonBra
+
+
+Crotcher Scorpion
+
+
+Crown
+
+
+CrozeniteFourLeafAmulet
+
+
+CrusadeHelmet
+
+
+CryptKey
+
+
+Curlee
+
+
+Current Magic Control
+
+
+Current drop rate is set to @@%, and will reset to @@% (default value) in @@.
+
+
+Current exp rate is set to @@% (default value).
+Aktuelle exp Rate ist auf @@% gesetzt (Standardwert).
+
+Current exp rate is set to @@%, and will reset to @@% (default value) in @@.
+Aktuelle exp Rate wurde auf @@% gesetzt, und wird in @@ auf @@% zurückgesetzt (Standardwert).
+
+Cursed Waterfall
+
+
+Custom
+
+
+Cyndala
+
+
+Cynric
+
+
+DEBUG: Changing @@ field @@ to something else.
+
+
+DEBUG: Changing @@, Values: (@@, @@, @@).
+
+
+Dagger
+Dolch
+
+DarkBlueBeret
+
+
+DarkBlueBowlerHat
+
+
+DarkBlueBowlerHatBrown
+
+
+DarkBlueContributor
+
+
+DarkBlueCottonBoots
+
+
+DarkBlueCottonCloth
+
+
+DarkBlueCottonGloves
+
+
+DarkBlueCottonHeadband
+
+
+DarkBlueCottonShirt
+
+
+DarkBlueCottonShorts
+
+
+DarkBlueCottonSkirt
+
+
+DarkBlueCottonTrousers
+
+
+DarkBlueDesertHat
+
+
+DarkBlueDye
+
+
+DarkBlueFineDress
+
+
+DarkBlueMiniskirt
+
+
+DarkBlueRabbitEars
+
+
+DarkBlueShades
+
+
+DarkBlueShortTankTop
+
+
+DarkBlueSilkRobe
+
+
+DarkBlueSorcererBlack
+
+
+DarkBlueSorcererDBlue
+
+
+DarkBlueSorcererDGreen
+
+
+DarkBlueSorcererGreen
+
+
+DarkBlueSorcererLBlue
+
+
+DarkBlueSorcererOrange
+
+
+DarkBlueSorcererPink
+
+
+DarkBlueSorcererPurple
+
+
+DarkBlueSorcererRed
+
+
+DarkBlueSorcererWhite
+
+
+DarkBlueSorcererYellow
+
+
+DarkBlueTankTop
+
+
+DarkBlueTurtleneck
+
+
+DarkBlueVNeckSweater
+
+
+DarkBlueWizardHat
+
+
+DarkChristmasSweater
+
+
+DarkConcentrationPotion
+
+
+DarkCrystal
+
+
+DarkEasterEgg
+
+
+DarkEggshellHat
+
+
+DarkGreenBeret
+
+
+DarkGreenBowlerHat
+
+
+DarkGreenBowlerHatBrown
+
+
+DarkGreenContributor
+
+
+DarkGreenCottonBoots
+
+
+DarkGreenCottonCloth
+
+
+DarkGreenCottonGloves
+
+
+DarkGreenCottonHeadband
+
+
+DarkGreenCottonShirt
+
+
+DarkGreenCottonShorts
+
+
+DarkGreenCottonSkirt
+
+
+DarkGreenCottonTrousers
+
+
+DarkGreenDesertHat
+
+
+DarkGreenDye
+
+
+DarkGreenFineDress
+
+
+DarkGreenMiniskirt
+
+
+DarkGreenRabbitEars
+
+
+DarkGreenShades
+
+
+DarkGreenShortTankTop
+
+
+DarkGreenSilkRobe
+
+
+DarkGreenSorcererBlack
+
+
+DarkGreenSorcererDBlue
+
+
+DarkGreenSorcererDGreen
+
+
+DarkGreenSorcererGreen
+
+
+DarkGreenSorcererLBlue
+
+
+DarkGreenSorcererOrange
+
+
+DarkGreenSorcererPink
+
+
+DarkGreenSorcererPurple
+
+
+DarkGreenSorcererRed
+
+
+DarkGreenSorcererWhite
+
+
+DarkGreenSorcererYellow
+
+
+DarkGreenTankTop
+
+
+DarkGreenTurtleneck
+
+
+DarkGreenVNeckSweater
+
+
+DarkGreenWizardHat
+
+
+DarkHelm
+
+
+DarkPetal
+
+
+DarkRedRose
+
+
+DarkTalisman
+
+
+Darnel
+
+
+Darug
+
+
+David
+
+
+Debug#0
+
+
+Debug#1
+
+
+Debug#2
+
+
+Debug#3
+
+
+Debug#Angela
+
+
+Debug#BlueSage
+
+
+Debug#Duels
+
+
+DebugFlowerP
+
+
+DecorCandy
+
+
+DemonMask
+
+
+Demonic Mouboo
+
+
+Demonic Spirit
+
+
+Deposit.
+Einzahlen.
+
+DesertBow
+
+
+DesertHat
+
+
+DesertHelmet
+
+
+DesertShirt
+
+
+DevelopersCap
+
+
+Diamond
+Diamant
+
+DiamondPowder
+
+
+DiamondRing
+
+
+Did I received any mail?
+
+
+Did you already talk to Tanisha?"
+
+
+Did you see how this spell is cast?
+
+
+DilutedConcentrationPot
+
+
+Dimond
+
+
+Dimonds Cove 1
+
+
+Dimonds Cove 2
+
+
+Directions
+
+
+Diryn the Traveler
+
+
+Discard
+Entfernen
+
+DiseasedHeart
+
+
+Do I look like a tree? I feel like one.
+Seh ich wie ein Baum aus? Zumindest fühl ich mich wie einer.
+
+Do you feel too weak even to do damage to this areas wishy-washy wildlife?
+Fühlst du dich sogar zu schwach, um diese Wischi-Waschi-Monster hier zu besiegen?
+
+Do you have a name?
+
+
+Do you really want me to show you the spell again? You will have to bring new ingredients.
+
+
+Do you want to give me these items?
+
+
+Doctor
+
+
+Doll
+Puppe
+
+Don't distract me, I have to stay alert.
+Lenk mich nicht ab. Ich muss aufmerksam bleiben.
+
+Donald
+
+
+Doom Golem
+
+
+Door
+Tür
+
+Doug
+
+
+Drabur
+
+
+Drag and drop an item from your inventory.
+Drag-and-drop einen Gegenstand aus deinem Inventar.
+
+Drake the Traveler
+
+
+Dread Pirate Marley
+
+
+Dread Pirate Marley Clone
+
+
+Dresser#tutorial
+
+
+Drinker#1
+
+
+Drinker#2
+
+
+Drop rate has been reset to @@% (default value).
+
+
+Drop rate is set to @@% for the next @@.
+
+
+DruidTreeBranch
+
+
+Drunken Lady Skeleton
+
+
+Drunken Skeleton
+
+
+ERROR: You must set a PinCode to make use of this function.
+
+
+Earmuffs
+
+
+Earth Spirit
+
+
+Easter Eggs
+
+
+Easter Fluffy
+
+
+EasterBasket
+
+
+EasterEgg
+
+
+Ectoplasm
+
+
+Edwin
+
+
+Eevert
+
+
+EggshellHat
+
+
+Ekinu
+
+
+Elanore carefully goes over your leaves, then smiles.
+
+
+Elanore counts the leaves you show her.
+
+
+Elanore shakes her head.
+
+
+Elanore smiles at you.
+
+
+Elanore smiles.
+
+
+Elanore the Healer
+
+
+Elanore#_M
+
+
+ElfNightcap
+
+
+Elias
+
+
+Elijah
+
+
+Eljas
+
+
+Emerald
+Smaradg
+
+EmeraldPowder
+
+
+EmeraldRing
+
+
+Emergency Exit
+
+
+EmptyBottle
+
+
+Enchanter
+
+
+EnchantersAmulet
+
+
+Engraving#Keshlam
+
+
+Engravings
+
+
+Enjoy your new style.
+Viel Spaß mit deinem neuen Style.
+
+Ensio
+
+
+Entertainer
+
+
+Eomie
+
+
+Equip the wand and lets try out that spell.
+
+
+EskimoHat
+
+
+Estard
+
+
+Estrilda
+
+
+Eurni
+
+
+Every 1 hour
+stündlich
+
+Every 12 hours
+12-stündlich
+
+Every 24 hours
+täglich
+
+Every 3 hours
+3-stündlich
+
+Every 5 hours
+5-stündlich
+
+Every 6 hours
+6-stündlich
+
+Evil Mushroom
+
+
+Evil Obelisk
+
+
+Example: @translate Elmo
+
+
+Example: @translate Nard
+
+
+Example: @translate npc/002-1/arpan
+
+
+Excitedly, you turn the page – only to find that it is stuck to the next and can't be freed!
+
+
+Exit
+
+
+Exp rate has been reset to @@% (default value).
+Exp Rate wurde auf @@% zurückgesetzt (Standardwert).
+
+Exp rate is set to @@% for the next @@.
+Exp Rate ist für die nächsten @@ auf @@% gesetzt.
+
+Eyepatch
+Augenklappe
+
+Fabius
+
+
+FaceMask
+
+
+FairTradeSoil
+
+
+FairyHat
+
+
+FakeFangs
+
+
+Falchion
+
+
+Falkurn
+
+
+Fallen
+
+
+FancyHat
+
+
+Farewell.
+Mach es gut.
+
+Faris
+
+
+Faris the Traveler
+
+
+Farmer Hinnak
+
+
+Feel free to come visit me another time.
+Du kannst mich jederzeit besuchen kommen.
+
+Ferry Master#candor
+
+
+Ferry Master#tulimshar
+
+
+Fey Element
+
+
+Fieri
+
+
+FineDress
+
+
+Fire Goblin
+
+
+Fire Skull
+
+
+Five for you and five for me.
+
+
+Flashmob
+
+
+FlawedLens
+
+
+FlightTalisman
+
+
+Fluffy
+Fluffy
+
+FluffyHat
+
+
+Focus Skill +
+
+
+Focus Skill -
+
+
+Focus list:
+
+
+Forest Mana Seed#_M
+
+
+ForestArmor
+
+
+ForestBow
+
+
+Forwin
+
+
+FourLeafClover
+
+
+FreeRangeMoss
+
+
+From what I have been hearing, you seem to be doing well on your way to becoming a healer. I have decided to accept you as a student of the School of Life Magic.
+
+
+FrozenYetiTear
+
+
+Frozenbeard
+
+
+Fruit Store
+
+
+FunkyChristmasSweater
+
+
+FunkyHat
+
+
+FurBoots
+
+
+GMCap
+
+
+GMRobe
+
+
+GP: %s
+
+
+Gamboge Plant
+
+
+GambogeHerb
+
+
+Game Statistics
+
+
+Garcon#Duels
+
+
+General Krukan
+
+
+General Razha
+
+
+General Store#dimond
+
+
+General Store#hurnscald
+
+
+General Terogan
+
+
+General Terogan#Exit1
+
+
+General Terogan#Exit2
+
+
+General Terogan#Main
+
+
+George#pirate
+
+
+Ggrmm... Grmmmm...
+Ggrmm... Grmmmm...
+
+Ghada
+
+
+Giant Maggot
+Gigantische Made
+
+GiantCaveMaggot
+
+
+GingerBreadMan
+
+
+Gispaan#Female
+
+
+Gispaan#Male
+
+
+Give me some space.
+Gib mir etwas Zeit.
+
+Gladys
+
+
+Gm Event#1
+
+
+Gm Event#2
+
+
+Gm Event#3
+
+
+Go back
+Zurückgehen
+
+Go back?
+
+
+Go fly a kite.
+Geh Kitesurfen.
+
+Go on. If you need to think a bit, take your time.
+
+
+GoblinMask
+
+
+Goggles
+
+
+Golbenez
+
+
+GoldTicket
+
+
+GoldenDeliciousApple
+
+
+GoldenFourLeafAmulet
+
+
+GoldenPVPCap
+
+
+GoldenPlatemail
+
+
+GoldenScorpionStinger
+
+
+GoldenWarlordPlate
+
+
+Goodbye!
+
+
+Goodbye.
+Auf Wiedersehen.
+
+GraduationCap
+
+
+GrapeLollipop
+
+
+Grass Snake
+Grasschlange
+
+GrassFedTofu
+
+
+GrassLiner
+
+
+GrassSeed
+
+
+GrassSnakeEgg
+
+
+GrassSnakeTongue
+
+
+Grave#1
+
+
+Grave#10
+
+
+Grave#11
+
+
+Grave#12
+
+
+Grave#2
+
+
+Grave#3
+
+
+Grave#4
+
+
+Grave#5
+
+
+Grave#6
+
+
+Grave#7
+
+
+Grave#8
+
+
+Grave#9
+
+
+GrayHint
+
+
+Great! Now you can equip it.
+
+
+Great, lets begin your first lesson.
+
+
+GreatDragon
+
+
+Green Slime
+Grüner Schleim
+
+Green Slime Mother
+
+
+GreenApple
+
+
+GreenBeret
+
+
+GreenBowlerHat
+
+
+GreenBowlerHatBrown
+
+
+GreenContributor
+
+
+GreenCottonBoots
+
+
+GreenCottonCloth
+
+
+GreenCottonGloves
+
+
+GreenCottonHeadband
+
+
+GreenCottonShirt
+
+
+GreenCottonShorts
+
+
+GreenCottonSkirt
+
+
+GreenCottonTrousers
+
+
+GreenDesertHat
+
+
+GreenDye
+
+
+GreenEasterEgg
+
+
+GreenEggshellHat
+
+
+GreenFineDress
+
+
+GreenHint
+
+
+GreenHitchhikersTowel
+
+
+GreenMiniskirt
+
+
+GreenOrnament
+
+
+GreenPresentBox
+
+
+GreenPresentHat
+
+
+GreenRabbitEars
+
+
+GreenRedStripedWrap
+
+
+GreenShades
+
+
+GreenShortTankTop
+
+
+GreenSilkRobe
+
+
+GreenSorcererBlack
+
+
+GreenSorcererDBlue
+
+
+GreenSorcererDGreen
+
+
+GreenSorcererGreen
+
+
+GreenSorcererLBlue
+
+
+GreenSorcererOrange
+
+
+GreenSorcererPink
+
+
+GreenSorcererPurple
+
+
+GreenSorcererRed
+
+
+GreenSorcererWhite
+
+
+GreenSorcererYellow
+
+
+GreenTankTop
+
+
+GreenTicket
+
+
+GreenTurtleneck
+
+
+GreenVNeckSweater
+
+
+GreenWizardHat
+
+
+GreenWrap
+
+
+Grenadier
+
+
+GrimaceOfDementia
+
+
+Grimoire
+Zauberbuch
+
+Grinchboo
+
+
+GroovyHat
+
+
+GrubSlime
+
+
+Guard#castle
+
+
+Guard#east1
+
+
+Guard#east3
+
+
+Guard#govt_in
+
+
+Guard#govt_out
+
+
+Guard#port1
+
+
+Guard#port2
+
+
+Guard#school
+
+
+GuardianWings
+
+
+GumiCandy
+
+
+Gungnir
+
+
+Gunney
+
+
+GutBuster
+
+
+GuyFawkesMask
+
+
+Gwendolyn
+
+
+Gwendolyn Bowmaker
+
+
+Hail adventurer! You are well on your way to mastering the beasts of the island.
+
+
+Halas
+
+
+Halberd
+Hellebarde
+
+Hall Of Acorns
+
+
+Hall Of Base Level
+
+
+Hall Of Fortune
+
+
+Hall Of Guilds
+
+
+Hall Of Job Level
+
+
+Hall Of Lethality
+
+
+Hamond
+
+
+HardSpike
+
+
+Harper
+
+
+Hasan
+
+
+Have a good day!
+Hab einen schönen Tag!
+
+Have fun with those spells and use them to cause hate, anger and death.
+
+
+Have you practiced enough?
+
+
+He is a kind old man. He stays mostly with his books and his apprentice, though we have chatted a few times.
+
+
+HeartGlasses
+
+
+HeartNecklace
+
+
+HeartOfIsis
+
+
+HeartOfLazurite
+
+
+Heathin
+
+
+HeathinDebug
+
+
+Hello! Can I help you?
+
+
+Hello! How are you? Did you already visit Hurnscald?
+
+
+Hello, Adventurer! Have you come back to help?
+
+
+Hello, I'm Alacrius.
+
+
+Hello.
+Hallo.
+
+Henriikka
+
+
+Here is another useful one: '%s'. It will tell you the stats of the target monster, so you can know how dangerous it is.
+
+
+Here you go!
+
+
+Hetchel
+
+
+HetchelDebug
+
+
+Hey! Good to hear from you!
+
+
+Heya!
+Heya!
+
+Hi.
+Hi.
+
+Hide from monsters: %s
+
+
+HighPriestCrown
+
+
+Hinnak
+
+
+HitchhikersTowel
+
+
+Hm... Shhhh...
+Hm... Schhhh...
+
+Hmm. I wanted to teach you something, but I've forgotten what it was... please come back later.
+
+
+Hmm... how about this: you help me with a few of my experiments, and I tell you?
+
+
+Honey
+Honig
+
+House Maggot
+
+
+How about changing my body type?
+
+
+How can I help you?"
+
+
+How did you...
+
+
+How do I know you will not run off to Sagatha with what I would be teaching you?
+
+
+How much do you want to deposit?
+Wieviel möchtest du einzahlen?
+
+How much do you want to withdraw?
+Wieviel möchtest du abheben?
+
+How sad to hear how manners have degenerated in recent centuries. Farewell for now, dear mortal.
+
+
+Howdy?
+Howdy?
+
+Hrmm, no looks like only %d out of 5 have been found.
+
+
+Hungry Fluffy
+
+
+Huntsman Spider
+
+
+Hurnscald North Dock
+
+
+Hurnscald North Koga
+
+
+Hurnscald South Dock
+
+
+Hurnscald South Koga
+
+
+Hydusun
+
+
+Hyvern
+
+
+HyvernStinger
+
+
+I always need components for my own healing spells. If you bring me ten gamboge leaves, ten alizarin leaves, ten mauve leaves and ten cobalt leaves, I can make ten lifestones; I will give you half of them.
+
+
+I am sorry, but I don't think that I know anything that would help you.
+
+
+I can trade you %d %ss for %d %s and %d GP.
+
+
+I can't stay here and talk all day. I have a job to do.
+Ich kann nicht den ganzen Tag hier rumstehen und reden. Ich habe einen Job zu erledigen.
+
+I changed my mind.
+Ich hab meine Meinung geändert.
+
+I do not know, though I suggest to seek out a local alchemist, if there is any.
+
+
+I have homework to do...
+
+
+I have taught thee all I can teach for now.
+
+
+I hope you like this color.
+Hoffentlich gefällt dir diese Farbe.
+
+I just want to live my life in peace.
+Ich möchte nur in Frieden leben.
+
+I know not what brought thee hither, but I kindly ask that thou leavest me alone in my sorrow.
+
+
+I like you, so I'll tell you the bad word. But you can't tell anyone else about it! The bad word is %s.'
+
+
+I lost my towel...
+
+
+I need to finish studying for my test...
+
+
+I said %s.
+
+
+I see you killed all the %s needed.
+
+
+I think I would like to observe you for a little longer to see if you would make a good healer.
+
+
+I want to sleep...
+
+
+I want to teach you my favorite. However, you are not powerful enough to use it yet; You will first have to absorb more magic from the mana seed.
+
+
+I will make quick work of your wounds.
+
+
+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.
+
+
+I will only teach you magic of the school of Life, and that only if you prove yourself to be a good healer – that is, if you use your powers to help others.
+
+
+I would like to perform money transactions.
+Ich würde gerne Geldgeschäfte erledigen.
+
+I would like to store some items.
+Ich würde gerne einige Gegenstände einlagern.
+
+I'd like to get a different style.
+Ich hätte gerne einen anderen Stil.
+
+I'll be waiting here, come back and see after you've killed those mobs.
+
+
+I'm a little busy right now.
+Ich bin gerade ein kleines bisschen beschäftigt.
+
+I'm done.
+Ich bin fertig.
+
+I'm fine for now, thank you.
+Momentan ist alles super, danke dir.
+
+I'm hoping to animate them into the shape of one of those odd log heads.
+
+
+I'm sorry, but I am not yet convinced that you are a good enough healer. Please continue in your endeavors.
+
+
+I'm sorry, but I can't help you with that.
+
+
+I'm supposed to combine two potions to create a %s, but I can't seem to figure out which two to combine...
+
+
+I'm trying to get work on my Alchemy homework, but I'm having some trouble.
+
+
+Ian
+
+
+Ian the Guide
+
+
+Ice Element
+
+
+Ice Goblin
+
+
+Ice Skull
+
+
+IceCube
+
+
+IceGladius
+
+
+IcedWater
+
+
+If the rumors are true and there really is a Mana Seed, then that would be wonderful news – perhaps we will have a few more healers soon!
+
+
+If you meant to reset the drop rate to its default value: @droprate default
+
+
+If you meant to reset the exp rate to its default value: @exprate default
+Wenn du die exp Rate auf den Standardwert zurücksetzen willst: @exprate default
+
+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: '%s'. Then press the root to the ground.
+
+
+If you're using another client, settings and controls may be different.
+
+
+Iivo
+
+
+IlliaCMobs051-3
+
+
+IlliaDMobs051-1
+
+
+IlliaFMobs051-1
+
+
+Imec
+
+
+Impossible to resync: You are dead.
+
+
+In that dresser there are some clothes you can wear.
+
+
+Inac
+
+
+Inar
+
+
+InfantryHelmet
+
+
+Inn
+Gasthaus
+
+Inspector#Hurnscald
+
+
+Internalize this feeling, and if your backpack was pressing on you you should no longer feel it now. We call it %s and it is a passive spell.
+
+
+Interval: (none, only sent on login)
+Intervall: (keins, nur zum Login gesendet)
+
+Interval: every @@ hour(s)
+Intervall: alle @@ Stunde(n)
+
+Invalid map mask
+
+
+Invalid parameter specified, blame saulc.
+
+
+Inya
+
+
+Iormo
+
+
+IronArrow
+
+
+IronIngot
+
+
+IronOre
+
+
+IronPotion
+
+
+IronPowder
+
+
+Ishi
+
+
+Ishyah
+
+
+Ismo
+
+
+Issay
+
+
+It appears to be an ordinary sword.
+
+
+It is a sunny day, don't you think?
+Ein schöner sonniger Tag, findest du nicht?
+
+It is already raining!
+
+
+It looks like you can't carry anything else for now.
+Sieht so aus, als könntest du gerade nichts mehr tragen.
+
+It might be a good idea to drag the spell to the shortcut window, so you can target and attack using your keyboard instead of mouse.
+
+
+It seems you did not tell me the correct ingredients. Come back when you find the correct ones.
+
+
+It seems you found %d out of 5 of my friends.
+
+
+It seems you managed to amass quite a fortune!
+
+
+It was impossible to conjure rain clouds on this map.
+
+
+It worked!
+
+
+Items: %s
+
+
+Iten
+
+
+Itka
+
+
+J.P. Morbid
+
+
+Jack
+
+
+Jack O
+
+
+JackOLantern
+
+
+Jackal
+
+
+JadeEgg
+
+
+Jail Lock 1
+
+
+Jail Lock 2
+
+
+Jail Lock 3
+
+
+Jail Lock 4
+
+
+Janika
+
+
+JarofBlood
+
+
+JarofOwnBlood
+
+
+JazzyHat
+
+
+JeansChaps
+
+
+JeansShorts
+
+
+JellAhh
+
+
+JellyBeans
+
+
+JellySkull
+
+
+Jena the Traveler
+
+
+Jeric
+
+
+Jerry
+
+
+Jessie
+
+
+JesterMask
+
+
+Jhedia
+
+
+Joan
+
+
+Joelin
+
+
+Jonathan
+
+
+Josh
+
+
+Julia
+Julia
+
+KPS Manager
+
+
+Kaan
+
+
+Kaan grins mischieviously.
+
+
+Kadiya
+
+
+Kage Golem
+
+
+Kane
+
+
+Katze
+
+
+Keep in mind this spell only works on yourself or party/guild companions. It will reduce your attack speed so keep this in mind.
+
+
+Keep moving pal.
+
+
+Kekeke... excellent! Yes, here goes your first spell, and it is even a passive: the flying backpack! If you are overloaded, it will take the load off your shoulders.
+
+
+Kfahr
+
+
+Khoenan the Traveler
+
+
+KidBook
+
+
+Kilis
+
+
+Kimarr
+
+
+Knife
+Messer
+
+KnightsHelmet
+
+
+KnitCap
+
+
+Knitra the Traveler
+
+
+Knowledgeable Tree
+
+
+Knox the Traveler
+
+
+Koyntety
+
+
+Kristian
+
+
+Kullervo
+
+
+Kylian
+Kylian
+
+KylianDebug#1
+
+
+KylianDebug#2
+
+
+Kytty
+
+
+LacedChocolateCake
+
+
+LacedOrangeCupcake
+
+
+LactoseFreeAcorn
+
+
+Lady Skeleton
+
+
+LadyFingers
+
+
+LargeHealingPotion
+
+
+LargeManaElixir
+
+
+Larvern
+
+
+Latif
+
+
+Latoy
+
+
+Lava Slime
+
+
+LazuriteCrystal
+
+
+LazuriteRobe
+
+
+LazuriteShard
+
+
+Leafing through the manuscript, you find that you can read little of the tiny handwriting and understand only a fraction of what is said.
+
+
+Leafing through the manuscript, you find that you understand too little of what is written to make any sense of it.
+
+
+LeatherBall
+
+
+LeatherGloves
+
+
+LeatherGoggles
+
+
+LeatherPatch
+
+
+LeatherShield
+
+
+LeatherShirt
+
+
+LeatherSuitcase
+
+
+LeatherTrousers
+
+
+Leave it alone.
+
+
+Lena
+
+
+Lenita
+
+
+Leofwin
+
+
+Lesser Ghost
+
+
+Let me give you a lifestone to get started with.
+
+
+Let's see whats on the list. Ah ok, I need you to kill me %d %s.
+
+
+Lets start with a basic wand attack: %s.
+
+
+Liana
+
+
+Lieutenant Dausen
+
+
+Lifestone
+
+
+LightBlueBeret
+
+
+LightBlueBowlerHat
+
+
+LightBlueBowlerHatBrown
+
+
+LightBlueContributor
+
+
+LightBlueCottonBoots
+
+
+LightBlueCottonCloth
+
+
+LightBlueCottonGloves
+
+
+LightBlueCottonHeadband
+
+
+LightBlueCottonShirt
+
+
+LightBlueCottonShorts
+
+
+LightBlueCottonSkirt
+
+
+LightBlueCottonTrousers
+
+
+LightBlueDesertHat
+
+
+LightBlueDye
+
+
+LightBlueFineDress
+
+
+LightBlueMiniskirt
+
+
+LightBlueRabbitEars
+
+
+LightBlueShades
+
+
+LightBlueShortTankTop
+
+
+LightBlueSilkRobe
+
+
+LightBlueSorcererBlack
+
+
+LightBlueSorcererDBlue
+
+
+LightBlueSorcererDGreen
+
+
+LightBlueSorcererGreen
+
+
+LightBlueSorcererLBlue
+
+
+LightBlueSorcererOrange
+
+
+LightBlueSorcererPink
+
+
+LightBlueSorcererPurple
+
+
+LightBlueSorcererRed
+
+
+LightBlueSorcererWhite
+
+
+LightBlueSorcererYellow
+
+
+LightBlueTankTop
+
+
+LightBlueTurtleneck
+
+
+LightBlueVNeckSweater
+
+
+LightBlueWizardHat
+
+
+LightCrystal
+
+
+LightPlatemail
+
+
+LimeHitchhikersTowel
+
+
+LockPicks
+
+
+Log Head
+
+
+LollipopColor1
+
+
+LollipopColor2
+
+
+LollipopColor3
+
+
+LongSword
+
+
+Lora Tay
+
+
+Lora Tay Debug
+
+
+Lorrie
+
+
+Lost? Confused? Want to know why you can't get past a quest, overcome an NPC or find an item? Check %s for player hints, walkthroughs, item lists and more!
+
+
+LoveLetter
+
+
+LovePotion
+
+
+Lovely Maggot
+
+
+Lovers
+
+
+Luca
+
+
+Luvia
+
+
+Luvia?
+
+
+MTJarofOwnBlood
+
+
+MageRing
+
+
+MagentaHint
+
+
+MagentaOrnament
+
+
+Maggot
+Made
+
+MaggotSlime
+
+
+Magic Sword
+
+
+Magic flows naturally from you, readily and with ease. You feel in perfect control of your magic.
+
+
+MagicGMTopHat
+
+
+Malek
+
+
+Malivox
+
+
+Mallard's Eye
+
+
+Mana Bug
+
+
+Mana Ghost
+
+
+Mana Slayer
+
+
+Mana Tyrant
+
+
+ManaGuardian
+
+
+ManaPotion
+
+
+Manually trigger the current broadcast
+Aktuelle Ankündigung manuell auslösen
+
+Maria
+
+
+Marikel
+
+
+Marshmallow
+
+
+Mauve Plant
+Malvenpflanze
+
+MauveHerb
+
+
+Mede
+
+
+MediumHealingPotion
+
+
+MediumManaElixir
+
+
+Melinda
+
+
+Meluna
+
+
+Meridith the Traveler
+
+
+Merry Christmas!
+
+
+Merry Christmas, adventurer.
+
+
+Merry Christmas, arr yarr!!
+
+
+Message:
+Nachricht:
+
+Michel
+
+
+Mika
+
+
+Mike
+
+
+Mikhail
+Mikhail
+
+Miler
+
+
+Milis
+
+
+Milk
+
+
+Milly
+Milly
+
+MillyDebugHelper
+
+
+Mine Debug#1
+
+
+Mine Debug#2
+
+
+Mine Debug#3
+
+
+Mine Debug#4
+
+
+Miner
+
+
+MinerGloves
+
+
+MinersHat
+
+
+Miniskirt
+
+
+Mirak
+
+
+Miriam
+
+
+Mirjami
+
+
+Miro
+
+
+Mirror#wiz
+
+
+Mjolnir
+
+
+Mo
+
+
+Mob points: %s
+
+
+Moggun
+
+
+Money transference will have a %d %% fee as well.
+
+
+MoneyChanger
+
+
+Monocle
+
+
+MonsterOilPotion
+
+
+MonsterSkullHelmet
+
+
+Monsters Killed in PvE: %s
+
+
+Moo!
+Muuh!
+
+Moonshroom
+
+
+MoonshroomHat
+
+
+Moooo!
+Muuuuh!
+
+Moooooo!
+Muuuuuuuuuuh!
+
+Moooooooooooo!
+Muuuuuuuuuuuuuuuuuuuh!
+
+MopoxCurePotion
+
+
+Morgan#_M
+
+
+MorganDebug
+
+
+Motto#wiz
+
+
+Mouboo
+Mouboo
+
+MoubooFigurine
+
+
+MoubooHead
+
+
+MoubootaurHead
+
+
+Mountain Snake
+
+
+MountainSnakeEgg
+
+
+MountainSnakeTongue
+
+
+MovieCap
+
+
+Much better, right?!
+
+
+Munro
+
+
+MurdererCrown
+
+
+MushHat
+
+
+My breath smells bad.
+Ich habe Mundgeruch.
+
+My name is Kaan, I'm Tanisha's brother."
+
+
+My spell only works on the very young, sorry.
+
+
+MylarinDust
+
+
+Mystic Sword
+
+
+Naah, you're too weak now! Come back later when you have grown!
+
+
+Naem
+
+
+Narrator
+Erzähler
+
+Nathan
+
+
+Nea
+
+
+Need a healing?
+
+
+Neko
+
+
+Never (only on login)
+Nie (nur beim Login)
+
+Next broadcast: (never)
+Nächste Ankündigung: (nie)
+
+Next broadcast: @@
+Nächste Ankündigung: @@
+
+Next ingredient.
+
+
+Next, I shall teach you a higher-level transmutation spell.
+
+
+Next, a nature spell. Take a cocoon shell. Hold it in your hand. Feel its lightness.
+
+
+Next, say '%s', and feel your skin grow rigid! Very useful against stings and stabs and pokes and pricks and that sort of stuff. Lowers attack speed and only works on yourself, party, or guild allies, though.
+
+
+Nice day to you.
+Einen schönen Tag dir.
+
+Nicholas
+
+
+Nickos
+
+
+Nigel
+
+
+Nikolai
+
+
+Nina the Traveler
+
+
+Nivalis Dock
+
+
+Nivalis Koga
+
+
+No
+Nein
+
+No, I am sorry. Please bring me ten leaves each of gamboge, alizarin, mauve, and cobalt.
+
+
+No, thanks. I already know how things are going.
+
+
+No, you are not powerful enough yet. Please come back and ask me again when you have learned to control more powerful magic, though!
+
+
+No.
+Nein.
+
+NohMask
+
+
+Nonsense! You look fine and dandy to me. All you need is a bit more exercise and fresh fruit in your diet!
+
+
+Not in the mood to chat.
+Ich bin nicht in der Stimmung, mich zu unterhalten.
+
+Not resync'ing to prevent flood.
+
+
+Not yet.
+Noch nicht.
+
+Notable mentions and thanks for our [@@https://www.patreon.com/themanaworld|sponsors@@] for their continued support.
+
+
+Note
+Hinweis
+
+Note#bar
+
+
+Note#mirak
+
+
+Note#wiz
+
+
+Note: Transfering items on mail cost %s GP/item
+
+
+Nothing happens.
+
+
+Now get the clothes out of the dresser.
+
+
+Now hold still, this won't hurt a bit...
+
+
+Now leave. Spread chaos with the spells I have taught you!
+
+
+Now that you are a student of mine, I will teach you some spells.
+
+
+Now that you know the basics of nature magic, here is one of my favourites: '%s' will summon rain, whereever you are standing. It will consume a bottle of water, though.
+
+
+Now, listen carefully: to make a short tank top out of three pieces of cloth, you must use the invocation '%s'.
+
+
+Nurse
+
+
+Nutcracker
+
+
+NutcrackerHat
+
+
+Nyle
+
+
+Observe!
+
+
+Oh dear! That looks like poison; hang on...
+
+
+Oh look, it is Cupid!
+
+
+Oh, I can't be sure... but something like '%s', I think.
+
+
+Oh, I have only met Sagatha once or twice, while collecting herbs. She is a warm and gentle person, but she tries to hide it.
+
+
+Oh, and a fruit may even fall for you if you are lucky! But stay alert to pick up your drops.
+Es könnte sogar eine Frucht für dich herunterfallen, wenn du Glück hast. Denk aber daran, deine Beute einzusammeln.
+
+Oh, and by the way my name is Sorfina."
+
+
+Oh, but of course! You are powerful enough to make your own lifestones, using the enchantment '%s'. This will consume a bug leg, a maggot slime and one of each of the four healing herbs, though.
+
+
+Oh, sorry – I don't really know him very well.
+
+
+Oh, you found them all! Good job! Now it's my turn with searching again. Go and hide!
+
+
+Oh.
+
+
+Oh... it seems that you have no room for the lifestones. But please do come back later when you have made a little space.
+
+
+Oh... you managed to put things into every little nook and pocket, haven't you? Well, come back later, I will give it to you then.
+
+
+Ok, done.
+Ok, erledigt.
+
+Okay let me try this.
+
+
+Olana
+
+
+Old Chest#crastur
+
+
+Old Man
+
+
+Old Wizard#_W
+
+
+Old Woman
+
+
+Omar
+
+
+Once this is done you have to throw it in the air and scream %s and the two roots will turn into toxic darts, a projectile you can throw.
+
+
+Only %s in storage will be counted.
+
+
+Ontas
+
+
+OpenPresentBox
+
+
+OperaMask
+
+
+Or, well, both.
+
+
+Orange
+
+
+OrangeBeret
+
+
+OrangeBowlerHat
+
+
+OrangeBowlerHatBrown
+
+
+OrangeCake
+
+
+OrangeContributor
+
+
+OrangeCottonBoots
+
+
+OrangeCottonCloth
+
+
+OrangeCottonGloves
+
+
+OrangeCottonHeadband
+
+
+OrangeCottonShirt
+
+
+OrangeCottonShorts
+
+
+OrangeCottonSkirt
+
+
+OrangeCottonTrousers
+
+
+OrangeCupcake
+
+
+OrangeDesertHat
+
+
+OrangeDye
+
+
+OrangeEggshellHat
+
+
+OrangeFineDress
+
+
+OrangeHint
+
+
+OrangeHitchhikersTowel
+
+
+OrangeLollipop
+
+
+OrangeMiniskirt
+
+
+OrangeRabbitEars
+
+
+OrangeRose
+
+
+OrangeRoseHat
+
+
+OrangeShades
+
+
+OrangeShortTankTop
+
+
+OrangeSilkRobe
+
+
+OrangeSorcererBlack
+
+
+OrangeSorcererDBlue
+
+
+OrangeSorcererDGreen
+
+
+OrangeSorcererGreen
+
+
+OrangeSorcererLBlue
+
+
+OrangeSorcererOrange
+
+
+OrangeSorcererPink
+
+
+OrangeSorcererPurple
+
+
+OrangeSorcererRed
+
+
+OrangeSorcererWhite
+
+
+OrangeSorcererYellow
+
+
+OrangeSummonFlower
+
+
+OrangeTankTop
+
+
+OrangeTulip
+
+
+OrangeTurtleneck
+
+
+OrangeVNeckSweater
+
+
+OrangeWizardHat
+
+
+OrchidBra
+
+
+Orum
+
+
+Orum#barrier
+
+
+Orum#trap
+
+
+Orum's Homunculus
+
+
+OrumDebug
+
+
+Oscar
+
+
+Oskari
+
+
+Osmo
+
+
+Oswal
+
+
+Other
+Sonstiges
+
+Other.
+Sonstiges.
+
+OverlordsHelmet
+
+
+PS. Doesn't always work. You need an account at %s and to be at ManaPlus Team.
+
+
+PVPCap
+
+
+PVPCoin
+
+
+Pachua
+
+
+Painless, wasn't it?
+
+
+PaladinsHelmet
+
+
+PanHat
+
+
+PaperBag
+
+
+Parcival
+
+
+Parua
+
+
+Pauline
+
+
+PaulineDebug
+
+
+Pear
+
+
+Pearl
+Perle
+
+Peetu
+
+
+Personal Information
+
+
+Peter
+Peter
+
+Phaet
+
+
+Phaet#arena
+
+
+Phil
+
+
+Phylactery
+
+
+PickledBeets
+
+
+PileOfAsh
+
+
+PilotHat
+
+
+Pink Flower
+
+
+PinkAntenna
+
+
+PinkBeret
+
+
+PinkBowlerHat
+
+
+PinkBowlerHatBrown
+
+
+PinkChristmasSweater
+
+
+PinkContributor
+
+
+PinkCottonBoots
+
+
+PinkCottonCloth
+
+
+PinkCottonGloves
+
+
+PinkCottonHeadband
+
+
+PinkCottonShirt
+
+
+PinkCottonShorts
+
+
+PinkCottonSkirt
+
+
+PinkCottonTrousers
+
+
+PinkDesertHat
+
+
+PinkDye
+
+
+PinkEasterEgg
+
+
+PinkFineDress
+
+
+PinkHitchhikersTowel
+
+
+PinkMiniskirt
+
+
+PinkPetal
+
+
+PinkRabbitEars
+
+
+PinkRose
+
+
+PinkRoseHat
+
+
+PinkShades
+
+
+PinkShortTankTop
+
+
+PinkSilkRobe
+
+
+PinkSorcererBlack
+
+
+PinkSorcererDBlue
+
+
+PinkSorcererDGreen
+
+
+PinkSorcererGreen
+
+
+PinkSorcererLBlue
+
+
+PinkSorcererOrange
+
+
+PinkSorcererPink
+
+
+PinkSorcererPurple
+
+
+PinkSorcererRed
+
+
+PinkSorcererWhite
+
+
+PinkSorcererYellow
+
+
+PinkTankTop
+
+
+PinkTicket
+
+
+PinkTulip
+
+
+PinkTurtleneck
+
+
+PinkVNeckSweater
+
+
+PinkWizardHat
+
+
+Pinkie
+
+
+Pinkie Scroll
+
+
+PinkieHat
+
+
+PinkieHelmet
+
+
+Pipe
+
+
+PirateHat
+
+
+PlatynaRedDress
+
+
+Players Killed in PvP: %s
+
+
+Players breaking the following rules may be banned for any length of time (even permanently) or have their characters reset at a GM's discretion:
+
+
+Please enter the message:
+Bitte gib die Nachricht ein:
+
+Please equip your ammo first!
+
+
+Please insert your pincode.
+
+
+Please leave me in peace.
+
+
+Please select a quest:
+Bitte wähle eine Quest:
+
+Please select the desired body type:
+
+
+Please select the interval:
+Bitte wähle das Intervall:
+
+Please stand still.
+
+
+Plum
+
+
+PlushMouboo
+
+
+PointyWitchHat
+
+
+Poison Skull
+
+
+Pollett
+
+
+PollettEgg
+
+
+Poltergeist
+
+
+PoltergeistPowder
+
+
+Pot
+
+
+Potions#_M
+
+
+Practice! There are no secrets to becoming a warrior.
+Ãœbung macht den Meister! Es gibt keine Geheimnisse beim Kriegerhandwerk.
+
+Present#1
+
+
+Present#2
+
+
+Present#3
+
+
+Psi Brain
+
+
+Pumpkin
+Kürbis
+
+PumpkinHelmet
+
+
+PumpkinSeeds
+
+
+PurificationPotion
+
+
+PurpleBeret
+
+
+PurpleBowlerHat
+
+
+PurpleBowlerHatBrown
+
+
+PurpleContributor
+
+
+PurpleCottonBoots
+
+
+PurpleCottonCloth
+
+
+PurpleCottonGloves
+
+
+PurpleCottonHeadband
+
+
+PurpleCottonShirt
+
+
+PurpleCottonShorts
+
+
+PurpleCottonSkirt
+
+
+PurpleCottonTrousers
+
+
+PurpleDesertHat
+
+
+PurpleDye
+
+
+PurpleFineDress
+
+
+PurpleHint
+
+
+PurpleHitchhikersTowel
+
+
+PurpleMiniskirt
+
+
+PurplePresentBox
+
+
+PurpleRabbitEars
+
+
+PurpleShades
+
+
+PurpleShortTankTop
+
+
+PurpleSilkRobe
+
+
+PurpleSorcererBlack
+
+
+PurpleSorcererDBlue
+
+
+PurpleSorcererDGreen
+
+
+PurpleSorcererGreen
+
+
+PurpleSorcererLBlue
+
+
+PurpleSorcererOrange
+
+
+PurpleSorcererPink
+
+
+PurpleSorcererPurple
+
+
+PurpleSorcererRed
+
+
+PurpleSorcererWhite
+
+
+PurpleSorcererYellow
+
+
+PurpleStripedWrap
+
+
+PurpleSummonFlower
+
+
+PurpleTankTop
+
+
+PurpleTicket
+
+
+PurpleTulip
+
+
+PurpleTurtleneck
+
+
+PurpleVNeckSweater
+
+
+PurpleWizardHat
+
+
+PurpleWrap
+
+
+Pyry
+
+
+Quest @@ modified by GM
+
+
+Quest debug
+Quest Debug
+
+QuillOfBinding
+
+
+Quit
+Beenden
+
+RIP#1
+
+
+RIP#10
+
+
+RIP#2
+
+
+RIP#3
+
+
+RIP#4
+
+
+RIP#5
+
+
+RIP#6
+
+
+RIP#7
+
+
+RIP#8
+
+
+RIP#9
+
+
+RabbitEars
+
+
+RaggedShorts
+
+
+Raging
+
+
+RangerHat
+
+
+Rasin
+
+
+Rauk
+
+
+RawAir
+
+
+RawLog
+
+
+RawTalisman
+
+
+ReadingGlasses
+
+
+RealisticBrain
+
+
+Reaper
+
+
+Reathe
+
+
+Rebecca
+
+
+Receptionist#inn
+
+
+Receptionist#mine
+
+
+Red Bone
+
+
+Red Scorpion
+
+
+Red Slime
+Roter Schleim
+
+Red Spark
+
+
+RedApple
+
+
+RedBeret
+
+
+RedBowlerHat
+
+
+RedBowlerHatBrown
+
+
+RedChristmasStocking
+
+
+RedContributor
+
+
+RedCottonBoots
+
+
+RedCottonCloth
+
+
+RedCottonGloves
+
+
+RedCottonHeadband
+
+
+RedCottonShirt
+
+
+RedCottonShorts
+
+
+RedCottonSkirt
+
+
+RedCottonTrousers
+
+
+RedDesertHat
+
+
+RedDottedWrap
+
+
+RedDye
+
+
+RedEasterEgg
+
+
+RedEggshellHat
+
+
+RedFineDress
+
+
+RedGoldenStripedWrap
+
+
+RedHint
+
+
+RedHitchhikersTowel
+
+
+RedMiniskirt
+
+
+RedNose
+
+
+RedOrnament
+
+
+RedPowder
+
+
+RedPresentHat
+
+
+RedRabbitEars
+
+
+RedRose
+
+
+RedRoseHat
+
+
+RedSaddleRug
+
+
+RedScorpionStinger
+
+
+RedShades
+
+
+RedShortTankTop
+
+
+RedSilkRobe
+
+
+RedSorcererBlack
+
+
+RedSorcererDBlue
+
+
+RedSorcererDGreen
+
+
+RedSorcererGreen
+
+
+RedSorcererLBlue
+
+
+RedSorcererOrange
+
+
+RedSorcererPink
+
+
+RedSorcererPurple
+
+
+RedSorcererRed
+
+
+RedSorcererWhite
+
+
+RedSorcererYellow
+
+
+RedStockings
+
+
+RedSummonFlower
+
+
+RedTankTop
+
+
+RedTicket
+
+
+RedTulip
+
+
+RedTurtleneck
+
+
+RedVNeckSweater
+
+
+RedWizardHat
+
+
+ReedBundle
+
+
+Reid's Ghost
+
+
+Reinboo
+
+
+Reino
+
+
+Remember, they're hiding somewhere on the island, you will have to explore to find them. They could be hiding anywhere.
+
+
+Remove all focus skills
+
+
+Repeat how many times?
+Wie oft wiederholen?
+
+Repeat: @@ times
+Wiederholen: @@ mal
+
+Resist Ailment
+
+
+Return to Super Menu
+Zum Super-Menü zurückkehren
+
+Return to my sister now. I expect that she shall teach thee one more spell.
+
+
+Rhutan the Traveler
+
+
+Richard
+
+
+Rikhard
+
+
+Riskim
+
+
+RoastedAcorn
+
+
+RoastedMaggot
+
+
+Robert
+
+
+RockKnife
+
+
+Root
+
+
+Rosen
+
+
+Rossy
+
+
+RottenRags
+
+
+Rouge#Duels
+
+
+Roulette
+
+
+Rrrr... Pchhhh...
+Rrrr... Pchhhh...
+
+RubberBat
+
+
+Ruby
+Rubin
+
+RubyPowder
+
+
+RubyRing
+
+
+Rudolph Slime
+
+
+RunestoneA
+
+
+RunestoneL
+
+
+RunestoneN
+
+
+RunestoneT
+
+
+RunestoneW
+
+
+Ryan
+
+
+Rynoh
+
+
+SUSAN
+
+
+Sabine
+
+
+Sabre
+
+
+Sagatha#_M
+
+
+SailorHat
+
+
+Samuel
+
+
+SandCutter
+
+
+Sandra
+
+
+Santa Slime
+
+
+Santa's Helper
+
+
+SantaBeardHat
+
+
+SantaCookie
+
+
+SantaHat
+
+
+SantaSnowGlobe
+
+
+Santaboo
+
+
+Santeri
+
+
+Sapphire
+Saphir
+
+SapphirePowder
+
+
+SapphireRing
+
+
+Sara
+
+
+Sarah
+
+
+Sasquatch
+
+
+Savaric
+
+
+SaviorArmor
+
+
+Say %s to make your roots into toxic darts.
+
+
+Saying#wiz
+
+
+ScarabArmlet
+
+
+Scared Man
+
+
+ScentedCandleHelmet
+
+
+Scheduled broadcasts
+Angesetzte Ankündigungen
+
+Scheduled broadcasts - Create new
+Angesetzte Ankündigungen - neu erstellen
+
+Scimitar
+
+
+Scissors
+Schere
+
+Scorpion
+Skorpion
+
+Scorpion King
+
+
+ScorpionStinger
+
+
+Scythe
+Sense
+
+Sea Slime
+
+
+Sea Slime Mother
+
+
+SealedSoul
+
+
+See you later!
+Bis nachher!
+
+See you soon!
+Auf bald!
+
+See you!
+Tschüß!
+
+Selim
+
+
+Sema
+
+
+Send 10 times
+10mal senden
+
+Send 2 times
+2mal senden
+
+Send 20 times
+20mal senden
+
+Send 3 times
+3mal senden
+
+Send 5 times
+5mal senden
+
+Send indefinitely
+Unbegrenzt senden
+
+Send only once
+Einmalig senden
+
+Send this message also on login?
+Die Nachricht auch beim Login anzeigen?
+
+Sent on login: @@
+Beim Login angezeigt: @@
+
+Sent on login: yes
+Beim Login angezeigt: ja
+
+Sent: @@ times out of @@
+Gesendet: @@ von @@mal
+
+SerfHat
+
+
+Serqet
+
+
+Set a new broadcast
+Neue Ankündigung erstellen
+
+Setzer
+Setzer
+
+Shannon
+
+
+SharpKnife
+
+
+She hesistates.
+
+
+She looks at you suspiciously.
+
+
+She performs a complicated gesture.
+
+
+She picks up all forty and presses them together in her hands, then whispers something.
+
+
+She smiles at you.
+
+
+She smiles.
+
+
+She takes away her hands and looks up.
+
+
+She walks up to you, holds your shoulders, and smiles at you.
+
+
+She was babbling at me about it all the morning until I sent her to take care of the maggots in the cafe.
+
+
+Sherman the Traveler
+
+
+ShockSweet
+
+
+ShortBow
+
+
+ShortSword
+
+
+ShortTankTop
+
+
+ShroomHat
+
+
+Sign
+
+
+SilkCocoon
+
+
+SilkGloves
+
+
+SilkHeadband
+
+
+SilkPants
+
+
+SilkRobe
+
+
+SilkSheet
+
+
+Silkworm
+Seidenraupe
+
+SilverFourLeafAmulet
+
+
+SilverMirror
+
+
+Silvia
+
+
+SimpleRing
+
+
+Skeleton
+Skelett
+
+SkeletonCharm
+
+
+Skill can only be cast on party or guild members!
+
+
+Skull
+Schädel
+
+SkullMask
+
+
+Sleeping Bandit
+
+
+Slime Blast
+
+
+SlingBullet
+
+
+SlingShot
+
+
+Slots#1
+
+
+Slots#2
+
+
+Slots#3
+
+
+Slots#4
+
+
+Slots#5
+
+
+Slots#6
+
+
+Slots#7
+
+
+SlowPoisonPotion
+
+
+SmallCrack#XmasPassage
+
+
+SmallHealingPotion
+
+
+SmallManaElixir
+
+
+SmallMushroom
+
+
+SmileyCap
+
+
+Snail
+
+
+Snake
+
+
+SnakeEgg
+
+
+SnakeSkin
+
+
+SnakeTongue
+
+
+Snapple
+
+
+Sneaky Bandit
+
+
+SnowGoggles
+
+
+SnowLauncher
+
+
+Snowball
+
+
+Snowman
+
+
+SnowmanSnowGlobe
+
+
+So be it, fellow warrior. Hear the incantation for the blade spell: '%s'
+
+
+So you think you're tough? A warrior must also be loyal and patient.
+Du glaubst also, stark zu sein? Ein Krieger muss aber ebenso loyal und freundlich sein.
+
+So, have you managed to transmute something?
+
+
+Some forest creatures sometimes overgrow their fur or hide. That makes them uncomfortable.
+
+
+Some of it might jog your memory or at least help you catch your bearings.
+
+
+Something else?
+Noch irgendwas?
+
+Sometimes you just need to run from battle.
+
+
+SorcererBlack
+
+
+SorcererDBlue
+
+
+SorcererDGreen
+
+
+SorcererGreen
+
+
+SorcererLBlue
+
+
+SorcererOrange
+
+
+SorcererPink
+
+
+SorcererPurple
+
+
+SorcererRed
+
+
+SorcererWhite
+
+
+SorcererYellow
+
+
+Sorfina
+
+
+Sorry %%i I am really really REALLY busy right now. Maybe later, when I find my toolset, we can start focusing on something.
+
+
+Soul
+
+
+Soul Eater
+
+
+Soul Menhir
+
+
+Soul Menhir#candor
+
+
+Soul Menhir#deadmire
+
+
+Soul Menhir#hurnscald
+
+
+Soul Menhir#nivalis
+
+
+Soul Menhir#tulimshar
+
+
+Soul Snake
+
+
+Speak '%s' 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.
+
+
+Speak to me again once you've cast the spell.
+
+
+Spear
+Speer
+
+Special monsters are not counted.
+
+
+Spectre
+
+
+SpectrePowder
+
+
+Speed
+
+
+Spell#wiz1
+
+
+Spell#wiz2
+
+
+Spell#wiz3
+
+
+Spell#wiz4
+
+
+Spell#wiz5
+
+
+Spell#wiz6
+
+
+Spell#wiz7
+
+
+Spider
+Spinne
+
+Spiky Mushroom
+
+
+Spiky mushrooms often grow too many spikes, so you can shear the spikes off of some.
+
+
+Squirrel
+
+
+SquirrelPelt
+
+
+StaffOfFire
+
+
+StaffOfIce
+
+
+StaffOfLife
+
+
+Stalker
+Stalker
+
+StandardHeadband
+
+
+Start broadcasting
+Ankündigung starten
+
+Start broadcasting, and make an extra broadcast right now
+Ankündigung starten, und sofort eine extra Ankündigung einleiten
+
+Start over
+Neustart
+
+Stats: %s
+
+
+Status Condition Cleared
+
+
+Steak
+
+
+SteelShield
+
+
+Stewen
+
+
+StickReinboo
+
+
+Sticking out of the rock is a sword hilt.
+
+
+Stop broadcasting
+Ankündigung beenden
+
+Stop it!
+Hör damit auf!
+
+Store Policy#1
+
+
+Store Policy#2
+
+
+Strange Stone
+
+
+StrangeCoin
+
+
+Stranger
+
+
+Styx the Traveler
+
+
+Suddenly, you hear a strange, metallic voice in your head, the voice of a woman.
+
+
+SulphurPowder
+
+
+Sunglasses
+Sonnenbrille
+
+Supply Chest
+
+
+Surprise me!
+Ãœberrasch mich!
+
+Swashbuckler
+
+
+Swezanne
+
+
+Sword
+
+
+Syntax: @wset <map_mask>
+
+
+TMWBirthdayGift
+
+
+TUTORIAL
+
+
+Taito
+
+
+Take %s arrows, sprinkle sulphur powder over them, and then speak '%s'. Throw them high up in the air, and watch the hail unfold before thy feet.
+
+
+Take a cocoon, living or dead, and suffuse it in magic. Fell the %s, feel its lightness and feel it float! You no longer should be feeling overburned by your stolen goods, kekeke...
+
+
+Take care!
+Pass auf dich auf!
+
+Talk to you later!
+Spreche dich später!
+
+Talk to you soon!
+Wir sprechen uns bald!
+
+Talpan
+
+
+Talponian#Female
+
+
+Talponian#Male
+
+
+TamOShanter
+
+
+Tame Scorpion
+
+
+Tanisha
+
+
+TankTop
+
+
+Tathin
+
+
+Taylor
+
+
+TealEasterEgg
+
+
+TealHint
+
+
+TealHitchhikersTowel
+
+
+Tengu
+
+
+Terranite
+
+
+Terranite Armor#Female
+
+
+Terranite Armor#Male
+
+
+TerraniteArrow
+
+
+TerraniteChestArmor
+
+
+TerraniteHead
+
+
+TerraniteHelmet
+
+
+TerraniteLegs
+
+
+TerraniteOre
+
+
+Teuvo
+
+
+Thank you for using our services. Please accept this little gift.
+
+
+Thanks once again for helping with the monsters in the island.
+
+
+Thanks, @@. We just wanted to be sure it was you.
+
+
+That invocation is '%s'.
+
+
+That would be great!
+Das wäre großartig!
+
+Thats not what I said to do. Please don't skip ahead.
+
+
+The Beheader
+
+
+The Egg cracks open and a living snake comes out of the egg.
+
+
+The Lost
+
+
+The Mana World - Legacy
+
+
+The Witch takes %s and %s and put them togheter calling %s.
+
+
+The Wizard's thank thee as well.
+
+
+The deep basso voice continues.
+
+
+The doctor examines you briefly.
+
+
+The doctor pulls out a syringe and fills it with a white liquid from a jar on his desk.
+
+
+The dresser is empty.
+
+
+The explanations in this tutorial are based on the Manaplus client.
+
+
+The invocation is `%s' followed by the last syllable of the name of the creature you want to shape the log into.
+
+
+The last word on that page is '%s' and it's underlined twice with a comment next to it saying 'finally got it right.'
+
+
+The message cannot be empty
+Die Nachricht darf nicht leer sein
+
+The next spell I have will make a normal tank top out of four pieces of cloth. The invocation is '%s', make sure to write this down.
+
+
+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.'
+
+
+The spell consumes a Small Mushroom and a Dark Crystal. Shove the Dark Crystal into the Small Mushroom and yell %s.
+
+
+The spell fails!
+
+
+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.
+
+
+The spell takes a mind of its own backfires!
+
+
+The voice sounds slightly amused.
+
+
+The witch glares at you in anger.
+
+
+The witch's eyes flare up in anger as she notices you, and she turns away from you.
+
+
+The wizard looks at you with despise.
+
+
+The wizard looks at you, his eyes flashing, and laughs diabolically.
+
+
+The wizard takes the crystal and the egg, mumbling something you don't understand. Suddenly, he throws the egg into the air and throws the crystal right through it midair.
+
+
+Then I fear that I shall not reveal the spell to you either.
+
+
+Then I wish thee well in thy travels, wanderer!
+
+
+Then chant the lesser healing spell, '%s', with whoever you wish to heal targeted.
+
+
+Then come back later.
+
+
+Then concentrate your anger upon the trees hereabouts, you will gain experience whilst leveling your sword skill on them.
+Dann konzentrier deine Wut auf die Bäume hier, du wirst Erfahrung sammeln, während du dich im Schwertkampf übst.
+
+Then please stop wasting my precious time.
+
+
+Then say %s and let the mushroom's power take over. It only works on yourself, party or guild allies.
+
+
+Then tell me the ingredients for the mouboo summoning spell and give them to me. Start with the first ingredient and then tell me the second one separately.
+
+
+Then, she rises up on her tiptoes and kisses you on your forehead.
+
+
+There are %d out of 5 found.
+
+
+There is no answer.
+
+
+There is no honor in fighting a weak opponent.
+Es ist nicht ehrenhaft, gegen schwächere Gegner zu kämpfen.
+
+There you are, right as rain! Now you take care, all right?
+
+
+These will do just fine.
+
+
+They call me Sagatha.
+
+
+Thinking well, you will not be able to use it yet; you will first have to gain a greater understanding of magic overall.
+
+
+This error is fatal, we stop execution.
+
+
+This is a wand, there are many like it but this one is now yours.
+
+
+This is not a monster; I cannot use monsterinfo on it.
+
+
+This menu allows you to set the scheduled broadcast that is sent to all players at a specific interval.
+Dieses Menü ermöglicht die Erstellung einer Ankündigung, die jedem Spieler in einem bestimmten Intervall angezeigt wird.
+
+This menu gives access to quest debug menus for @@ quests.
+Dieses Menü erlaubt den Zugang zu den Debug Menüs für die @@ Quests.
+
+This powder thou shalst need to cast the lightning spell. Throw it up into the air and shout '%s', and smite thine enemies with lightning.
+
+
+This skill can only be used on monsters!
+
+
+This spell makes arrows out of a single wooden log. Its invocation is '%s'.
+
+
+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 and may even injure yourself further.
+
+
+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!
+
+
+Thou hast collected %s Monster Points. For one thousand of them, I shall admit thee to the school of war magic.
+
+
+Thug
+
+
+Thurstan
+
+
+Thurston
+
+
+Tinris
+
+
+TinyHealingPotion
+
+
+TinyManaElixir
+
+
+Tipsy Skeleton
+
+
+To cast a spell open the skill window, select the spell you wish to use, and press the %s button.
+
+
+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.
+
+
+To heal yourself, it's enough to just cast by itself, without a target selected.
+
+
+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.
+
+
+To make a shirt, use the invocation '%s'. This will require five pieces of cloth.
+
+
+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.
+
+
+To summon the snakes use %s.
+
+
+To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.
+
+
+Toggle Focus - Astral Soul
+
+
+Toggle Focus - Brawling
+
+
+Toggle Focus - Mallards Eye
+
+
+Toggle Focus - Raging
+
+
+Toggle Focus - Resist Ailment
+
+
+Toggle Focus - Speed
+
+
+Toichi
+
+
+Tondar
+
+
+Tongue
+Zunge
+
+TonoriDelight
+
+
+Toothbrush
+
+
+TopHat
+
+
+Topaz
+Topas
+
+TopazPowder
+
+
+TopazRing
+
+
+Torch#1
+
+
+Torch#2
+
+
+Torch#3
+
+
+Tormenta
+
+
+Total Gold: %s
+
+
+Total deaths: %s
+
+
+Touch it.
+
+
+Towel
+
+
+ToySabre
+
+
+Trader
+
+
+TreasureKey
+
+
+Troll
+Troll
+
+Troupe Leader
+
+
+Trying to control your magic is still rather troublesome.
+
+
+Tulimshar Dock
+
+
+Tulimshar Koga
+
+
+TurquoiseBra
+
+
+Turtleneck
+
+
+TutDebug
+
+
+Umfrey
+
+
+Umm... no... I... I don't remember anything else...
+
+
+Undead Troll
+
+
+Undead Witch
+
+
+UndeadDebug3
+
+
+UndeadDebug4
+
+
+UndeadDebug5
+
+
+UndeadEar
+
+
+UndeadEye
+
+
+UnderworldKey
+
+
+UnderworldMask
+
+
+Unfortunately, that seems to require more magical power than you can use right now. If only the Mana Seed granted you more power...
+
+
+Unfortunately, you can't make out what the transmutation is for or even whether it requires any materials...
+
+
+Unlike lesser heal, it'll heal instantly, however it still cannot help if the person has a serious injury or has been inflicted with an ailment.
+
+
+Urmas
+
+
+Urn
+
+
+Usage of @exprate without argument is deprecated, please use "@rates" instead.
+
+
+Usage: @translate <npc file>
+
+
+Use
+
+
+Use @@ to cancel.
+
+
+VNeckSweater
+
+
+Valdo
+
+
+Valia
+
+
+Valjas
+
+
+Valon
+
+
+ValonDebug
+
+
+Vampire Bat
+
+
+VampireBatWing
+
+
+Various wands and staffs are found throughout the land with many different strengths and weaknesses.
+
+
+VeganWater
+
+
+Vellamo
+
+
+Veneri
+
+
+Verneri
+
+
+Very well then, see you.
+
+
+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.
+
+
+Vicious Squirrel
+
+
+Vincent
+
+
+Vincent Debug
+
+
+Virus
+
+
+Void Archant
+
+
+Void Bat
+
+
+Void Flower
+
+
+Void Maggot
+
+
+Void Mouboo
+
+
+Void Scorpion
+
+
+Void Shroom
+
+
+Void Slime
+
+
+Void Snake
+
+
+Void Soldier
+
+
+Voltain
+
+
+WARNING: If you insert wrong pincode, you'll be disconnected.
+
+
+Waitress
+
+
+Wand
+
+
+Waric
+
+
+Waric nods at you.
+
+
+Waric#trap
+
+
+WarlordBoots
+
+
+WarlordHelmet
+
+
+WarlordPlate
+
+
+Warning#mirak
+
+
+Warning, %d remaining: %s
+
+
+WarpedLog
+
+
+Water Pump
+
+
+We refuse service to anyone who:
+
+
+We will start with an easy one. I will teach you how to summon a wicked mushroom.
+
+
+We've been taking care of you ever since. Waiting for you to wake up."
+
+
+Wedding Officiator
+
+
+WeddingRing
+
+
+Weellos
+
+
+Welcome back, apprentice.
+
+
+Welcome to my prison, mortal!
+
+
+Well
+
+
+Well %s what else can you tell me about yourself?.
+
+
+Well I can tell you some useful things, if you want to hear.
+
+
+Well, I could. However, I am not sure you are trustworthy.
+
+
+Well, either you are going mad, or that sword in the stone is talking to you.
+
+
+Well, well, well! Look at all those green bubbles coming out of your head; that looks like poisoning to me! Did you eat something rotten?
+
+
+What do you want to do with your money?
+Was möchsest du mit deinem Geld machen?
+
+What else do you need?
+Brauchst du sonst noch was?
+
+What is it is that brings thee to this place?
+
+
+What is my current hairstyle and hair color?
+Was habe ich gerade für eine Frisur und Haarfarbe?
+
+What would you like me to do?
+Was soll ich für dich tun?
+
+What're you looking at?!
+Was schaust du so blöd?!
+
+What's your race?
+
+
+Whatever the reason, she doesn't seem to like you.
+
+
+Which language do you speak?
+
+
+White Bell
+
+
+White Slime
+
+
+WhiteBellTuber
+
+
+WhiteBlanket
+
+
+WhiteCake
+
+
+WhiteCowboyHat
+
+
+WhiteEvokersRobeBlue
+
+
+WhiteFur
+
+
+WhiteHitchhikersTowel
+
+
+WhitePresentBox
+
+
+WhiteRose
+
+
+WhiteRoseHat
+
+
+WhiteSaddleRug
+
+
+WhiteSummonFlower
+
+
+WhiteTulip
+
+
+WhiteWizardRobe
+
+
+WhiteWrap
+
+
+Why are you wasting my time? Come back when you got everything I need.
+
+
+Wicked Mushroom
+
+
+Wight
+
+
+WinterGloves
+
+
+Wisp
+
+
+WispPowder
+
+
+Witch Guard
+
+
+WitchDoctorsMask
+
+
+WitchHat
+
+
+Withdraw.
+Abheben.
+
+WizardHat
+
+
+Wolfgang
+
+
+Wolvern
+
+
+WolvernPelt
+
+
+WolvernTooth
+
+
+WoodenShield
+
+
+WoodenStaff
+
+
+WraithHorn
+
+
+WumpusEgg
+
+
+Wyara is the Hurnscald town witch. She was also the town healer before the Doctor moved there.
+
+
+Wyara the Witch
+
+
+Wyara#_M
+
+
+Xakelbael
+
+
+XmasCake
+
+
+XmasCandyCane
+
+
+XmasDebug#1
+
+
+XmasDebug#2
+
+
+XmasDebug#3
+
+
+XmasDebug#4
+
+
+XmasSpawnCounter#0
+
+
+XmasSpawnCounter#1
+
+
+XmasSpawnCounter#2
+
+
+XmasSpawnManager
+
+
+YOU CAN FEEL THE POWER FLOWING TROUGH YOU.
+
+
+YOU WERE BLESSED BY JESUSALVA
+
+
+Yalina
+
+
+Yanis
+
+
+Yarr arr!
+
+
+Yeah, and she's done with the maggots.
+
+
+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.
+
+
+Yellow Slime
+Gelber Schleim
+
+YellowBeret
+
+
+YellowBowlerHat
+
+
+YellowBowlerHatBrown
+
+
+YellowContributor
+
+
+YellowCottonBoots
+
+
+YellowCottonCloth
+
+
+YellowCottonGloves
+
+
+YellowCottonHeadband
+
+
+YellowCottonShirt
+
+
+YellowCottonShorts
+
+
+YellowCottonSkirt
+
+
+YellowCottonTrousers
+
+
+YellowDesertHat
+
+
+YellowDottedWrap
+
+
+YellowDye
+
+
+YellowEasterEgg
+
+
+YellowEggshellHat
+
+
+YellowFineDress
+
+
+YellowHint
+
+
+YellowHitchhikersTowel
+
+
+YellowMiniskirt
+
+
+YellowOrnament
+
+
+YellowPowder
+
+
+YellowPresentBox
+
+
+YellowPresentHat
+
+
+YellowRabbitEars
+
+
+YellowRose
+
+
+YellowRoseHat
+
+
+YellowShades
+
+
+YellowShortTankTop
+
+
+YellowSilkRobe
+
+
+YellowSorcererBlack
+
+
+YellowSorcererDBlue
+
+
+YellowSorcererDGreen
+
+
+YellowSorcererGreen
+
+
+YellowSorcererLBlue
+
+
+YellowSorcererOrange
+
+
+YellowSorcererPink
+
+
+YellowSorcererPurple
+
+
+YellowSorcererRed
+
+
+YellowSorcererWhite
+
+
+YellowSorcererYellow
+
+
+YellowSummonFlower
+
+
+YellowTankTop
+
+
+YellowTicket
+
+
+YellowTulip
+
+
+YellowTurtleneck
+
+
+YellowVNeckSweater
+
+
+YellowWizardHat
+
+
+YellowWrap
+
+
+Yerrnk
+
+
+Yes
+Ja
+
+Yes, I helped her with the maggots.
+
+
+Yes, of course.
+
+
+Yes.
+Ja.
+
+Yeti
+
+
+YetiClaw
+
+
+YetiMask
+
+
+YetiSkinShirt
+
+
+You are already a student of Sagatha. I will not teach you anything!
+
+
+You are making progress, but you still need more practice.
+
+
+You are missing required items.
+
+
+You are still at the beginning of your path, but do keep practicing.
+
+
+You can also manually stop it at any time with: @droprate default
+
+
+You can also manually stop it at any time with: @exprate default
+Du kannst es jederzeit manuell stoppen: @exprate default
+
+You can call fluffies, too. But for them you must call out '%s' instead, with white fluffy fur instead of a spike. And don't forget the root.
+
+
+You can harden your skin with a hard spike. Hold it in your hands and speak '%s', then draw its hardness into your skin, or the skin of someone's else.
+
+
+You can help them with shearing magic. Press your hands together and say '%s'. Then touch them with your hands, and brush off any excess.
+
+
+You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.
+
+
+You can turn the log into a wooden figurine by imagining the creature whose shape you want in your head and saying `%s' followed by the last syllable of the name of the creature you want to shape it into.
+
+
+You can't make out anything else of value, so you place the manuscript back in the bookshelf.
+
+
+You cannot complete the casting correctly!
+
+
+You currently have @@ GP on your bank account.
+
+
+You didn't have any possessions on you when we found you and no one knows who you are.
+
+
+You do not have enough %s (min %d)
+
+
+You do not have enough Gold Pieces on your bank account.
+
+
+You do not have enough Gold on yourself.
+
+
+You do not have suffice magic power to make rain.
+
+
+You don't have enough magical power to learn the next healing spell yet.
+
+
+You don't look too well; let me treat your wounds.
+
+
+You feel a strange, tingling kind of warmth spread through your body.
+
+
+You feel completely overwhelmed by your magic.
+
+
+You feel in almost perfect control of your magic.
+
+
+You feel mostly in control of your magic.
+
+
+You feel quite in control of your magic.
+
+
+You feel quite overwhelmed by your magic, but are beginning to see patterns.
+
+
+You feel somewhat in control of your magic.
+
+
+You feel that you have only the bare minimum of control over your magic.
+
+
+You feel that you have very good control of your magic.
+
+
+You feel you still have a few difficulties in controlling your magic.
+
+
+You found %d out of 5 us.
+
+
+You have made good progress, but please do continue in your efforts.
+
+
+You have made good progress, but you lack the magical power to advance further. Also, I would like to observe you some more to be certain that you will make a good healer.
+
+
+You look fantastic.
+
+
+You made a cash deposit of @@ GP.
+
+
+You may find that you can transmute the powder more effectively after a while; that is perfectly natural.
+
+
+You must have been thrown off one of the ships sailing during that last tremor."
+
+
+You must practice more first.
+
+
+You need a Dagger, Sharp Knife or Knife to use!
+
+
+You need at least %d %s to use this spell!
+
+
+You need more room in your inventory.
+
+
+You need to be carrying less weight.
+
+
+You need to kill %s: %d/%d.
+
+
+You open your eyes.
+
+
+You see a girl who is holding her hands in front of her face.
+
+
+You seem to be ready to advance as a healer. There is one favor I must ask of you first, though.
+
+
+You should be more careful.
+
+
+You should come back when you have some free space.
+Du solltest zurück kommen wenn du etwas Platz frei hast.
+
+You should get dressed now.
+
+
+You still need to find some of my friends. You have found %d out of 5 of my friends.
+
+
+You successfully set the drop rate to @@%. It will reset to @@% (default value) in @@.
+
+
+You successfully set the exp rate to @@%. It will reset to @@% (default value) in @@.
+Du hast die exp Rate erfolgreich auf @@% eingestellt. Sie wird in @@ auf @@% zurückgesetzt (Standardwert).
+
+You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the dresser.
+
+
+You were permanently banned by the GM Team.
+
+
+You withdrew a total of @@ GP.
+
+
+Young Man
+
+
+Your GM level is now hidden.
+
+
+Your GM level is now visible.
+
+
+Your hairstyle is @@ and its color is @@.
+Deine Frisur ist @@ und die Haarfarbe ist @@.
+
+Your magic takes a mind of its own!
+
+
+Zack
+
+
+ZaxDeKagen
+
+
+Zegas
+
+
+ZegasDebug
+
+
+Zitoni
+
+
+Zombie
+
+
+ZombieNachos
+
+
+Zzzzzzzzz...
+Zzzzzzzzz...
+
+_N-Pumpkin
+
+
+a ground!
+ein Boden!
+
+a quiet place,
+ein ruhiger Ort,
+
+fifteen
+
+
+no
+Nein
+
+no active broadcast
+keine aktive Ankündigung
+
+sign#pvp-1
+
+
+sign#pvp-2
+
+
+specialMob027-3
+
+
+specialMob027-4
+
+
+yes
+Ja
+
+• Can't walk without stopping after every step
+
+
+• Has a bubblehead
+
+
+• Is not properly shaded
+
+
diff --git a/langs/lang_en.old b/langs/lang_en.old
new file mode 100644
index 00000000..56874220
--- /dev/null
+++ b/langs/lang_en.old
@@ -0,0 +1,465 @@
+Apprentice
+Apprentice
+
+Debug#5
+Debug#5
+
+Piou Egg
+Piou Egg
+
+Stone Board
+Stone Board
+
+The AlizarinPlant
+The AlizarinPlant
+
+The AngryFireGoblin
+The AngryFireGoblin
+
+The AngryGreenSlime
+The AngryGreenSlime
+
+The AngryScorpionMob
+The AngryScorpionMob
+
+The AngrySeaSlime
+The AngrySeaSlime
+
+The Anne
+The Anne
+
+The Archant
+The Archant
+
+The AzulSlime
+The AzulSlime
+
+The BallLightning
+The BallLightning
+
+The Bandit
+The Bandit
+
+The BanditLord
+The BanditLord
+
+The Bat
+The Bat
+
+The Bee
+The Bee
+
+The BlackScorpionMob
+The BlackScorpionMob
+
+The BlueSlime
+The BlueSlime
+
+The BlueSpark
+The BlueSpark
+
+The Bluepar
+The Bluepar
+
+The Butterfly
+The Butterfly
+
+The CandiedSlime
+The CandiedSlime
+
+The CaveMaggot
+The CaveMaggot
+
+The CaveSnake
+The CaveSnake
+
+The CloverPatch
+The CloverPatch
+
+The CobaltPlant
+The CobaltPlant
+
+The CopperSlime
+The CopperSlime
+
+The CrotcherScorpionMob
+The CrotcherScorpionMob
+
+The DemonicMouboo
+The DemonicMouboo
+
+The DemonicSpirit
+The DemonicSpirit
+
+The DoomGolem
+The DoomGolem
+
+The DreadPirateMarley
+The DreadPirateMarley
+
+The DreadPirateMarleyClone
+The DreadPirateMarleyClone
+
+The DrunkenLadySkeleton
+The DrunkenLadySkeleton
+
+The DrunkenSkeleton
+The DrunkenSkeleton
+
+The EasterFluffy
+The EasterFluffy
+
+The Enchanter
+The Enchanter
+
+The EvilMushroom
+The EvilMushroom
+
+The Fallen
+The Fallen
+
+The FeyElement
+The FeyElement
+
+The FireGoblin
+The FireGoblin
+
+The FireSkull
+The FireSkull
+
+The Flashmob
+The Flashmob
+
+The Fluffy
+The Fluffy
+
+The GambogePlant
+The GambogePlant
+
+The GeneralKrukan
+The GeneralKrukan
+
+The GeneralRazha
+The GeneralRazha
+
+The GeneralTerogan
+The GeneralTerogan
+
+The GiantMaggot
+The GiantMaggot
+
+The GrassSnake
+The GrassSnake
+
+The GreenSlime
+The GreenSlime
+
+The GreenSlimeMother
+The GreenSlimeMother
+
+The Grenadier
+The Grenadier
+
+The Grinchboo
+The Grinchboo
+
+The HouseMaggot
+The HouseMaggot
+
+The HungryFluffy
+The HungryFluffy
+
+The HuntsmanSpider
+The HuntsmanSpider
+
+The Hyvern
+The Hyvern
+
+The IceElement
+The IceElement
+
+The IceGoblin
+The IceGoblin
+
+The IceSkull
+The IceSkull
+
+The JackO
+The JackO
+
+The KageGolem
+The KageGolem
+
+The Koyntety
+The Koyntety
+
+The LadySkeleton
+The LadySkeleton
+
+The Larvern
+The Larvern
+
+The LavaSlime
+The LavaSlime
+
+The LesserGhost
+The LesserGhost
+
+The LogHead
+The LogHead
+
+The LovelyMaggot
+The LovelyMaggot
+
+The Luvia
+The Luvia
+
+The Maggot
+The Maggot
+
+The ManaBug
+The ManaBug
+
+The ManaGhost
+The ManaGhost
+
+The ManaSlayer
+The ManaSlayer
+
+The ManaTyrant
+The ManaTyrant
+
+The MauvePlant
+The MauvePlant
+
+The Moggun
+The Moggun
+
+The Moonshroom
+The Moonshroom
+
+The Mouboo
+The Mouboo
+
+The MountainSnake
+The MountainSnake
+
+The Nutcracker
+The Nutcracker
+
+The PinkFlower
+The PinkFlower
+
+The Pinkie
+The Pinkie
+
+The PoisonSkull
+The PoisonSkull
+
+The Pollett
+The Pollett
+
+The Poltergeist
+The Poltergeist
+
+The PsiBrain
+The PsiBrain
+
+The Pumpkin
+The Pumpkin
+
+The Reaper
+The Reaper
+
+The RedBone
+The RedBone
+
+The RedScorpionMob
+The RedScorpionMob
+
+The RedSlime
+The RedSlime
+
+The RedSpark
+The RedSpark
+
+The Reinboo
+The Reinboo
+
+The RudolphSlime
+The RudolphSlime
+
+The SUSAN
+The SUSAN
+
+The SantaSlime
+The SantaSlime
+
+The Santaboo
+The Santaboo
+
+The Sasquatch
+The Sasquatch
+
+The ScorpionMob
+The ScorpionMob
+
+The Scythe
+The Scythe
+
+The SeaSlime
+The SeaSlime
+
+The SeaSlimeMother
+The SeaSlimeMother
+
+The Serqet
+The Serqet
+
+The Silkworm
+The Silkworm
+
+The Skeleton
+The Skeleton
+
+The SleepingBandit
+The SleepingBandit
+
+The SlimeBlast
+The SlimeBlast
+
+The Snail
+The Snail
+
+The Snake
+The Snake
+
+The SoulEater
+The SoulEater
+
+The SoulSnake
+The SoulSnake
+
+The Spectre
+The Spectre
+
+The Spider
+The Spider
+
+The SpikyMushroom
+The SpikyMushroom
+
+The Squirrel
+The Squirrel
+
+The Stalker
+The Stalker
+
+The Swashbuckler
+The Swashbuckler
+
+The TameScorpionMob
+The TameScorpionMob
+
+The Tengu
+The Tengu
+
+The Terranite
+The Terranite
+
+The TheLost
+The TheLost
+
+The Thug
+The Thug
+
+The TipsySkeleton
+The TipsySkeleton
+
+The Tormenta
+The Tormenta
+
+The Troll
+The Troll
+
+The UndeadTroll
+The UndeadTroll
+
+The UndeadWitch
+The UndeadWitch
+
+The VampireBat
+The VampireBat
+
+The ViciousSquirrel
+The ViciousSquirrel
+
+The Virus
+The Virus
+
+The VoidArchant
+The VoidArchant
+
+The VoidBat
+The VoidBat
+
+The VoidFlower
+The VoidFlower
+
+The VoidMaggot
+The VoidMaggot
+
+The VoidMouboo
+The VoidMouboo
+
+The VoidScorpionMob
+The VoidScorpionMob
+
+The VoidShroom
+The VoidShroom
+
+The VoidSlime
+The VoidSlime
+
+The VoidSnake
+The VoidSnake
+
+The VoidSoldier
+The VoidSoldier
+
+The WhiteBell
+The WhiteBell
+
+The WhiteSlime
+The WhiteSlime
+
+The WickedMushroom
+The WickedMushroom
+
+The Wight
+The Wight
+
+The Wisp
+The Wisp
+
+The WitchGuard
+The WitchGuard
+
+The Wolvern
+The Wolvern
+
+The Xakelbael
+The Xakelbael
+
+The YellowSlime
+The YellowSlime
+
+The Yeti
+The Yeti
+
+The Zombie
+The Zombie
+
+Then say %s and let the mushroom's power take over.
+Then say %s and let the mushroom's power take over.
+
diff --git a/langs/lang_en.txt b/langs/lang_en.txt
new file mode 100644
index 00000000..b8500363
--- /dev/null
+++ b/langs/lang_en.txt
@@ -0,0 +1,6673 @@
+Copyright (C) 2010-2015 Evol Online
+"Ah, you woke up. You washed ashore on the beach 3 days ago. You've been asleep since.
+"Ah, you woke up. You washed ashore on the beach 3 days ago. You've been asleep since.
+
+"Come back and see me when the job is done."
+"Come back and see me when the job is done."
+
+"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 '%s', which is the lay on hands magic."
+"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 '%s', which is the lay on hands magic."
+
+"Maybe I should go back to practicing '%s' until I can make potions properly." %%6
+"Maybe I should go back to practicing '%s' until I can make potions properly." %%6
+
+"My little granddaughter Tanisha found you. Kaan was able to carry you to bed.
+"My little granddaughter Tanisha found you. Kaan was able to carry you to bed.
+
+"She hates maggots.
+"She hates maggots.
+
+"The first one for the mouboo was %s and the one for the pinkie was %s.
+"The first one for the mouboo was %s and the one for the pinkie was %s.
+
+"Welcome to the bank!
+"Welcome to the bank!
+
+"You're the person I brought here, right?
+"You're the person I brought here, right?
+
+##BHall Of Acorns: TOP15##b
+##BHall Of Acorns: TOP15##b
+
+##BHall Of Fortune: TOP15##b
+##BHall Of Fortune: TOP15##b
+
+##BHall Of Guild Level: TOP5##b
+##BHall Of Guild Level: TOP5##b
+
+##BHall Of Job Level: TOP15##b
+##BHall Of Job Level: TOP15##b
+
+##BHall Of Lethality: TOP15##b
+##BHall Of Lethality: TOP15##b
+
+##BHall Of Level: TOP15##b
+##BHall Of Level: TOP15##b
+
+%%@
+%%@
+
+%%A
+%%A
+
+%%B
+%%B
+
+%%C
+%%C
+
+%%D
+%%D
+
+%%E
+%%E
+
+%%F
+%%F
+
+%d out of 5 have been found.
+%d out of 5 have been found.
+
+%s
+%s
+
+%s - Level %d (~%s HP, ~%s ATK)
+%s - Level %d (~%s HP, ~%s ATK)
+
+%s : %s
+%s : %s
+
+(A mystical aura surrounds this stone. You feel mysteriously attracted to it. Something tells you to touch it. What do you do?)
+(A mystical aura surrounds this stone. You feel mysteriously attracted to it. Something tells you to touch it. What do you do?)
+
+... Tulimshar in Tonori ... I'm a Talpan.
+... Tulimshar in Tonori ... I'm a Talpan.
+
+1) Do not abuse other players. Insults, swearing, and the like are not to be directed towards a particular person or group.
+1) Do not abuse other players. Insults, swearing, and the like are not to be directed towards a particular person or group.
+
+2) No bots – including ##Bany##b AFK activity or automated actions of any sort.
+2) No bots – including ##Bany##b AFK activity or automated actions of any sort.
+
+3) No spamming or flooding (including messages, whispers, and trade requests).
+3) No spamming or flooding (including messages, whispers, and trade requests).
+
+4) No begging.
+4) No begging.
+
+5) Speak ##Bonly##b English in the public chat.
+5) Speak ##Bonly##b English in the public chat.
+
+6) Treat others how you would like to be treated.
+6) Treat others how you would like to be treated.
+
+7
+7
+
+98... 99... 100!
+98... 99... 100!
+
+?
+?
+
+@@
+@@
+
+A blissful day to thee, mortal!
+A blissful day to thee, mortal!
+
+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 '%s' spell.
+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 '%s' spell.
+
+A sunny and hot day,
+A sunny and hot day,
+
+A wicked mushroom will appear to fight for you. Usually.
+A wicked mushroom will appear to fight for you. Usually.
+
+A-hoy matey!
+A-hoy matey!
+
+AFK botting will be determined by talking to players who are moving and/or attacking.
+AFK botting will be determined by talking to players who are moving and/or attacking.
+
+AFKCap
+AFKCap
+
+Aahna
+Aahna
+
+Aaron
+Aaron
+
+Abort
+Abort
+
+Acorn
+Acorn
+
+ActivatedSulphur
+ActivatedSulphur
+
+Add all focus skills
+Add all focus skills
+
+Adrian
+Adrian
+
+After a while, you stumble across a section that appears to be written somewhat legibly. The author notes that he (or perhaps she?) is describing a completely new transmutation.
+After a while, you stumble across a section that appears to be written somewhat legibly. The author notes that he (or perhaps she?) is describing a completely new transmutation.
+
+After we finish talking, click on the clothes and press the equip button.
+After we finish talking, click on the clothes and press the equip button.
+
+Agostine
+Agostine
+
+Agostine Debug
+Agostine Debug
+
+Ah, the Professors will get mad at me again...
+Ah, the Professors will get mad at me again...
+
+Ah, yes, your training...
+Ah, yes, your training...
+
+Ah.
+Ah.
+
+Ah... no beer? Oh well.
+Ah... no beer? Oh well.
+
+Aidan
+Aidan
+
+Airlia
+Airlia
+
+Aisha
+Aisha
+
+Aisha looks around as she leans in and hushes you to silence. After a few seconds, she whispers to you:
+Aisha looks around as she leans in and hushes you to silence. After a few seconds, she whispers to you:
+
+Akseli
+Akseli
+
+Alacrius
+Alacrius
+
+Alan
+Alan
+
+Aldred
+Aldred
+
+Alice
+Alice
+
+Alizarin Plant
+Alizarin Plant
+
+AlizarinHerb
+AlizarinHerb
+
+All monsters summoned!
+All monsters summoned!
+
+All of my money.
+All of my money.
+
+All scoreboards are updated hourly.
+All scoreboards are updated hourly.
+
+AmberChristmasSweater
+AmberChristmasSweater
+
+Amethyst
+Amethyst
+
+AmethystPowder
+AmethystPowder
+
+AmethystRing
+AmethystRing
+
+Amrak
+Amrak
+
+And make sure to keep notes of your spells! Don't rely only on your skill tab (F5).
+And make sure to keep notes of your spells! Don't rely only on your skill tab (F5).
+
+And the first spell, to summon wicked mushrooms, is %s.
+And the first spell, to summon wicked mushrooms, is %s.
+
+Andra
+Andra
+
+Angela
+Angela
+
+Angela#house
+Angela#house
+
+Angry Fire Goblin
+Angry Fire Goblin
+
+Angry Green Slime
+Angry Green Slime
+
+Angry Scorpion
+Angry Scorpion
+
+Angry Sea Slime
+Angry Sea Slime
+
+AngryScorpionStinger
+AngryScorpionStinger
+
+Angus
+Angus
+
+AniManOMat
+AniManOMat
+
+AnimalBones
+AnimalBones
+
+Anne
+Anne
+
+AnniversaryHat
+AnniversaryHat
+
+Another Sneaky Bandit
+Another Sneaky Bandit
+
+AntlerHat
+AntlerHat
+
+Antlers
+Antlers
+
+Anwar
+Anwar
+
+Anything else you can remember?
+Anything else you can remember?
+
+Anything else?
+Anything else?
+
+AppleCake
+AppleCake
+
+ApprenticeRobe
+ApprenticeRobe
+
+AquaHint
+AquaHint
+
+AquaOrnament
+AquaOrnament
+
+AquaTicket
+AquaTicket
+
+Aradin
+Aradin
+
+Archant
+Archant
+
+Archibald
+Archibald
+
+Ardra
+Ardra
+
+Are you read for another spell?
+Are you read for another spell?
+
+Arkim
+Arkim
+
+Arr!
+Arr!
+
+Arr, I'm bored!
+Arr, I'm bored!
+
+Arrow
+Arrow
+
+Arvo
+Arvo
+
+As she opens her hands again, the leaves have turned into ten golden crystals.
+As she opens her hands again, the leaves have turned into ten golden crystals.
+
+As the power of your magic grows so will the spells you can cast.
+As the power of your magic grows so will the spells you can cast.
+
+As you look at the sword, you suddenly hear a voice in your head!
+As you look at the sword, you suddenly hear a voice in your head!
+
+As you want!
+As you want!
+
+Ashley
+Ashley
+
+AssassinBoots
+AssassinBoots
+
+AssassinGloves
+AssassinGloves
+
+AssassinPants
+AssassinPants
+
+AssassinShirt
+AssassinShirt
+
+Astral Soul
+Astral Soul
+
+AstralCube
+AstralCube
+
+At this point, the river deepens, slowing down to a leisurely pace. In its center you notice an unusual stone, waves breaking around it.
+At this point, the river deepens, slowing down to a leisurely pace. In its center you notice an unusual stone, waves breaking around it.
+
+Auldsbel places the logs next to his hut.
+Auldsbel places the logs next to his hut.
+
+Auldsbel the Wizard
+Auldsbel the Wizard
+
+Auldsbel#_M
+Auldsbel#_M
+
+Aureole
+Aureole
+
+Automated following will be determined by observation.
+Automated following will be determined by observation.
+
+AutumnMask
+AutumnMask
+
+Avalia
+Avalia
+
+Axe
+Axe
+
+AxeHat
+AxeHat
+
+Ayasha
+Ayasha
+
+AyashaDebug
+AyashaDebug
+
+Azul Slime
+Azul Slime
+
+Back
+Back
+
+Baktar
+Baktar
+
+Ball Lightning
+Ball Lightning
+
+Bandana
+Bandana
+
+Bandit
+Bandit
+
+Bandit Lord
+Bandit Lord
+
+BanditHood
+BanditHood
+
+BansheeBow
+BansheeBow
+
+Banu
+Banu
+
+Bar Rules
+Bar Rules
+
+Barbara Grey
+Barbara Grey
+
+Bard
+Bard
+
+Bardiche
+Bardiche
+
+Barkeeper
+Barkeeper
+
+Barrel#0
+Barrel
+
+Barrel#1
+Barrel
+
+Barrel#2
+Barrel#2
+
+Barrel#3
+Barrel#3
+
+Barrel#4
+Barrel#4
+
+Barrel#5
+Barrel#5
+
+Barrel#6
+Barrel#6
+
+Barrel#7
+Barrel#7
+
+Bartender
+Bartender
+
+Bartender#Casino
+Bartender#Casino
+
+Bartender#Duels
+Bartender#Duels
+
+Basil
+Basil
+
+BastardSword
+BastardSword
+
+Bat
+Bat
+
+BatTeeth
+BatTeeth
+
+BatWing
+BatWing
+
+Battle Master#Duels
+Battle Master#Duels
+
+BeanieCopter
+BeanieCopter
+
+Bee
+Bee
+
+Beer
+Beer
+
+BeetleJuice
+BeetleJuice
+
+Before you stands a beautiful woman, dressed in dark purple robes and wearing a witch's hat.
+Before you stands a beautiful woman, dressed in dark purple robes and wearing a witch's hat.
+
+Beheader
+Beheader
+
+Ben
+Ben
+
+Bennet
+Bennet
+
+BentNeedle
+BentNeedle
+
+Beret
+Beret
+
+Bernard
+Bernard
+
+Beware of what thou wishest for, mortal...
+Beware of what thou wishest for, mortal...
+
+Birrod
+Birrod
+
+Black Scorpion
+Black Scorpion
+
+BlackBeret
+BlackBeret
+
+BlackBoots
+BlackBoots
+
+BlackBowlerHat
+BlackBowlerHat
+
+BlackBowlerHatBrown
+BlackBowlerHatBrown
+
+BlackContributor
+BlackContributor
+
+BlackCottonBoots
+BlackCottonBoots
+
+BlackCottonCloth
+BlackCottonCloth
+
+BlackCottonGloves
+BlackCottonGloves
+
+BlackCottonHeadband
+BlackCottonHeadband
+
+BlackCottonShirt
+BlackCottonShirt
+
+BlackCottonShorts
+BlackCottonShorts
+
+BlackCottonSkirt
+BlackCottonSkirt
+
+BlackCottonTrousers
+BlackCottonTrousers
+
+BlackCowboyHat
+BlackCowboyHat
+
+BlackDesertHat
+BlackDesertHat
+
+BlackDye
+BlackDye
+
+BlackEvokersRobeBlue
+BlackEvokersRobeBlue
+
+BlackFineDress
+BlackFineDress
+
+BlackJack
+BlackJack
+
+BlackMiniskirt
+BlackMiniskirt
+
+BlackPearl
+BlackPearl
+
+BlackRabbitEars
+BlackRabbitEars
+
+BlackRose
+BlackRose
+
+BlackScorpionStinger
+BlackScorpionStinger
+
+BlackShades
+BlackShades
+
+BlackShortTankTop
+BlackShortTankTop
+
+BlackSilkRobe
+BlackSilkRobe
+
+BlackSorcererBlack
+BlackSorcererBlack
+
+BlackSorcererDBlue
+BlackSorcererDBlue
+
+BlackSorcererDGreen
+BlackSorcererDGreen
+
+BlackSorcererGreen
+BlackSorcererGreen
+
+BlackSorcererLBlue
+BlackSorcererLBlue
+
+BlackSorcererOrange
+BlackSorcererOrange
+
+BlackSorcererPink
+BlackSorcererPink
+
+BlackSorcererPurple
+BlackSorcererPurple
+
+BlackSorcererRed
+BlackSorcererRed
+
+BlackSorcererWhite
+BlackSorcererWhite
+
+BlackSorcererYellow
+BlackSorcererYellow
+
+BlackTankTop
+BlackTankTop
+
+BlackTurtleneck
+BlackTurtleneck
+
+BlackVNeckSweater
+BlackVNeckSweater
+
+BlackWizardHat
+BlackWizardHat
+
+BlackWizardRobe
+BlackWizardRobe
+
+Blacksmith
+Blacksmith
+
+BlacksmithsAxe
+BlacksmithsAxe
+
+Blackwin
+Blackwin
+
+BlinkingEvil
+BlinkingEvil
+
+BlinkingEvilBlue
+BlinkingEvilBlue
+
+BlinkingEvilHalloween
+BlinkingEvilHalloween
+
+BlinkingEvilPink
+BlinkingEvilPink
+
+BlinkingEvilRed
+BlinkingEvilRed
+
+BlinkingEvilYellow
+BlinkingEvilYellow
+
+BlinkingHocus
+BlinkingHocus
+
+BloodInk
+BloodInk
+
+BloodWine
+BloodWine
+
+Bloodstone
+Bloodstone
+
+Blossom
+Blossom
+
+Blue Slime
+Blue Slime
+
+Blue Spark
+Blue Spark
+
+BlueChristmasSweater
+BlueChristmasSweater
+
+BlueDottedWrap
+BlueDottedWrap
+
+BlueEasterEgg
+BlueEasterEgg
+
+BlueEggshellHat
+BlueEggshellHat
+
+BlueHint
+BlueHint
+
+BlueHitchhikersTowel
+BlueHitchhikersTowel
+
+BlueOrnament
+BlueOrnament
+
+BluePowder
+BluePowder
+
+BluePresentBox
+BluePresentBox
+
+BluePresentHat
+BluePresentHat
+
+BlueRose
+BlueRose
+
+BlueRoseHat
+BlueRoseHat
+
+BlueTicket
+BlueTicket
+
+BlueWolfHelmet
+BlueWolfHelmet
+
+BlueWrap
+BlueWrap
+
+Blueberries
+Blueberries
+
+Bluepar
+Bluepar
+
+Body type %i
+Body type %i
+
+Bone
+Bone
+
+BoneArrows
+BoneArrows
+
+BoneDarts
+BoneDarts
+
+BoneKnife
+BoneKnife
+
+Bones
+Bones
+
+BookPage
+BookPage
+
+Bookshelf
+Bookshelf
+
+Boots
+Boots
+
+Boss points: %s
+Boss points: %s
+
+BottleOfSand
+BottleOfSand
+
+BottleOfWater
+BottleOfWater
+
+Bow
+Bow
+
+BowlerHat
+BowlerHat
+
+BowlerHatBrown
+BowlerHatBrown
+
+Bracco
+Bracco
+
+BrainStem
+BrainStem
+
+Brawling
+Brawling
+
+Bring me ten bug legs, and I will reveal its invocation to you.
+Bring me ten bug legs, and I will reveal its invocation to you.
+
+Brodomir
+Brodomir
+
+BrokenDoll
+BrokenDoll
+
+BrokenFourLeafAmulet
+BrokenFourLeafAmulet
+
+BromenalBoots
+BromenalBoots
+
+BromenalChest
+BromenalChest
+
+BromenalFourLeafAmulet
+BromenalFourLeafAmulet
+
+BromenalGloves
+BromenalGloves
+
+BromenalHelmet
+BromenalHelmet
+
+BromenalLegs
+BromenalLegs
+
+BromenalShield
+BromenalShield
+
+Browsing through the books, you come across a manuscript entitled 'Notes of Potaffe, On Transmutation.'
+Browsing through the books, you come across a manuscript entitled 'Notes of Potaffe, On Transmutation.'
+
+Bryant
+Bryant
+
+BucketHat
+BucketHat
+
+BugLeg
+BugLeg
+
+BullHelmet
+BullHelmet
+
+BunchOfParsley
+BunchOfParsley
+
+Bunkmaster Daban
+Bunkmaster Daban
+
+Bunkmaster Phict
+Bunkmaster Phict
+
+BunnyEars
+BunnyEars
+
+But alas, thou need more magical power for that.
+But alas, thou need more magical power for that.
+
+But be warned: you won't be able to use advanced healing magic until you are more capable in your regular magic usage.
+But be warned: you won't be able to use advanced healing magic until you are more capable in your regular magic usage.
+
+But remember, the game isn't fun when you already know what to do. Use it well or you will lose interest in playing The Mana World! Please help by reporting anything that is unclear, outdated or that needs to be seen on our forums at %s.
+But remember, the game isn't fun when you already know what to do. Use it well or you will lose interest in playing The Mana World! Please help by reporting anything that is unclear, outdated or that needs to be seen on our forums at %s.
+
+Butterfly
+Butterfly
+
+Button#mine-1
+Button#mine-1
+
+Button#mine-2
+Button#mine-2
+
+Button#mine-3
+Button#mine-3
+
+Bye for now.
+Bye for now.
+
+Bye then!
+Bye then!
+
+Bye!
+Bye!
+
+Bye.
+Bye.
+
+CactusDrink
+CactusDrink
+
+CactusPotion
+CactusPotion
+
+Cake
+Cake
+
+Can you do something with my color?
+Can you do something with my color?
+
+Can you please go away?
+Can you please go away?
+
+Can't talk right now, I'm on patrol duty.
+Can't talk right now, I'm on patrol duty.
+
+Candide
+Candide
+
+Candied Slime
+Candied Slime
+
+CandleHelmet
+CandleHelmet
+
+Candor Dock
+Candor Dock
+
+Candor Koga
+Candor Koga
+
+Candy
+Candy
+
+CandyCane
+CandyCane
+
+CandyPumpkin
+CandyPumpkin
+
+Cap
+Cap
+
+Capitão Mirc
+Capitão Mirc
+
+CaptainsHat
+CaptainsHat
+
+CaramelApple
+CaramelApple
+
+CaramelCandy
+CaramelCandy
+
+CarbonGasMask
+CarbonGasMask
+
+Caretaker
+Caretaker
+
+CashiersShade
+CashiersShade
+
+CasinoCoins
+CasinoCoins
+
+CatEars
+CatEars
+
+Caul
+Caul
+
+Cave Maggot
+Cave Maggot
+
+Cave Snake
+Cave Snake
+
+CaveSnakeEgg
+CaveSnakeEgg
+
+CaveSnakeLamp
+CaveSnakeLamp
+
+CaveSnakeTongue
+CaveSnakeTongue
+
+Celestia
+Celestia
+
+Celestia BackDoor
+Celestia BackDoor
+
+Celestia Door
+Celestia Door
+
+Cerhan
+Cerhan
+
+ChainmailShirt
+ChainmailShirt
+
+Changing your body type will send you back to the character selection screen.
+Changing your body type will send you back to the character selection screen.
+
+Charda
+Charda
+
+Ched
+Ched
+
+Cheers!
+Cheers!
+
+Chef Armand
+Chef Armand
+
+Chef#dimond
+Chef#dimond
+
+Chef#graveyard
+Chef#graveyard
+
+ChefHat
+ChefHat
+
+Cherry
+Cherry
+
+CherryCake
+CherryCake
+
+Chest#DemonMask
+Chest#DemonMask
+
+Chest#boring
+Chest#boring
+
+Chest#illia
+Chest#illia
+
+Chest#keshlam
+Chest#keshlam
+
+Chest#sword
+Chest#sword
+
+ChicSantaHat
+ChicSantaHat
+
+ChickenLeg
+ChickenLeg
+
+Chief Warrick
+Chief Warrick
+
+ChocolateBar
+ChocolateBar
+
+ChocolateCake
+ChocolateCake
+
+ChocolateMouboo
+ChocolateMouboo
+
+ChristmasElfHat
+ChristmasElfHat
+
+ChristmasTreeHat
+ChristmasTreeHat
+
+Cindy
+Cindy
+
+Cindy#house
+Cindy#house
+
+Circlet
+Circlet
+
+Clauquer
+Clauquer
+
+ClosedChristmasBox
+ClosedChristmasBox
+
+Clover Patch
+Clover Patch
+
+CloverHat
+CloverHat
+
+Coal
+Coal
+
+Cobalt Plant
+Cobalt Plant
+
+CobaltHerb
+CobaltHerb
+
+CoinBag
+CoinBag
+
+Come back when thou art stronger.
+Come back when thou art stronger.
+
+Command not permitted on this map! Check npc/functions/weather.conf
+Command not permitted on this map! Check npc/functions/weather.conf
+
+ConcentrationPotion
+ConcentrationPotion
+
+Connor
+Connor
+
+Constable Bob
+Constable Bob
+
+Constable Perry Graf
+Constable Perry Graf
+
+Contributor
+Contributor
+
+Cooky
+Cooky
+
+Copper Slime
+Copper Slime
+
+CottonBoots
+CottonBoots
+
+CottonCloth
+CottonCloth
+
+CottonGloves
+CottonGloves
+
+CottonHeadband
+CottonHeadband
+
+CottonShirt
+CottonShirt
+
+CottonShorts
+CottonShorts
+
+CottonSkirt
+CottonSkirt
+
+CottonTrousers
+CottonTrousers
+
+CranberryLollipop
+CranberryLollipop
+
+Crastur the Ugly
+Crastur the Ugly
+
+CrescentRod
+CrescentRod
+
+CrimsonBra
+CrimsonBra
+
+Crotcher Scorpion
+Crotcher Scorpion
+
+Crown
+Crown
+
+CrozeniteFourLeafAmulet
+CrozeniteFourLeafAmulet
+
+CrusadeHelmet
+CrusadeHelmet
+
+CryptKey
+CryptKey
+
+Curlee
+Curlee
+
+Current Magic Control
+Current Magic Control
+
+Current drop rate is set to @@%, and will reset to @@% (default value) in @@.
+Current drop rate is set to @@%, and will reset to @@% (default value) in @@.
+
+Current exp rate is set to @@% (default value).
+Current exp rate is set to @@% (default value).
+
+Current exp rate is set to @@%, and will reset to @@% (default value) in @@.
+Current exp rate is set to @@%, and will reset to @@% (default value) in @@.
+
+Cursed Waterfall
+Cursed Waterfall
+
+Custom
+Custom
+
+Cyndala
+Cyndala
+
+Cynric
+Cynric
+
+DEBUG: Changing @@ field @@ to something else.
+DEBUG: Changing @@ field @@ to something else.
+
+DEBUG: Changing @@, Values: (@@, @@, @@).
+DEBUG: Changing @@, Values: (@@, @@, @@).
+
+Dagger
+Dagger
+
+DarkBlueBeret
+DarkBlueBeret
+
+DarkBlueBowlerHat
+DarkBlueBowlerHat
+
+DarkBlueBowlerHatBrown
+DarkBlueBowlerHatBrown
+
+DarkBlueContributor
+DarkBlueContributor
+
+DarkBlueCottonBoots
+DarkBlueCottonBoots
+
+DarkBlueCottonCloth
+DarkBlueCottonCloth
+
+DarkBlueCottonGloves
+DarkBlueCottonGloves
+
+DarkBlueCottonHeadband
+DarkBlueCottonHeadband
+
+DarkBlueCottonShirt
+DarkBlueCottonShirt
+
+DarkBlueCottonShorts
+DarkBlueCottonShorts
+
+DarkBlueCottonSkirt
+DarkBlueCottonSkirt
+
+DarkBlueCottonTrousers
+DarkBlueCottonTrousers
+
+DarkBlueDesertHat
+DarkBlueDesertHat
+
+DarkBlueDye
+DarkBlueDye
+
+DarkBlueFineDress
+DarkBlueFineDress
+
+DarkBlueMiniskirt
+DarkBlueMiniskirt
+
+DarkBlueRabbitEars
+DarkBlueRabbitEars
+
+DarkBlueShades
+DarkBlueShades
+
+DarkBlueShortTankTop
+DarkBlueShortTankTop
+
+DarkBlueSilkRobe
+DarkBlueSilkRobe
+
+DarkBlueSorcererBlack
+DarkBlueSorcererBlack
+
+DarkBlueSorcererDBlue
+DarkBlueSorcererDBlue
+
+DarkBlueSorcererDGreen
+DarkBlueSorcererDGreen
+
+DarkBlueSorcererGreen
+DarkBlueSorcererGreen
+
+DarkBlueSorcererLBlue
+DarkBlueSorcererLBlue
+
+DarkBlueSorcererOrange
+DarkBlueSorcererOrange
+
+DarkBlueSorcererPink
+DarkBlueSorcererPink
+
+DarkBlueSorcererPurple
+DarkBlueSorcererPurple
+
+DarkBlueSorcererRed
+DarkBlueSorcererRed
+
+DarkBlueSorcererWhite
+DarkBlueSorcererWhite
+
+DarkBlueSorcererYellow
+DarkBlueSorcererYellow
+
+DarkBlueTankTop
+DarkBlueTankTop
+
+DarkBlueTurtleneck
+DarkBlueTurtleneck
+
+DarkBlueVNeckSweater
+DarkBlueVNeckSweater
+
+DarkBlueWizardHat
+DarkBlueWizardHat
+
+DarkChristmasSweater
+DarkChristmasSweater
+
+DarkConcentrationPotion
+DarkConcentrationPotion
+
+DarkCrystal
+DarkCrystal
+
+DarkEasterEgg
+DarkEasterEgg
+
+DarkEggshellHat
+DarkEggshellHat
+
+DarkGreenBeret
+DarkGreenBeret
+
+DarkGreenBowlerHat
+DarkGreenBowlerHat
+
+DarkGreenBowlerHatBrown
+DarkGreenBowlerHatBrown
+
+DarkGreenContributor
+DarkGreenContributor
+
+DarkGreenCottonBoots
+DarkGreenCottonBoots
+
+DarkGreenCottonCloth
+DarkGreenCottonCloth
+
+DarkGreenCottonGloves
+DarkGreenCottonGloves
+
+DarkGreenCottonHeadband
+DarkGreenCottonHeadband
+
+DarkGreenCottonShirt
+DarkGreenCottonShirt
+
+DarkGreenCottonShorts
+DarkGreenCottonShorts
+
+DarkGreenCottonSkirt
+DarkGreenCottonSkirt
+
+DarkGreenCottonTrousers
+DarkGreenCottonTrousers
+
+DarkGreenDesertHat
+DarkGreenDesertHat
+
+DarkGreenDye
+DarkGreenDye
+
+DarkGreenFineDress
+DarkGreenFineDress
+
+DarkGreenMiniskirt
+DarkGreenMiniskirt
+
+DarkGreenRabbitEars
+DarkGreenRabbitEars
+
+DarkGreenShades
+DarkGreenShades
+
+DarkGreenShortTankTop
+DarkGreenShortTankTop
+
+DarkGreenSilkRobe
+DarkGreenSilkRobe
+
+DarkGreenSorcererBlack
+DarkGreenSorcererBlack
+
+DarkGreenSorcererDBlue
+DarkGreenSorcererDBlue
+
+DarkGreenSorcererDGreen
+DarkGreenSorcererDGreen
+
+DarkGreenSorcererGreen
+DarkGreenSorcererGreen
+
+DarkGreenSorcererLBlue
+DarkGreenSorcererLBlue
+
+DarkGreenSorcererOrange
+DarkGreenSorcererOrange
+
+DarkGreenSorcererPink
+DarkGreenSorcererPink
+
+DarkGreenSorcererPurple
+DarkGreenSorcererPurple
+
+DarkGreenSorcererRed
+DarkGreenSorcererRed
+
+DarkGreenSorcererWhite
+DarkGreenSorcererWhite
+
+DarkGreenSorcererYellow
+DarkGreenSorcererYellow
+
+DarkGreenTankTop
+DarkGreenTankTop
+
+DarkGreenTurtleneck
+DarkGreenTurtleneck
+
+DarkGreenVNeckSweater
+DarkGreenVNeckSweater
+
+DarkGreenWizardHat
+DarkGreenWizardHat
+
+DarkHelm
+DarkHelm
+
+DarkPetal
+DarkPetal
+
+DarkRedRose
+DarkRedRose
+
+DarkTalisman
+DarkTalisman
+
+Darnel
+Darnel
+
+Darug
+Darug
+
+David
+David
+
+Debug#0
+Debug
+
+Debug#1
+Debug
+
+Debug#2
+Debug#2
+
+Debug#3
+Debug#3
+
+Debug#Angela
+Debug#Angela
+
+Debug#BlueSage
+Debug#BlueSage
+
+Debug#Duels
+Debug#Duels
+
+DebugFlowerP
+DebugFlowerP
+
+DecorCandy
+DecorCandy
+
+DemonMask
+DemonMask
+
+Demonic Mouboo
+Demonic Mouboo
+
+Demonic Spirit
+Demonic Spirit
+
+Deposit.
+Deposit.
+
+DesertBow
+DesertBow
+
+DesertHat
+DesertHat
+
+DesertHelmet
+DesertHelmet
+
+DesertShirt
+DesertShirt
+
+DevelopersCap
+DevelopersCap
+
+Diamond
+Diamond
+
+DiamondPowder
+DiamondPowder
+
+DiamondRing
+DiamondRing
+
+Did I received any mail?
+Did I received any mail?
+
+Did you already talk to Tanisha?"
+Did you already talk to Tanisha?"
+
+Did you see how this spell is cast?
+Did you see how this spell is cast?
+
+DilutedConcentrationPot
+DilutedConcentrationPot
+
+Dimond
+Dimond
+
+Dimonds Cove 1
+Dimonds Cove 1
+
+Dimonds Cove 2
+Dimonds Cove 2
+
+Directions
+Directions
+
+Diryn the Traveler
+Diryn the Traveler
+
+Discard
+Discard
+
+DiseasedHeart
+DiseasedHeart
+
+Do I look like a tree? I feel like one.
+Do I look like a tree? I feel like one.
+
+Do you feel too weak even to do damage to this areas wishy-washy wildlife?
+Do you feel too weak even to do damage to this areas wishy-washy wildlife?
+
+Do you have a name?
+Do you have a name?
+
+Do you really want me to show you the spell again? You will have to bring new ingredients.
+Do you really want me to show you the spell again? You will have to bring new ingredients.
+
+Do you want to give me these items?
+Do you want to give me these items?
+
+Doctor
+Doctor
+
+Doll
+Doll
+
+Don't distract me, I have to stay alert.
+Don't distract me, I have to stay alert.
+
+Donald
+Donald
+
+Doom Golem
+Doom Golem
+
+Door
+Door
+
+Doug
+Doug
+
+Drabur
+Drabur
+
+Drag and drop an item from your inventory.
+Drag and drop an item from your inventory.
+
+Drake the Traveler
+Drake the Traveler
+
+Dread Pirate Marley
+Dread Pirate Marley
+
+Dread Pirate Marley Clone
+Dread Pirate Marley Clone
+
+Dresser#tutorial
+Dresser#tutorial
+
+Drinker#1
+Drinker
+
+Drinker#2
+Drinker#2
+
+Drop rate has been reset to @@% (default value).
+Drop rate has been reset to @@% (default value).
+
+Drop rate is set to @@% for the next @@.
+Drop rate is set to @@% for the next @@.
+
+DruidTreeBranch
+DruidTreeBranch
+
+Drunken Lady Skeleton
+Drunken Lady Skeleton
+
+Drunken Skeleton
+Drunken Skeleton
+
+ERROR: You must set a PinCode to make use of this function.
+ERROR: You must set a PinCode to make use of this function.
+
+Earmuffs
+Earmuffs
+
+Earth Spirit
+Earth Spirit
+
+Easter Eggs
+Easter Eggs
+
+Easter Fluffy
+Easter Fluffy
+
+EasterBasket
+EasterBasket
+
+EasterEgg
+EasterEgg
+
+Ectoplasm
+Ectoplasm
+
+Edwin
+Edwin
+
+Eevert
+Eevert
+
+EggshellHat
+EggshellHat
+
+Ekinu
+Ekinu
+
+Elanore carefully goes over your leaves, then smiles.
+Elanore carefully goes over your leaves, then smiles.
+
+Elanore counts the leaves you show her.
+Elanore counts the leaves you show her.
+
+Elanore shakes her head.
+Elanore shakes her head.
+
+Elanore smiles at you.
+Elanore smiles at you.
+
+Elanore smiles.
+Elanore smiles.
+
+Elanore the Healer
+Elanore the Healer
+
+Elanore#_M
+Elanore#_M
+
+ElfNightcap
+ElfNightcap
+
+Elias
+Elias
+
+Elijah
+Elijah
+
+Eljas
+Eljas
+
+Emerald
+Emerald
+
+EmeraldPowder
+EmeraldPowder
+
+EmeraldRing
+EmeraldRing
+
+Emergency Exit
+Emergency Exit
+
+EmptyBottle
+EmptyBottle
+
+Enchanter
+Enchanter
+
+EnchantersAmulet
+EnchantersAmulet
+
+Engraving#Keshlam
+Engraving#Keshlam
+
+Engravings
+Engravings
+
+Enjoy your new style.
+Enjoy your new style.
+
+Ensio
+Ensio
+
+Entertainer
+Entertainer
+
+Eomie
+Eomie
+
+Equip the wand and lets try out that spell.
+Equip the wand and lets try out that spell.
+
+EskimoHat
+EskimoHat
+
+Estard
+Estard
+
+Estrilda
+Estrilda
+
+Eurni
+Eurni
+
+Every 1 hour
+Every 1 hour
+
+Every 12 hours
+Every 12 hours
+
+Every 24 hours
+Every 24 hours
+
+Every 3 hours
+Every 3 hours
+
+Every 5 hours
+Every 5 hours
+
+Every 6 hours
+Every 6 hours
+
+Evil Mushroom
+Evil Mushroom
+
+Evil Obelisk
+Evil Obelisk
+
+Example: @translate Elmo
+Example: @translate Elmo
+
+Example: @translate Nard
+Example: @translate Nard
+
+Example: @translate npc/002-1/arpan
+Example: @translate npc/002-1/arpan
+
+Excitedly, you turn the page – only to find that it is stuck to the next and can't be freed!
+Excitedly, you turn the page – only to find that it is stuck to the next and can't be freed!
+
+Exit
+Exit
+
+Exp rate has been reset to @@% (default value).
+Exp rate has been reset to @@% (default value).
+
+Exp rate is set to @@% for the next @@.
+Exp rate is set to @@% for the next @@.
+
+Eyepatch
+Eyepatch
+
+Fabius
+Fabius
+
+FaceMask
+FaceMask
+
+FairTradeSoil
+FairTradeSoil
+
+FairyHat
+FairyHat
+
+FakeFangs
+FakeFangs
+
+Falchion
+Falchion
+
+Falkurn
+Falkurn
+
+Fallen
+Fallen
+
+FancyHat
+FancyHat
+
+Farewell.
+Farewell.
+
+Faris
+Faris
+
+Faris the Traveler
+Faris the Traveler
+
+Farmer Hinnak
+Farmer Hinnak
+
+Feel free to come visit me another time.
+Feel free to come visit me another time.
+
+Ferry Master#candor
+Ferry Master#candor
+
+Ferry Master#tulimshar
+Ferry Master#tulimshar
+
+Fey Element
+Fey Element
+
+Fieri
+Fieri
+
+FineDress
+FineDress
+
+Fire Goblin
+Fire Goblin
+
+Fire Skull
+Fire Skull
+
+Five for you and five for me.
+Five for you and five for me.
+
+Flashmob
+Flashmob
+
+FlawedLens
+FlawedLens
+
+FlightTalisman
+FlightTalisman
+
+Fluffy
+Fluffy
+
+FluffyHat
+FluffyHat
+
+Focus Skill +
+Focus Skill +
+
+Focus Skill -
+Focus Skill -
+
+Focus list:
+Focus list:
+
+Forest Mana Seed#_M
+Forest Mana Seed#_M
+
+ForestArmor
+ForestArmor
+
+ForestBow
+ForestBow
+
+Forwin
+Forwin
+
+FourLeafClover
+FourLeafClover
+
+FreeRangeMoss
+FreeRangeMoss
+
+From what I have been hearing, you seem to be doing well on your way to becoming a healer. I have decided to accept you as a student of the School of Life Magic.
+From what I have been hearing, you seem to be doing well on your way to becoming a healer. I have decided to accept you as a student of the School of Life Magic.
+
+FrozenYetiTear
+FrozenYetiTear
+
+Frozenbeard
+Frozenbeard
+
+Fruit Store
+Fruit Store
+
+FunkyChristmasSweater
+FunkyChristmasSweater
+
+FunkyHat
+FunkyHat
+
+FurBoots
+FurBoots
+
+GMCap
+GMCap
+
+GMRobe
+GMRobe
+
+GP: %s
+GP: %s
+
+Gamboge Plant
+Gamboge Plant
+
+GambogeHerb
+GambogeHerb
+
+Game Statistics
+Game Statistics
+
+Garcon#Duels
+Garcon#Duels
+
+General Krukan
+General Krukan
+
+General Razha
+General Razha
+
+General Store#dimond
+General Store#dimond
+
+General Store#hurnscald
+General Store#hurnscald
+
+General Terogan
+General Terogan
+
+General Terogan#Exit1
+General Terogan#Exit1
+
+General Terogan#Exit2
+General Terogan#Exit2
+
+General Terogan#Main
+General Terogan#Main
+
+George#pirate
+George#pirate
+
+Ggrmm... Grmmmm...
+Ggrmm... Grmmmm...
+
+Ghada
+Ghada
+
+Giant Maggot
+Giant Maggot
+
+GiantCaveMaggot
+GiantCaveMaggot
+
+GingerBreadMan
+GingerBreadMan
+
+Gispaan#Female
+Gispaan#Female
+
+Gispaan#Male
+Gispaan#Male
+
+Give me some space.
+Give me some space.
+
+Gladys
+Gladys
+
+Gm Event#1
+Gm Event
+
+Gm Event#2
+Gm Event#2
+
+Gm Event#3
+Gm Event#3
+
+Go back
+Go back
+
+Go back?
+Go back?
+
+Go fly a kite.
+Go fly a kite.
+
+Go on. If you need to think a bit, take your time.
+Go on. If you need to think a bit, take your time.
+
+GoblinMask
+GoblinMask
+
+Goggles
+Goggles
+
+Golbenez
+Golbenez
+
+GoldTicket
+GoldTicket
+
+GoldenDeliciousApple
+GoldenDeliciousApple
+
+GoldenFourLeafAmulet
+GoldenFourLeafAmulet
+
+GoldenPVPCap
+GoldenPVPCap
+
+GoldenPlatemail
+GoldenPlatemail
+
+GoldenScorpionStinger
+GoldenScorpionStinger
+
+GoldenWarlordPlate
+GoldenWarlordPlate
+
+Goodbye!
+Goodbye!
+
+Goodbye.
+Goodbye.
+
+GraduationCap
+GraduationCap
+
+GrapeLollipop
+GrapeLollipop
+
+Grass Snake
+Grass Snake
+
+GrassFedTofu
+GrassFedTofu
+
+GrassLiner
+GrassLiner
+
+GrassSeed
+GrassSeed
+
+GrassSnakeEgg
+GrassSnakeEgg
+
+GrassSnakeTongue
+GrassSnakeTongue
+
+Grave#1
+Grave
+
+Grave#10
+Grave#10
+
+Grave#11
+Grave#11
+
+Grave#12
+Grave#12
+
+Grave#2
+Grave#2
+
+Grave#3
+Grave#3
+
+Grave#4
+Grave#4
+
+Grave#5
+Grave#5
+
+Grave#6
+Grave#6
+
+Grave#7
+Grave#7
+
+Grave#8
+Grave#8
+
+Grave#9
+Grave#9
+
+GrayHint
+GrayHint
+
+Great! Now you can equip it.
+Great! Now you can equip it.
+
+Great, lets begin your first lesson.
+Great, lets begin your first lesson.
+
+GreatDragon
+GreatDragon
+
+Green Slime
+Green Slime
+
+Green Slime Mother
+Green Slime Mother
+
+GreenApple
+GreenApple
+
+GreenBeret
+GreenBeret
+
+GreenBowlerHat
+GreenBowlerHat
+
+GreenBowlerHatBrown
+GreenBowlerHatBrown
+
+GreenContributor
+GreenContributor
+
+GreenCottonBoots
+GreenCottonBoots
+
+GreenCottonCloth
+GreenCottonCloth
+
+GreenCottonGloves
+GreenCottonGloves
+
+GreenCottonHeadband
+GreenCottonHeadband
+
+GreenCottonShirt
+GreenCottonShirt
+
+GreenCottonShorts
+GreenCottonShorts
+
+GreenCottonSkirt
+GreenCottonSkirt
+
+GreenCottonTrousers
+GreenCottonTrousers
+
+GreenDesertHat
+GreenDesertHat
+
+GreenDye
+GreenDye
+
+GreenEasterEgg
+GreenEasterEgg
+
+GreenEggshellHat
+GreenEggshellHat
+
+GreenFineDress
+GreenFineDress
+
+GreenHint
+GreenHint
+
+GreenHitchhikersTowel
+GreenHitchhikersTowel
+
+GreenMiniskirt
+GreenMiniskirt
+
+GreenOrnament
+GreenOrnament
+
+GreenPresentBox
+GreenPresentBox
+
+GreenPresentHat
+GreenPresentHat
+
+GreenRabbitEars
+GreenRabbitEars
+
+GreenRedStripedWrap
+GreenRedStripedWrap
+
+GreenShades
+GreenShades
+
+GreenShortTankTop
+GreenShortTankTop
+
+GreenSilkRobe
+GreenSilkRobe
+
+GreenSorcererBlack
+GreenSorcererBlack
+
+GreenSorcererDBlue
+GreenSorcererDBlue
+
+GreenSorcererDGreen
+GreenSorcererDGreen
+
+GreenSorcererGreen
+GreenSorcererGreen
+
+GreenSorcererLBlue
+GreenSorcererLBlue
+
+GreenSorcererOrange
+GreenSorcererOrange
+
+GreenSorcererPink
+GreenSorcererPink
+
+GreenSorcererPurple
+GreenSorcererPurple
+
+GreenSorcererRed
+GreenSorcererRed
+
+GreenSorcererWhite
+GreenSorcererWhite
+
+GreenSorcererYellow
+GreenSorcererYellow
+
+GreenTankTop
+GreenTankTop
+
+GreenTicket
+GreenTicket
+
+GreenTurtleneck
+GreenTurtleneck
+
+GreenVNeckSweater
+GreenVNeckSweater
+
+GreenWizardHat
+GreenWizardHat
+
+GreenWrap
+GreenWrap
+
+Grenadier
+Grenadier
+
+GrimaceOfDementia
+GrimaceOfDementia
+
+Grimoire
+Grimoire
+
+Grinchboo
+Grinchboo
+
+GroovyHat
+GroovyHat
+
+GrubSlime
+GrubSlime
+
+Guard#castle
+Guard#castle
+
+Guard#east1
+Guard#east1
+
+Guard#east3
+Guard#east3
+
+Guard#govt_in
+Guard#govt_in
+
+Guard#govt_out
+Guard#govt_out
+
+Guard#port1
+Guard#port1
+
+Guard#port2
+Guard#port2
+
+Guard#school
+Guard#school
+
+GuardianWings
+GuardianWings
+
+GumiCandy
+GumiCandy
+
+Gungnir
+Gungnir
+
+Gunney
+Gunney
+
+GutBuster
+GutBuster
+
+GuyFawkesMask
+GuyFawkesMask
+
+Gwendolyn
+Gwendolyn
+
+Gwendolyn Bowmaker
+Gwendolyn Bowmaker
+
+Hail adventurer! You are well on your way to mastering the beasts of the island.
+Hail adventurer! You are well on your way to mastering the beasts of the island.
+
+Halas
+Halas
+
+Halberd
+Halberd
+
+Hall Of Acorns
+Hall Of Acorns
+
+Hall Of Base Level
+Hall Of Base Level
+
+Hall Of Fortune
+Hall Of Fortune
+
+Hall Of Guilds
+Hall Of Guilds
+
+Hall Of Job Level
+Hall Of Job Level
+
+Hall Of Lethality
+Hall Of Lethality
+
+Hamond
+Hamond
+
+HardSpike
+HardSpike
+
+Harper
+Harper
+
+Hasan
+Hasan
+
+Have a good day!
+Have a good day!
+
+Have fun with those spells and use them to cause hate, anger and death.
+Have fun with those spells and use them to cause hate, anger and death.
+
+Have you practiced enough?
+Have you practiced enough?
+
+He is a kind old man. He stays mostly with his books and his apprentice, though we have chatted a few times.
+He is a kind old man. He stays mostly with his books and his apprentice, though we have chatted a few times.
+
+HeartGlasses
+HeartGlasses
+
+HeartNecklace
+HeartNecklace
+
+HeartOfIsis
+HeartOfIsis
+
+HeartOfLazurite
+HeartOfLazurite
+
+Heathin
+Heathin
+
+HeathinDebug
+HeathinDebug
+
+Hello! Can I help you?
+Hello! Can I help you?
+
+Hello! How are you? Did you already visit Hurnscald?
+Hello! How are you? Did you already visit Hurnscald?
+
+Hello, Adventurer! Have you come back to help?
+Hello, Adventurer! Have you come back to help?
+
+Hello, I'm Alacrius.
+Hello, I'm Alacrius.
+
+Hello.
+Hello.
+
+Henriikka
+Henriikka
+
+Here is another useful one: '%s'. It will tell you the stats of the target monster, so you can know how dangerous it is.
+Here is another useful one: '%s'. It will tell you the stats of the target monster, so you can know how dangerous it is.
+
+Here you go!
+Here you go!
+
+Hetchel
+Hetchel
+
+HetchelDebug
+HetchelDebug
+
+Hey! Good to hear from you!
+Hey! Good to hear from you!
+
+Heya!
+Heya!
+
+Hi.
+Hi.
+
+Hide from monsters: %s
+Hide from monsters: %s
+
+HighPriestCrown
+HighPriestCrown
+
+Hinnak
+Hinnak
+
+HitchhikersTowel
+HitchhikersTowel
+
+Hm... Shhhh...
+Hm... Shhhh...
+
+Hmm. I wanted to teach you something, but I've forgotten what it was... please come back later.
+Hmm. I wanted to teach you something, but I've forgotten what it was... please come back later.
+
+Hmm... how about this: you help me with a few of my experiments, and I tell you?
+Hmm... how about this: you help me with a few of my experiments, and I tell you?
+
+Honey
+Honey
+
+House Maggot
+House Maggot
+
+How about changing my body type?
+How about changing my body type?
+
+How can I help you?"
+How can I help you?"
+
+How did you...
+How did you...
+
+How do I know you will not run off to Sagatha with what I would be teaching you?
+How do I know you will not run off to Sagatha with what I would be teaching you?
+
+How much do you want to deposit?
+How much do you want to deposit?
+
+How much do you want to withdraw?
+How much do you want to withdraw?
+
+How sad to hear how manners have degenerated in recent centuries. Farewell for now, dear mortal.
+How sad to hear how manners have degenerated in recent centuries. Farewell for now, dear mortal.
+
+Howdy?
+Howdy?
+
+Hrmm, no looks like only %d out of 5 have been found.
+Hrmm, no looks like only %d out of 5 have been found.
+
+Hungry Fluffy
+Hungry Fluffy
+
+Huntsman Spider
+Huntsman Spider
+
+Hurnscald North Dock
+Hurnscald North Dock
+
+Hurnscald North Koga
+Hurnscald North Koga
+
+Hurnscald South Dock
+Hurnscald South Dock
+
+Hurnscald South Koga
+Hurnscald South Koga
+
+Hydusun
+Hydusun
+
+Hyvern
+Hyvern
+
+HyvernStinger
+HyvernStinger
+
+I always need components for my own healing spells. If you bring me ten gamboge leaves, ten alizarin leaves, ten mauve leaves and ten cobalt leaves, I can make ten lifestones; I will give you half of them.
+I always need components for my own healing spells. If you bring me ten gamboge leaves, ten alizarin leaves, ten mauve leaves and ten cobalt leaves, I can make ten lifestones; I will give you half of them.
+
+I am sorry, but I don't think that I know anything that would help you.
+I am sorry, but I don't think that I know anything that would help you.
+
+I can trade you %d %ss for %d %s and %d GP.
+I can trade you %d %ss for %d %s and %d GP.
+
+I can't stay here and talk all day. I have a job to do.
+I can't stay here and talk all day. I have a job to do.
+
+I changed my mind.
+I changed my mind.
+
+I do not know, though I suggest to seek out a local alchemist, if there is any.
+I do not know, though I suggest to seek out a local alchemist, if there is any.
+
+I have homework to do...
+I have homework to do...
+
+I have taught thee all I can teach for now.
+I have taught thee all I can teach for now.
+
+I hope you like this color.
+I hope you like this color.
+
+I just want to live my life in peace.
+I just want to live my life in peace.
+
+I know not what brought thee hither, but I kindly ask that thou leavest me alone in my sorrow.
+I know not what brought thee hither, but I kindly ask that thou leavest me alone in my sorrow.
+
+I like you, so I'll tell you the bad word. But you can't tell anyone else about it! The bad word is %s.'
+I like you, so I'll tell you the bad word. But you can't tell anyone else about it! The bad word is %s.'
+
+I lost my towel...
+I lost my towel...
+
+I need to finish studying for my test...
+I need to finish studying for my test...
+
+I said %s.
+I said %s.
+
+I see you killed all the %s needed.
+I see you killed all the %s needed.
+
+I think I would like to observe you for a little longer to see if you would make a good healer.
+I think I would like to observe you for a little longer to see if you would make a good healer.
+
+I want to sleep...
+I want to sleep...
+
+I want to teach you my favorite. However, you are not powerful enough to use it yet; You will first have to absorb more magic from the mana seed.
+I want to teach you my favorite. However, you are not powerful enough to use it yet; You will first have to absorb more magic from the mana seed.
+
+I will make quick work of your wounds.
+I will make quick work of your wounds.
+
+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.
+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.
+
+I will only teach you magic of the school of Life, and that only if you prove yourself to be a good healer – that is, if you use your powers to help others.
+I will only teach you magic of the school of Life, and that only if you prove yourself to be a good healer – that is, if you use your powers to help others.
+
+I would like to perform money transactions.
+I would like to perform money transactions.
+
+I would like to store some items.
+I would like to store some items.
+
+I'd like to get a different style.
+I'd like to get a different style.
+
+I'll be waiting here, come back and see after you've killed those mobs.
+I'll be waiting here, come back and see after you've killed those mobs.
+
+I'm a little busy right now.
+I'm a little busy right now.
+
+I'm done.
+I'm done.
+
+I'm fine for now, thank you.
+I'm fine for now, thank you.
+
+I'm hoping to animate them into the shape of one of those odd log heads.
+I'm hoping to animate them into the shape of one of those odd log heads.
+
+I'm sorry, but I am not yet convinced that you are a good enough healer. Please continue in your endeavors.
+I'm sorry, but I am not yet convinced that you are a good enough healer. Please continue in your endeavors.
+
+I'm sorry, but I can't help you with that.
+I'm sorry, but I can't help you with that.
+
+I'm supposed to combine two potions to create a %s, but I can't seem to figure out which two to combine...
+I'm supposed to combine two potions to create a %s, but I can't seem to figure out which two to combine...
+
+I'm trying to get work on my Alchemy homework, but I'm having some trouble.
+I'm trying to get work on my Alchemy homework, but I'm having some trouble.
+
+Ian
+Ian
+
+Ian the Guide
+Ian the Guide
+
+Ice Element
+Ice Element
+
+Ice Goblin
+Ice Goblin
+
+Ice Skull
+Ice Skull
+
+IceCube
+IceCube
+
+IceGladius
+IceGladius
+
+IcedWater
+IcedWater
+
+If the rumors are true and there really is a Mana Seed, then that would be wonderful news – perhaps we will have a few more healers soon!
+If the rumors are true and there really is a Mana Seed, then that would be wonderful news – perhaps we will have a few more healers soon!
+
+If you meant to reset the drop rate to its default value: @droprate default
+If you meant to reset the drop rate to its default value: @droprate default
+
+If you meant to reset the exp rate to its default value: @exprate default
+If you meant to reset the exp rate to its default value: @exprate default
+
+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: '%s'. Then press the root to the ground.
+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: '%s'. Then press the root to the ground.
+
+If you're using another client, settings and controls may be different.
+If you're using another client, settings and controls may be different.
+
+Iivo
+Iivo
+
+IlliaCMobs051-3
+IlliaCMobs051-3
+
+IlliaDMobs051-1
+IlliaDMobs051-1
+
+IlliaFMobs051-1
+IlliaFMobs051-1
+
+Imec
+Imec
+
+Impossible to resync: You are dead.
+Impossible to resync: You are dead.
+
+In that dresser there are some clothes you can wear.
+In that dresser there are some clothes you can wear.
+
+Inac
+Inac
+
+Inar
+Inar
+
+InfantryHelmet
+InfantryHelmet
+
+Inn
+Inn
+
+Inspector#Hurnscald
+Inspector#Hurnscald
+
+Internalize this feeling, and if your backpack was pressing on you you should no longer feel it now. We call it %s and it is a passive spell.
+Internalize this feeling, and if your backpack was pressing on you you should no longer feel it now. We call it %s and it is a passive spell.
+
+Interval: (none, only sent on login)
+Interval: (none, only sent on login)
+
+Interval: every @@ hour(s)
+Interval: every @@ hour(s)
+
+Invalid map mask
+Invalid map mask
+
+Invalid parameter specified, blame saulc.
+Invalid parameter specified, blame saulc.
+
+Inya
+Inya
+
+Iormo
+Iormo
+
+IronArrow
+IronArrow
+
+IronIngot
+IronIngot
+
+IronOre
+IronOre
+
+IronPotion
+IronPotion
+
+IronPowder
+IronPowder
+
+Ishi
+Ishi
+
+Ishyah
+Ishyah
+
+Ismo
+Ismo
+
+Issay
+Issay
+
+It appears to be an ordinary sword.
+It appears to be an ordinary sword.
+
+It is a sunny day, don't you think?
+It is a sunny day, don't you think?
+
+It is already raining!
+It is already raining!
+
+It looks like you can't carry anything else for now.
+It looks like you can't carry anything else for now.
+
+It might be a good idea to drag the spell to the shortcut window, so you can target and attack using your keyboard instead of mouse.
+It might be a good idea to drag the spell to the shortcut window, so you can target and attack using your keyboard instead of mouse.
+
+It seems you did not tell me the correct ingredients. Come back when you find the correct ones.
+It seems you did not tell me the correct ingredients. Come back when you find the correct ones.
+
+It seems you found %d out of 5 of my friends.
+It seems you found %d out of 5 of my friends.
+
+It seems you managed to amass quite a fortune!
+It seems you managed to amass quite a fortune!
+
+It was impossible to conjure rain clouds on this map.
+It was impossible to conjure rain clouds on this map.
+
+It worked!
+It worked!
+
+Items: %s
+Items: %s
+
+Iten
+Iten
+
+Itka
+Itka
+
+J.P. Morbid
+J.P. Morbid
+
+Jack
+Jack
+
+Jack O
+Jack O
+
+JackOLantern
+JackOLantern
+
+Jackal
+Jackal
+
+JadeEgg
+JadeEgg
+
+Jail Lock 1
+Jail Lock 1
+
+Jail Lock 2
+Jail Lock 2
+
+Jail Lock 3
+Jail Lock 3
+
+Jail Lock 4
+Jail Lock 4
+
+Janika
+Janika
+
+JarofBlood
+JarofBlood
+
+JarofOwnBlood
+JarofOwnBlood
+
+JazzyHat
+JazzyHat
+
+JeansChaps
+JeansChaps
+
+JeansShorts
+JeansShorts
+
+JellAhh
+JellAhh
+
+JellyBeans
+JellyBeans
+
+JellySkull
+JellySkull
+
+Jena the Traveler
+Jena the Traveler
+
+Jeric
+Jeric
+
+Jerry
+Jerry
+
+Jessie
+Jessie
+
+JesterMask
+JesterMask
+
+Jhedia
+Jhedia
+
+Joan
+Joan
+
+Joelin
+Joelin
+
+Jonathan
+Jonathan
+
+Josh
+Josh
+
+Julia
+Julia
+
+KPS Manager
+KPS Manager
+
+Kaan
+Kaan
+
+Kaan grins mischieviously.
+Kaan grins mischieviously.
+
+Kadiya
+Kadiya
+
+Kage Golem
+Kage Golem
+
+Kane
+Kane
+
+Katze
+Katze
+
+Keep in mind this spell only works on yourself or party/guild companions. It will reduce your attack speed so keep this in mind.
+Keep in mind this spell only works on yourself or party/guild companions. It will reduce your attack speed so keep this in mind.
+
+Keep moving pal.
+Keep moving pal.
+
+Kekeke... excellent! Yes, here goes your first spell, and it is even a passive: the flying backpack! If you are overloaded, it will take the load off your shoulders.
+Kekeke... excellent! Yes, here goes your first spell, and it is even a passive: the flying backpack! If you are overloaded, it will take the load off your shoulders.
+
+Kfahr
+Kfahr
+
+Khoenan the Traveler
+Khoenan the Traveler
+
+KidBook
+KidBook
+
+Kilis
+Kilis
+
+Kimarr
+Kimarr
+
+Knife
+Knife
+
+KnightsHelmet
+KnightsHelmet
+
+KnitCap
+KnitCap
+
+Knitra the Traveler
+Knitra the Traveler
+
+Knowledgeable Tree
+Knowledgeable Tree
+
+Knox the Traveler
+Knox the Traveler
+
+Koyntety
+Koyntety
+
+Kristian
+Kristian
+
+Kullervo
+Kullervo
+
+Kylian
+Kylian
+
+KylianDebug#1
+KylianDebug
+
+KylianDebug#2
+KylianDebug#2
+
+Kytty
+Kytty
+
+LacedChocolateCake
+LacedChocolateCake
+
+LacedOrangeCupcake
+LacedOrangeCupcake
+
+LactoseFreeAcorn
+LactoseFreeAcorn
+
+Lady Skeleton
+Lady Skeleton
+
+LadyFingers
+LadyFingers
+
+LargeHealingPotion
+LargeHealingPotion
+
+LargeManaElixir
+LargeManaElixir
+
+Larvern
+Larvern
+
+Latif
+Latif
+
+Latoy
+Latoy
+
+Lava Slime
+Lava Slime
+
+LazuriteCrystal
+LazuriteCrystal
+
+LazuriteRobe
+LazuriteRobe
+
+LazuriteShard
+LazuriteShard
+
+Leafing through the manuscript, you find that you can read little of the tiny handwriting and understand only a fraction of what is said.
+Leafing through the manuscript, you find that you can read little of the tiny handwriting and understand only a fraction of what is said.
+
+Leafing through the manuscript, you find that you understand too little of what is written to make any sense of it.
+Leafing through the manuscript, you find that you understand too little of what is written to make any sense of it.
+
+LeatherBall
+LeatherBall
+
+LeatherGloves
+LeatherGloves
+
+LeatherGoggles
+LeatherGoggles
+
+LeatherPatch
+LeatherPatch
+
+LeatherShield
+LeatherShield
+
+LeatherShirt
+LeatherShirt
+
+LeatherSuitcase
+LeatherSuitcase
+
+LeatherTrousers
+LeatherTrousers
+
+Leave it alone.
+Leave it alone.
+
+Lena
+Lena
+
+Lenita
+Lenita
+
+Leofwin
+Leofwin
+
+Lesser Ghost
+Lesser Ghost
+
+Let me give you a lifestone to get started with.
+Let me give you a lifestone to get started with.
+
+Let's see whats on the list. Ah ok, I need you to kill me %d %s.
+Let's see whats on the list. Ah ok, I need you to kill me %d %s.
+
+Lets start with a basic wand attack: %s.
+Lets start with a basic wand attack: %s.
+
+Liana
+Liana
+
+Lieutenant Dausen
+Lieutenant Dausen
+
+Lifestone
+Lifestone
+
+LightBlueBeret
+LightBlueBeret
+
+LightBlueBowlerHat
+LightBlueBowlerHat
+
+LightBlueBowlerHatBrown
+LightBlueBowlerHatBrown
+
+LightBlueContributor
+LightBlueContributor
+
+LightBlueCottonBoots
+LightBlueCottonBoots
+
+LightBlueCottonCloth
+LightBlueCottonCloth
+
+LightBlueCottonGloves
+LightBlueCottonGloves
+
+LightBlueCottonHeadband
+LightBlueCottonHeadband
+
+LightBlueCottonShirt
+LightBlueCottonShirt
+
+LightBlueCottonShorts
+LightBlueCottonShorts
+
+LightBlueCottonSkirt
+LightBlueCottonSkirt
+
+LightBlueCottonTrousers
+LightBlueCottonTrousers
+
+LightBlueDesertHat
+LightBlueDesertHat
+
+LightBlueDye
+LightBlueDye
+
+LightBlueFineDress
+LightBlueFineDress
+
+LightBlueMiniskirt
+LightBlueMiniskirt
+
+LightBlueRabbitEars
+LightBlueRabbitEars
+
+LightBlueShades
+LightBlueShades
+
+LightBlueShortTankTop
+LightBlueShortTankTop
+
+LightBlueSilkRobe
+LightBlueSilkRobe
+
+LightBlueSorcererBlack
+LightBlueSorcererBlack
+
+LightBlueSorcererDBlue
+LightBlueSorcererDBlue
+
+LightBlueSorcererDGreen
+LightBlueSorcererDGreen
+
+LightBlueSorcererGreen
+LightBlueSorcererGreen
+
+LightBlueSorcererLBlue
+LightBlueSorcererLBlue
+
+LightBlueSorcererOrange
+LightBlueSorcererOrange
+
+LightBlueSorcererPink
+LightBlueSorcererPink
+
+LightBlueSorcererPurple
+LightBlueSorcererPurple
+
+LightBlueSorcererRed
+LightBlueSorcererRed
+
+LightBlueSorcererWhite
+LightBlueSorcererWhite
+
+LightBlueSorcererYellow
+LightBlueSorcererYellow
+
+LightBlueTankTop
+LightBlueTankTop
+
+LightBlueTurtleneck
+LightBlueTurtleneck
+
+LightBlueVNeckSweater
+LightBlueVNeckSweater
+
+LightBlueWizardHat
+LightBlueWizardHat
+
+LightCrystal
+LightCrystal
+
+LightPlatemail
+LightPlatemail
+
+LimeHitchhikersTowel
+LimeHitchhikersTowel
+
+LockPicks
+LockPicks
+
+Log Head
+Log Head
+
+LollipopColor1
+LollipopColor1
+
+LollipopColor2
+LollipopColor2
+
+LollipopColor3
+LollipopColor3
+
+LongSword
+LongSword
+
+Lora Tay
+Lora Tay
+
+Lora Tay Debug
+Lora Tay Debug
+
+Lorrie
+Lorrie
+
+Lost? Confused? Want to know why you can't get past a quest, overcome an NPC or find an item? Check %s for player hints, walkthroughs, item lists and more!
+Lost? Confused? Want to know why you can't get past a quest, overcome an NPC or find an item? Check %s for player hints, walkthroughs, item lists and more!
+
+LoveLetter
+LoveLetter
+
+LovePotion
+LovePotion
+
+Lovely Maggot
+Lovely Maggot
+
+Lovers
+Lovers
+
+Luca
+Luca
+
+Luvia
+Luvia
+
+Luvia?
+Luvia?
+
+MTJarofOwnBlood
+MTJarofOwnBlood
+
+MageRing
+MageRing
+
+MagentaHint
+MagentaHint
+
+MagentaOrnament
+MagentaOrnament
+
+Maggot
+Maggot
+
+MaggotSlime
+MaggotSlime
+
+Magic Sword
+Magic Sword
+
+Magic flows naturally from you, readily and with ease. You feel in perfect control of your magic.
+Magic flows naturally from you, readily and with ease. You feel in perfect control of your magic.
+
+MagicGMTopHat
+MagicGMTopHat
+
+Malek
+Malek
+
+Malivox
+Malivox
+
+Mallard's Eye
+Mallard's Eye
+
+Mana Bug
+Mana Bug
+
+Mana Ghost
+Mana Ghost
+
+Mana Slayer
+Mana Slayer
+
+Mana Tyrant
+Mana Tyrant
+
+ManaGuardian
+ManaGuardian
+
+ManaPotion
+ManaPotion
+
+Manually trigger the current broadcast
+Manually trigger the current broadcast
+
+Maria
+Maria
+
+Marikel
+Marikel
+
+Marshmallow
+Marshmallow
+
+Mauve Plant
+Mauve Plant
+
+MauveHerb
+MauveHerb
+
+Mede
+Mede
+
+MediumHealingPotion
+MediumHealingPotion
+
+MediumManaElixir
+MediumManaElixir
+
+Melinda
+Melinda
+
+Meluna
+Meluna
+
+Meridith the Traveler
+Meridith the Traveler
+
+Merry Christmas!
+Merry Christmas!
+
+Merry Christmas, adventurer.
+Merry Christmas, adventurer.
+
+Merry Christmas, arr yarr!!
+Merry Christmas, arr yarr!!
+
+Message:
+Message:
+
+Michel
+Michel
+
+Mika
+Mika
+
+Mike
+Mike
+
+Mikhail
+Mikhail
+
+Miler
+Miler
+
+Milis
+Milis
+
+Milk
+Milk
+
+Milly
+Milly
+
+MillyDebugHelper
+MillyDebugHelper
+
+Mine Debug#1
+Mine Debug
+
+Mine Debug#2
+Mine Debug#2
+
+Mine Debug#3
+Mine Debug#3
+
+Mine Debug#4
+Mine Debug#4
+
+Miner
+Miner
+
+MinerGloves
+MinerGloves
+
+MinersHat
+MinersHat
+
+Miniskirt
+Miniskirt
+
+Mirak
+Mirak
+
+Miriam
+Miriam
+
+Mirjami
+Mirjami
+
+Miro
+Miro
+
+Mirror#wiz
+Mirror#wiz
+
+Mjolnir
+Mjolnir
+
+Mo
+Mo
+
+Mob points: %s
+Mob points: %s
+
+Moggun
+Moggun
+
+Money transference will have a %d %% fee as well.
+Money transference will have a %d %% fee as well.
+
+MoneyChanger
+MoneyChanger
+
+Monocle
+Monocle
+
+MonsterOilPotion
+MonsterOilPotion
+
+MonsterSkullHelmet
+MonsterSkullHelmet
+
+Monsters Killed in PvE: %s
+Monsters Killed in PvE: %s
+
+Moo!
+Moo!
+
+Moonshroom
+Moonshroom
+
+MoonshroomHat
+MoonshroomHat
+
+Moooo!
+Moooo!
+
+Moooooo!
+Moooooo!
+
+Moooooooooooo!
+Moooooooooooo!
+
+MopoxCurePotion
+MopoxCurePotion
+
+Morgan#_M
+Morgan#_M
+
+MorganDebug
+MorganDebug
+
+Motto#wiz
+Motto#wiz
+
+Mouboo
+Mouboo
+
+MoubooFigurine
+MoubooFigurine
+
+MoubooHead
+MoubooHead
+
+MoubootaurHead
+MoubootaurHead
+
+Mountain Snake
+Mountain Snake
+
+MountainSnakeEgg
+MountainSnakeEgg
+
+MountainSnakeTongue
+MountainSnakeTongue
+
+MovieCap
+MovieCap
+
+Much better, right?!
+Much better, right?!
+
+Munro
+Munro
+
+MurdererCrown
+MurdererCrown
+
+MushHat
+MushHat
+
+My breath smells bad.
+My breath smells bad.
+
+My name is Kaan, I'm Tanisha's brother."
+My name is Kaan, I'm Tanisha's brother."
+
+My spell only works on the very young, sorry.
+My spell only works on the very young, sorry.
+
+MylarinDust
+MylarinDust
+
+Mystic Sword
+Mystic Sword
+
+Naah, you're too weak now! Come back later when you have grown!
+Naah, you're too weak now! Come back later when you have grown!
+
+Naem
+Naem
+
+Narrator
+Narrator
+
+Nathan
+Nathan
+
+Nea
+Nea
+
+Need a healing?
+Need a healing?
+
+Neko
+Neko
+
+Never (only on login)
+Never (only on login)
+
+Next broadcast: (never)
+Next broadcast: (never)
+
+Next broadcast: @@
+Next broadcast: @@
+
+Next ingredient.
+Next ingredient.
+
+Next, I shall teach you a higher-level transmutation spell.
+Next, I shall teach you a higher-level transmutation spell.
+
+Next, a nature spell. Take a cocoon shell. Hold it in your hand. Feel its lightness.
+Next, a nature spell. Take a cocoon shell. Hold it in your hand. Feel its lightness.
+
+Next, say '%s', and feel your skin grow rigid! Very useful against stings and stabs and pokes and pricks and that sort of stuff. Lowers attack speed and only works on yourself, party, or guild allies, though.
+Next, say '%s', and feel your skin grow rigid! Very useful against stings and stabs and pokes and pricks and that sort of stuff. Lowers attack speed and only works on yourself, party, or guild allies, though.
+
+Nice day to you.
+Nice day to you.
+
+Nicholas
+Nicholas
+
+Nickos
+Nickos
+
+Nigel
+Nigel
+
+Nikolai
+Nikolai
+
+Nina the Traveler
+Nina the Traveler
+
+Nivalis Dock
+Nivalis Dock
+
+Nivalis Koga
+Nivalis Koga
+
+No
+No
+
+No, I am sorry. Please bring me ten leaves each of gamboge, alizarin, mauve, and cobalt.
+No, I am sorry. Please bring me ten leaves each of gamboge, alizarin, mauve, and cobalt.
+
+No, thanks. I already know how things are going.
+No, thanks. I already know how things are going.
+
+No, you are not powerful enough yet. Please come back and ask me again when you have learned to control more powerful magic, though!
+No, you are not powerful enough yet. Please come back and ask me again when you have learned to control more powerful magic, though!
+
+No.
+No.
+
+NohMask
+NohMask
+
+Nonsense! You look fine and dandy to me. All you need is a bit more exercise and fresh fruit in your diet!
+Nonsense! You look fine and dandy to me. All you need is a bit more exercise and fresh fruit in your diet!
+
+Not in the mood to chat.
+Not in the mood to chat.
+
+Not resync'ing to prevent flood.
+Not resync'ing to prevent flood.
+
+Not yet.
+Not yet.
+
+Notable mentions and thanks for our [@@https://www.patreon.com/themanaworld|sponsors@@] for their continued support.
+Notable mentions and thanks for our [@@https://www.patreon.com/themanaworld|sponsors@@] for their continued support.
+
+Note
+Note
+
+Note#bar
+Note#bar
+
+Note#mirak
+Note#mirak
+
+Note#wiz
+Note#wiz
+
+Note: Transfering items on mail cost %s GP/item
+Note: Transfering items on mail cost %s GP/item
+
+Nothing happens.
+Nothing happens.
+
+Now get the clothes out of the dresser.
+Now get the clothes out of the dresser.
+
+Now hold still, this won't hurt a bit...
+Now hold still, this won't hurt a bit...
+
+Now leave. Spread chaos with the spells I have taught you!
+Now leave. Spread chaos with the spells I have taught you!
+
+Now that you are a student of mine, I will teach you some spells.
+Now that you are a student of mine, I will teach you some spells.
+
+Now that you know the basics of nature magic, here is one of my favourites: '%s' will summon rain, whereever you are standing. It will consume a bottle of water, though.
+Now that you know the basics of nature magic, here is one of my favourites: '%s' will summon rain, whereever you are standing. It will consume a bottle of water, though.
+
+Now, listen carefully: to make a short tank top out of three pieces of cloth, you must use the invocation '%s'.
+Now, listen carefully: to make a short tank top out of three pieces of cloth, you must use the invocation '%s'.
+
+Nurse
+Nurse
+
+Nutcracker
+Nutcracker
+
+NutcrackerHat
+NutcrackerHat
+
+Nyle
+Nyle
+
+Observe!
+Observe!
+
+Oh dear! That looks like poison; hang on...
+Oh dear! That looks like poison; hang on...
+
+Oh look, it is Cupid!
+Oh look, it is Cupid!
+
+Oh, I can't be sure... but something like '%s', I think.
+Oh, I can't be sure... but something like '%s', I think.
+
+Oh, I have only met Sagatha once or twice, while collecting herbs. She is a warm and gentle person, but she tries to hide it.
+Oh, I have only met Sagatha once or twice, while collecting herbs. She is a warm and gentle person, but she tries to hide it.
+
+Oh, and a fruit may even fall for you if you are lucky! But stay alert to pick up your drops.
+Oh, and a fruit may even fall for you if you are lucky! But stay alert to pick up your drops.
+
+Oh, and by the way my name is Sorfina."
+Oh, and by the way my name is Sorfina."
+
+Oh, but of course! You are powerful enough to make your own lifestones, using the enchantment '%s'. This will consume a bug leg, a maggot slime and one of each of the four healing herbs, though.
+Oh, but of course! You are powerful enough to make your own lifestones, using the enchantment '%s'. This will consume a bug leg, a maggot slime and one of each of the four healing herbs, though.
+
+Oh, sorry – I don't really know him very well.
+Oh, sorry – I don't really know him very well.
+
+Oh, you found them all! Good job! Now it's my turn with searching again. Go and hide!
+Oh, you found them all! Good job! Now it's my turn with searching again. Go and hide!
+
+Oh.
+Oh.
+
+Oh... it seems that you have no room for the lifestones. But please do come back later when you have made a little space.
+Oh... it seems that you have no room for the lifestones. But please do come back later when you have made a little space.
+
+Oh... you managed to put things into every little nook and pocket, haven't you? Well, come back later, I will give it to you then.
+Oh... you managed to put things into every little nook and pocket, haven't you? Well, come back later, I will give it to you then.
+
+Ok, done.
+Ok, done.
+
+Okay let me try this.
+Okay let me try this.
+
+Olana
+Olana
+
+Old Chest#crastur
+Old Chest#crastur
+
+Old Man
+Old Man
+
+Old Wizard#_W
+Old Wizard#_W
+
+Old Woman
+Old Woman
+
+Omar
+Omar
+
+Once this is done you have to throw it in the air and scream %s and the two roots will turn into toxic darts, a projectile you can throw.
+Once this is done you have to throw it in the air and scream %s and the two roots will turn into toxic darts, a projectile you can throw.
+
+Only %s in storage will be counted.
+Only %s in storage will be counted.
+
+Ontas
+Ontas
+
+OpenPresentBox
+OpenPresentBox
+
+OperaMask
+OperaMask
+
+Or, well, both.
+Or, well, both.
+
+Orange
+Orange
+
+OrangeBeret
+OrangeBeret
+
+OrangeBowlerHat
+OrangeBowlerHat
+
+OrangeBowlerHatBrown
+OrangeBowlerHatBrown
+
+OrangeCake
+OrangeCake
+
+OrangeContributor
+OrangeContributor
+
+OrangeCottonBoots
+OrangeCottonBoots
+
+OrangeCottonCloth
+OrangeCottonCloth
+
+OrangeCottonGloves
+OrangeCottonGloves
+
+OrangeCottonHeadband
+OrangeCottonHeadband
+
+OrangeCottonShirt
+OrangeCottonShirt
+
+OrangeCottonShorts
+OrangeCottonShorts
+
+OrangeCottonSkirt
+OrangeCottonSkirt
+
+OrangeCottonTrousers
+OrangeCottonTrousers
+
+OrangeCupcake
+OrangeCupcake
+
+OrangeDesertHat
+OrangeDesertHat
+
+OrangeDye
+OrangeDye
+
+OrangeEggshellHat
+OrangeEggshellHat
+
+OrangeFineDress
+OrangeFineDress
+
+OrangeHint
+OrangeHint
+
+OrangeHitchhikersTowel
+OrangeHitchhikersTowel
+
+OrangeLollipop
+OrangeLollipop
+
+OrangeMiniskirt
+OrangeMiniskirt
+
+OrangeRabbitEars
+OrangeRabbitEars
+
+OrangeRose
+OrangeRose
+
+OrangeRoseHat
+OrangeRoseHat
+
+OrangeShades
+OrangeShades
+
+OrangeShortTankTop
+OrangeShortTankTop
+
+OrangeSilkRobe
+OrangeSilkRobe
+
+OrangeSorcererBlack
+OrangeSorcererBlack
+
+OrangeSorcererDBlue
+OrangeSorcererDBlue
+
+OrangeSorcererDGreen
+OrangeSorcererDGreen
+
+OrangeSorcererGreen
+OrangeSorcererGreen
+
+OrangeSorcererLBlue
+OrangeSorcererLBlue
+
+OrangeSorcererOrange
+OrangeSorcererOrange
+
+OrangeSorcererPink
+OrangeSorcererPink
+
+OrangeSorcererPurple
+OrangeSorcererPurple
+
+OrangeSorcererRed
+OrangeSorcererRed
+
+OrangeSorcererWhite
+OrangeSorcererWhite
+
+OrangeSorcererYellow
+OrangeSorcererYellow
+
+OrangeSummonFlower
+OrangeSummonFlower
+
+OrangeTankTop
+OrangeTankTop
+
+OrangeTulip
+OrangeTulip
+
+OrangeTurtleneck
+OrangeTurtleneck
+
+OrangeVNeckSweater
+OrangeVNeckSweater
+
+OrangeWizardHat
+OrangeWizardHat
+
+OrchidBra
+OrchidBra
+
+Orum
+Orum
+
+Orum#barrier
+Orum#barrier
+
+Orum#trap
+Orum#trap
+
+Orum's Homunculus
+Orum's Homunculus
+
+OrumDebug
+OrumDebug
+
+Oscar
+Oscar
+
+Oskari
+Oskari
+
+Osmo
+Osmo
+
+Oswal
+Oswal
+
+Other
+Other
+
+Other.
+Other.
+
+OverlordsHelmet
+OverlordsHelmet
+
+PS. Doesn't always work. You need an account at %s and to be at ManaPlus Team.
+PS. Doesn't always work. You need an account at %s and to be at ManaPlus Team.
+
+PVPCap
+PVPCap
+
+PVPCoin
+PVPCoin
+
+Pachua
+Pachua
+
+Painless, wasn't it?
+Painless, wasn't it?
+
+PaladinsHelmet
+PaladinsHelmet
+
+PanHat
+PanHat
+
+PaperBag
+PaperBag
+
+Parcival
+Parcival
+
+Parua
+Parua
+
+Pauline
+Pauline
+
+PaulineDebug
+PaulineDebug
+
+Pear
+Pear
+
+Pearl
+Pearl
+
+Peetu
+Peetu
+
+Personal Information
+Personal Information
+
+Peter
+Peter
+
+Phaet
+Phaet
+
+Phaet#arena
+Phaet#arena
+
+Phil
+Phil
+
+Phylactery
+Phylactery
+
+PickledBeets
+PickledBeets
+
+PileOfAsh
+PileOfAsh
+
+PilotHat
+PilotHat
+
+Pink Flower
+Pink Flower
+
+PinkAntenna
+PinkAntenna
+
+PinkBeret
+PinkBeret
+
+PinkBowlerHat
+PinkBowlerHat
+
+PinkBowlerHatBrown
+PinkBowlerHatBrown
+
+PinkChristmasSweater
+PinkChristmasSweater
+
+PinkContributor
+PinkContributor
+
+PinkCottonBoots
+PinkCottonBoots
+
+PinkCottonCloth
+PinkCottonCloth
+
+PinkCottonGloves
+PinkCottonGloves
+
+PinkCottonHeadband
+PinkCottonHeadband
+
+PinkCottonShirt
+PinkCottonShirt
+
+PinkCottonShorts
+PinkCottonShorts
+
+PinkCottonSkirt
+PinkCottonSkirt
+
+PinkCottonTrousers
+PinkCottonTrousers
+
+PinkDesertHat
+PinkDesertHat
+
+PinkDye
+PinkDye
+
+PinkEasterEgg
+PinkEasterEgg
+
+PinkFineDress
+PinkFineDress
+
+PinkHitchhikersTowel
+PinkHitchhikersTowel
+
+PinkMiniskirt
+PinkMiniskirt
+
+PinkPetal
+PinkPetal
+
+PinkRabbitEars
+PinkRabbitEars
+
+PinkRose
+PinkRose
+
+PinkRoseHat
+PinkRoseHat
+
+PinkShades
+PinkShades
+
+PinkShortTankTop
+PinkShortTankTop
+
+PinkSilkRobe
+PinkSilkRobe
+
+PinkSorcererBlack
+PinkSorcererBlack
+
+PinkSorcererDBlue
+PinkSorcererDBlue
+
+PinkSorcererDGreen
+PinkSorcererDGreen
+
+PinkSorcererGreen
+PinkSorcererGreen
+
+PinkSorcererLBlue
+PinkSorcererLBlue
+
+PinkSorcererOrange
+PinkSorcererOrange
+
+PinkSorcererPink
+PinkSorcererPink
+
+PinkSorcererPurple
+PinkSorcererPurple
+
+PinkSorcererRed
+PinkSorcererRed
+
+PinkSorcererWhite
+PinkSorcererWhite
+
+PinkSorcererYellow
+PinkSorcererYellow
+
+PinkTankTop
+PinkTankTop
+
+PinkTicket
+PinkTicket
+
+PinkTulip
+PinkTulip
+
+PinkTurtleneck
+PinkTurtleneck
+
+PinkVNeckSweater
+PinkVNeckSweater
+
+PinkWizardHat
+PinkWizardHat
+
+Pinkie
+Pinkie
+
+Pinkie Scroll
+Pinkie Scroll
+
+PinkieHat
+PinkieHat
+
+PinkieHelmet
+PinkieHelmet
+
+Pipe
+Pipe
+
+PirateHat
+PirateHat
+
+PlatynaRedDress
+PlatynaRedDress
+
+Players Killed in PvP: %s
+Players Killed in PvP: %s
+
+Players breaking the following rules may be banned for any length of time (even permanently) or have their characters reset at a GM's discretion:
+Players breaking the following rules may be banned for any length of time (even permanently) or have their characters reset at a GM's discretion:
+
+Please enter the message:
+Please enter the message:
+
+Please equip your ammo first!
+Please equip your ammo first!
+
+Please insert your pincode.
+Please insert your pincode.
+
+Please leave me in peace.
+Please leave me in peace.
+
+Please select a quest:
+Please select a quest:
+
+Please select the desired body type:
+Please select the desired body type:
+
+Please select the interval:
+Please select the interval:
+
+Please stand still.
+Please stand still.
+
+Plum
+Plum
+
+PlushMouboo
+PlushMouboo
+
+PointyWitchHat
+PointyWitchHat
+
+Poison Skull
+Poison Skull
+
+Pollett
+Pollett
+
+PollettEgg
+PollettEgg
+
+Poltergeist
+Poltergeist
+
+PoltergeistPowder
+PoltergeistPowder
+
+Pot
+Pot
+
+Potions#_M
+Potions#_M
+
+Practice! There are no secrets to becoming a warrior.
+Practice! There are no secrets to becoming a warrior.
+
+Present#1
+Present
+
+Present#2
+Present#2
+
+Present#3
+Present#3
+
+Psi Brain
+Psi Brain
+
+Pumpkin
+Pumpkin
+
+PumpkinHelmet
+PumpkinHelmet
+
+PumpkinSeeds
+PumpkinSeeds
+
+PurificationPotion
+PurificationPotion
+
+PurpleBeret
+PurpleBeret
+
+PurpleBowlerHat
+PurpleBowlerHat
+
+PurpleBowlerHatBrown
+PurpleBowlerHatBrown
+
+PurpleContributor
+PurpleContributor
+
+PurpleCottonBoots
+PurpleCottonBoots
+
+PurpleCottonCloth
+PurpleCottonCloth
+
+PurpleCottonGloves
+PurpleCottonGloves
+
+PurpleCottonHeadband
+PurpleCottonHeadband
+
+PurpleCottonShirt
+PurpleCottonShirt
+
+PurpleCottonShorts
+PurpleCottonShorts
+
+PurpleCottonSkirt
+PurpleCottonSkirt
+
+PurpleCottonTrousers
+PurpleCottonTrousers
+
+PurpleDesertHat
+PurpleDesertHat
+
+PurpleDye
+PurpleDye
+
+PurpleFineDress
+PurpleFineDress
+
+PurpleHint
+PurpleHint
+
+PurpleHitchhikersTowel
+PurpleHitchhikersTowel
+
+PurpleMiniskirt
+PurpleMiniskirt
+
+PurplePresentBox
+PurplePresentBox
+
+PurpleRabbitEars
+PurpleRabbitEars
+
+PurpleShades
+PurpleShades
+
+PurpleShortTankTop
+PurpleShortTankTop
+
+PurpleSilkRobe
+PurpleSilkRobe
+
+PurpleSorcererBlack
+PurpleSorcererBlack
+
+PurpleSorcererDBlue
+PurpleSorcererDBlue
+
+PurpleSorcererDGreen
+PurpleSorcererDGreen
+
+PurpleSorcererGreen
+PurpleSorcererGreen
+
+PurpleSorcererLBlue
+PurpleSorcererLBlue
+
+PurpleSorcererOrange
+PurpleSorcererOrange
+
+PurpleSorcererPink
+PurpleSorcererPink
+
+PurpleSorcererPurple
+PurpleSorcererPurple
+
+PurpleSorcererRed
+PurpleSorcererRed
+
+PurpleSorcererWhite
+PurpleSorcererWhite
+
+PurpleSorcererYellow
+PurpleSorcererYellow
+
+PurpleStripedWrap
+PurpleStripedWrap
+
+PurpleSummonFlower
+PurpleSummonFlower
+
+PurpleTankTop
+PurpleTankTop
+
+PurpleTicket
+PurpleTicket
+
+PurpleTulip
+PurpleTulip
+
+PurpleTurtleneck
+PurpleTurtleneck
+
+PurpleVNeckSweater
+PurpleVNeckSweater
+
+PurpleWizardHat
+PurpleWizardHat
+
+PurpleWrap
+PurpleWrap
+
+Pyry
+Pyry
+
+Quest @@ modified by GM
+Quest @@ modified by GM
+
+Quest debug
+Quest debug
+
+QuillOfBinding
+QuillOfBinding
+
+Quit
+Quit
+
+RIP#1
+RIP
+
+RIP#10
+RIP#10
+
+RIP#2
+RIP#2
+
+RIP#3
+RIP#3
+
+RIP#4
+RIP#4
+
+RIP#5
+RIP#5
+
+RIP#6
+RIP#6
+
+RIP#7
+RIP#7
+
+RIP#8
+RIP#8
+
+RIP#9
+RIP#9
+
+RabbitEars
+RabbitEars
+
+RaggedShorts
+RaggedShorts
+
+Raging
+Raging
+
+RangerHat
+RangerHat
+
+Rasin
+Rasin
+
+Rauk
+Rauk
+
+RawAir
+RawAir
+
+RawLog
+RawLog
+
+RawTalisman
+RawTalisman
+
+ReadingGlasses
+ReadingGlasses
+
+RealisticBrain
+RealisticBrain
+
+Reaper
+Reaper
+
+Reathe
+Reathe
+
+Rebecca
+Rebecca
+
+Receptionist#inn
+Receptionist#inn
+
+Receptionist#mine
+Receptionist#mine
+
+Red Bone
+Red Bone
+
+Red Scorpion
+Red Scorpion
+
+Red Slime
+Red Slime
+
+Red Spark
+Red Spark
+
+RedApple
+RedApple
+
+RedBeret
+RedBeret
+
+RedBowlerHat
+RedBowlerHat
+
+RedBowlerHatBrown
+RedBowlerHatBrown
+
+RedChristmasStocking
+RedChristmasStocking
+
+RedContributor
+RedContributor
+
+RedCottonBoots
+RedCottonBoots
+
+RedCottonCloth
+RedCottonCloth
+
+RedCottonGloves
+RedCottonGloves
+
+RedCottonHeadband
+RedCottonHeadband
+
+RedCottonShirt
+RedCottonShirt
+
+RedCottonShorts
+RedCottonShorts
+
+RedCottonSkirt
+RedCottonSkirt
+
+RedCottonTrousers
+RedCottonTrousers
+
+RedDesertHat
+RedDesertHat
+
+RedDottedWrap
+RedDottedWrap
+
+RedDye
+RedDye
+
+RedEasterEgg
+RedEasterEgg
+
+RedEggshellHat
+RedEggshellHat
+
+RedFineDress
+RedFineDress
+
+RedGoldenStripedWrap
+RedGoldenStripedWrap
+
+RedHint
+RedHint
+
+RedHitchhikersTowel
+RedHitchhikersTowel
+
+RedMiniskirt
+RedMiniskirt
+
+RedNose
+RedNose
+
+RedOrnament
+RedOrnament
+
+RedPowder
+RedPowder
+
+RedPresentHat
+RedPresentHat
+
+RedRabbitEars
+RedRabbitEars
+
+RedRose
+RedRose
+
+RedRoseHat
+RedRoseHat
+
+RedSaddleRug
+RedSaddleRug
+
+RedScorpionStinger
+RedScorpionStinger
+
+RedShades
+RedShades
+
+RedShortTankTop
+RedShortTankTop
+
+RedSilkRobe
+RedSilkRobe
+
+RedSorcererBlack
+RedSorcererBlack
+
+RedSorcererDBlue
+RedSorcererDBlue
+
+RedSorcererDGreen
+RedSorcererDGreen
+
+RedSorcererGreen
+RedSorcererGreen
+
+RedSorcererLBlue
+RedSorcererLBlue
+
+RedSorcererOrange
+RedSorcererOrange
+
+RedSorcererPink
+RedSorcererPink
+
+RedSorcererPurple
+RedSorcererPurple
+
+RedSorcererRed
+RedSorcererRed
+
+RedSorcererWhite
+RedSorcererWhite
+
+RedSorcererYellow
+RedSorcererYellow
+
+RedStockings
+RedStockings
+
+RedSummonFlower
+RedSummonFlower
+
+RedTankTop
+RedTankTop
+
+RedTicket
+RedTicket
+
+RedTulip
+RedTulip
+
+RedTurtleneck
+RedTurtleneck
+
+RedVNeckSweater
+RedVNeckSweater
+
+RedWizardHat
+RedWizardHat
+
+ReedBundle
+ReedBundle
+
+Reid's Ghost
+Reid's Ghost
+
+Reinboo
+Reinboo
+
+Reino
+Reino
+
+Remember, they're hiding somewhere on the island, you will have to explore to find them. They could be hiding anywhere.
+Remember, they're hiding somewhere on the island, you will have to explore to find them. They could be hiding anywhere.
+
+Remove all focus skills
+Remove all focus skills
+
+Repeat how many times?
+Repeat how many times?
+
+Repeat: @@ times
+Repeat: @@ times
+
+Resist Ailment
+Resist Ailment
+
+Return to Super Menu
+Return to Super Menu
+
+Return to my sister now. I expect that she shall teach thee one more spell.
+Return to my sister now. I expect that she shall teach thee one more spell.
+
+Rhutan the Traveler
+Rhutan the Traveler
+
+Richard
+Richard
+
+Rikhard
+Rikhard
+
+Riskim
+Riskim
+
+RoastedAcorn
+RoastedAcorn
+
+RoastedMaggot
+RoastedMaggot
+
+Robert
+Robert
+
+RockKnife
+RockKnife
+
+Root
+Root
+
+Rosen
+Rosen
+
+Rossy
+Rossy
+
+RottenRags
+RottenRags
+
+Rouge#Duels
+Rouge#Duels
+
+Roulette
+Roulette
+
+Rrrr... Pchhhh...
+Rrrr... Pchhhh...
+
+RubberBat
+RubberBat
+
+Ruby
+Ruby
+
+RubyPowder
+RubyPowder
+
+RubyRing
+RubyRing
+
+Rudolph Slime
+Rudolph Slime
+
+RunestoneA
+RunestoneA
+
+RunestoneL
+RunestoneL
+
+RunestoneN
+RunestoneN
+
+RunestoneT
+RunestoneT
+
+RunestoneW
+RunestoneW
+
+Ryan
+Ryan
+
+Rynoh
+Rynoh
+
+SUSAN
+SUSAN
+
+Sabine
+Sabine
+
+Sabre
+Sabre
+
+Sagatha#_M
+Sagatha#_M
+
+SailorHat
+SailorHat
+
+Samuel
+Samuel
+
+SandCutter
+SandCutter
+
+Sandra
+Sandra
+
+Santa Slime
+Santa Slime
+
+Santa's Helper
+Santa's Helper
+
+SantaBeardHat
+SantaBeardHat
+
+SantaCookie
+SantaCookie
+
+SantaHat
+SantaHat
+
+SantaSnowGlobe
+SantaSnowGlobe
+
+Santaboo
+Santaboo
+
+Santeri
+Santeri
+
+Sapphire
+Sapphire
+
+SapphirePowder
+SapphirePowder
+
+SapphireRing
+SapphireRing
+
+Sara
+Sara
+
+Sarah
+Sarah
+
+Sasquatch
+Sasquatch
+
+Savaric
+Savaric
+
+SaviorArmor
+SaviorArmor
+
+Say %s to make your roots into toxic darts.
+Say %s to make your roots into toxic darts.
+
+Saying#wiz
+Saying#wiz
+
+ScarabArmlet
+ScarabArmlet
+
+Scared Man
+Scared Man
+
+ScentedCandleHelmet
+ScentedCandleHelmet
+
+Scheduled broadcasts
+Scheduled broadcasts
+
+Scheduled broadcasts - Create new
+Scheduled broadcasts - Create new
+
+Scimitar
+Scimitar
+
+Scissors
+Scissors
+
+Scorpion
+Scorpion
+
+Scorpion King
+Scorpion King
+
+ScorpionStinger
+ScorpionStinger
+
+Scythe
+Scythe
+
+Sea Slime
+Sea Slime
+
+Sea Slime Mother
+Sea Slime Mother
+
+SealedSoul
+SealedSoul
+
+See you later!
+See you later!
+
+See you soon!
+See you soon!
+
+See you!
+See you!
+
+Selim
+Selim
+
+Sema
+Sema
+
+Send 10 times
+Send 10 times
+
+Send 2 times
+Send 2 times
+
+Send 20 times
+Send 20 times
+
+Send 3 times
+Send 3 times
+
+Send 5 times
+Send 5 times
+
+Send indefinitely
+Send indefinitely
+
+Send only once
+Send only once
+
+Send this message also on login?
+Send this message also on login?
+
+Sent on login: @@
+Sent on login: @@
+
+Sent on login: yes
+Sent on login: yes
+
+Sent: @@ times out of @@
+Sent: @@ times out of @@
+
+SerfHat
+SerfHat
+
+Serqet
+Serqet
+
+Set a new broadcast
+Set a new broadcast
+
+Setzer
+Setzer
+
+Shannon
+Shannon
+
+SharpKnife
+SharpKnife
+
+She hesistates.
+She hesistates.
+
+She looks at you suspiciously.
+She looks at you suspiciously.
+
+She performs a complicated gesture.
+She performs a complicated gesture.
+
+She picks up all forty and presses them together in her hands, then whispers something.
+She picks up all forty and presses them together in her hands, then whispers something.
+
+She smiles at you.
+She smiles at you.
+
+She smiles.
+She smiles.
+
+She takes away her hands and looks up.
+She takes away her hands and looks up.
+
+She walks up to you, holds your shoulders, and smiles at you.
+She walks up to you, holds your shoulders, and smiles at you.
+
+She was babbling at me about it all the morning until I sent her to take care of the maggots in the cafe.
+She was babbling at me about it all the morning until I sent her to take care of the maggots in the cafe.
+
+Sherman the Traveler
+Sherman the Traveler
+
+ShockSweet
+ShockSweet
+
+ShortBow
+ShortBow
+
+ShortSword
+ShortSword
+
+ShortTankTop
+ShortTankTop
+
+ShroomHat
+ShroomHat
+
+Sign
+Sign
+
+SilkCocoon
+SilkCocoon
+
+SilkGloves
+SilkGloves
+
+SilkHeadband
+SilkHeadband
+
+SilkPants
+SilkPants
+
+SilkRobe
+SilkRobe
+
+SilkSheet
+SilkSheet
+
+Silkworm
+Silkworm
+
+SilverFourLeafAmulet
+SilverFourLeafAmulet
+
+SilverMirror
+SilverMirror
+
+Silvia
+Silvia
+
+SimpleRing
+SimpleRing
+
+Skeleton
+Skeleton
+
+SkeletonCharm
+SkeletonCharm
+
+Skill can only be cast on party or guild members!
+Skill can only be cast on party or guild members!
+
+Skull
+Skull
+
+SkullMask
+SkullMask
+
+Sleeping Bandit
+Sleeping Bandit
+
+Slime Blast
+Slime Blast
+
+SlingBullet
+SlingBullet
+
+SlingShot
+SlingShot
+
+Slots#1
+Slots
+
+Slots#2
+Slots#2
+
+Slots#3
+Slots#3
+
+Slots#4
+Slots#4
+
+Slots#5
+Slots#5
+
+Slots#6
+Slots#6
+
+Slots#7
+Slots#7
+
+SlowPoisonPotion
+SlowPoisonPotion
+
+SmallCrack#XmasPassage
+SmallCrack#XmasPassage
+
+SmallHealingPotion
+SmallHealingPotion
+
+SmallManaElixir
+SmallManaElixir
+
+SmallMushroom
+SmallMushroom
+
+SmileyCap
+SmileyCap
+
+Snail
+Snail
+
+Snake
+Snake
+
+SnakeEgg
+SnakeEgg
+
+SnakeSkin
+SnakeSkin
+
+SnakeTongue
+SnakeTongue
+
+Snapple
+Snapple
+
+Sneaky Bandit
+Sneaky Bandit
+
+SnowGoggles
+SnowGoggles
+
+SnowLauncher
+SnowLauncher
+
+Snowball
+Snowball
+
+Snowman
+Snowman
+
+SnowmanSnowGlobe
+SnowmanSnowGlobe
+
+So be it, fellow warrior. Hear the incantation for the blade spell: '%s'
+So be it, fellow warrior. Hear the incantation for the blade spell: '%s'
+
+So you think you're tough? A warrior must also be loyal and patient.
+So you think you're tough? A warrior must also be loyal and patient.
+
+So, have you managed to transmute something?
+So, have you managed to transmute something?
+
+Some forest creatures sometimes overgrow their fur or hide. That makes them uncomfortable.
+Some forest creatures sometimes overgrow their fur or hide. That makes them uncomfortable.
+
+Some of it might jog your memory or at least help you catch your bearings.
+Some of it might jog your memory or at least help you catch your bearings.
+
+Something else?
+Something else?
+
+Sometimes you just need to run from battle.
+Sometimes you just need to run from battle.
+
+SorcererBlack
+SorcererBlack
+
+SorcererDBlue
+SorcererDBlue
+
+SorcererDGreen
+SorcererDGreen
+
+SorcererGreen
+SorcererGreen
+
+SorcererLBlue
+SorcererLBlue
+
+SorcererOrange
+SorcererOrange
+
+SorcererPink
+SorcererPink
+
+SorcererPurple
+SorcererPurple
+
+SorcererRed
+SorcererRed
+
+SorcererWhite
+SorcererWhite
+
+SorcererYellow
+SorcererYellow
+
+Sorfina
+Sorfina
+
+Sorry %%i I am really really REALLY busy right now. Maybe later, when I find my toolset, we can start focusing on something.
+Sorry %%i I am really really REALLY busy right now. Maybe later, when I find my toolset, we can start focusing on something.
+
+Soul
+Soul
+
+Soul Eater
+Soul Eater
+
+Soul Menhir
+Soul Menhir
+
+Soul Menhir#candor
+Soul Menhir#candor
+
+Soul Menhir#deadmire
+Soul Menhir#deadmire
+
+Soul Menhir#hurnscald
+Soul Menhir#hurnscald
+
+Soul Menhir#nivalis
+Soul Menhir#nivalis
+
+Soul Menhir#tulimshar
+Soul Menhir#tulimshar
+
+Soul Snake
+Soul Snake
+
+Speak '%s' 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.
+Speak '%s' 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.
+
+Speak to me again once you've cast the spell.
+Speak to me again once you've cast the spell.
+
+Spear
+Spear
+
+Special monsters are not counted.
+Special monsters are not counted.
+
+Spectre
+Spectre
+
+SpectrePowder
+SpectrePowder
+
+Speed
+Speed
+
+Spell#wiz1
+Spell#wiz1
+
+Spell#wiz2
+Spell#wiz2
+
+Spell#wiz3
+Spell#wiz3
+
+Spell#wiz4
+Spell#wiz4
+
+Spell#wiz5
+Spell#wiz5
+
+Spell#wiz6
+Spell#wiz6
+
+Spell#wiz7
+Spell#wiz7
+
+Spider
+Spider
+
+Spiky Mushroom
+Spiky Mushroom
+
+Spiky mushrooms often grow too many spikes, so you can shear the spikes off of some.
+Spiky mushrooms often grow too many spikes, so you can shear the spikes off of some.
+
+Squirrel
+Squirrel
+
+SquirrelPelt
+SquirrelPelt
+
+StaffOfFire
+StaffOfFire
+
+StaffOfIce
+StaffOfIce
+
+StaffOfLife
+StaffOfLife
+
+Stalker
+Stalker
+
+StandardHeadband
+StandardHeadband
+
+Start broadcasting
+Start broadcasting
+
+Start broadcasting, and make an extra broadcast right now
+Start broadcasting, and make an extra broadcast right now
+
+Start over
+Start over
+
+Stats: %s
+Stats: %s
+
+Status Condition Cleared
+Status Condition Cleared
+
+Steak
+Steak
+
+SteelShield
+SteelShield
+
+Stewen
+Stewen
+
+StickReinboo
+StickReinboo
+
+Sticking out of the rock is a sword hilt.
+Sticking out of the rock is a sword hilt.
+
+Stop broadcasting
+Stop broadcasting
+
+Stop it!
+Stop it!
+
+Store Policy#1
+Store Policy
+
+Store Policy#2
+Store Policy#2
+
+Strange Stone
+Strange Stone
+
+StrangeCoin
+StrangeCoin
+
+Stranger
+Stranger
+
+Styx the Traveler
+Styx the Traveler
+
+Suddenly, you hear a strange, metallic voice in your head, the voice of a woman.
+Suddenly, you hear a strange, metallic voice in your head, the voice of a woman.
+
+SulphurPowder
+SulphurPowder
+
+Sunglasses
+Sunglasses
+
+Supply Chest
+Supply Chest
+
+Surprise me!
+Surprise me!
+
+Swashbuckler
+Swashbuckler
+
+Swezanne
+Swezanne
+
+Sword
+Sword
+
+Syntax: @wset <map_mask>
+Syntax: @wset <map_mask>
+
+TMWBirthdayGift
+TMWBirthdayGift
+
+TUTORIAL
+TUTORIAL
+
+Taito
+Taito
+
+Take %s arrows, sprinkle sulphur powder over them, and then speak '%s'. Throw them high up in the air, and watch the hail unfold before thy feet.
+Take %s arrows, sprinkle sulphur powder over them, and then speak '%s'. Throw them high up in the air, and watch the hail unfold before thy feet.
+
+Take a cocoon, living or dead, and suffuse it in magic. Fell the %s, feel its lightness and feel it float! You no longer should be feeling overburned by your stolen goods, kekeke...
+Take a cocoon, living or dead, and suffuse it in magic. Fell the %s, feel its lightness and feel it float! You no longer should be feeling overburned by your stolen goods, kekeke...
+
+Take care!
+Take care!
+
+Talk to you later!
+Talk to you later!
+
+Talk to you soon!
+Talk to you soon!
+
+Talpan
+Talpan
+
+Talponian#Female
+Talponian#Female
+
+Talponian#Male
+Talponian#Male
+
+TamOShanter
+TamOShanter
+
+Tame Scorpion
+Tame Scorpion
+
+Tanisha
+Tanisha
+
+TankTop
+TankTop
+
+Tathin
+Tathin
+
+Taylor
+Taylor
+
+TealEasterEgg
+TealEasterEgg
+
+TealHint
+TealHint
+
+TealHitchhikersTowel
+TealHitchhikersTowel
+
+Tengu
+Tengu
+
+Terranite
+Terranite
+
+Terranite Armor#Female
+Terranite Armor#Female
+
+Terranite Armor#Male
+Terranite Armor#Male
+
+TerraniteArrow
+TerraniteArrow
+
+TerraniteChestArmor
+TerraniteChestArmor
+
+TerraniteHead
+TerraniteHead
+
+TerraniteHelmet
+TerraniteHelmet
+
+TerraniteLegs
+TerraniteLegs
+
+TerraniteOre
+TerraniteOre
+
+Teuvo
+Teuvo
+
+Thank you for using our services. Please accept this little gift.
+Thank you for using our services. Please accept this little gift.
+
+Thanks once again for helping with the monsters in the island.
+Thanks once again for helping with the monsters in the island.
+
+Thanks, @@. We just wanted to be sure it was you.
+Thanks, @@. We just wanted to be sure it was you.
+
+That invocation is '%s'.
+That invocation is '%s'.
+
+That would be great!
+That would be great!
+
+Thats not what I said to do. Please don't skip ahead.
+Thats not what I said to do. Please don't skip ahead.
+
+The Beheader
+The Beheader
+
+The Egg cracks open and a living snake comes out of the egg.
+The Egg cracks open and a living snake comes out of the egg.
+
+The Lost
+The Lost
+
+The Mana World - Legacy
+The Mana World - Legacy
+
+The Witch takes %s and %s and put them togheter calling %s.
+The Witch takes %s and %s and put them togheter calling %s.
+
+The Wizard's thank thee as well.
+The Wizard's thank thee as well.
+
+The deep basso voice continues.
+The deep basso voice continues.
+
+The doctor examines you briefly.
+The doctor examines you briefly.
+
+The doctor pulls out a syringe and fills it with a white liquid from a jar on his desk.
+The doctor pulls out a syringe and fills it with a white liquid from a jar on his desk.
+
+The dresser is empty.
+The dresser is empty.
+
+The explanations in this tutorial are based on the Manaplus client.
+The explanations in this tutorial are based on the Manaplus client.
+
+The invocation is `%s' followed by the last syllable of the name of the creature you want to shape the log into.
+The invocation is `%s' followed by the last syllable of the name of the creature you want to shape the log into.
+
+The last word on that page is '%s' and it's underlined twice with a comment next to it saying 'finally got it right.'
+The last word on that page is '%s' and it's underlined twice with a comment next to it saying 'finally got it right.'
+
+The message cannot be empty
+The message cannot be empty
+
+The next spell I have will make a normal tank top out of four pieces of cloth. The invocation is '%s', make sure to write this down.
+The next spell I have will make a normal tank top out of four pieces of cloth. The invocation is '%s', make sure to write this down.
+
+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.'
+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.'
+
+The spell consumes a Small Mushroom and a Dark Crystal. Shove the Dark Crystal into the Small Mushroom and yell %s.
+The spell consumes a Small Mushroom and a Dark Crystal. Shove the Dark Crystal into the Small Mushroom and yell %s.
+
+The spell fails!
+The spell fails!
+
+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.
+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.
+
+The spell takes a mind of its own backfires!
+The spell takes a mind of its own backfires!
+
+The voice sounds slightly amused.
+The voice sounds slightly amused.
+
+The witch glares at you in anger.
+The witch glares at you in anger.
+
+The witch's eyes flare up in anger as she notices you, and she turns away from you.
+The witch's eyes flare up in anger as she notices you, and she turns away from you.
+
+The wizard looks at you with despise.
+The wizard looks at you with despise.
+
+The wizard looks at you, his eyes flashing, and laughs diabolically.
+The wizard looks at you, his eyes flashing, and laughs diabolically.
+
+The wizard takes the crystal and the egg, mumbling something you don't understand. Suddenly, he throws the egg into the air and throws the crystal right through it midair.
+The wizard takes the crystal and the egg, mumbling something you don't understand. Suddenly, he throws the egg into the air and throws the crystal right through it midair.
+
+Then I fear that I shall not reveal the spell to you either.
+Then I fear that I shall not reveal the spell to you either.
+
+Then I wish thee well in thy travels, wanderer!
+Then I wish thee well in thy travels, wanderer!
+
+Then chant the lesser healing spell, '%s', with whoever you wish to heal targeted.
+Then chant the lesser healing spell, '%s', with whoever you wish to heal targeted.
+
+Then come back later.
+Then come back later.
+
+Then concentrate your anger upon the trees hereabouts, you will gain experience whilst leveling your sword skill on them.
+Then concentrate your anger upon the trees hereabouts, you will gain experience whilst leveling your sword skill on them.
+
+Then please stop wasting my precious time.
+Then please stop wasting my precious time.
+
+Then say %s and let the mushroom's power take over. It only works on yourself, party or guild allies.
+Then say %s and let the mushroom's power take over. It only works on yourself, party or guild allies.
+
+Then tell me the ingredients for the mouboo summoning spell and give them to me. Start with the first ingredient and then tell me the second one separately.
+Then tell me the ingredients for the mouboo summoning spell and give them to me. Start with the first ingredient and then tell me the second one separately.
+
+Then, she rises up on her tiptoes and kisses you on your forehead.
+Then, she rises up on her tiptoes and kisses you on your forehead.
+
+There are %d out of 5 found.
+There are %d out of 5 found.
+
+There is no answer.
+There is no answer.
+
+There is no honor in fighting a weak opponent.
+There is no honor in fighting a weak opponent.
+
+There you are, right as rain! Now you take care, all right?
+There you are, right as rain! Now you take care, all right?
+
+These will do just fine.
+These will do just fine.
+
+They call me Sagatha.
+They call me Sagatha.
+
+Thinking well, you will not be able to use it yet; you will first have to gain a greater understanding of magic overall.
+Thinking well, you will not be able to use it yet; you will first have to gain a greater understanding of magic overall.
+
+This error is fatal, we stop execution.
+This error is fatal, we stop execution.
+
+This is a wand, there are many like it but this one is now yours.
+This is a wand, there are many like it but this one is now yours.
+
+This is not a monster; I cannot use monsterinfo on it.
+This is not a monster; I cannot use monsterinfo on it.
+
+This menu allows you to set the scheduled broadcast that is sent to all players at a specific interval.
+This menu allows you to set the scheduled broadcast that is sent to all players at a specific interval.
+
+This menu gives access to quest debug menus for @@ quests.
+This menu gives access to quest debug menus for @@ quests.
+
+This powder thou shalst need to cast the lightning spell. Throw it up into the air and shout '%s', and smite thine enemies with lightning.
+This powder thou shalst need to cast the lightning spell. Throw it up into the air and shout '%s', and smite thine enemies with lightning.
+
+This skill can only be used on monsters!
+This skill can only be used on monsters!
+
+This spell makes arrows out of a single wooden log. Its invocation is '%s'.
+This spell makes arrows out of a single wooden log. Its invocation is '%s'.
+
+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 and may even injure yourself further.
+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 and may even injure yourself further.
+
+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!
+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!
+
+Thou hast collected %s Monster Points. For one thousand of them, I shall admit thee to the school of war magic.
+Thou hast collected %s Monster Points. For one thousand of them, I shall admit thee to the school of war magic.
+
+Thug
+Thug
+
+Thurstan
+Thurstan
+
+Thurston
+Thurston
+
+Tinris
+Tinris
+
+TinyHealingPotion
+TinyHealingPotion
+
+TinyManaElixir
+TinyManaElixir
+
+Tipsy Skeleton
+Tipsy Skeleton
+
+To cast a spell open the skill window, select the spell you wish to use, and press the %s button.
+To cast a spell open the skill window, select the spell you wish to use, and press the %s button.
+
+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.
+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.
+
+To heal yourself, it's enough to just cast by itself, without a target selected.
+To heal yourself, it's enough to just cast by itself, without a target selected.
+
+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.
+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.
+
+To make a shirt, use the invocation '%s'. This will require five pieces of cloth.
+To make a shirt, use the invocation '%s'. This will require five pieces of cloth.
+
+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.
+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.
+
+To summon the snakes use %s.
+To summon the snakes use %s.
+
+To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.
+To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.
+
+Toggle Focus - Astral Soul
+Toggle Focus - Astral Soul
+
+Toggle Focus - Brawling
+Toggle Focus - Brawling
+
+Toggle Focus - Mallards Eye
+Toggle Focus - Mallards Eye
+
+Toggle Focus - Raging
+Toggle Focus - Raging
+
+Toggle Focus - Resist Ailment
+Toggle Focus - Resist Ailment
+
+Toggle Focus - Speed
+Toggle Focus - Speed
+
+Toichi
+Toichi
+
+Tondar
+Tondar
+
+Tongue
+Tongue
+
+TonoriDelight
+TonoriDelight
+
+Toothbrush
+Toothbrush
+
+TopHat
+TopHat
+
+Topaz
+Topaz
+
+TopazPowder
+TopazPowder
+
+TopazRing
+TopazRing
+
+Torch#1
+Torch
+
+Torch#2
+Torch#2
+
+Torch#3
+Torch#3
+
+Tormenta
+Tormenta
+
+Total Gold: %s
+Total Gold: %s
+
+Total deaths: %s
+Total deaths: %s
+
+Touch it.
+Touch it.
+
+Towel
+Towel
+
+ToySabre
+ToySabre
+
+Trader
+Trader
+
+TreasureKey
+TreasureKey
+
+Troll
+Troll
+
+Troupe Leader
+Troupe Leader
+
+Trying to control your magic is still rather troublesome.
+Trying to control your magic is still rather troublesome.
+
+Tulimshar Dock
+Tulimshar Dock
+
+Tulimshar Koga
+Tulimshar Koga
+
+TurquoiseBra
+TurquoiseBra
+
+Turtleneck
+Turtleneck
+
+TutDebug
+TutDebug
+
+Umfrey
+Umfrey
+
+Umm... no... I... I don't remember anything else...
+Umm... no... I... I don't remember anything else...
+
+Undead Troll
+Undead Troll
+
+Undead Witch
+Undead Witch
+
+UndeadDebug3
+UndeadDebug3
+
+UndeadDebug4
+UndeadDebug4
+
+UndeadDebug5
+UndeadDebug5
+
+UndeadEar
+UndeadEar
+
+UndeadEye
+UndeadEye
+
+UnderworldKey
+UnderworldKey
+
+UnderworldMask
+UnderworldMask
+
+Unfortunately, that seems to require more magical power than you can use right now. If only the Mana Seed granted you more power...
+Unfortunately, that seems to require more magical power than you can use right now. If only the Mana Seed granted you more power...
+
+Unfortunately, you can't make out what the transmutation is for or even whether it requires any materials...
+Unfortunately, you can't make out what the transmutation is for or even whether it requires any materials...
+
+Unlike lesser heal, it'll heal instantly, however it still cannot help if the person has a serious injury or has been inflicted with an ailment.
+Unlike lesser heal, it'll heal instantly, however it still cannot help if the person has a serious injury or has been inflicted with an ailment.
+
+Urmas
+Urmas
+
+Urn
+Urn
+
+Usage of @exprate without argument is deprecated, please use "@rates" instead.
+Usage of @exprate without argument is deprecated, please use "@rates" instead.
+
+Usage: @translate <npc file>
+Usage: @translate <npc file>
+
+Use
+Use
+
+Use @@ to cancel.
+Use @@ to cancel.
+
+VNeckSweater
+VNeckSweater
+
+Valdo
+Valdo
+
+Valia
+Valia
+
+Valjas
+Valjas
+
+Valon
+Valon
+
+ValonDebug
+ValonDebug
+
+Vampire Bat
+Vampire Bat
+
+VampireBatWing
+VampireBatWing
+
+Various wands and staffs are found throughout the land with many different strengths and weaknesses.
+Various wands and staffs are found throughout the land with many different strengths and weaknesses.
+
+VeganWater
+VeganWater
+
+Vellamo
+Vellamo
+
+Veneri
+Veneri
+
+Verneri
+Verneri
+
+Very well then, see you.
+Very well then, see you.
+
+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.
+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.
+
+Vicious Squirrel
+Vicious Squirrel
+
+Vincent
+Vincent
+
+Vincent Debug
+Vincent Debug
+
+Virus
+Virus
+
+Void Archant
+Void Archant
+
+Void Bat
+Void Bat
+
+Void Flower
+Void Flower
+
+Void Maggot
+Void Maggot
+
+Void Mouboo
+Void Mouboo
+
+Void Scorpion
+Void Scorpion
+
+Void Shroom
+Void Shroom
+
+Void Slime
+Void Slime
+
+Void Snake
+Void Snake
+
+Void Soldier
+Void Soldier
+
+Voltain
+Voltain
+
+WARNING: If you insert wrong pincode, you'll be disconnected.
+WARNING: If you insert wrong pincode, you'll be disconnected.
+
+Waitress
+Waitress
+
+Wand
+Wand
+
+Waric
+Waric
+
+Waric nods at you.
+Waric nods at you.
+
+Waric#trap
+Waric#trap
+
+WarlordBoots
+WarlordBoots
+
+WarlordHelmet
+WarlordHelmet
+
+WarlordPlate
+WarlordPlate
+
+Warning#mirak
+Warning#mirak
+
+Warning, %d remaining: %s
+Warning, %d remaining: %s
+
+WarpedLog
+WarpedLog
+
+Water Pump
+Water Pump
+
+We refuse service to anyone who:
+We refuse service to anyone who:
+
+We will start with an easy one. I will teach you how to summon a wicked mushroom.
+We will start with an easy one. I will teach you how to summon a wicked mushroom.
+
+We've been taking care of you ever since. Waiting for you to wake up."
+We've been taking care of you ever since. Waiting for you to wake up."
+
+Wedding Officiator
+Wedding Officiator
+
+WeddingRing
+WeddingRing
+
+Weellos
+Weellos
+
+Welcome back, apprentice.
+Welcome back, apprentice.
+
+Welcome to my prison, mortal!
+Welcome to my prison, mortal!
+
+Well
+Well
+
+Well %s what else can you tell me about yourself?.
+Well %s what else can you tell me about yourself?.
+
+Well I can tell you some useful things, if you want to hear.
+Well I can tell you some useful things, if you want to hear.
+
+Well, I could. However, I am not sure you are trustworthy.
+Well, I could. However, I am not sure you are trustworthy.
+
+Well, either you are going mad, or that sword in the stone is talking to you.
+Well, either you are going mad, or that sword in the stone is talking to you.
+
+Well, well, well! Look at all those green bubbles coming out of your head; that looks like poisoning to me! Did you eat something rotten?
+Well, well, well! Look at all those green bubbles coming out of your head; that looks like poisoning to me! Did you eat something rotten?
+
+What do you want to do with your money?
+What do you want to do with your money?
+
+What else do you need?
+What else do you need?
+
+What is it is that brings thee to this place?
+What is it is that brings thee to this place?
+
+What is my current hairstyle and hair color?
+What is my current hairstyle and hair color?
+
+What would you like me to do?
+What would you like me to do?
+
+What're you looking at?!
+What're you looking at?!
+
+What's your race?
+What's your race?
+
+Whatever the reason, she doesn't seem to like you.
+Whatever the reason, she doesn't seem to like you.
+
+Which language do you speak?
+Which language do you speak?
+
+White Bell
+White Bell
+
+White Slime
+White Slime
+
+WhiteBellTuber
+WhiteBellTuber
+
+WhiteBlanket
+WhiteBlanket
+
+WhiteCake
+WhiteCake
+
+WhiteCowboyHat
+WhiteCowboyHat
+
+WhiteEvokersRobeBlue
+WhiteEvokersRobeBlue
+
+WhiteFur
+WhiteFur
+
+WhiteHitchhikersTowel
+WhiteHitchhikersTowel
+
+WhitePresentBox
+WhitePresentBox
+
+WhiteRose
+WhiteRose
+
+WhiteRoseHat
+WhiteRoseHat
+
+WhiteSaddleRug
+WhiteSaddleRug
+
+WhiteSummonFlower
+WhiteSummonFlower
+
+WhiteTulip
+WhiteTulip
+
+WhiteWizardRobe
+WhiteWizardRobe
+
+WhiteWrap
+WhiteWrap
+
+Why are you wasting my time? Come back when you got everything I need.
+Why are you wasting my time? Come back when you got everything I need.
+
+Wicked Mushroom
+Wicked Mushroom
+
+Wight
+Wight
+
+WinterGloves
+WinterGloves
+
+Wisp
+Wisp
+
+WispPowder
+WispPowder
+
+Witch Guard
+Witch Guard
+
+WitchDoctorsMask
+WitchDoctorsMask
+
+WitchHat
+WitchHat
+
+Withdraw.
+Withdraw.
+
+WizardHat
+WizardHat
+
+Wolfgang
+Wolfgang
+
+Wolvern
+Wolvern
+
+WolvernPelt
+WolvernPelt
+
+WolvernTooth
+WolvernTooth
+
+WoodenShield
+WoodenShield
+
+WoodenStaff
+WoodenStaff
+
+WraithHorn
+WraithHorn
+
+WumpusEgg
+WumpusEgg
+
+Wyara is the Hurnscald town witch. She was also the town healer before the Doctor moved there.
+Wyara is the Hurnscald town witch. She was also the town healer before the Doctor moved there.
+
+Wyara the Witch
+Wyara the Witch
+
+Wyara#_M
+Wyara#_M
+
+Xakelbael
+Xakelbael
+
+XmasCake
+XmasCake
+
+XmasCandyCane
+XmasCandyCane
+
+XmasDebug#1
+XmasDebug
+
+XmasDebug#2
+XmasDebug#2
+
+XmasDebug#3
+XmasDebug#3
+
+XmasDebug#4
+XmasDebug#4
+
+XmasSpawnCounter#0
+XmasSpawnCounter
+
+XmasSpawnCounter#1
+XmasSpawnCounter
+
+XmasSpawnCounter#2
+XmasSpawnCounter#2
+
+XmasSpawnManager
+XmasSpawnManager
+
+YOU CAN FEEL THE POWER FLOWING TROUGH YOU.
+YOU CAN FEEL THE POWER FLOWING TROUGH YOU.
+
+YOU WERE BLESSED BY JESUSALVA
+YOU WERE BLESSED BY JESUSALVA
+
+Yalina
+Yalina
+
+Yanis
+Yanis
+
+Yarr arr!
+Yarr arr!
+
+Yeah, and she's done with the maggots.
+Yeah, and she's done with the maggots.
+
+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.
+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.
+
+Yellow Slime
+Yellow Slime
+
+YellowBeret
+YellowBeret
+
+YellowBowlerHat
+YellowBowlerHat
+
+YellowBowlerHatBrown
+YellowBowlerHatBrown
+
+YellowContributor
+YellowContributor
+
+YellowCottonBoots
+YellowCottonBoots
+
+YellowCottonCloth
+YellowCottonCloth
+
+YellowCottonGloves
+YellowCottonGloves
+
+YellowCottonHeadband
+YellowCottonHeadband
+
+YellowCottonShirt
+YellowCottonShirt
+
+YellowCottonShorts
+YellowCottonShorts
+
+YellowCottonSkirt
+YellowCottonSkirt
+
+YellowCottonTrousers
+YellowCottonTrousers
+
+YellowDesertHat
+YellowDesertHat
+
+YellowDottedWrap
+YellowDottedWrap
+
+YellowDye
+YellowDye
+
+YellowEasterEgg
+YellowEasterEgg
+
+YellowEggshellHat
+YellowEggshellHat
+
+YellowFineDress
+YellowFineDress
+
+YellowHint
+YellowHint
+
+YellowHitchhikersTowel
+YellowHitchhikersTowel
+
+YellowMiniskirt
+YellowMiniskirt
+
+YellowOrnament
+YellowOrnament
+
+YellowPowder
+YellowPowder
+
+YellowPresentBox
+YellowPresentBox
+
+YellowPresentHat
+YellowPresentHat
+
+YellowRabbitEars
+YellowRabbitEars
+
+YellowRose
+YellowRose
+
+YellowRoseHat
+YellowRoseHat
+
+YellowShades
+YellowShades
+
+YellowShortTankTop
+YellowShortTankTop
+
+YellowSilkRobe
+YellowSilkRobe
+
+YellowSorcererBlack
+YellowSorcererBlack
+
+YellowSorcererDBlue
+YellowSorcererDBlue
+
+YellowSorcererDGreen
+YellowSorcererDGreen
+
+YellowSorcererGreen
+YellowSorcererGreen
+
+YellowSorcererLBlue
+YellowSorcererLBlue
+
+YellowSorcererOrange
+YellowSorcererOrange
+
+YellowSorcererPink
+YellowSorcererPink
+
+YellowSorcererPurple
+YellowSorcererPurple
+
+YellowSorcererRed
+YellowSorcererRed
+
+YellowSorcererWhite
+YellowSorcererWhite
+
+YellowSorcererYellow
+YellowSorcererYellow
+
+YellowSummonFlower
+YellowSummonFlower
+
+YellowTankTop
+YellowTankTop
+
+YellowTicket
+YellowTicket
+
+YellowTulip
+YellowTulip
+
+YellowTurtleneck
+YellowTurtleneck
+
+YellowVNeckSweater
+YellowVNeckSweater
+
+YellowWizardHat
+YellowWizardHat
+
+YellowWrap
+YellowWrap
+
+Yerrnk
+Yerrnk
+
+Yes
+Yes
+
+Yes, I helped her with the maggots.
+Yes, I helped her with the maggots.
+
+Yes, of course.
+Yes, of course.
+
+Yes.
+Yes.
+
+Yeti
+Yeti
+
+YetiClaw
+YetiClaw
+
+YetiMask
+YetiMask
+
+YetiSkinShirt
+YetiSkinShirt
+
+You are already a student of Sagatha. I will not teach you anything!
+You are already a student of Sagatha. I will not teach you anything!
+
+You are making progress, but you still need more practice.
+You are making progress, but you still need more practice.
+
+You are missing required items.
+You are missing required items.
+
+You are still at the beginning of your path, but do keep practicing.
+You are still at the beginning of your path, but do keep practicing.
+
+You can also manually stop it at any time with: @droprate default
+You can also manually stop it at any time with: @droprate default
+
+You can also manually stop it at any time with: @exprate default
+You can also manually stop it at any time with: @exprate default
+
+You can call fluffies, too. But for them you must call out '%s' instead, with white fluffy fur instead of a spike. And don't forget the root.
+You can call fluffies, too. But for them you must call out '%s' instead, with white fluffy fur instead of a spike. And don't forget the root.
+
+You can harden your skin with a hard spike. Hold it in your hands and speak '%s', then draw its hardness into your skin, or the skin of someone's else.
+You can harden your skin with a hard spike. Hold it in your hands and speak '%s', then draw its hardness into your skin, or the skin of someone's else.
+
+You can help them with shearing magic. Press your hands together and say '%s'. Then touch them with your hands, and brush off any excess.
+You can help them with shearing magic. Press your hands together and say '%s'. Then touch them with your hands, and brush off any excess.
+
+You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.
+You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.
+
+You can turn the log into a wooden figurine by imagining the creature whose shape you want in your head and saying `%s' followed by the last syllable of the name of the creature you want to shape it into.
+You can turn the log into a wooden figurine by imagining the creature whose shape you want in your head and saying `%s' followed by the last syllable of the name of the creature you want to shape it into.
+
+You can't make out anything else of value, so you place the manuscript back in the bookshelf.
+You can't make out anything else of value, so you place the manuscript back in the bookshelf.
+
+You cannot complete the casting correctly!
+You cannot complete the casting correctly!
+
+You currently have @@ GP on your bank account.
+You currently have @@ GP on your bank account.
+
+You didn't have any possessions on you when we found you and no one knows who you are.
+You didn't have any possessions on you when we found you and no one knows who you are.
+
+You do not have enough %s (min %d)
+You do not have enough %s (min %d)
+
+You do not have enough Gold Pieces on your bank account.
+You do not have enough Gold Pieces on your bank account.
+
+You do not have enough Gold on yourself.
+You do not have enough Gold on yourself.
+
+You do not have suffice magic power to make rain.
+You do not have suffice magic power to make rain.
+
+You don't have enough magical power to learn the next healing spell yet.
+You don't have enough magical power to learn the next healing spell yet.
+
+You don't look too well; let me treat your wounds.
+You don't look too well; let me treat your wounds.
+
+You feel a strange, tingling kind of warmth spread through your body.
+You feel a strange, tingling kind of warmth spread through your body.
+
+You feel completely overwhelmed by your magic.
+You feel completely overwhelmed by your magic.
+
+You feel in almost perfect control of your magic.
+You feel in almost perfect control of your magic.
+
+You feel mostly in control of your magic.
+You feel mostly in control of your magic.
+
+You feel quite in control of your magic.
+You feel quite in control of your magic.
+
+You feel quite overwhelmed by your magic, but are beginning to see patterns.
+You feel quite overwhelmed by your magic, but are beginning to see patterns.
+
+You feel somewhat in control of your magic.
+You feel somewhat in control of your magic.
+
+You feel that you have only the bare minimum of control over your magic.
+You feel that you have only the bare minimum of control over your magic.
+
+You feel that you have very good control of your magic.
+You feel that you have very good control of your magic.
+
+You feel you still have a few difficulties in controlling your magic.
+You feel you still have a few difficulties in controlling your magic.
+
+You found %d out of 5 us.
+You found %d out of 5 us.
+
+You have made good progress, but please do continue in your efforts.
+You have made good progress, but please do continue in your efforts.
+
+You have made good progress, but you lack the magical power to advance further. Also, I would like to observe you some more to be certain that you will make a good healer.
+You have made good progress, but you lack the magical power to advance further. Also, I would like to observe you some more to be certain that you will make a good healer.
+
+You look fantastic.
+You look fantastic.
+
+You made a cash deposit of @@ GP.
+You made a cash deposit of @@ GP.
+
+You may find that you can transmute the powder more effectively after a while; that is perfectly natural.
+You may find that you can transmute the powder more effectively after a while; that is perfectly natural.
+
+You must have been thrown off one of the ships sailing during that last tremor."
+You must have been thrown off one of the ships sailing during that last tremor."
+
+You must practice more first.
+You must practice more first.
+
+You need a Dagger, Sharp Knife or Knife to use!
+You need a Dagger, Sharp Knife or Knife to use!
+
+You need at least %d %s to use this spell!
+You need at least %d %s to use this spell!
+
+You need more room in your inventory.
+You need more room in your inventory.
+
+You need to be carrying less weight.
+You need to be carrying less weight.
+
+You need to kill %s: %d/%d.
+You need to kill %s: %d/%d.
+
+You open your eyes.
+You open your eyes.
+
+You see a girl who is holding her hands in front of her face.
+You see a girl who is holding her hands in front of her face.
+
+You seem to be ready to advance as a healer. There is one favor I must ask of you first, though.
+You seem to be ready to advance as a healer. There is one favor I must ask of you first, though.
+
+You should be more careful.
+You should be more careful.
+
+You should come back when you have some free space.
+You should come back when you have some free space.
+
+You should get dressed now.
+You should get dressed now.
+
+You still need to find some of my friends. You have found %d out of 5 of my friends.
+You still need to find some of my friends. You have found %d out of 5 of my friends.
+
+You successfully set the drop rate to @@%. It will reset to @@% (default value) in @@.
+You successfully set the drop rate to @@%. It will reset to @@% (default value) in @@.
+
+You successfully set the exp rate to @@%. It will reset to @@% (default value) in @@.
+You successfully set the exp rate to @@%. It will reset to @@% (default value) in @@.
+
+You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the dresser.
+You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the dresser.
+
+You were permanently banned by the GM Team.
+You were permanently banned by the GM Team.
+
+You withdrew a total of @@ GP.
+You withdrew a total of @@ GP.
+
+Young Man
+Young Man
+
+Your GM level is now hidden.
+Your GM level is now hidden.
+
+Your GM level is now visible.
+Your GM level is now visible.
+
+Your hairstyle is @@ and its color is @@.
+Your hairstyle is @@ and its color is @@.
+
+Your magic takes a mind of its own!
+Your magic takes a mind of its own!
+
+Zack
+Zack
+
+ZaxDeKagen
+ZaxDeKagen
+
+Zegas
+Zegas
+
+ZegasDebug
+ZegasDebug
+
+Zitoni
+Zitoni
+
+Zombie
+Zombie
+
+ZombieNachos
+ZombieNachos
+
+Zzzzzzzzz...
+Zzzzzzzzz...
+
+_N-Pumpkin
+_N-Pumpkin
+
+a ground!
+a ground!
+
+a quiet place,
+a quiet place,
+
+fifteen
+fifteen
+
+no
+no
+
+no active broadcast
+no active broadcast
+
+sign#pvp-1
+sign#pvp-1
+
+sign#pvp-2
+sign#pvp-2
+
+specialMob027-3
+specialMob027-3
+
+specialMob027-4
+specialMob027-4
+
+yes
+yes
+
+• Can't walk without stopping after every step
+• Can't walk without stopping after every step
+
+• Has a bubblehead
+• Has a bubblehead
+
+• Is not properly shaded
+• Is not properly shaded
+
diff --git a/langs/lang_es.old b/langs/lang_es.old
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/langs/lang_es.old
diff --git a/langs/lang_es.txt b/langs/lang_es.txt
new file mode 100644
index 00000000..0e8371a9
--- /dev/null
+++ b/langs/lang_es.txt
@@ -0,0 +1,6673 @@
+Copyright (C) 2010-2015 Evol Online
+"Ah, you woke up. You washed ashore on the beach 3 days ago. You've been asleep since.
+
+
+"Come back and see me when the job is done."
+
+
+"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 '%s', which is the lay on hands magic."
+
+
+"Maybe I should go back to practicing '%s' until I can make potions properly." %%6
+
+
+"My little granddaughter Tanisha found you. Kaan was able to carry you to bed.
+
+
+"She hates maggots.
+
+
+"The first one for the mouboo was %s and the one for the pinkie was %s.
+
+
+"Welcome to the bank!
+
+
+"You're the person I brought here, right?
+
+
+##BHall Of Acorns: TOP15##b
+##BSalón de las Bellotas: PRIMEROS 15##b
+
+##BHall Of Fortune: TOP15##b
+##BSalón de la Fortuna: PRIMEROS 15##b
+
+##BHall Of Guild Level: TOP5##b
+##BSalón de Nivel de Gremio: PRIMEROS 5##b
+
+##BHall Of Job Level: TOP15##b
+##BSalón de Nivel de Habilidad: PRIMEROS 15##b
+
+##BHall Of Lethality: TOP15##b
+##BSalón de la Letalidad: PRIMEROS 15##b
+
+##BHall Of Level: TOP15##b
+##BSalón de Nivel: PRIMEROS 15##b
+
+%%@
+%%@
+
+%%A
+%%A
+
+%%B
+%%B
+
+%%C
+%%C
+
+%%D
+%%D
+
+%%E
+%%E
+
+%%F
+%%F
+
+%d out of 5 have been found.
+
+
+%s
+%s
+
+%s - Level %d (~%s HP, ~%s ATK)
+
+
+%s : %s
+
+
+(A mystical aura surrounds this stone. You feel mysteriously attracted to it. Something tells you to touch it. What do you do?)
+
+
+... Tulimshar in Tonori ... I'm a Talpan.
+
+
+1) Do not abuse other players. Insults, swearing, and the like are not to be directed towards a particular person or group.
+
+
+2) No bots – including ##Bany##b AFK activity or automated actions of any sort.
+
+
+3) No spamming or flooding (including messages, whispers, and trade requests).
+
+
+4) No begging.
+
+
+5) Speak ##Bonly##b English in the public chat.
+
+
+6) Treat others how you would like to be treated.
+
+
+7
+7
+
+98... 99... 100!
+
+
+?
+
+
+@@
+@@
+
+A blissful day to thee, mortal!
+
+
+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 '%s' spell.
+
+
+A sunny and hot day,
+Un soleado y caluroso día,
+
+A wicked mushroom will appear to fight for you. Usually.
+
+
+A-hoy matey!
+¡A la vista camarada!
+
+AFK botting will be determined by talking to players who are moving and/or attacking.
+
+
+AFKCap
+
+
+Aahna
+Aahna
+
+Aaron
+
+
+Abort
+Abandonar
+
+Acorn
+Bellota
+
+ActivatedSulphur
+
+
+Add all focus skills
+
+
+Adrian
+Adrian
+
+After a while, you stumble across a section that appears to be written somewhat legibly. The author notes that he (or perhaps she?) is describing a completely new transmutation.
+
+
+After we finish talking, click on the clothes and press the equip button.
+
+
+Agostine
+
+
+Agostine Debug
+
+
+Ah, the Professors will get mad at me again...
+
+
+Ah, yes, your training...
+
+
+Ah.
+
+
+Ah... no beer? Oh well.
+
+
+Aidan
+Aidan
+
+Airlia
+Airlia
+
+Aisha
+Aisha
+
+Aisha looks around as she leans in and hushes you to silence. After a few seconds, she whispers to you:
+
+
+Akseli
+
+
+Alacrius
+
+
+Alan
+Alan
+
+Aldred
+
+
+Alice
+
+
+Alizarin Plant
+Planta de Alizarina
+
+AlizarinHerb
+
+
+All monsters summoned!
+¡Todos los monstruos invocados!
+
+All of my money.
+Todo mi dinero.
+
+All scoreboards are updated hourly.
+Todos las puntuaciones son actualizadas cada hora.
+
+AmberChristmasSweater
+
+
+Amethyst
+Amatista
+
+AmethystPowder
+
+
+AmethystRing
+
+
+Amrak
+
+
+And make sure to keep notes of your spells! Don't rely only on your skill tab (F5).
+
+
+And the first spell, to summon wicked mushrooms, is %s.
+
+
+Andra
+
+
+Angela
+
+
+Angela#house
+
+
+Angry Fire Goblin
+
+
+Angry Green Slime
+
+
+Angry Scorpion
+
+
+Angry Sea Slime
+
+
+AngryScorpionStinger
+
+
+Angus
+Angus
+
+AniManOMat
+
+
+AnimalBones
+
+
+Anne
+
+
+AnniversaryHat
+
+
+Another Sneaky Bandit
+
+
+AntlerHat
+
+
+Antlers
+
+
+Anwar
+Anwar
+
+Anything else you can remember?
+
+
+Anything else?
+¿Algo más?
+
+AppleCake
+
+
+ApprenticeRobe
+
+
+AquaHint
+
+
+AquaOrnament
+
+
+AquaTicket
+
+
+Aradin
+
+
+Archant
+
+
+Archibald
+
+
+Ardra
+
+
+Are you read for another spell?
+
+
+Arkim
+
+
+Arr!
+
+
+Arr, I'm bored!
+
+
+Arrow
+
+
+Arvo
+
+
+As she opens her hands again, the leaves have turned into ten golden crystals.
+
+
+As the power of your magic grows so will the spells you can cast.
+
+
+As you look at the sword, you suddenly hear a voice in your head!
+
+
+As you want!
+¡Como quieras!
+
+Ashley
+
+
+AssassinBoots
+
+
+AssassinGloves
+
+
+AssassinPants
+
+
+AssassinShirt
+
+
+Astral Soul
+
+
+AstralCube
+
+
+At this point, the river deepens, slowing down to a leisurely pace. In its center you notice an unusual stone, waves breaking around it.
+
+
+Auldsbel places the logs next to his hut.
+
+
+Auldsbel the Wizard
+
+
+Auldsbel#_M
+
+
+Aureole
+
+
+Automated following will be determined by observation.
+
+
+AutumnMask
+
+
+Avalia
+
+
+Axe
+Hacha
+
+AxeHat
+
+
+Ayasha
+Ayasha
+
+AyashaDebug
+
+
+Azul Slime
+
+
+Back
+
+
+Baktar
+
+
+Ball Lightning
+
+
+Bandana
+Pañoleta
+
+Bandit
+Bandolero
+
+Bandit Lord
+Cherinol
+
+BanditHood
+
+
+BansheeBow
+
+
+Banu
+Banu
+
+Bar Rules
+
+
+Barbara Grey
+
+
+Bard
+Bardo
+
+Bardiche
+
+
+Barkeeper
+
+
+Barrel#0
+
+
+Barrel#1
+
+
+Barrel#2
+
+
+Barrel#3
+
+
+Barrel#4
+
+
+Barrel#5
+
+
+Barrel#6
+
+
+Barrel#7
+
+
+Bartender
+
+
+Bartender#Casino
+
+
+Bartender#Duels
+
+
+Basil
+
+
+BastardSword
+
+
+Bat
+
+
+BatTeeth
+
+
+BatWing
+
+
+Battle Master#Duels
+
+
+BeanieCopter
+
+
+Bee
+Aveja
+
+Beer
+Cerveza
+
+BeetleJuice
+
+
+Before you stands a beautiful woman, dressed in dark purple robes and wearing a witch's hat.
+
+
+Beheader
+
+
+Ben
+
+
+Bennet
+
+
+BentNeedle
+
+
+Beret
+
+
+Bernard
+Bernard
+
+Beware of what thou wishest for, mortal...
+
+
+Birrod
+
+
+Black Scorpion
+Alacrán Negro
+
+BlackBeret
+
+
+BlackBoots
+
+
+BlackBowlerHat
+
+
+BlackBowlerHatBrown
+
+
+BlackContributor
+
+
+BlackCottonBoots
+
+
+BlackCottonCloth
+
+
+BlackCottonGloves
+
+
+BlackCottonHeadband
+
+
+BlackCottonShirt
+
+
+BlackCottonShorts
+
+
+BlackCottonSkirt
+
+
+BlackCottonTrousers
+
+
+BlackCowboyHat
+
+
+BlackDesertHat
+
+
+BlackDye
+
+
+BlackEvokersRobeBlue
+
+
+BlackFineDress
+
+
+BlackJack
+
+
+BlackMiniskirt
+
+
+BlackPearl
+
+
+BlackRabbitEars
+
+
+BlackRose
+
+
+BlackScorpionStinger
+
+
+BlackShades
+
+
+BlackShortTankTop
+
+
+BlackSilkRobe
+
+
+BlackSorcererBlack
+
+
+BlackSorcererDBlue
+
+
+BlackSorcererDGreen
+
+
+BlackSorcererGreen
+
+
+BlackSorcererLBlue
+
+
+BlackSorcererOrange
+
+
+BlackSorcererPink
+
+
+BlackSorcererPurple
+
+
+BlackSorcererRed
+
+
+BlackSorcererWhite
+
+
+BlackSorcererYellow
+
+
+BlackTankTop
+
+
+BlackTurtleneck
+
+
+BlackVNeckSweater
+
+
+BlackWizardHat
+
+
+BlackWizardRobe
+
+
+Blacksmith
+Herrero
+
+BlacksmithsAxe
+
+
+Blackwin
+
+
+BlinkingEvil
+
+
+BlinkingEvilBlue
+
+
+BlinkingEvilHalloween
+
+
+BlinkingEvilPink
+
+
+BlinkingEvilRed
+
+
+BlinkingEvilYellow
+
+
+BlinkingHocus
+
+
+BloodInk
+
+
+BloodWine
+
+
+Bloodstone
+Heliotropo
+
+Blossom
+Blossom
+
+Blue Slime
+
+
+Blue Spark
+
+
+BlueChristmasSweater
+
+
+BlueDottedWrap
+
+
+BlueEasterEgg
+
+
+BlueEggshellHat
+
+
+BlueHint
+
+
+BlueHitchhikersTowel
+
+
+BlueOrnament
+
+
+BluePowder
+
+
+BluePresentBox
+
+
+BluePresentHat
+
+
+BlueRose
+
+
+BlueRoseHat
+
+
+BlueTicket
+
+
+BlueWolfHelmet
+
+
+BlueWrap
+
+
+Blueberries
+Arándanos
+
+Bluepar
+Principe Azul
+
+Body type %i
+Biotipo %i
+
+Bone
+Hueso
+
+BoneArrows
+
+
+BoneDarts
+
+
+BoneKnife
+
+
+Bones
+
+
+BookPage
+
+
+Bookshelf
+
+
+Boots
+Botas
+
+Boss points: %s
+
+
+BottleOfSand
+
+
+BottleOfWater
+
+
+Bow
+
+
+BowlerHat
+
+
+BowlerHatBrown
+
+
+Bracco
+
+
+BrainStem
+
+
+Brawling
+
+
+Bring me ten bug legs, and I will reveal its invocation to you.
+
+
+Brodomir
+
+
+BrokenDoll
+
+
+BrokenFourLeafAmulet
+
+
+BromenalBoots
+
+
+BromenalChest
+
+
+BromenalFourLeafAmulet
+
+
+BromenalGloves
+
+
+BromenalHelmet
+
+
+BromenalLegs
+
+
+BromenalShield
+
+
+Browsing through the books, you come across a manuscript entitled 'Notes of Potaffe, On Transmutation.'
+
+
+Bryant
+
+
+BucketHat
+
+
+BugLeg
+
+
+BullHelmet
+
+
+BunchOfParsley
+
+
+Bunkmaster Daban
+
+
+Bunkmaster Phict
+
+
+BunnyEars
+
+
+But alas, thou need more magical power for that.
+
+
+But be warned: you won't be able to use advanced healing magic until you are more capable in your regular magic usage.
+
+
+But remember, the game isn't fun when you already know what to do. Use it well or you will lose interest in playing The Mana World! Please help by reporting anything that is unclear, outdated or that needs to be seen on our forums at %s.
+
+
+Butterfly
+Mariposa
+
+Button#mine-1
+
+
+Button#mine-2
+
+
+Button#mine-3
+
+
+Bye for now.
+Adiós por ahora.
+
+Bye then!
+¡Adiós entonces!
+
+Bye!
+¡Adiós!
+
+Bye.
+Adiós.
+
+CactusDrink
+
+
+CactusPotion
+
+
+Cake
+
+
+Can you do something with my color?
+¿Puede hacer algo con mi color?
+
+Can you please go away?
+¿Puedes irte, por favor?
+
+Can't talk right now, I'm on patrol duty.
+Ahorita no puedo hablarle, estoy de patrulla.
+
+Candide
+
+
+Candied Slime
+
+
+CandleHelmet
+
+
+Candor Dock
+
+
+Candor Koga
+
+
+Candy
+
+
+CandyCane
+
+
+CandyPumpkin
+
+
+Cap
+
+
+Capitão Mirc
+
+
+CaptainsHat
+
+
+CaramelApple
+
+
+CaramelCandy
+
+
+CarbonGasMask
+
+
+Caretaker
+
+
+CashiersShade
+
+
+CasinoCoins
+
+
+CatEars
+
+
+Caul
+Caul
+
+Cave Maggot
+Gusano de las Cavernas
+
+Cave Snake
+
+
+CaveSnakeEgg
+
+
+CaveSnakeLamp
+
+
+CaveSnakeTongue
+
+
+Celestia
+Celestia
+
+Celestia BackDoor
+
+
+Celestia Door
+
+
+Cerhan
+
+
+ChainmailShirt
+
+
+Changing your body type will send you back to the character selection screen.
+Cambiar biotipo te regresará a la pantalla de selección de personaje
+
+Charda
+
+
+Ched
+
+
+Cheers!
+¡Salud!
+
+Chef Armand
+
+
+Chef#dimond
+
+
+Chef#graveyard
+
+
+ChefHat
+
+
+Cherry
+
+
+CherryCake
+
+
+Chest#DemonMask
+
+
+Chest#boring
+
+
+Chest#illia
+
+
+Chest#keshlam
+
+
+Chest#sword
+
+
+ChicSantaHat
+
+
+ChickenLeg
+
+
+Chief Warrick
+
+
+ChocolateBar
+
+
+ChocolateCake
+
+
+ChocolateMouboo
+
+
+ChristmasElfHat
+
+
+ChristmasTreeHat
+
+
+Cindy
+
+
+Cindy#house
+
+
+Circlet
+
+
+Clauquer
+Clauquer
+
+ClosedChristmasBox
+
+
+Clover Patch
+Parche de Tréboles
+
+CloverHat
+
+
+Coal
+Carbón
+
+Cobalt Plant
+Planta de Cobáltica
+
+CobaltHerb
+
+
+CoinBag
+
+
+Come back when thou art stronger.
+
+
+Command not permitted on this map! Check npc/functions/weather.conf
+
+
+ConcentrationPotion
+
+
+Connor
+
+
+Constable Bob
+
+
+Constable Perry Graf
+
+
+Contributor
+Colaborador
+
+Cooky
+
+
+Copper Slime
+
+
+CottonBoots
+
+
+CottonCloth
+
+
+CottonGloves
+
+
+CottonHeadband
+
+
+CottonShirt
+
+
+CottonShorts
+
+
+CottonSkirt
+
+
+CottonTrousers
+
+
+CranberryLollipop
+
+
+Crastur the Ugly
+
+
+CrescentRod
+
+
+CrimsonBra
+
+
+Crotcher Scorpion
+
+
+Crown
+
+
+CrozeniteFourLeafAmulet
+
+
+CrusadeHelmet
+
+
+CryptKey
+
+
+Curlee
+
+
+Current Magic Control
+Control Mágico Actual
+
+Current drop rate is set to @@%, and will reset to @@% (default value) in @@.
+
+
+Current exp rate is set to @@% (default value).
+El índice de experiencia en curso se estableció en @@% (valor predeterminado).
+
+Current exp rate is set to @@%, and will reset to @@% (default value) in @@.
+El índice de experiencia en curso se estableció en @@%, y se restablecerá a @@% (valor predeterminado) en @@.
+
+Cursed Waterfall
+
+
+Custom
+
+
+Cyndala
+Cyndala
+
+Cynric
+Cynric
+
+DEBUG: Changing @@ field @@ to something else.
+
+
+DEBUG: Changing @@, Values: (@@, @@, @@).
+
+
+Dagger
+Daga
+
+DarkBlueBeret
+
+
+DarkBlueBowlerHat
+
+
+DarkBlueBowlerHatBrown
+
+
+DarkBlueContributor
+
+
+DarkBlueCottonBoots
+
+
+DarkBlueCottonCloth
+
+
+DarkBlueCottonGloves
+
+
+DarkBlueCottonHeadband
+
+
+DarkBlueCottonShirt
+
+
+DarkBlueCottonShorts
+
+
+DarkBlueCottonSkirt
+
+
+DarkBlueCottonTrousers
+
+
+DarkBlueDesertHat
+
+
+DarkBlueDye
+
+
+DarkBlueFineDress
+
+
+DarkBlueMiniskirt
+
+
+DarkBlueRabbitEars
+
+
+DarkBlueShades
+
+
+DarkBlueShortTankTop
+
+
+DarkBlueSilkRobe
+
+
+DarkBlueSorcererBlack
+
+
+DarkBlueSorcererDBlue
+
+
+DarkBlueSorcererDGreen
+
+
+DarkBlueSorcererGreen
+
+
+DarkBlueSorcererLBlue
+
+
+DarkBlueSorcererOrange
+
+
+DarkBlueSorcererPink
+
+
+DarkBlueSorcererPurple
+
+
+DarkBlueSorcererRed
+
+
+DarkBlueSorcererWhite
+
+
+DarkBlueSorcererYellow
+
+
+DarkBlueTankTop
+
+
+DarkBlueTurtleneck
+
+
+DarkBlueVNeckSweater
+
+
+DarkBlueWizardHat
+
+
+DarkChristmasSweater
+
+
+DarkConcentrationPotion
+
+
+DarkCrystal
+
+
+DarkEasterEgg
+
+
+DarkEggshellHat
+
+
+DarkGreenBeret
+
+
+DarkGreenBowlerHat
+
+
+DarkGreenBowlerHatBrown
+
+
+DarkGreenContributor
+
+
+DarkGreenCottonBoots
+
+
+DarkGreenCottonCloth
+
+
+DarkGreenCottonGloves
+
+
+DarkGreenCottonHeadband
+
+
+DarkGreenCottonShirt
+
+
+DarkGreenCottonShorts
+
+
+DarkGreenCottonSkirt
+
+
+DarkGreenCottonTrousers
+
+
+DarkGreenDesertHat
+
+
+DarkGreenDye
+
+
+DarkGreenFineDress
+
+
+DarkGreenMiniskirt
+
+
+DarkGreenRabbitEars
+
+
+DarkGreenShades
+
+
+DarkGreenShortTankTop
+
+
+DarkGreenSilkRobe
+
+
+DarkGreenSorcererBlack
+
+
+DarkGreenSorcererDBlue
+
+
+DarkGreenSorcererDGreen
+
+
+DarkGreenSorcererGreen
+
+
+DarkGreenSorcererLBlue
+
+
+DarkGreenSorcererOrange
+
+
+DarkGreenSorcererPink
+
+
+DarkGreenSorcererPurple
+
+
+DarkGreenSorcererRed
+
+
+DarkGreenSorcererWhite
+
+
+DarkGreenSorcererYellow
+
+
+DarkGreenTankTop
+
+
+DarkGreenTurtleneck
+
+
+DarkGreenVNeckSweater
+
+
+DarkGreenWizardHat
+
+
+DarkHelm
+
+
+DarkPetal
+
+
+DarkRedRose
+
+
+DarkTalisman
+
+
+Darnel
+
+
+Darug
+
+
+David
+David
+
+Debug#0
+
+
+Debug#1
+
+
+Debug#2
+
+
+Debug#3
+
+
+Debug#Angela
+
+
+Debug#BlueSage
+
+
+Debug#Duels
+
+
+DebugFlowerP
+
+
+DecorCandy
+
+
+DemonMask
+
+
+Demonic Mouboo
+
+
+Demonic Spirit
+Espíritu Demoníaco
+
+Deposit.
+Depositar.
+
+DesertBow
+
+
+DesertHat
+
+
+DesertHelmet
+
+
+DesertShirt
+
+
+DevelopersCap
+
+
+Diamond
+Diamante
+
+DiamondPowder
+
+
+DiamondRing
+
+
+Did I received any mail?
+
+
+Did you already talk to Tanisha?"
+
+
+Did you see how this spell is cast?
+
+
+DilutedConcentrationPot
+
+
+Dimond
+
+
+Dimonds Cove 1
+
+
+Dimonds Cove 2
+
+
+Directions
+
+
+Diryn the Traveler
+
+
+Discard
+Desechar
+
+DiseasedHeart
+
+
+Do I look like a tree? I feel like one.
+¿Parezco un árbol? Me siento como uno.
+
+Do you feel too weak even to do damage to this areas wishy-washy wildlife?
+¿Se siente muy débil incluso para dañar estas insulsas zonas de vida silvestre?
+
+Do you have a name?
+
+
+Do you really want me to show you the spell again? You will have to bring new ingredients.
+
+
+Do you want to give me these items?
+
+
+Doctor
+Doctor
+
+Doll
+Muñeca
+
+Don't distract me, I have to stay alert.
+No me distraiga, tengo que mantenerme alerta.
+
+Donald
+Donald
+
+Doom Golem
+
+
+Door
+Puerta
+
+Doug
+
+
+Drabur
+Drabur
+
+Drag and drop an item from your inventory.
+Arrastra y suelta un objeto desde tu inventario.
+
+Drake the Traveler
+
+
+Dread Pirate Marley
+
+
+Dread Pirate Marley Clone
+
+
+Dresser#tutorial
+
+
+Drinker#1
+
+
+Drinker#2
+
+
+Drop rate has been reset to @@% (default value).
+
+
+Drop rate is set to @@% for the next @@.
+
+
+DruidTreeBranch
+
+
+Drunken Lady Skeleton
+
+
+Drunken Skeleton
+
+
+ERROR: You must set a PinCode to make use of this function.
+
+
+Earmuffs
+
+
+Earth Spirit
+
+
+Easter Eggs
+
+
+Easter Fluffy
+
+
+EasterBasket
+
+
+EasterEgg
+
+
+Ectoplasm
+
+
+Edwin
+
+
+Eevert
+
+
+EggshellHat
+
+
+Ekinu
+Ekinu
+
+Elanore carefully goes over your leaves, then smiles.
+
+
+Elanore counts the leaves you show her.
+
+
+Elanore shakes her head.
+
+
+Elanore smiles at you.
+
+
+Elanore smiles.
+
+
+Elanore the Healer
+
+
+Elanore#_M
+
+
+ElfNightcap
+
+
+Elias
+
+
+Elijah
+
+
+Eljas
+
+
+Emerald
+Esmeralda
+
+EmeraldPowder
+
+
+EmeraldRing
+
+
+Emergency Exit
+
+
+EmptyBottle
+
+
+Enchanter
+
+
+EnchantersAmulet
+
+
+Engraving#Keshlam
+
+
+Engravings
+
+
+Enjoy your new style.
+Deléitate con tu nuevo estilo.
+
+Ensio
+
+
+Entertainer
+
+
+Eomie
+Eomie
+
+Equip the wand and lets try out that spell.
+
+
+EskimoHat
+
+
+Estard
+
+
+Estrilda
+
+
+Eurni
+
+
+Every 1 hour
+Cada hora
+
+Every 12 hours
+Cada 12 horas
+
+Every 24 hours
+Cada 24 horas
+
+Every 3 hours
+Cada 3 horas
+
+Every 5 hours
+Cada 5 horas
+
+Every 6 hours
+Cada 6 horas
+
+Evil Mushroom
+
+
+Evil Obelisk
+
+
+Example: @translate Elmo
+
+
+Example: @translate Nard
+
+
+Example: @translate npc/002-1/arpan
+
+
+Excitedly, you turn the page – only to find that it is stuck to the next and can't be freed!
+
+
+Exit
+
+
+Exp rate has been reset to @@% (default value).
+El índice de experiencia ha sido restablecido a @@% (valor predeterminado).
+
+Exp rate is set to @@% for the next @@.
+El índice de experiencia se estableció en @@% por los siguientes @@.
+
+Eyepatch
+Parche Ocular
+
+Fabius
+
+
+FaceMask
+
+
+FairTradeSoil
+
+
+FairyHat
+
+
+FakeFangs
+
+
+Falchion
+
+
+Falkurn
+
+
+Fallen
+
+
+FancyHat
+
+
+Farewell.
+Adiós.
+
+Faris
+
+
+Faris the Traveler
+
+
+Farmer Hinnak
+
+
+Feel free to come visit me another time.
+Siéntase libre de volver a visitarme.
+
+Ferry Master#candor
+
+
+Ferry Master#tulimshar
+
+
+Fey Element
+
+
+Fieri
+
+
+FineDress
+
+
+Fire Goblin
+Trasgo de Fuego
+
+Fire Skull
+
+
+Five for you and five for me.
+
+
+Flashmob
+
+
+FlawedLens
+
+
+FlightTalisman
+
+
+Fluffy
+Felpudo
+
+FluffyHat
+
+
+Focus Skill +
+
+
+Focus Skill -
+
+
+Focus list:
+
+
+Forest Mana Seed#_M
+
+
+ForestArmor
+
+
+ForestBow
+
+
+Forwin
+
+
+FourLeafClover
+
+
+FreeRangeMoss
+
+
+From what I have been hearing, you seem to be doing well on your way to becoming a healer. I have decided to accept you as a student of the School of Life Magic.
+
+
+FrozenYetiTear
+
+
+Frozenbeard
+
+
+Fruit Store
+
+
+FunkyChristmasSweater
+
+
+FunkyHat
+
+
+FurBoots
+
+
+GMCap
+
+
+GMRobe
+
+
+GP: %s
+
+
+Gamboge Plant
+Planta de Gutagamba
+
+GambogeHerb
+
+
+Game Statistics
+Estadísticos del Juego
+
+Garcon#Duels
+
+
+General Krukan
+General Krukan
+
+General Razha
+General Razha
+
+General Store#dimond
+
+
+General Store#hurnscald
+
+
+General Terogan
+General Terogan
+
+General Terogan#Exit1
+
+
+General Terogan#Exit2
+
+
+General Terogan#Main
+
+
+George#pirate
+
+
+Ggrmm... Grmmmm...
+Rrrrr... Rrrrrrr...
+
+Ghada
+
+
+Giant Maggot
+Chiza Gigante
+
+GiantCaveMaggot
+
+
+GingerBreadMan
+
+
+Gispaan#Female
+
+
+Gispaan#Male
+
+
+Give me some space.
+Dame un poco de espacio.
+
+Gladys
+
+
+Gm Event#1
+
+
+Gm Event#2
+
+
+Gm Event#3
+
+
+Go back
+Regresar
+
+Go back?
+
+
+Go fly a kite.
+Ve a ver si ya puso la puerca.
+
+Go on. If you need to think a bit, take your time.
+
+
+GoblinMask
+
+
+Goggles
+
+
+Golbenez
+
+
+GoldTicket
+
+
+GoldenDeliciousApple
+
+
+GoldenFourLeafAmulet
+
+
+GoldenPVPCap
+
+
+GoldenPlatemail
+
+
+GoldenScorpionStinger
+
+
+GoldenWarlordPlate
+
+
+Goodbye!
+¡Adiós!
+
+Goodbye.
+Adiós.
+
+GraduationCap
+
+
+GrapeLollipop
+
+
+Grass Snake
+Culebra de las Praderas
+
+GrassFedTofu
+
+
+GrassLiner
+
+
+GrassSeed
+
+
+GrassSnakeEgg
+
+
+GrassSnakeTongue
+
+
+Grave#1
+
+
+Grave#10
+
+
+Grave#11
+
+
+Grave#12
+
+
+Grave#2
+
+
+Grave#3
+
+
+Grave#4
+
+
+Grave#5
+
+
+Grave#6
+
+
+Grave#7
+
+
+Grave#8
+
+
+Grave#9
+
+
+GrayHint
+
+
+Great! Now you can equip it.
+
+
+Great, lets begin your first lesson.
+
+
+GreatDragon
+
+
+Green Slime
+Babosa Verde
+
+Green Slime Mother
+
+
+GreenApple
+
+
+GreenBeret
+
+
+GreenBowlerHat
+
+
+GreenBowlerHatBrown
+
+
+GreenContributor
+
+
+GreenCottonBoots
+
+
+GreenCottonCloth
+
+
+GreenCottonGloves
+
+
+GreenCottonHeadband
+
+
+GreenCottonShirt
+
+
+GreenCottonShorts
+
+
+GreenCottonSkirt
+
+
+GreenCottonTrousers
+
+
+GreenDesertHat
+
+
+GreenDye
+
+
+GreenEasterEgg
+
+
+GreenEggshellHat
+
+
+GreenFineDress
+
+
+GreenHint
+
+
+GreenHitchhikersTowel
+
+
+GreenMiniskirt
+
+
+GreenOrnament
+
+
+GreenPresentBox
+
+
+GreenPresentHat
+
+
+GreenRabbitEars
+
+
+GreenRedStripedWrap
+
+
+GreenShades
+
+
+GreenShortTankTop
+
+
+GreenSilkRobe
+
+
+GreenSorcererBlack
+
+
+GreenSorcererDBlue
+
+
+GreenSorcererDGreen
+
+
+GreenSorcererGreen
+
+
+GreenSorcererLBlue
+
+
+GreenSorcererOrange
+
+
+GreenSorcererPink
+
+
+GreenSorcererPurple
+
+
+GreenSorcererRed
+
+
+GreenSorcererWhite
+
+
+GreenSorcererYellow
+
+
+GreenTankTop
+
+
+GreenTicket
+
+
+GreenTurtleneck
+
+
+GreenVNeckSweater
+
+
+GreenWizardHat
+
+
+GreenWrap
+
+
+Grenadier
+
+
+GrimaceOfDementia
+
+
+Grimoire
+Grimorio
+
+Grinchboo
+
+
+GroovyHat
+
+
+GrubSlime
+
+
+Guard#castle
+
+
+Guard#east1
+
+
+Guard#east3
+
+
+Guard#govt_in
+
+
+Guard#govt_out
+
+
+Guard#port1
+
+
+Guard#port2
+
+
+Guard#school
+
+
+GuardianWings
+
+
+GumiCandy
+
+
+Gungnir
+
+
+Gunney
+
+
+GutBuster
+
+
+GuyFawkesMask
+
+
+Gwendolyn
+
+
+Gwendolyn Bowmaker
+
+
+Hail adventurer! You are well on your way to mastering the beasts of the island.
+
+
+Halas
+
+
+Halberd
+Alabarda
+
+Hall Of Acorns
+Salón de las Bellotas
+
+Hall Of Base Level
+Salón del Nivel Base
+
+Hall Of Fortune
+Salón de la Fortuna
+
+Hall Of Guilds
+Salón de los Gremios
+
+Hall Of Job Level
+Salón del Nivel de Habilidad
+
+Hall Of Lethality
+Salón de la Letalidad
+
+Hamond
+
+
+HardSpike
+
+
+Harper
+Harper
+
+Hasan
+Hasan
+
+Have a good day!
+¡Qué tengas un buen día!
+
+Have fun with those spells and use them to cause hate, anger and death.
+
+
+Have you practiced enough?
+
+
+He is a kind old man. He stays mostly with his books and his apprentice, though we have chatted a few times.
+
+
+HeartGlasses
+
+
+HeartNecklace
+
+
+HeartOfIsis
+
+
+HeartOfLazurite
+
+
+Heathin
+Heathin
+
+HeathinDebug
+
+
+Hello! Can I help you?
+
+
+Hello! How are you? Did you already visit Hurnscald?
+
+
+Hello, Adventurer! Have you come back to help?
+
+
+Hello, I'm Alacrius.
+
+
+Hello.
+Hola.
+
+Henriikka
+
+
+Here is another useful one: '%s'. It will tell you the stats of the target monster, so you can know how dangerous it is.
+
+
+Here you go!
+
+
+Hetchel
+Hetchel
+
+HetchelDebug
+
+
+Hey! Good to hear from you!
+
+
+Heya!
+¡Eh, usted!
+
+Hi.
+Hola.
+
+Hide from monsters: %s
+
+
+HighPriestCrown
+
+
+Hinnak
+
+
+HitchhikersTowel
+
+
+Hm... Shhhh...
+Mm... Shhhh...
+
+Hmm. I wanted to teach you something, but I've forgotten what it was... please come back later.
+
+
+Hmm... how about this: you help me with a few of my experiments, and I tell you?
+
+
+Honey
+Miel
+
+House Maggot
+
+
+How about changing my body type?
+¿Qué tal si cambio mi biotipo?
+
+How can I help you?"
+
+
+How did you...
+
+
+How do I know you will not run off to Sagatha with what I would be teaching you?
+
+
+How much do you want to deposit?
+¿Cuánto quiere consignar?
+
+How much do you want to withdraw?
+¿Cuánto quiere retirar?
+
+How sad to hear how manners have degenerated in recent centuries. Farewell for now, dear mortal.
+
+
+Howdy?
+¿Quihubo?
+
+Hrmm, no looks like only %d out of 5 have been found.
+
+
+Hungry Fluffy
+
+
+Huntsman Spider
+
+
+Hurnscald North Dock
+
+
+Hurnscald North Koga
+
+
+Hurnscald South Dock
+
+
+Hurnscald South Koga
+
+
+Hydusun
+Hydusun
+
+Hyvern
+
+
+HyvernStinger
+
+
+I always need components for my own healing spells. If you bring me ten gamboge leaves, ten alizarin leaves, ten mauve leaves and ten cobalt leaves, I can make ten lifestones; I will give you half of them.
+
+
+I am sorry, but I don't think that I know anything that would help you.
+
+
+I can trade you %d %ss for %d %s and %d GP.
+
+
+I can't stay here and talk all day. I have a job to do.
+No puedo quedarme aquí a charlar todo el día. Tengo cosas que hacer.
+
+I changed my mind.
+Cambié de opinión.
+
+I do not know, though I suggest to seek out a local alchemist, if there is any.
+
+
+I have homework to do...
+
+
+I have taught thee all I can teach for now.
+
+
+I hope you like this color.
+Espero que le guste este color.
+
+I just want to live my life in peace.
+Tan solo quiero vivir mi vida en paz.
+
+I know not what brought thee hither, but I kindly ask that thou leavest me alone in my sorrow.
+
+
+I like you, so I'll tell you the bad word. But you can't tell anyone else about it! The bad word is %s.'
+
+
+I lost my towel...
+
+
+I need to finish studying for my test...
+
+
+I said %s.
+
+
+I see you killed all the %s needed.
+
+
+I think I would like to observe you for a little longer to see if you would make a good healer.
+
+
+I want to sleep...
+
+
+I want to teach you my favorite. However, you are not powerful enough to use it yet; You will first have to absorb more magic from the mana seed.
+
+
+I will make quick work of your wounds.
+
+
+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.
+
+
+I will only teach you magic of the school of Life, and that only if you prove yourself to be a good healer – that is, if you use your powers to help others.
+
+
+I would like to perform money transactions.
+Quisiera realizar transacciones de dinero.
+
+I would like to store some items.
+Quisiera almacenar algunos objetos.
+
+I'd like to get a different style.
+Me gustaría cambiar de estilo.
+
+I'll be waiting here, come back and see after you've killed those mobs.
+
+
+I'm a little busy right now.
+Ahorita ando algo ocupado.
+
+I'm done.
+He terminado.
+
+I'm fine for now, thank you.
+Por ahora estoy bien, gracias.
+
+I'm hoping to animate them into the shape of one of those odd log heads.
+
+
+I'm sorry, but I am not yet convinced that you are a good enough healer. Please continue in your endeavors.
+
+
+I'm sorry, but I can't help you with that.
+
+
+I'm supposed to combine two potions to create a %s, but I can't seem to figure out which two to combine...
+
+
+I'm trying to get work on my Alchemy homework, but I'm having some trouble.
+
+
+Ian
+
+
+Ian the Guide
+
+
+Ice Element
+
+
+Ice Goblin
+Trasgo de Hielo
+
+Ice Skull
+
+
+IceCube
+
+
+IceGladius
+
+
+IcedWater
+
+
+If the rumors are true and there really is a Mana Seed, then that would be wonderful news – perhaps we will have a few more healers soon!
+
+
+If you meant to reset the drop rate to its default value: @droprate default
+
+
+If you meant to reset the exp rate to its default value: @exprate default
+Si busca restablecer el índice de experiencia a su valor predeterminado: @exprate default
+
+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: '%s'. Then press the root to the ground.
+
+
+If you're using another client, settings and controls may be different.
+
+
+Iivo
+
+
+IlliaCMobs051-3
+
+
+IlliaDMobs051-1
+
+
+IlliaFMobs051-1
+
+
+Imec
+
+
+Impossible to resync: You are dead.
+Imposible resincronizar: Estás muerto.
+
+In that dresser there are some clothes you can wear.
+
+
+Inac
+Inac
+
+Inar
+Inar
+
+InfantryHelmet
+
+
+Inn
+Mesón
+
+Inspector#Hurnscald
+
+
+Internalize this feeling, and if your backpack was pressing on you you should no longer feel it now. We call it %s and it is a passive spell.
+
+
+Interval: (none, only sent on login)
+Intervalo: (ninguno, sólo enviado al acceder)
+
+Interval: every @@ hour(s)
+Intervalo: cada @@ hora(s)
+
+Invalid map mask
+
+
+Invalid parameter specified, blame saulc.
+
+
+Inya
+Inya
+
+Iormo
+
+
+IronArrow
+
+
+IronIngot
+
+
+IronOre
+
+
+IronPotion
+
+
+IronPowder
+
+
+Ishi
+Ishi
+
+Ishyah
+
+
+Ismo
+
+
+Issay
+
+
+It appears to be an ordinary sword.
+
+
+It is a sunny day, don't you think?
+Es un día soleado, ¿no os parece?
+
+It is already raining!
+
+
+It looks like you can't carry anything else for now.
+Parece que por el momento no puedes cargar nada más.
+
+It might be a good idea to drag the spell to the shortcut window, so you can target and attack using your keyboard instead of mouse.
+
+
+It seems you did not tell me the correct ingredients. Come back when you find the correct ones.
+
+
+It seems you found %d out of 5 of my friends.
+
+
+It seems you managed to amass quite a fortune!
+
+
+It was impossible to conjure rain clouds on this map.
+
+
+It worked!
+
+
+Items: %s
+
+
+Iten
+
+
+Itka
+Itka
+
+J.P. Morbid
+J.P. Morbid
+
+Jack
+Jack
+
+Jack O
+
+
+JackOLantern
+
+
+Jackal
+
+
+JadeEgg
+
+
+Jail Lock 1
+
+
+Jail Lock 2
+
+
+Jail Lock 3
+
+
+Jail Lock 4
+
+
+Janika
+
+
+JarofBlood
+
+
+JarofOwnBlood
+
+
+JazzyHat
+
+
+JeansChaps
+
+
+JeansShorts
+
+
+JellAhh
+
+
+JellyBeans
+
+
+JellySkull
+
+
+Jena the Traveler
+
+
+Jeric
+
+
+Jerry
+
+
+Jessie
+Jessie
+
+JesterMask
+
+
+Jhedia
+Jhedia
+
+Joan
+
+
+Joelin
+Joelin
+
+Jonathan
+
+
+Josh
+
+
+Julia
+Julia
+
+KPS Manager
+
+
+Kaan
+Kaan
+
+Kaan grins mischieviously.
+
+
+Kadiya
+
+
+Kage Golem
+
+
+Kane
+
+
+Katze
+
+
+Keep in mind this spell only works on yourself or party/guild companions. It will reduce your attack speed so keep this in mind.
+
+
+Keep moving pal.
+
+
+Kekeke... excellent! Yes, here goes your first spell, and it is even a passive: the flying backpack! If you are overloaded, it will take the load off your shoulders.
+
+
+Kfahr
+Kfahr
+
+Khoenan the Traveler
+
+
+KidBook
+
+
+Kilis
+
+
+Kimarr
+
+
+Knife
+Cuchillo
+
+KnightsHelmet
+
+
+KnitCap
+
+
+Knitra the Traveler
+
+
+Knowledgeable Tree
+
+
+Knox the Traveler
+
+
+Koyntety
+
+
+Kristian
+
+
+Kullervo
+
+
+Kylian
+Kylian
+
+KylianDebug#1
+
+
+KylianDebug#2
+
+
+Kytty
+
+
+LacedChocolateCake
+
+
+LacedOrangeCupcake
+
+
+LactoseFreeAcorn
+
+
+Lady Skeleton
+
+
+LadyFingers
+
+
+LargeHealingPotion
+
+
+LargeManaElixir
+
+
+Larvern
+
+
+Latif
+
+
+Latoy
+
+
+Lava Slime
+
+
+LazuriteCrystal
+
+
+LazuriteRobe
+
+
+LazuriteShard
+
+
+Leafing through the manuscript, you find that you can read little of the tiny handwriting and understand only a fraction of what is said.
+
+
+Leafing through the manuscript, you find that you understand too little of what is written to make any sense of it.
+
+
+LeatherBall
+
+
+LeatherGloves
+
+
+LeatherGoggles
+
+
+LeatherPatch
+
+
+LeatherShield
+
+
+LeatherShirt
+
+
+LeatherSuitcase
+
+
+LeatherTrousers
+
+
+Leave it alone.
+
+
+Lena
+Lena
+
+Lenita
+
+
+Leofwin
+
+
+Lesser Ghost
+
+
+Let me give you a lifestone to get started with.
+
+
+Let's see whats on the list. Ah ok, I need you to kill me %d %s.
+
+
+Lets start with a basic wand attack: %s.
+
+
+Liana
+Liana
+
+Lieutenant Dausen
+
+
+Lifestone
+
+
+LightBlueBeret
+
+
+LightBlueBowlerHat
+
+
+LightBlueBowlerHatBrown
+
+
+LightBlueContributor
+
+
+LightBlueCottonBoots
+
+
+LightBlueCottonCloth
+
+
+LightBlueCottonGloves
+
+
+LightBlueCottonHeadband
+
+
+LightBlueCottonShirt
+
+
+LightBlueCottonShorts
+
+
+LightBlueCottonSkirt
+
+
+LightBlueCottonTrousers
+
+
+LightBlueDesertHat
+
+
+LightBlueDye
+
+
+LightBlueFineDress
+
+
+LightBlueMiniskirt
+
+
+LightBlueRabbitEars
+
+
+LightBlueShades
+
+
+LightBlueShortTankTop
+
+
+LightBlueSilkRobe
+
+
+LightBlueSorcererBlack
+
+
+LightBlueSorcererDBlue
+
+
+LightBlueSorcererDGreen
+
+
+LightBlueSorcererGreen
+
+
+LightBlueSorcererLBlue
+
+
+LightBlueSorcererOrange
+
+
+LightBlueSorcererPink
+
+
+LightBlueSorcererPurple
+
+
+LightBlueSorcererRed
+
+
+LightBlueSorcererWhite
+
+
+LightBlueSorcererYellow
+
+
+LightBlueTankTop
+
+
+LightBlueTurtleneck
+
+
+LightBlueVNeckSweater
+
+
+LightBlueWizardHat
+
+
+LightCrystal
+
+
+LightPlatemail
+
+
+LimeHitchhikersTowel
+
+
+LockPicks
+
+
+Log Head
+Hojarasquin del Monte
+
+LollipopColor1
+
+
+LollipopColor2
+
+
+LollipopColor3
+
+
+LongSword
+
+
+Lora Tay
+
+
+Lora Tay Debug
+
+
+Lorrie
+
+
+Lost? Confused? Want to know why you can't get past a quest, overcome an NPC or find an item? Check %s for player hints, walkthroughs, item lists and more!
+
+
+LoveLetter
+
+
+LovePotion
+
+
+Lovely Maggot
+
+
+Lovers
+
+
+Luca
+
+
+Luvia
+
+
+Luvia?
+
+
+MTJarofOwnBlood
+
+
+MageRing
+
+
+MagentaHint
+
+
+MagentaOrnament
+
+
+Maggot
+Gusano
+
+MaggotSlime
+
+
+Magic Sword
+
+
+Magic flows naturally from you, readily and with ease. You feel in perfect control of your magic.
+
+
+MagicGMTopHat
+
+
+Malek
+
+
+Malivox
+Malivox
+
+Mallard's Eye
+
+
+Mana Bug
+Gazapo del Maná
+
+Mana Ghost
+Fantasma del Maná
+
+Mana Slayer
+
+
+Mana Tyrant
+
+
+ManaGuardian
+
+
+ManaPotion
+
+
+Manually trigger the current broadcast
+Activar manualmente la transmisión en curso
+
+Maria
+
+
+Marikel
+Marikel
+
+Marshmallow
+
+
+Mauve Plant
+Planta de Malva
+
+MauveHerb
+
+
+Mede
+
+
+MediumHealingPotion
+
+
+MediumManaElixir
+
+
+Melinda
+
+
+Meluna
+
+
+Meridith the Traveler
+
+
+Merry Christmas!
+
+
+Merry Christmas, adventurer.
+
+
+Merry Christmas, arr yarr!!
+
+
+Message:
+Mensaje:
+
+Michel
+
+
+Mika
+
+
+Mike
+
+
+Mikhail
+Mikhail
+
+Miler
+
+
+Milis
+
+
+Milk
+
+
+Milly
+Milly
+
+MillyDebugHelper
+
+
+Mine Debug#1
+
+
+Mine Debug#2
+
+
+Mine Debug#3
+
+
+Mine Debug#4
+
+
+Miner
+
+
+MinerGloves
+
+
+MinersHat
+
+
+Miniskirt
+
+
+Mirak
+
+
+Miriam
+
+
+Mirjami
+
+
+Miro
+
+
+Mirror#wiz
+
+
+Mjolnir
+
+
+Mo
+
+
+Mob points: %s
+
+
+Moggun
+
+
+Money transference will have a %d %% fee as well.
+
+
+MoneyChanger
+
+
+Monocle
+
+
+MonsterOilPotion
+
+
+MonsterSkullHelmet
+
+
+Monsters Killed in PvE: %s
+Monstruos Eliminados en JcE: %s
+
+Moo!
+¡Muu!
+
+Moonshroom
+
+
+MoonshroomHat
+
+
+Moooo!
+¡Muuuu!
+
+Moooooo!
+¡Muuuuuu!
+
+Moooooooooooo!
+¡Muuuuuuuuuuuu!
+
+MopoxCurePotion
+
+
+Morgan#_M
+
+
+MorganDebug
+
+
+Motto#wiz
+
+
+Mouboo
+Muubuu
+
+MoubooFigurine
+
+
+MoubooHead
+
+
+MoubootaurHead
+
+
+Mountain Snake
+
+
+MountainSnakeEgg
+
+
+MountainSnakeTongue
+
+
+MovieCap
+
+
+Much better, right?!
+
+
+Munro
+
+
+MurdererCrown
+
+
+MushHat
+
+
+My breath smells bad.
+Tengo mal aliento.
+
+My name is Kaan, I'm Tanisha's brother."
+
+
+My spell only works on the very young, sorry.
+
+
+MylarinDust
+
+
+Mystic Sword
+
+
+Naah, you're too weak now! Come back later when you have grown!
+
+
+Naem
+
+
+Narrator
+Narrador
+
+Nathan
+
+
+Nea
+
+
+Need a healing?
+
+
+Neko
+Neko
+
+Never (only on login)
+Nunca (sólo al acceder)
+
+Next broadcast: (never)
+Siguiente transmisión: (nunca)
+
+Next broadcast: @@
+Siguiente transmisión: @@
+
+Next ingredient.
+
+
+Next, I shall teach you a higher-level transmutation spell.
+
+
+Next, a nature spell. Take a cocoon shell. Hold it in your hand. Feel its lightness.
+
+
+Next, say '%s', and feel your skin grow rigid! Very useful against stings and stabs and pokes and pricks and that sort of stuff. Lowers attack speed and only works on yourself, party, or guild allies, though.
+
+
+Nice day to you.
+Que tenga un buen día.
+
+Nicholas
+Nicholas
+
+Nickos
+Nickos
+
+Nigel
+
+
+Nikolai
+
+
+Nina the Traveler
+
+
+Nivalis Dock
+
+
+Nivalis Koga
+
+
+No
+No
+
+No, I am sorry. Please bring me ten leaves each of gamboge, alizarin, mauve, and cobalt.
+
+
+No, thanks. I already know how things are going.
+
+
+No, you are not powerful enough yet. Please come back and ask me again when you have learned to control more powerful magic, though!
+
+
+No.
+No.
+
+NohMask
+
+
+Nonsense! You look fine and dandy to me. All you need is a bit more exercise and fresh fruit in your diet!
+
+
+Not in the mood to chat.
+No estoy de humor para charlar.
+
+Not resync'ing to prevent flood.
+No resincronizar para evitar aluviones.
+
+Not yet.
+Aún no.
+
+Notable mentions and thanks for our [@@https://www.patreon.com/themanaworld|sponsors@@] for their continued support.
+Mención de honor y agradecimiento a nuestros [@@https://www.patreon.com/themanaworld|patrocinadores@@] por su continuo apoyo.
+
+Note
+Nota
+
+Note#bar
+
+
+Note#mirak
+
+
+Note#wiz
+
+
+Note: Transfering items on mail cost %s GP/item
+
+
+Nothing happens.
+
+
+Now get the clothes out of the dresser.
+
+
+Now hold still, this won't hurt a bit...
+
+
+Now leave. Spread chaos with the spells I have taught you!
+
+
+Now that you are a student of mine, I will teach you some spells.
+
+
+Now that you know the basics of nature magic, here is one of my favourites: '%s' will summon rain, whereever you are standing. It will consume a bottle of water, though.
+
+
+Now, listen carefully: to make a short tank top out of three pieces of cloth, you must use the invocation '%s'.
+
+
+Nurse
+Enfermera
+
+Nutcracker
+Cascanueces
+
+NutcrackerHat
+
+
+Nyle
+Nyle
+
+Observe!
+
+
+Oh dear! That looks like poison; hang on...
+
+
+Oh look, it is Cupid!
+Vea, ¡es Cupid!
+
+Oh, I can't be sure... but something like '%s', I think.
+
+
+Oh, I have only met Sagatha once or twice, while collecting herbs. She is a warm and gentle person, but she tries to hide it.
+
+
+Oh, and a fruit may even fall for you if you are lucky! But stay alert to pick up your drops.
+Ah, ¡y hasta puedes recibir una fruta si tiene suerte! Pero tienes que estar al loro para recoger los objetos soltados.
+
+Oh, and by the way my name is Sorfina."
+
+
+Oh, but of course! You are powerful enough to make your own lifestones, using the enchantment '%s'. This will consume a bug leg, a maggot slime and one of each of the four healing herbs, though.
+
+
+Oh, sorry – I don't really know him very well.
+
+
+Oh, you found them all! Good job! Now it's my turn with searching again. Go and hide!
+
+
+Oh.
+
+
+Oh... it seems that you have no room for the lifestones. But please do come back later when you have made a little space.
+
+
+Oh... you managed to put things into every little nook and pocket, haven't you? Well, come back later, I will give it to you then.
+
+
+Ok, done.
+Vale, hecho.
+
+Okay let me try this.
+
+
+Olana
+Olana
+
+Old Chest#crastur
+
+
+Old Man
+Viejo
+
+Old Wizard#_W
+
+
+Old Woman
+Vieja
+
+Omar
+
+
+Once this is done you have to throw it in the air and scream %s and the two roots will turn into toxic darts, a projectile you can throw.
+
+
+Only %s in storage will be counted.
+Solo se contarán los %s almacenados.
+
+Ontas
+
+
+OpenPresentBox
+
+
+OperaMask
+
+
+Or, well, both.
+
+
+Orange
+
+
+OrangeBeret
+
+
+OrangeBowlerHat
+
+
+OrangeBowlerHatBrown
+
+
+OrangeCake
+
+
+OrangeContributor
+
+
+OrangeCottonBoots
+
+
+OrangeCottonCloth
+
+
+OrangeCottonGloves
+
+
+OrangeCottonHeadband
+
+
+OrangeCottonShirt
+
+
+OrangeCottonShorts
+
+
+OrangeCottonSkirt
+
+
+OrangeCottonTrousers
+
+
+OrangeCupcake
+
+
+OrangeDesertHat
+
+
+OrangeDye
+
+
+OrangeEggshellHat
+
+
+OrangeFineDress
+
+
+OrangeHint
+
+
+OrangeHitchhikersTowel
+
+
+OrangeLollipop
+
+
+OrangeMiniskirt
+
+
+OrangeRabbitEars
+
+
+OrangeRose
+
+
+OrangeRoseHat
+
+
+OrangeShades
+
+
+OrangeShortTankTop
+
+
+OrangeSilkRobe
+
+
+OrangeSorcererBlack
+
+
+OrangeSorcererDBlue
+
+
+OrangeSorcererDGreen
+
+
+OrangeSorcererGreen
+
+
+OrangeSorcererLBlue
+
+
+OrangeSorcererOrange
+
+
+OrangeSorcererPink
+
+
+OrangeSorcererPurple
+
+
+OrangeSorcererRed
+
+
+OrangeSorcererWhite
+
+
+OrangeSorcererYellow
+
+
+OrangeSummonFlower
+
+
+OrangeTankTop
+
+
+OrangeTulip
+
+
+OrangeTurtleneck
+
+
+OrangeVNeckSweater
+
+
+OrangeWizardHat
+
+
+OrchidBra
+
+
+Orum
+
+
+Orum#barrier
+
+
+Orum#trap
+
+
+Orum's Homunculus
+
+
+OrumDebug
+
+
+Oscar
+Oscar
+
+Oskari
+
+
+Osmo
+
+
+Oswal
+
+
+Other
+Otro
+
+Other.
+Otro.
+
+OverlordsHelmet
+
+
+PS. Doesn't always work. You need an account at %s and to be at ManaPlus Team.
+
+
+PVPCap
+
+
+PVPCoin
+
+
+Pachua
+
+
+Painless, wasn't it?
+
+
+PaladinsHelmet
+
+
+PanHat
+
+
+PaperBag
+
+
+Parcival
+
+
+Parua
+Parua
+
+Pauline
+Pauline
+
+PaulineDebug
+
+
+Pear
+
+
+Pearl
+Perla
+
+Peetu
+
+
+Personal Information
+
+
+Peter
+Peter
+
+Phaet
+
+
+Phaet#arena
+
+
+Phil
+
+
+Phylactery
+
+
+PickledBeets
+
+
+PileOfAsh
+
+
+PilotHat
+
+
+Pink Flower
+Flora Rosa
+
+PinkAntenna
+
+
+PinkBeret
+
+
+PinkBowlerHat
+
+
+PinkBowlerHatBrown
+
+
+PinkChristmasSweater
+
+
+PinkContributor
+
+
+PinkCottonBoots
+
+
+PinkCottonCloth
+
+
+PinkCottonGloves
+
+
+PinkCottonHeadband
+
+
+PinkCottonShirt
+
+
+PinkCottonShorts
+
+
+PinkCottonSkirt
+
+
+PinkCottonTrousers
+
+
+PinkDesertHat
+
+
+PinkDye
+
+
+PinkEasterEgg
+
+
+PinkFineDress
+
+
+PinkHitchhikersTowel
+
+
+PinkMiniskirt
+
+
+PinkPetal
+
+
+PinkRabbitEars
+
+
+PinkRose
+
+
+PinkRoseHat
+
+
+PinkShades
+
+
+PinkShortTankTop
+
+
+PinkSilkRobe
+
+
+PinkSorcererBlack
+
+
+PinkSorcererDBlue
+
+
+PinkSorcererDGreen
+
+
+PinkSorcererGreen
+
+
+PinkSorcererLBlue
+
+
+PinkSorcererOrange
+
+
+PinkSorcererPink
+
+
+PinkSorcererPurple
+
+
+PinkSorcererRed
+
+
+PinkSorcererWhite
+
+
+PinkSorcererYellow
+
+
+PinkTankTop
+
+
+PinkTicket
+
+
+PinkTulip
+
+
+PinkTurtleneck
+
+
+PinkVNeckSweater
+
+
+PinkWizardHat
+
+
+Pinkie
+Rosáceo
+
+Pinkie Scroll
+
+
+PinkieHat
+
+
+PinkieHelmet
+
+
+Pipe
+
+
+PirateHat
+
+
+PlatynaRedDress
+
+
+Players Killed in PvP: %s
+Jugadores Eliminados en JcJ: %s
+
+Players breaking the following rules may be banned for any length of time (even permanently) or have their characters reset at a GM's discretion:
+
+
+Please enter the message:
+Por favor ingrese el mensaje:
+
+Please equip your ammo first!
+
+
+Please insert your pincode.
+
+
+Please leave me in peace.
+
+
+Please select a quest:
+Por favor selecione una misión:
+
+Please select the desired body type:
+Por favor seleccione el biotipo deseado:
+
+Please select the interval:
+Por favor seleccione el intervalo:
+
+Please stand still.
+
+
+Plum
+
+
+PlushMouboo
+
+
+PointyWitchHat
+
+
+Poison Skull
+Calavera Ponzoñosa
+
+Pollett
+
+
+PollettEgg
+
+
+Poltergeist
+
+
+PoltergeistPowder
+
+
+Pot
+
+
+Potions#_M
+
+
+Practice! There are no secrets to becoming a warrior.
+¡Práctica! No hay secretos para convertirse en un guerrero.
+
+Present#1
+
+
+Present#2
+
+
+Present#3
+
+
+Psi Brain
+
+
+Pumpkin
+Calabaza
+
+PumpkinHelmet
+
+
+PumpkinSeeds
+
+
+PurificationPotion
+
+
+PurpleBeret
+
+
+PurpleBowlerHat
+
+
+PurpleBowlerHatBrown
+
+
+PurpleContributor
+
+
+PurpleCottonBoots
+
+
+PurpleCottonCloth
+
+
+PurpleCottonGloves
+
+
+PurpleCottonHeadband
+
+
+PurpleCottonShirt
+
+
+PurpleCottonShorts
+
+
+PurpleCottonSkirt
+
+
+PurpleCottonTrousers
+
+
+PurpleDesertHat
+
+
+PurpleDye
+
+
+PurpleFineDress
+
+
+PurpleHint
+
+
+PurpleHitchhikersTowel
+
+
+PurpleMiniskirt
+
+
+PurplePresentBox
+
+
+PurpleRabbitEars
+
+
+PurpleShades
+
+
+PurpleShortTankTop
+
+
+PurpleSilkRobe
+
+
+PurpleSorcererBlack
+
+
+PurpleSorcererDBlue
+
+
+PurpleSorcererDGreen
+
+
+PurpleSorcererGreen
+
+
+PurpleSorcererLBlue
+
+
+PurpleSorcererOrange
+
+
+PurpleSorcererPink
+
+
+PurpleSorcererPurple
+
+
+PurpleSorcererRed
+
+
+PurpleSorcererWhite
+
+
+PurpleSorcererYellow
+
+
+PurpleStripedWrap
+
+
+PurpleSummonFlower
+
+
+PurpleTankTop
+
+
+PurpleTicket
+
+
+PurpleTulip
+
+
+PurpleTurtleneck
+
+
+PurpleVNeckSweater
+
+
+PurpleWizardHat
+
+
+PurpleWrap
+
+
+Pyry
+
+
+Quest @@ modified by GM
+Misión @@ modificada por DJ
+
+Quest debug
+Depurar misión
+
+QuillOfBinding
+
+
+Quit
+Salir
+
+RIP#1
+
+
+RIP#10
+
+
+RIP#2
+
+
+RIP#3
+
+
+RIP#4
+
+
+RIP#5
+
+
+RIP#6
+
+
+RIP#7
+
+
+RIP#8
+
+
+RIP#9
+
+
+RabbitEars
+
+
+RaggedShorts
+
+
+Raging
+
+
+RangerHat
+
+
+Rasin
+
+
+Rauk
+
+
+RawAir
+
+
+RawLog
+
+
+RawTalisman
+
+
+ReadingGlasses
+
+
+RealisticBrain
+
+
+Reaper
+Parca
+
+Reathe
+
+
+Rebecca
+
+
+Receptionist#inn
+
+
+Receptionist#mine
+
+
+Red Bone
+
+
+Red Scorpion
+
+
+Red Slime
+Babosa Roja
+
+Red Spark
+
+
+RedApple
+
+
+RedBeret
+
+
+RedBowlerHat
+
+
+RedBowlerHatBrown
+
+
+RedChristmasStocking
+
+
+RedContributor
+
+
+RedCottonBoots
+
+
+RedCottonCloth
+
+
+RedCottonGloves
+
+
+RedCottonHeadband
+
+
+RedCottonShirt
+
+
+RedCottonShorts
+
+
+RedCottonSkirt
+
+
+RedCottonTrousers
+
+
+RedDesertHat
+
+
+RedDottedWrap
+
+
+RedDye
+
+
+RedEasterEgg
+
+
+RedEggshellHat
+
+
+RedFineDress
+
+
+RedGoldenStripedWrap
+
+
+RedHint
+
+
+RedHitchhikersTowel
+
+
+RedMiniskirt
+
+
+RedNose
+
+
+RedOrnament
+
+
+RedPowder
+
+
+RedPresentHat
+
+
+RedRabbitEars
+
+
+RedRose
+
+
+RedRoseHat
+
+
+RedSaddleRug
+
+
+RedScorpionStinger
+
+
+RedShades
+
+
+RedShortTankTop
+
+
+RedSilkRobe
+
+
+RedSorcererBlack
+
+
+RedSorcererDBlue
+
+
+RedSorcererDGreen
+
+
+RedSorcererGreen
+
+
+RedSorcererLBlue
+
+
+RedSorcererOrange
+
+
+RedSorcererPink
+
+
+RedSorcererPurple
+
+
+RedSorcererRed
+
+
+RedSorcererWhite
+
+
+RedSorcererYellow
+
+
+RedStockings
+
+
+RedSummonFlower
+
+
+RedTankTop
+
+
+RedTicket
+
+
+RedTulip
+
+
+RedTurtleneck
+
+
+RedVNeckSweater
+
+
+RedWizardHat
+
+
+ReedBundle
+
+
+Reid's Ghost
+
+
+Reinboo
+
+
+Reino
+
+
+Remember, they're hiding somewhere on the island, you will have to explore to find them. They could be hiding anywhere.
+
+
+Remove all focus skills
+
+
+Repeat how many times?
+¿Repetir cuántas veces más?
+
+Repeat: @@ times
+Repetir: @@ veces
+
+Resist Ailment
+
+
+Return to Super Menu
+Regresar al Super Menú
+
+Return to my sister now. I expect that she shall teach thee one more spell.
+
+
+Rhutan the Traveler
+
+
+Richard
+Richard
+
+Rikhard
+
+
+Riskim
+Riskim
+
+RoastedAcorn
+
+
+RoastedMaggot
+
+
+Robert
+
+
+RockKnife
+
+
+Root
+
+
+Rosen
+Rosen
+
+Rossy
+Rossy
+
+RottenRags
+
+
+Rouge#Duels
+
+
+Roulette
+
+
+Rrrr... Pchhhh...
+Prrrr... Pchhhh...
+
+RubberBat
+
+
+Ruby
+Rubí
+
+RubyPowder
+
+
+RubyRing
+
+
+Rudolph Slime
+
+
+RunestoneA
+
+
+RunestoneL
+
+
+RunestoneN
+
+
+RunestoneT
+
+
+RunestoneW
+
+
+Ryan
+Ryan
+
+Rynoh
+
+
+SUSAN
+
+
+Sabine
+Sabine
+
+Sabre
+
+
+Sagatha#_M
+
+
+SailorHat
+
+
+Samuel
+
+
+SandCutter
+
+
+Sandra
+
+
+Santa Slime
+
+
+Santa's Helper
+
+
+SantaBeardHat
+
+
+SantaCookie
+
+
+SantaHat
+
+
+SantaSnowGlobe
+
+
+Santaboo
+
+
+Santeri
+
+
+Sapphire
+Zafiro
+
+SapphirePowder
+
+
+SapphireRing
+
+
+Sara
+
+
+Sarah
+
+
+Sasquatch
+
+
+Savaric
+
+
+SaviorArmor
+
+
+Say %s to make your roots into toxic darts.
+
+
+Saying#wiz
+
+
+ScarabArmlet
+
+
+Scared Man
+
+
+ScentedCandleHelmet
+
+
+Scheduled broadcasts
+Transmisiones programadas
+
+Scheduled broadcasts - Create new
+Transmisiones programadas - Crear nueva
+
+Scimitar
+
+
+Scissors
+Tijeras
+
+Scorpion
+Alacrán
+
+Scorpion King
+
+
+ScorpionStinger
+
+
+Scythe
+Hoz
+
+Sea Slime
+
+
+Sea Slime Mother
+
+
+SealedSoul
+
+
+See you later!
+¡Nos vemos luego!
+
+See you soon!
+¡Hasta pronto!
+
+See you!
+¡Nos vemos!
+
+Selim
+Selim
+
+Sema
+
+
+Send 10 times
+Enviar 10 veces
+
+Send 2 times
+Enviar 2 veces
+
+Send 20 times
+Enviar 20 veces
+
+Send 3 times
+Enviar 3 veces
+
+Send 5 times
+Enviar 5 veces
+
+Send indefinitely
+Enviar indefinidamente
+
+Send only once
+Enviar sólo una vez
+
+Send this message also on login?
+¿Enviar también este mensaje al acceder?
+
+Sent on login: @@
+Enviar al acceder: @@
+
+Sent on login: yes
+Enviar al acceder: sí
+
+Sent: @@ times out of @@
+Enviar: @@ de cada @@ veces
+
+SerfHat
+
+
+Serqet
+Caballito del Diablo
+
+Set a new broadcast
+Establecer nueva transmisión
+
+Setzer
+Setzer
+
+Shannon
+
+
+SharpKnife
+
+
+She hesistates.
+
+
+She looks at you suspiciously.
+
+
+She performs a complicated gesture.
+
+
+She picks up all forty and presses them together in her hands, then whispers something.
+
+
+She smiles at you.
+
+
+She smiles.
+
+
+She takes away her hands and looks up.
+
+
+She walks up to you, holds your shoulders, and smiles at you.
+
+
+She was babbling at me about it all the morning until I sent her to take care of the maggots in the cafe.
+
+
+Sherman the Traveler
+
+
+ShockSweet
+
+
+ShortBow
+
+
+ShortSword
+
+
+ShortTankTop
+
+
+ShroomHat
+
+
+Sign
+
+
+SilkCocoon
+
+
+SilkGloves
+
+
+SilkHeadband
+
+
+SilkPants
+
+
+SilkRobe
+
+
+SilkSheet
+
+
+Silkworm
+Gusano de Seda
+
+SilverFourLeafAmulet
+
+
+SilverMirror
+
+
+Silvia
+
+
+SimpleRing
+
+
+Skeleton
+Esqueleto
+
+SkeletonCharm
+
+
+Skill can only be cast on party or guild members!
+
+
+Skull
+Calavera
+
+SkullMask
+
+
+Sleeping Bandit
+
+
+Slime Blast
+
+
+SlingBullet
+
+
+SlingShot
+
+
+Slots#1
+
+
+Slots#2
+
+
+Slots#3
+
+
+Slots#4
+
+
+Slots#5
+
+
+Slots#6
+
+
+Slots#7
+
+
+SlowPoisonPotion
+
+
+SmallCrack#XmasPassage
+
+
+SmallHealingPotion
+
+
+SmallManaElixir
+
+
+SmallMushroom
+
+
+SmileyCap
+
+
+Snail
+
+
+Snake
+Culebra
+
+SnakeEgg
+
+
+SnakeSkin
+
+
+SnakeTongue
+
+
+Snapple
+
+
+Sneaky Bandit
+
+
+SnowGoggles
+
+
+SnowLauncher
+
+
+Snowball
+
+
+Snowman
+
+
+SnowmanSnowGlobe
+
+
+So be it, fellow warrior. Hear the incantation for the blade spell: '%s'
+
+
+So you think you're tough? A warrior must also be loyal and patient.
+¿Así qué te crees muy rudo? Un guerrero también debe ser leal y paciente.
+
+So, have you managed to transmute something?
+
+
+Some forest creatures sometimes overgrow their fur or hide. That makes them uncomfortable.
+
+
+Some of it might jog your memory or at least help you catch your bearings.
+
+
+Something else?
+¿Algo más?
+
+Sometimes you just need to run from battle.
+
+
+SorcererBlack
+
+
+SorcererDBlue
+
+
+SorcererDGreen
+
+
+SorcererGreen
+
+
+SorcererLBlue
+
+
+SorcererOrange
+
+
+SorcererPink
+
+
+SorcererPurple
+
+
+SorcererRed
+
+
+SorcererWhite
+
+
+SorcererYellow
+
+
+Sorfina
+Sorfina
+
+Sorry %%i I am really really REALLY busy right now. Maybe later, when I find my toolset, we can start focusing on something.
+
+
+Soul
+
+
+Soul Eater
+
+
+Soul Menhir
+
+
+Soul Menhir#candor
+
+
+Soul Menhir#deadmire
+
+
+Soul Menhir#hurnscald
+Menhir de las Ãnimas#hurnscald
+
+Soul Menhir#nivalis
+
+
+Soul Menhir#tulimshar
+
+
+Soul Snake
+
+
+Speak '%s' 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.
+
+
+Speak to me again once you've cast the spell.
+
+
+Spear
+Lanza
+
+Special monsters are not counted.
+Los monstruos especiales no cuentan.
+
+Spectre
+
+
+SpectrePowder
+
+
+Speed
+
+
+Spell#wiz1
+
+
+Spell#wiz2
+
+
+Spell#wiz3
+
+
+Spell#wiz4
+
+
+Spell#wiz5
+
+
+Spell#wiz6
+
+
+Spell#wiz7
+
+
+Spider
+Araña
+
+Spiky Mushroom
+Puyaseta
+
+Spiky mushrooms often grow too many spikes, so you can shear the spikes off of some.
+
+
+Squirrel
+Ardilla
+
+SquirrelPelt
+
+
+StaffOfFire
+
+
+StaffOfIce
+
+
+StaffOfLife
+
+
+Stalker
+Merodeador
+
+StandardHeadband
+
+
+Start broadcasting
+Comenzar a transmitir
+
+Start broadcasting, and make an extra broadcast right now
+Comenzar a transmitir, y hacer una transmisión adicional ahora mismo.
+
+Start over
+Volver a empezar
+
+Stats: %s
+
+
+Status Condition Cleared
+
+
+Steak
+
+
+SteelShield
+
+
+Stewen
+
+
+StickReinboo
+
+
+Sticking out of the rock is a sword hilt.
+
+
+Stop broadcasting
+Detener la transmisión
+
+Stop it!
+¡Basta!
+
+Store Policy#1
+
+
+Store Policy#2
+
+
+Strange Stone
+
+
+StrangeCoin
+
+
+Stranger
+
+
+Styx the Traveler
+
+
+Suddenly, you hear a strange, metallic voice in your head, the voice of a woman.
+
+
+SulphurPowder
+
+
+Sunglasses
+Gafas de Sol
+
+Supply Chest
+
+
+Surprise me!
+¡Sorpréndeme!
+
+Swashbuckler
+
+
+Swezanne
+
+
+Sword
+
+
+Syntax: @wset <map_mask>
+
+
+TMWBirthdayGift
+
+
+TUTORIAL
+
+
+Taito
+
+
+Take %s arrows, sprinkle sulphur powder over them, and then speak '%s'. Throw them high up in the air, and watch the hail unfold before thy feet.
+
+
+Take a cocoon, living or dead, and suffuse it in magic. Fell the %s, feel its lightness and feel it float! You no longer should be feeling overburned by your stolen goods, kekeke...
+
+
+Take care!
+¡Cuídate!
+
+Talk to you later!
+¡Hablamos luego!
+
+Talk to you soon!
+¡Nos hablamos pronto!
+
+Talpan
+
+
+Talponian#Female
+
+
+Talponian#Male
+
+
+TamOShanter
+
+
+Tame Scorpion
+
+
+Tanisha
+Tanisha
+
+TankTop
+
+
+Tathin
+
+
+Taylor
+
+
+TealEasterEgg
+
+
+TealHint
+
+
+TealHitchhikersTowel
+
+
+Tengu
+Tengu
+
+Terranite
+Terranítico
+
+Terranite Armor#Female
+
+
+Terranite Armor#Male
+
+
+TerraniteArrow
+
+
+TerraniteChestArmor
+
+
+TerraniteHead
+
+
+TerraniteHelmet
+
+
+TerraniteLegs
+
+
+TerraniteOre
+
+
+Teuvo
+
+
+Thank you for using our services. Please accept this little gift.
+
+
+Thanks once again for helping with the monsters in the island.
+
+
+Thanks, @@. We just wanted to be sure it was you.
+
+
+That invocation is '%s'.
+
+
+That would be great!
+¡Eso sería genial!
+
+Thats not what I said to do. Please don't skip ahead.
+
+
+The Beheader
+
+
+The Egg cracks open and a living snake comes out of the egg.
+
+
+The Lost
+
+
+The Mana World - Legacy
+
+
+The Witch takes %s and %s and put them togheter calling %s.
+
+
+The Wizard's thank thee as well.
+
+
+The deep basso voice continues.
+
+
+The doctor examines you briefly.
+El doctor te examina brevemente.
+
+The doctor pulls out a syringe and fills it with a white liquid from a jar on his desk.
+
+
+The dresser is empty.
+
+
+The explanations in this tutorial are based on the Manaplus client.
+
+
+The invocation is `%s' followed by the last syllable of the name of the creature you want to shape the log into.
+
+
+The last word on that page is '%s' and it's underlined twice with a comment next to it saying 'finally got it right.'
+
+
+The message cannot be empty
+El mensaje no puede estar vacío
+
+The next spell I have will make a normal tank top out of four pieces of cloth. The invocation is '%s', make sure to write this down.
+
+
+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.'
+
+
+The spell consumes a Small Mushroom and a Dark Crystal. Shove the Dark Crystal into the Small Mushroom and yell %s.
+
+
+The spell fails!
+
+
+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.
+
+
+The spell takes a mind of its own backfires!
+
+
+The voice sounds slightly amused.
+
+
+The witch glares at you in anger.
+
+
+The witch's eyes flare up in anger as she notices you, and she turns away from you.
+
+
+The wizard looks at you with despise.
+
+
+The wizard looks at you, his eyes flashing, and laughs diabolically.
+
+
+The wizard takes the crystal and the egg, mumbling something you don't understand. Suddenly, he throws the egg into the air and throws the crystal right through it midair.
+
+
+Then I fear that I shall not reveal the spell to you either.
+
+
+Then I wish thee well in thy travels, wanderer!
+
+
+Then chant the lesser healing spell, '%s', with whoever you wish to heal targeted.
+
+
+Then come back later.
+
+
+Then concentrate your anger upon the trees hereabouts, you will gain experience whilst leveling your sword skill on them.
+Entonces desquítese con esos árboles. Ganará experiencia mientras nivela su habilidad con la espada.
+
+Then please stop wasting my precious time.
+Entonces por favor, deje de hacerme perder mi valioso tiempo.
+
+Then say %s and let the mushroom's power take over. It only works on yourself, party or guild allies.
+
+
+Then tell me the ingredients for the mouboo summoning spell and give them to me. Start with the first ingredient and then tell me the second one separately.
+
+
+Then, she rises up on her tiptoes and kisses you on your forehead.
+
+
+There are %d out of 5 found.
+
+
+There is no answer.
+
+
+There is no honor in fighting a weak opponent.
+No hay honor en enfrentarse a un oponente débil.
+
+There you are, right as rain! Now you take care, all right?
+
+
+These will do just fine.
+
+
+They call me Sagatha.
+
+
+Thinking well, you will not be able to use it yet; you will first have to gain a greater understanding of magic overall.
+
+
+This error is fatal, we stop execution.
+
+
+This is a wand, there are many like it but this one is now yours.
+
+
+This is not a monster; I cannot use monsterinfo on it.
+
+
+This menu allows you to set the scheduled broadcast that is sent to all players at a specific interval.
+Este menú le permite ajustar la transmisión programada que se envía a todos los jugadores a un determinado intervalo .
+
+This menu gives access to quest debug menus for @@ quests.
+Este menú brinda acceso a todos los menús de depuración de misión para las misiones @@.
+
+This powder thou shalst need to cast the lightning spell. Throw it up into the air and shout '%s', and smite thine enemies with lightning.
+
+
+This skill can only be used on monsters!
+
+
+This spell makes arrows out of a single wooden log. Its invocation is '%s'.
+
+
+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 and may even injure yourself further.
+
+
+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!
+
+
+Thou hast collected %s Monster Points. For one thousand of them, I shall admit thee to the school of war magic.
+
+
+Thug
+
+
+Thurstan
+
+
+Thurston
+
+
+Tinris
+
+
+TinyHealingPotion
+
+
+TinyManaElixir
+
+
+Tipsy Skeleton
+
+
+To cast a spell open the skill window, select the spell you wish to use, and press the %s button.
+
+
+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.
+
+
+To heal yourself, it's enough to just cast by itself, without a target selected.
+
+
+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.
+
+
+To make a shirt, use the invocation '%s'. This will require five pieces of cloth.
+
+
+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.
+
+
+To summon the snakes use %s.
+
+
+To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.
+
+
+Toggle Focus - Astral Soul
+
+
+Toggle Focus - Brawling
+
+
+Toggle Focus - Mallards Eye
+
+
+Toggle Focus - Raging
+
+
+Toggle Focus - Resist Ailment
+
+
+Toggle Focus - Speed
+
+
+Toichi
+Toichi
+
+Tondar
+
+
+Tongue
+Lengua
+
+TonoriDelight
+
+
+Toothbrush
+
+
+TopHat
+
+
+Topaz
+Topacio
+
+TopazPowder
+
+
+TopazRing
+
+
+Torch#1
+
+
+Torch#2
+
+
+Torch#3
+
+
+Tormenta
+
+
+Total Gold: %s
+
+
+Total deaths: %s
+
+
+Touch it.
+
+
+Towel
+
+
+ToySabre
+
+
+Trader
+
+
+TreasureKey
+
+
+Troll
+Trol
+
+Troupe Leader
+Jefa de la Comparsa
+
+Trying to control your magic is still rather troublesome.
+
+
+Tulimshar Dock
+
+
+Tulimshar Koga
+
+
+TurquoiseBra
+
+
+Turtleneck
+
+
+TutDebug
+
+
+Umfrey
+
+
+Umm... no... I... I don't remember anything else...
+
+
+Undead Troll
+
+
+Undead Witch
+
+
+UndeadDebug3
+
+
+UndeadDebug4
+
+
+UndeadDebug5
+
+
+UndeadEar
+
+
+UndeadEye
+
+
+UnderworldKey
+
+
+UnderworldMask
+
+
+Unfortunately, that seems to require more magical power than you can use right now. If only the Mana Seed granted you more power...
+
+
+Unfortunately, you can't make out what the transmutation is for or even whether it requires any materials...
+
+
+Unlike lesser heal, it'll heal instantly, however it still cannot help if the person has a serious injury or has been inflicted with an ailment.
+
+
+Urmas
+
+
+Urn
+
+
+Usage of @exprate without argument is deprecated, please use "@rates" instead.
+
+
+Usage: @translate <npc file>
+
+
+Use
+
+
+Use @@ to cancel.
+
+
+VNeckSweater
+
+
+Valdo
+
+
+Valia
+Valia
+
+Valjas
+
+
+Valon
+
+
+ValonDebug
+
+
+Vampire Bat
+
+
+VampireBatWing
+
+
+Various wands and staffs are found throughout the land with many different strengths and weaknesses.
+
+
+VeganWater
+
+
+Vellamo
+
+
+Veneri
+
+
+Verneri
+
+
+Very well then, see you.
+
+
+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.
+
+
+Vicious Squirrel
+
+
+Vincent
+Vincent
+
+Vincent Debug
+
+
+Virus
+
+
+Void Archant
+
+
+Void Bat
+
+
+Void Flower
+
+
+Void Maggot
+
+
+Void Mouboo
+
+
+Void Scorpion
+
+
+Void Shroom
+
+
+Void Slime
+
+
+Void Snake
+
+
+Void Soldier
+
+
+Voltain
+Voltain
+
+WARNING: If you insert wrong pincode, you'll be disconnected.
+
+
+Waitress
+
+
+Wand
+
+
+Waric
+
+
+Waric nods at you.
+
+
+Waric#trap
+
+
+WarlordBoots
+
+
+WarlordHelmet
+
+
+WarlordPlate
+
+
+Warning#mirak
+
+
+Warning, %d remaining: %s
+
+
+WarpedLog
+
+
+Water Pump
+
+
+We refuse service to anyone who:
+Nos rehusamos a servir a quienquiera que:
+
+We will start with an easy one. I will teach you how to summon a wicked mushroom.
+
+
+We've been taking care of you ever since. Waiting for you to wake up."
+
+
+Wedding Officiator
+
+
+WeddingRing
+
+
+Weellos
+
+
+Welcome back, apprentice.
+
+
+Welcome to my prison, mortal!
+
+
+Well
+
+
+Well %s what else can you tell me about yourself?.
+
+
+Well I can tell you some useful things, if you want to hear.
+
+
+Well, I could. However, I am not sure you are trustworthy.
+
+
+Well, either you are going mad, or that sword in the stone is talking to you.
+
+
+Well, well, well! Look at all those green bubbles coming out of your head; that looks like poisoning to me! Did you eat something rotten?
+
+
+What do you want to do with your money?
+¿Qué quieres hacer con tu dinero?
+
+What else do you need?
+¿Qué más necesitas?
+
+What is it is that brings thee to this place?
+
+
+What is my current hairstyle and hair color?
+¿Cuál es mi peinado y color de cabello actual?
+
+What would you like me to do?
+¿Qué quieres que haga?
+
+What're you looking at?!
+¡¿Qué mira?!
+
+What's your race?
+¿Cuál es su raza?
+
+Whatever the reason, she doesn't seem to like you.
+
+
+Which language do you speak?
+
+
+White Bell
+
+
+White Slime
+
+
+WhiteBellTuber
+
+
+WhiteBlanket
+
+
+WhiteCake
+
+
+WhiteCowboyHat
+
+
+WhiteEvokersRobeBlue
+
+
+WhiteFur
+
+
+WhiteHitchhikersTowel
+
+
+WhitePresentBox
+
+
+WhiteRose
+
+
+WhiteRoseHat
+
+
+WhiteSaddleRug
+
+
+WhiteSummonFlower
+
+
+WhiteTulip
+
+
+WhiteWizardRobe
+
+
+WhiteWrap
+
+
+Why are you wasting my time? Come back when you got everything I need.
+
+
+Wicked Mushroom
+Maldiseta
+
+Wight
+
+
+WinterGloves
+
+
+Wisp
+
+
+WispPowder
+
+
+Witch Guard
+
+
+WitchDoctorsMask
+
+
+WitchHat
+
+
+Withdraw.
+Retirar.
+
+WizardHat
+
+
+Wolfgang
+
+
+Wolvern
+Lobuno
+
+WolvernPelt
+
+
+WolvernTooth
+
+
+WoodenShield
+
+
+WoodenStaff
+
+
+WraithHorn
+
+
+WumpusEgg
+
+
+Wyara is the Hurnscald town witch. She was also the town healer before the Doctor moved there.
+
+
+Wyara the Witch
+
+
+Wyara#_M
+
+
+Xakelbael
+
+
+XmasCake
+
+
+XmasCandyCane
+
+
+XmasDebug#1
+
+
+XmasDebug#2
+
+
+XmasDebug#3
+
+
+XmasDebug#4
+
+
+XmasSpawnCounter#0
+
+
+XmasSpawnCounter#1
+
+
+XmasSpawnCounter#2
+
+
+XmasSpawnManager
+
+
+YOU CAN FEEL THE POWER FLOWING TROUGH YOU.
+
+
+YOU WERE BLESSED BY JESUSALVA
+
+
+Yalina
+
+
+Yanis
+
+
+Yarr arr!
+
+
+Yeah, and she's done with the maggots.
+
+
+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.
+
+
+Yellow Slime
+Babosa Amarilla
+
+YellowBeret
+
+
+YellowBowlerHat
+
+
+YellowBowlerHatBrown
+
+
+YellowContributor
+
+
+YellowCottonBoots
+
+
+YellowCottonCloth
+
+
+YellowCottonGloves
+
+
+YellowCottonHeadband
+
+
+YellowCottonShirt
+
+
+YellowCottonShorts
+
+
+YellowCottonSkirt
+
+
+YellowCottonTrousers
+
+
+YellowDesertHat
+
+
+YellowDottedWrap
+
+
+YellowDye
+
+
+YellowEasterEgg
+
+
+YellowEggshellHat
+
+
+YellowFineDress
+
+
+YellowHint
+
+
+YellowHitchhikersTowel
+
+
+YellowMiniskirt
+
+
+YellowOrnament
+
+
+YellowPowder
+
+
+YellowPresentBox
+
+
+YellowPresentHat
+
+
+YellowRabbitEars
+
+
+YellowRose
+
+
+YellowRoseHat
+
+
+YellowShades
+
+
+YellowShortTankTop
+
+
+YellowSilkRobe
+
+
+YellowSorcererBlack
+
+
+YellowSorcererDBlue
+
+
+YellowSorcererDGreen
+
+
+YellowSorcererGreen
+
+
+YellowSorcererLBlue
+
+
+YellowSorcererOrange
+
+
+YellowSorcererPink
+
+
+YellowSorcererPurple
+
+
+YellowSorcererRed
+
+
+YellowSorcererWhite
+
+
+YellowSorcererYellow
+
+
+YellowSummonFlower
+
+
+YellowTankTop
+
+
+YellowTicket
+
+
+YellowTulip
+
+
+YellowTurtleneck
+
+
+YellowVNeckSweater
+
+
+YellowWizardHat
+
+
+YellowWrap
+
+
+Yerrnk
+
+
+Yes
+Sí
+
+Yes, I helped her with the maggots.
+
+
+Yes, of course.
+
+
+Yes.
+Sí.
+
+Yeti
+
+
+YetiClaw
+
+
+YetiMask
+
+
+YetiSkinShirt
+
+
+You are already a student of Sagatha. I will not teach you anything!
+
+
+You are making progress, but you still need more practice.
+
+
+You are missing required items.
+
+
+You are still at the beginning of your path, but do keep practicing.
+
+
+You can also manually stop it at any time with: @droprate default
+
+
+You can also manually stop it at any time with: @exprate default
+También puede detenerlo manualmente en cualquier momento con: @exprate estándar
+
+You can call fluffies, too. But for them you must call out '%s' instead, with white fluffy fur instead of a spike. And don't forget the root.
+
+
+You can harden your skin with a hard spike. Hold it in your hands and speak '%s', then draw its hardness into your skin, or the skin of someone's else.
+
+
+You can help them with shearing magic. Press your hands together and say '%s'. Then touch them with your hands, and brush off any excess.
+
+
+You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.
+
+
+You can turn the log into a wooden figurine by imagining the creature whose shape you want in your head and saying `%s' followed by the last syllable of the name of the creature you want to shape it into.
+
+
+You can't make out anything else of value, so you place the manuscript back in the bookshelf.
+
+
+You cannot complete the casting correctly!
+
+
+You currently have @@ GP on your bank account.
+
+
+You didn't have any possessions on you when we found you and no one knows who you are.
+
+
+You do not have enough %s (min %d)
+
+
+You do not have enough Gold Pieces on your bank account.
+
+
+You do not have enough Gold on yourself.
+
+
+You do not have suffice magic power to make rain.
+
+
+You don't have enough magical power to learn the next healing spell yet.
+
+
+You don't look too well; let me treat your wounds.
+
+
+You feel a strange, tingling kind of warmth spread through your body.
+
+
+You feel completely overwhelmed by your magic.
+
+
+You feel in almost perfect control of your magic.
+
+
+You feel mostly in control of your magic.
+
+
+You feel quite in control of your magic.
+
+
+You feel quite overwhelmed by your magic, but are beginning to see patterns.
+
+
+You feel somewhat in control of your magic.
+
+
+You feel that you have only the bare minimum of control over your magic.
+
+
+You feel that you have very good control of your magic.
+
+
+You feel you still have a few difficulties in controlling your magic.
+
+
+You found %d out of 5 us.
+
+
+You have made good progress, but please do continue in your efforts.
+
+
+You have made good progress, but you lack the magical power to advance further. Also, I would like to observe you some more to be certain that you will make a good healer.
+
+
+You look fantastic.
+Te ves genial.
+
+You made a cash deposit of @@ GP.
+
+
+You may find that you can transmute the powder more effectively after a while; that is perfectly natural.
+
+
+You must have been thrown off one of the ships sailing during that last tremor."
+
+
+You must practice more first.
+
+
+You need a Dagger, Sharp Knife or Knife to use!
+
+
+You need at least %d %s to use this spell!
+
+
+You need more room in your inventory.
+
+
+You need to be carrying less weight.
+
+
+You need to kill %s: %d/%d.
+
+
+You open your eyes.
+
+
+You see a girl who is holding her hands in front of her face.
+
+
+You seem to be ready to advance as a healer. There is one favor I must ask of you first, though.
+
+
+You should be more careful.
+
+
+You should come back when you have some free space.
+Deberías volver cuando tengas algo de espacio libre.
+
+You should get dressed now.
+
+
+You still need to find some of my friends. You have found %d out of 5 of my friends.
+
+
+You successfully set the drop rate to @@%. It will reset to @@% (default value) in @@.
+
+
+You successfully set the exp rate to @@%. It will reset to @@% (default value) in @@.
+Asignó satisfactoriamente el índice de experiencia en @@%. Este se restablecerá a @@% (valor predeterminado) en @@.
+
+You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the dresser.
+
+
+You were permanently banned by the GM Team.
+
+
+You withdrew a total of @@ GP.
+
+
+Young Man
+
+
+Your GM level is now hidden.
+Su nivel de DJ ahora está oculto.
+
+Your GM level is now visible.
+Su nivel de DJ es ahora visible.
+
+Your hairstyle is @@ and its color is @@.
+Su peinado es @@ y su color es @@.
+
+Your magic takes a mind of its own!
+
+
+Zack
+
+
+ZaxDeKagen
+
+
+Zegas
+Zegas
+
+ZegasDebug
+
+
+Zitoni
+Zitoni
+
+Zombie
+Zombi
+
+ZombieNachos
+
+
+Zzzzzzzzz...
+Zzzzzzzzz...
+
+_N-Pumpkin
+
+
+a ground!
+¡Tierra!
+
+a quiet place,
+un lugar tranquilo,
+
+fifteen
+
+
+no
+no
+
+no active broadcast
+transmisión inactiva
+
+sign#pvp-1
+
+
+sign#pvp-2
+
+
+specialMob027-3
+
+
+specialMob027-4
+
+
+yes
+sí
+
+• Can't walk without stopping after every step
+
+
+• Has a bubblehead
+
+
+• Is not properly shaded
+
+
diff --git a/langs/lang_fr.old b/langs/lang_fr.old
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/langs/lang_fr.old
diff --git a/langs/lang_fr.txt b/langs/lang_fr.txt
new file mode 100644
index 00000000..6d5602bb
--- /dev/null
+++ b/langs/lang_fr.txt
@@ -0,0 +1,6673 @@
+Copyright (C) 2010-2015 Evol Online
+"Ah, you woke up. You washed ashore on the beach 3 days ago. You've been asleep since.
+
+
+"Come back and see me when the job is done."
+
+
+"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 '%s', which is the lay on hands magic."
+
+
+"Maybe I should go back to practicing '%s' until I can make potions properly." %%6
+
+
+"My little granddaughter Tanisha found you. Kaan was able to carry you to bed.
+
+
+"She hates maggots.
+
+
+"The first one for the mouboo was %s and the one for the pinkie was %s.
+
+
+"Welcome to the bank!
+
+
+"You're the person I brought here, right?
+
+
+##BHall Of Acorns: TOP15##b
+
+
+##BHall Of Fortune: TOP15##b
+
+
+##BHall Of Guild Level: TOP5##b
+
+
+##BHall Of Job Level: TOP15##b
+
+
+##BHall Of Lethality: TOP15##b
+
+
+##BHall Of Level: TOP15##b
+
+
+%%@
+
+
+%%A
+
+
+%%B
+
+
+%%C
+
+
+%%D
+
+
+%%E
+
+
+%%F
+
+
+%d out of 5 have been found.
+
+
+%s
+%s
+
+%s - Level %d (~%s HP, ~%s ATK)
+
+
+%s : %s
+
+
+(A mystical aura surrounds this stone. You feel mysteriously attracted to it. Something tells you to touch it. What do you do?)
+
+
+... Tulimshar in Tonori ... I'm a Talpan.
+
+
+1) Do not abuse other players. Insults, swearing, and the like are not to be directed towards a particular person or group.
+
+
+2) No bots – including ##Bany##b AFK activity or automated actions of any sort.
+
+
+3) No spamming or flooding (including messages, whispers, and trade requests).
+
+
+4) No begging.
+
+
+5) Speak ##Bonly##b English in the public chat.
+
+
+6) Treat others how you would like to be treated.
+
+
+7
+
+
+98... 99... 100!
+
+
+?
+
+
+@@
+@@
+
+A blissful day to thee, mortal!
+
+
+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 '%s' spell.
+
+
+A sunny and hot day,
+Un jour chaud et ensoleillé,
+
+A wicked mushroom will appear to fight for you. Usually.
+
+
+A-hoy matey!
+Eh-oh matelot !
+
+AFK botting will be determined by talking to players who are moving and/or attacking.
+
+
+AFKCap
+
+
+Aahna
+
+
+Aaron
+
+
+Abort
+Abandonner
+
+Acorn
+Gland
+
+ActivatedSulphur
+
+
+Add all focus skills
+
+
+Adrian
+
+
+After a while, you stumble across a section that appears to be written somewhat legibly. The author notes that he (or perhaps she?) is describing a completely new transmutation.
+
+
+After we finish talking, click on the clothes and press the equip button.
+
+
+Agostine
+
+
+Agostine Debug
+
+
+Ah, the Professors will get mad at me again...
+
+
+Ah, yes, your training...
+
+
+Ah.
+
+
+Ah... no beer? Oh well.
+
+
+Aidan
+
+
+Airlia
+
+
+Aisha
+
+
+Aisha looks around as she leans in and hushes you to silence. After a few seconds, she whispers to you:
+
+
+Akseli
+
+
+Alacrius
+
+
+Alan
+
+
+Aldred
+
+
+Alice
+
+
+Alizarin Plant
+
+
+AlizarinHerb
+
+
+All monsters summoned!
+Tous les monstres ont été invoqués!
+
+All of my money.
+Tout mon argent.
+
+All scoreboards are updated hourly.
+
+
+AmberChristmasSweater
+
+
+Amethyst
+Améthyste
+
+AmethystPowder
+
+
+AmethystRing
+
+
+Amrak
+
+
+And make sure to keep notes of your spells! Don't rely only on your skill tab (F5).
+
+
+And the first spell, to summon wicked mushrooms, is %s.
+
+
+Andra
+
+
+Angela
+
+
+Angela#house
+
+
+Angry Fire Goblin
+
+
+Angry Green Slime
+
+
+Angry Scorpion
+
+
+Angry Sea Slime
+
+
+AngryScorpionStinger
+
+
+Angus
+
+
+AniManOMat
+
+
+AnimalBones
+
+
+Anne
+
+
+AnniversaryHat
+
+
+Another Sneaky Bandit
+
+
+AntlerHat
+
+
+Antlers
+
+
+Anwar
+Anwar
+
+Anything else you can remember?
+
+
+Anything else?
+Ça sera tout ?
+
+AppleCake
+
+
+ApprenticeRobe
+
+
+AquaHint
+
+
+AquaOrnament
+
+
+AquaTicket
+
+
+Aradin
+
+
+Archant
+
+
+Archibald
+
+
+Ardra
+
+
+Are you read for another spell?
+
+
+Arkim
+
+
+Arr!
+
+
+Arr, I'm bored!
+
+
+Arrow
+
+
+Arvo
+
+
+As she opens her hands again, the leaves have turned into ten golden crystals.
+
+
+As the power of your magic grows so will the spells you can cast.
+
+
+As you look at the sword, you suddenly hear a voice in your head!
+
+
+As you want!
+Comment tu veux !
+
+Ashley
+
+
+AssassinBoots
+
+
+AssassinGloves
+
+
+AssassinPants
+
+
+AssassinShirt
+
+
+Astral Soul
+
+
+AstralCube
+
+
+At this point, the river deepens, slowing down to a leisurely pace. In its center you notice an unusual stone, waves breaking around it.
+
+
+Auldsbel places the logs next to his hut.
+
+
+Auldsbel the Wizard
+
+
+Auldsbel#_M
+
+
+Aureole
+
+
+Automated following will be determined by observation.
+
+
+AutumnMask
+
+
+Avalia
+
+
+Axe
+Hache
+
+AxeHat
+
+
+Ayasha
+
+
+AyashaDebug
+
+
+Azul Slime
+
+
+Back
+
+
+Baktar
+
+
+Ball Lightning
+
+
+Bandana
+Bandana
+
+Bandit
+
+
+Bandit Lord
+
+
+BanditHood
+
+
+BansheeBow
+
+
+Banu
+
+
+Bar Rules
+
+
+Barbara Grey
+
+
+Bard
+Barde
+
+Bardiche
+
+
+Barkeeper
+
+
+Barrel#0
+
+
+Barrel#1
+
+
+Barrel#2
+
+
+Barrel#3
+
+
+Barrel#4
+
+
+Barrel#5
+
+
+Barrel#6
+
+
+Barrel#7
+
+
+Bartender
+
+
+Bartender#Casino
+
+
+Bartender#Duels
+
+
+Basil
+
+
+BastardSword
+
+
+Bat
+
+
+BatTeeth
+
+
+BatWing
+
+
+Battle Master#Duels
+
+
+BeanieCopter
+
+
+Bee
+abeille
+
+Beer
+Bière
+
+BeetleJuice
+
+
+Before you stands a beautiful woman, dressed in dark purple robes and wearing a witch's hat.
+
+
+Beheader
+
+
+Ben
+
+
+Bennet
+
+
+BentNeedle
+
+
+Beret
+
+
+Bernard
+Bernard
+
+Beware of what thou wishest for, mortal...
+
+
+Birrod
+
+
+Black Scorpion
+
+
+BlackBeret
+
+
+BlackBoots
+
+
+BlackBowlerHat
+
+
+BlackBowlerHatBrown
+
+
+BlackContributor
+
+
+BlackCottonBoots
+
+
+BlackCottonCloth
+
+
+BlackCottonGloves
+
+
+BlackCottonHeadband
+
+
+BlackCottonShirt
+
+
+BlackCottonShorts
+
+
+BlackCottonSkirt
+
+
+BlackCottonTrousers
+
+
+BlackCowboyHat
+
+
+BlackDesertHat
+
+
+BlackDye
+
+
+BlackEvokersRobeBlue
+
+
+BlackFineDress
+
+
+BlackJack
+
+
+BlackMiniskirt
+
+
+BlackPearl
+
+
+BlackRabbitEars
+
+
+BlackRose
+
+
+BlackScorpionStinger
+
+
+BlackShades
+
+
+BlackShortTankTop
+
+
+BlackSilkRobe
+
+
+BlackSorcererBlack
+
+
+BlackSorcererDBlue
+
+
+BlackSorcererDGreen
+
+
+BlackSorcererGreen
+
+
+BlackSorcererLBlue
+
+
+BlackSorcererOrange
+
+
+BlackSorcererPink
+
+
+BlackSorcererPurple
+
+
+BlackSorcererRed
+
+
+BlackSorcererWhite
+
+
+BlackSorcererYellow
+
+
+BlackTankTop
+
+
+BlackTurtleneck
+
+
+BlackVNeckSweater
+
+
+BlackWizardHat
+
+
+BlackWizardRobe
+
+
+Blacksmith
+Forgeron
+
+BlacksmithsAxe
+
+
+Blackwin
+
+
+BlinkingEvil
+
+
+BlinkingEvilBlue
+
+
+BlinkingEvilHalloween
+
+
+BlinkingEvilPink
+
+
+BlinkingEvilRed
+
+
+BlinkingEvilYellow
+
+
+BlinkingHocus
+
+
+BloodInk
+
+
+BloodWine
+
+
+Bloodstone
+
+
+Blossom
+
+
+Blue Slime
+
+
+Blue Spark
+
+
+BlueChristmasSweater
+
+
+BlueDottedWrap
+
+
+BlueEasterEgg
+
+
+BlueEggshellHat
+
+
+BlueHint
+
+
+BlueHitchhikersTowel
+
+
+BlueOrnament
+
+
+BluePowder
+
+
+BluePresentBox
+
+
+BluePresentHat
+
+
+BlueRose
+
+
+BlueRoseHat
+
+
+BlueTicket
+
+
+BlueWolfHelmet
+
+
+BlueWrap
+
+
+Blueberries
+Myrtilles
+
+Bluepar
+
+
+Body type %i
+
+
+Bone
+Os
+
+BoneArrows
+
+
+BoneDarts
+
+
+BoneKnife
+
+
+Bones
+
+
+BookPage
+
+
+Bookshelf
+
+
+Boots
+Bottes
+
+Boss points: %s
+
+
+BottleOfSand
+
+
+BottleOfWater
+
+
+Bow
+
+
+BowlerHat
+
+
+BowlerHatBrown
+
+
+Bracco
+
+
+BrainStem
+
+
+Brawling
+
+
+Bring me ten bug legs, and I will reveal its invocation to you.
+
+
+Brodomir
+
+
+BrokenDoll
+
+
+BrokenFourLeafAmulet
+
+
+BromenalBoots
+
+
+BromenalChest
+
+
+BromenalFourLeafAmulet
+
+
+BromenalGloves
+
+
+BromenalHelmet
+
+
+BromenalLegs
+
+
+BromenalShield
+
+
+Browsing through the books, you come across a manuscript entitled 'Notes of Potaffe, On Transmutation.'
+
+
+Bryant
+
+
+BucketHat
+
+
+BugLeg
+
+
+BullHelmet
+
+
+BunchOfParsley
+
+
+Bunkmaster Daban
+
+
+Bunkmaster Phict
+
+
+BunnyEars
+
+
+But alas, thou need more magical power for that.
+
+
+But be warned: you won't be able to use advanced healing magic until you are more capable in your regular magic usage.
+
+
+But remember, the game isn't fun when you already know what to do. Use it well or you will lose interest in playing The Mana World! Please help by reporting anything that is unclear, outdated or that needs to be seen on our forums at %s.
+
+
+Butterfly
+Papillon
+
+Button#mine-1
+
+
+Button#mine-2
+
+
+Button#mine-3
+
+
+Bye for now.
+À la prochaine.
+
+Bye then!
+Et bien au revoir !
+
+Bye!
+Au revoir !
+
+Bye.
+Au revoir.
+
+CactusDrink
+
+
+CactusPotion
+
+
+Cake
+
+
+Can you do something with my color?
+Peux-tu faire quelque chose avec ma couleur ?
+
+Can you please go away?
+Peux-tu t'en aller je te prie ?
+
+Can't talk right now, I'm on patrol duty.
+Je ne peux pas parler là maintenant, je suis de patrouille.
+
+Candide
+
+
+Candied Slime
+
+
+CandleHelmet
+
+
+Candor Dock
+
+
+Candor Koga
+
+
+Candy
+
+
+CandyCane
+
+
+CandyPumpkin
+
+
+Cap
+
+
+Capitão Mirc
+
+
+CaptainsHat
+
+
+CaramelApple
+
+
+CaramelCandy
+
+
+CarbonGasMask
+
+
+Caretaker
+
+
+CashiersShade
+
+
+CasinoCoins
+
+
+CatEars
+
+
+Caul
+
+
+Cave Maggot
+Maggot de Cave
+
+Cave Snake
+
+
+CaveSnakeEgg
+
+
+CaveSnakeLamp
+
+
+CaveSnakeTongue
+
+
+Celestia
+
+
+Celestia BackDoor
+
+
+Celestia Door
+
+
+Cerhan
+
+
+ChainmailShirt
+
+
+Changing your body type will send you back to the character selection screen.
+
+
+Charda
+
+
+Ched
+
+
+Cheers!
+Salut !
+
+Chef Armand
+
+
+Chef#dimond
+
+
+Chef#graveyard
+
+
+ChefHat
+
+
+Cherry
+
+
+CherryCake
+
+
+Chest#DemonMask
+
+
+Chest#boring
+
+
+Chest#illia
+
+
+Chest#keshlam
+
+
+Chest#sword
+
+
+ChicSantaHat
+
+
+ChickenLeg
+
+
+Chief Warrick
+
+
+ChocolateBar
+
+
+ChocolateCake
+
+
+ChocolateMouboo
+
+
+ChristmasElfHat
+
+
+ChristmasTreeHat
+
+
+Cindy
+
+
+Cindy#house
+
+
+Circlet
+
+
+Clauquer
+
+
+ClosedChristmasBox
+
+
+Clover Patch
+
+
+CloverHat
+
+
+Coal
+Charbon
+
+Cobalt Plant
+
+
+CobaltHerb
+
+
+CoinBag
+
+
+Come back when thou art stronger.
+
+
+Command not permitted on this map! Check npc/functions/weather.conf
+
+
+ConcentrationPotion
+
+
+Connor
+
+
+Constable Bob
+
+
+Constable Perry Graf
+
+
+Contributor
+
+
+Cooky
+
+
+Copper Slime
+
+
+CottonBoots
+
+
+CottonCloth
+
+
+CottonGloves
+
+
+CottonHeadband
+
+
+CottonShirt
+
+
+CottonShorts
+
+
+CottonSkirt
+
+
+CottonTrousers
+
+
+CranberryLollipop
+
+
+Crastur the Ugly
+
+
+CrescentRod
+
+
+CrimsonBra
+
+
+Crotcher Scorpion
+
+
+Crown
+
+
+CrozeniteFourLeafAmulet
+
+
+CrusadeHelmet
+
+
+CryptKey
+
+
+Curlee
+
+
+Current Magic Control
+
+
+Current drop rate is set to @@%, and will reset to @@% (default value) in @@.
+
+
+Current exp rate is set to @@% (default value).
+Le taux d'exp actuel est réglé à @@% (valeur par défaut).
+
+Current exp rate is set to @@%, and will reset to @@% (default value) in @@.
+Le taux d'exp actuel est réglé à @@%, et se réinitialisera à @@% (valeur par défaut) dans @@.
+
+Cursed Waterfall
+
+
+Custom
+
+
+Cyndala
+
+
+Cynric
+
+
+DEBUG: Changing @@ field @@ to something else.
+
+
+DEBUG: Changing @@, Values: (@@, @@, @@).
+
+
+Dagger
+Dague
+
+DarkBlueBeret
+
+
+DarkBlueBowlerHat
+
+
+DarkBlueBowlerHatBrown
+
+
+DarkBlueContributor
+
+
+DarkBlueCottonBoots
+
+
+DarkBlueCottonCloth
+
+
+DarkBlueCottonGloves
+
+
+DarkBlueCottonHeadband
+
+
+DarkBlueCottonShirt
+
+
+DarkBlueCottonShorts
+
+
+DarkBlueCottonSkirt
+
+
+DarkBlueCottonTrousers
+
+
+DarkBlueDesertHat
+
+
+DarkBlueDye
+
+
+DarkBlueFineDress
+
+
+DarkBlueMiniskirt
+
+
+DarkBlueRabbitEars
+
+
+DarkBlueShades
+
+
+DarkBlueShortTankTop
+
+
+DarkBlueSilkRobe
+
+
+DarkBlueSorcererBlack
+
+
+DarkBlueSorcererDBlue
+
+
+DarkBlueSorcererDGreen
+
+
+DarkBlueSorcererGreen
+
+
+DarkBlueSorcererLBlue
+
+
+DarkBlueSorcererOrange
+
+
+DarkBlueSorcererPink
+
+
+DarkBlueSorcererPurple
+
+
+DarkBlueSorcererRed
+
+
+DarkBlueSorcererWhite
+
+
+DarkBlueSorcererYellow
+
+
+DarkBlueTankTop
+
+
+DarkBlueTurtleneck
+
+
+DarkBlueVNeckSweater
+
+
+DarkBlueWizardHat
+
+
+DarkChristmasSweater
+
+
+DarkConcentrationPotion
+
+
+DarkCrystal
+
+
+DarkEasterEgg
+
+
+DarkEggshellHat
+
+
+DarkGreenBeret
+
+
+DarkGreenBowlerHat
+
+
+DarkGreenBowlerHatBrown
+
+
+DarkGreenContributor
+
+
+DarkGreenCottonBoots
+
+
+DarkGreenCottonCloth
+
+
+DarkGreenCottonGloves
+
+
+DarkGreenCottonHeadband
+
+
+DarkGreenCottonShirt
+
+
+DarkGreenCottonShorts
+
+
+DarkGreenCottonSkirt
+
+
+DarkGreenCottonTrousers
+
+
+DarkGreenDesertHat
+
+
+DarkGreenDye
+
+
+DarkGreenFineDress
+
+
+DarkGreenMiniskirt
+
+
+DarkGreenRabbitEars
+
+
+DarkGreenShades
+
+
+DarkGreenShortTankTop
+
+
+DarkGreenSilkRobe
+
+
+DarkGreenSorcererBlack
+
+
+DarkGreenSorcererDBlue
+
+
+DarkGreenSorcererDGreen
+
+
+DarkGreenSorcererGreen
+
+
+DarkGreenSorcererLBlue
+
+
+DarkGreenSorcererOrange
+
+
+DarkGreenSorcererPink
+
+
+DarkGreenSorcererPurple
+
+
+DarkGreenSorcererRed
+
+
+DarkGreenSorcererWhite
+
+
+DarkGreenSorcererYellow
+
+
+DarkGreenTankTop
+
+
+DarkGreenTurtleneck
+
+
+DarkGreenVNeckSweater
+
+
+DarkGreenWizardHat
+
+
+DarkHelm
+
+
+DarkPetal
+
+
+DarkRedRose
+
+
+DarkTalisman
+
+
+Darnel
+
+
+Darug
+
+
+David
+
+
+Debug#0
+
+
+Debug#1
+
+
+Debug#2
+
+
+Debug#3
+
+
+Debug#Angela
+
+
+Debug#BlueSage
+
+
+Debug#Duels
+
+
+DebugFlowerP
+
+
+DecorCandy
+
+
+DemonMask
+
+
+Demonic Mouboo
+
+
+Demonic Spirit
+
+
+Deposit.
+Dépôt.
+
+DesertBow
+
+
+DesertHat
+
+
+DesertHelmet
+
+
+DesertShirt
+
+
+DevelopersCap
+
+
+Diamond
+Diamant
+
+DiamondPowder
+
+
+DiamondRing
+
+
+Did I received any mail?
+
+
+Did you already talk to Tanisha?"
+
+
+Did you see how this spell is cast?
+
+
+DilutedConcentrationPot
+
+
+Dimond
+
+
+Dimonds Cove 1
+
+
+Dimonds Cove 2
+
+
+Directions
+
+
+Diryn the Traveler
+
+
+Discard
+Abandon
+
+DiseasedHeart
+
+
+Do I look like a tree? I feel like one.
+Est-ce que je ressemble à un arbre ? J'ai l'impression d'en être un.
+
+Do you feel too weak even to do damage to this areas wishy-washy wildlife?
+Te sens-tu trop faible même pour faire des dégâts à la faune de cet endroit insipide ?
+
+Do you have a name?
+
+
+Do you really want me to show you the spell again? You will have to bring new ingredients.
+
+
+Do you want to give me these items?
+
+
+Doctor
+
+
+Doll
+Poupée
+
+Don't distract me, I have to stay alert.
+Ne me distrais pas, je dois rester concentré.
+
+Donald
+
+
+Doom Golem
+
+
+Door
+Porte
+
+Doug
+
+
+Drabur
+
+
+Drag and drop an item from your inventory.
+Glisse et dépose un item de ton inventaire.
+
+Drake the Traveler
+
+
+Dread Pirate Marley
+
+
+Dread Pirate Marley Clone
+
+
+Dresser#tutorial
+
+
+Drinker#1
+
+
+Drinker#2
+
+
+Drop rate has been reset to @@% (default value).
+
+
+Drop rate is set to @@% for the next @@.
+
+
+DruidTreeBranch
+
+
+Drunken Lady Skeleton
+
+
+Drunken Skeleton
+
+
+ERROR: You must set a PinCode to make use of this function.
+
+
+Earmuffs
+
+
+Earth Spirit
+
+
+Easter Eggs
+
+
+Easter Fluffy
+
+
+EasterBasket
+
+
+EasterEgg
+
+
+Ectoplasm
+
+
+Edwin
+
+
+Eevert
+
+
+EggshellHat
+
+
+Ekinu
+
+
+Elanore carefully goes over your leaves, then smiles.
+
+
+Elanore counts the leaves you show her.
+
+
+Elanore shakes her head.
+
+
+Elanore smiles at you.
+
+
+Elanore smiles.
+
+
+Elanore the Healer
+
+
+Elanore#_M
+
+
+ElfNightcap
+
+
+Elias
+
+
+Elijah
+
+
+Eljas
+
+
+Emerald
+Emeraude
+
+EmeraldPowder
+
+
+EmeraldRing
+
+
+Emergency Exit
+
+
+EmptyBottle
+
+
+Enchanter
+
+
+EnchantersAmulet
+
+
+Engraving#Keshlam
+
+
+Engravings
+
+
+Enjoy your new style.
+Profite de ton nouveau style !
+
+Ensio
+
+
+Entertainer
+
+
+Eomie
+
+
+Equip the wand and lets try out that spell.
+
+
+EskimoHat
+
+
+Estard
+
+
+Estrilda
+
+
+Eurni
+
+
+Every 1 hour
+Toute les 1 heures
+
+Every 12 hours
+Toute les 12 heures
+
+Every 24 hours
+Toute les 24 heures
+
+Every 3 hours
+Toute les 3 heures
+
+Every 5 hours
+Toute les 5 heures
+
+Every 6 hours
+Toute les 6 heures
+
+Evil Mushroom
+
+
+Evil Obelisk
+
+
+Example: @translate Elmo
+
+
+Example: @translate Nard
+
+
+Example: @translate npc/002-1/arpan
+
+
+Excitedly, you turn the page – only to find that it is stuck to the next and can't be freed!
+
+
+Exit
+
+
+Exp rate has been reset to @@% (default value).
+Le taux d'exp a été réinitialisé à @@% (valeur par défaut).
+
+Exp rate is set to @@% for the next @@.
+Le taux d'exp est réglé à @@% pour les prochaines @@.
+
+Eyepatch
+Cache-Oeil
+
+Fabius
+
+
+FaceMask
+
+
+FairTradeSoil
+
+
+FairyHat
+
+
+FakeFangs
+
+
+Falchion
+
+
+Falkurn
+
+
+Fallen
+
+
+FancyHat
+
+
+Farewell.
+Adieu.
+
+Faris
+
+
+Faris the Traveler
+
+
+Farmer Hinnak
+
+
+Feel free to come visit me another time.
+Sens-toi libre de venir me rendre visite à tout moment.
+
+Ferry Master#candor
+
+
+Ferry Master#tulimshar
+
+
+Fey Element
+
+
+Fieri
+
+
+FineDress
+
+
+Fire Goblin
+
+
+Fire Skull
+
+
+Five for you and five for me.
+
+
+Flashmob
+
+
+FlawedLens
+
+
+FlightTalisman
+
+
+Fluffy
+Pluche
+
+FluffyHat
+
+
+Focus Skill +
+
+
+Focus Skill -
+
+
+Focus list:
+
+
+Forest Mana Seed#_M
+
+
+ForestArmor
+
+
+ForestBow
+
+
+Forwin
+
+
+FourLeafClover
+
+
+FreeRangeMoss
+
+
+From what I have been hearing, you seem to be doing well on your way to becoming a healer. I have decided to accept you as a student of the School of Life Magic.
+
+
+FrozenYetiTear
+
+
+Frozenbeard
+
+
+Fruit Store
+
+
+FunkyChristmasSweater
+
+
+FunkyHat
+
+
+FurBoots
+
+
+GMCap
+
+
+GMRobe
+
+
+GP: %s
+
+
+Gamboge Plant
+
+
+GambogeHerb
+
+
+Game Statistics
+
+
+Garcon#Duels
+
+
+General Krukan
+
+
+General Razha
+
+
+General Store#dimond
+
+
+General Store#hurnscald
+
+
+General Terogan
+
+
+General Terogan#Exit1
+
+
+General Terogan#Exit2
+
+
+General Terogan#Main
+
+
+George#pirate
+
+
+Ggrmm... Grmmmm...
+Ggrmm... Grmmmm...
+
+Ghada
+
+
+Giant Maggot
+
+
+GiantCaveMaggot
+
+
+GingerBreadMan
+
+
+Gispaan#Female
+
+
+Gispaan#Male
+
+
+Give me some space.
+Donne-moi de l'espace.
+
+Gladys
+
+
+Gm Event#1
+
+
+Gm Event#2
+
+
+Gm Event#3
+
+
+Go back
+Revenir en arrière
+
+Go back?
+
+
+Go fly a kite.
+Vas faire voler un cerf-volant.
+
+Go on. If you need to think a bit, take your time.
+
+
+GoblinMask
+
+
+Goggles
+
+
+Golbenez
+
+
+GoldTicket
+
+
+GoldenDeliciousApple
+
+
+GoldenFourLeafAmulet
+
+
+GoldenPVPCap
+
+
+GoldenPlatemail
+
+
+GoldenScorpionStinger
+
+
+GoldenWarlordPlate
+
+
+Goodbye!
+
+
+Goodbye.
+Au revoir.
+
+GraduationCap
+
+
+GrapeLollipop
+
+
+Grass Snake
+Couleuvre
+
+GrassFedTofu
+
+
+GrassLiner
+
+
+GrassSeed
+
+
+GrassSnakeEgg
+
+
+GrassSnakeTongue
+
+
+Grave#1
+
+
+Grave#10
+
+
+Grave#11
+
+
+Grave#12
+
+
+Grave#2
+
+
+Grave#3
+
+
+Grave#4
+
+
+Grave#5
+
+
+Grave#6
+
+
+Grave#7
+
+
+Grave#8
+
+
+Grave#9
+
+
+GrayHint
+
+
+Great! Now you can equip it.
+
+
+Great, lets begin your first lesson.
+
+
+GreatDragon
+
+
+Green Slime
+Slime Vert
+
+Green Slime Mother
+
+
+GreenApple
+
+
+GreenBeret
+
+
+GreenBowlerHat
+
+
+GreenBowlerHatBrown
+
+
+GreenContributor
+
+
+GreenCottonBoots
+
+
+GreenCottonCloth
+
+
+GreenCottonGloves
+
+
+GreenCottonHeadband
+
+
+GreenCottonShirt
+
+
+GreenCottonShorts
+
+
+GreenCottonSkirt
+
+
+GreenCottonTrousers
+
+
+GreenDesertHat
+
+
+GreenDye
+
+
+GreenEasterEgg
+
+
+GreenEggshellHat
+
+
+GreenFineDress
+
+
+GreenHint
+
+
+GreenHitchhikersTowel
+
+
+GreenMiniskirt
+
+
+GreenOrnament
+
+
+GreenPresentBox
+
+
+GreenPresentHat
+
+
+GreenRabbitEars
+
+
+GreenRedStripedWrap
+
+
+GreenShades
+
+
+GreenShortTankTop
+
+
+GreenSilkRobe
+
+
+GreenSorcererBlack
+
+
+GreenSorcererDBlue
+
+
+GreenSorcererDGreen
+
+
+GreenSorcererGreen
+
+
+GreenSorcererLBlue
+
+
+GreenSorcererOrange
+
+
+GreenSorcererPink
+
+
+GreenSorcererPurple
+
+
+GreenSorcererRed
+
+
+GreenSorcererWhite
+
+
+GreenSorcererYellow
+
+
+GreenTankTop
+
+
+GreenTicket
+
+
+GreenTurtleneck
+
+
+GreenVNeckSweater
+
+
+GreenWizardHat
+
+
+GreenWrap
+
+
+Grenadier
+
+
+GrimaceOfDementia
+
+
+Grimoire
+Grimoire
+
+Grinchboo
+
+
+GroovyHat
+
+
+GrubSlime
+
+
+Guard#castle
+
+
+Guard#east1
+
+
+Guard#east3
+
+
+Guard#govt_in
+
+
+Guard#govt_out
+
+
+Guard#port1
+
+
+Guard#port2
+
+
+Guard#school
+
+
+GuardianWings
+
+
+GumiCandy
+
+
+Gungnir
+
+
+Gunney
+
+
+GutBuster
+
+
+GuyFawkesMask
+
+
+Gwendolyn
+
+
+Gwendolyn Bowmaker
+
+
+Hail adventurer! You are well on your way to mastering the beasts of the island.
+
+
+Halas
+
+
+Halberd
+Hallebarde
+
+Hall Of Acorns
+
+
+Hall Of Base Level
+
+
+Hall Of Fortune
+
+
+Hall Of Guilds
+
+
+Hall Of Job Level
+
+
+Hall Of Lethality
+
+
+Hamond
+
+
+HardSpike
+
+
+Harper
+
+
+Hasan
+
+
+Have a good day!
+Bonne journée !
+
+Have fun with those spells and use them to cause hate, anger and death.
+
+
+Have you practiced enough?
+
+
+He is a kind old man. He stays mostly with his books and his apprentice, though we have chatted a few times.
+
+
+HeartGlasses
+
+
+HeartNecklace
+
+
+HeartOfIsis
+
+
+HeartOfLazurite
+
+
+Heathin
+
+
+HeathinDebug
+
+
+Hello! Can I help you?
+
+
+Hello! How are you? Did you already visit Hurnscald?
+
+
+Hello, Adventurer! Have you come back to help?
+
+
+Hello, I'm Alacrius.
+
+
+Hello.
+Bonjour.
+
+Henriikka
+
+
+Here is another useful one: '%s'. It will tell you the stats of the target monster, so you can know how dangerous it is.
+
+
+Here you go!
+
+
+Hetchel
+
+
+HetchelDebug
+
+
+Hey! Good to hear from you!
+
+
+Heya!
+Hey !
+
+Hi.
+Bonjour.
+
+Hide from monsters: %s
+
+
+HighPriestCrown
+
+
+Hinnak
+
+
+HitchhikersTowel
+
+
+Hm... Shhhh...
+Hm... Shhhh...
+
+Hmm. I wanted to teach you something, but I've forgotten what it was... please come back later.
+
+
+Hmm... how about this: you help me with a few of my experiments, and I tell you?
+
+
+Honey
+Miel
+
+House Maggot
+
+
+How about changing my body type?
+
+
+How can I help you?"
+
+
+How did you...
+
+
+How do I know you will not run off to Sagatha with what I would be teaching you?
+
+
+How much do you want to deposit?
+Combien veux-tu déposer?
+
+How much do you want to withdraw?
+De combien veux-tu t'en désister?
+
+How sad to hear how manners have degenerated in recent centuries. Farewell for now, dear mortal.
+
+
+Howdy?
+Comment vas-tu ?
+
+Hrmm, no looks like only %d out of 5 have been found.
+
+
+Hungry Fluffy
+
+
+Huntsman Spider
+
+
+Hurnscald North Dock
+
+
+Hurnscald North Koga
+
+
+Hurnscald South Dock
+
+
+Hurnscald South Koga
+
+
+Hydusun
+
+
+Hyvern
+
+
+HyvernStinger
+
+
+I always need components for my own healing spells. If you bring me ten gamboge leaves, ten alizarin leaves, ten mauve leaves and ten cobalt leaves, I can make ten lifestones; I will give you half of them.
+
+
+I am sorry, but I don't think that I know anything that would help you.
+
+
+I can trade you %d %ss for %d %s and %d GP.
+
+
+I can't stay here and talk all day. I have a job to do.
+Je ne peux pas rester ici à te parler toute la journée. J'ai un travail à faire.
+
+I changed my mind.
+J'ai changé d'avis.
+
+I do not know, though I suggest to seek out a local alchemist, if there is any.
+
+
+I have homework to do...
+
+
+I have taught thee all I can teach for now.
+
+
+I hope you like this color.
+J'espère que tu aimes cette couleur.
+
+I just want to live my life in peace.
+Je veux juste vivre ma vie en paix.
+
+I know not what brought thee hither, but I kindly ask that thou leavest me alone in my sorrow.
+
+
+I like you, so I'll tell you the bad word. But you can't tell anyone else about it! The bad word is %s.'
+
+
+I lost my towel...
+
+
+I need to finish studying for my test...
+
+
+I said %s.
+
+
+I see you killed all the %s needed.
+
+
+I think I would like to observe you for a little longer to see if you would make a good healer.
+
+
+I want to sleep...
+
+
+I want to teach you my favorite. However, you are not powerful enough to use it yet; You will first have to absorb more magic from the mana seed.
+
+
+I will make quick work of your wounds.
+
+
+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.
+
+
+I will only teach you magic of the school of Life, and that only if you prove yourself to be a good healer – that is, if you use your powers to help others.
+
+
+I would like to perform money transactions.
+J'aimerais effectuer des transactions monétaires.
+
+I would like to store some items.
+Je voudrais entreposer des objets.
+
+I'd like to get a different style.
+J'aimerais avoir un style différent.
+
+I'll be waiting here, come back and see after you've killed those mobs.
+
+
+I'm a little busy right now.
+Je suis un peu occupé pour le moment.
+
+I'm done.
+J'ai fini.
+
+I'm fine for now, thank you.
+Je vais bien pour l'instant, merci.
+
+I'm hoping to animate them into the shape of one of those odd log heads.
+
+
+I'm sorry, but I am not yet convinced that you are a good enough healer. Please continue in your endeavors.
+
+
+I'm sorry, but I can't help you with that.
+
+
+I'm supposed to combine two potions to create a %s, but I can't seem to figure out which two to combine...
+
+
+I'm trying to get work on my Alchemy homework, but I'm having some trouble.
+
+
+Ian
+
+
+Ian the Guide
+
+
+Ice Element
+
+
+Ice Goblin
+
+
+Ice Skull
+
+
+IceCube
+
+
+IceGladius
+
+
+IcedWater
+
+
+If the rumors are true and there really is a Mana Seed, then that would be wonderful news – perhaps we will have a few more healers soon!
+
+
+If you meant to reset the drop rate to its default value: @droprate default
+
+
+If you meant to reset the exp rate to its default value: @exprate default
+Si tu voulais réinitialiser le taux d'exp à sa valeur par default : @exprate default
+
+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: '%s'. Then press the root to the ground.
+
+
+If you're using another client, settings and controls may be different.
+
+
+Iivo
+
+
+IlliaCMobs051-3
+
+
+IlliaDMobs051-1
+
+
+IlliaFMobs051-1
+
+
+Imec
+
+
+Impossible to resync: You are dead.
+
+
+In that dresser there are some clothes you can wear.
+
+
+Inac
+
+
+Inar
+
+
+InfantryHelmet
+
+
+Inn
+Auberge
+
+Inspector#Hurnscald
+
+
+Internalize this feeling, and if your backpack was pressing on you you should no longer feel it now. We call it %s and it is a passive spell.
+
+
+Interval: (none, only sent on login)
+Intervalle : (aucun, seulement envoyé en se connectant)
+
+Interval: every @@ hour(s)
+Intervalle : toutes les @@ heure(s)
+
+Invalid map mask
+
+
+Invalid parameter specified, blame saulc.
+
+
+Inya
+
+
+Iormo
+
+
+IronArrow
+
+
+IronIngot
+
+
+IronOre
+
+
+IronPotion
+
+
+IronPowder
+
+
+Ishi
+
+
+Ishyah
+
+
+Ismo
+
+
+Issay
+
+
+It appears to be an ordinary sword.
+
+
+It is a sunny day, don't you think?
+C'est un jour ensoleillé, tu ne trouves pas ?
+
+It is already raining!
+
+
+It looks like you can't carry anything else for now.
+Il semblerait que tu ne puisses rien porter d'autre pour l'instant.
+
+It might be a good idea to drag the spell to the shortcut window, so you can target and attack using your keyboard instead of mouse.
+
+
+It seems you did not tell me the correct ingredients. Come back when you find the correct ones.
+
+
+It seems you found %d out of 5 of my friends.
+
+
+It seems you managed to amass quite a fortune!
+
+
+It was impossible to conjure rain clouds on this map.
+
+
+It worked!
+
+
+Items: %s
+
+
+Iten
+
+
+Itka
+
+
+J.P. Morbid
+
+
+Jack
+
+
+Jack O
+
+
+JackOLantern
+
+
+Jackal
+
+
+JadeEgg
+
+
+Jail Lock 1
+
+
+Jail Lock 2
+
+
+Jail Lock 3
+
+
+Jail Lock 4
+
+
+Janika
+
+
+JarofBlood
+
+
+JarofOwnBlood
+
+
+JazzyHat
+
+
+JeansChaps
+
+
+JeansShorts
+
+
+JellAhh
+
+
+JellyBeans
+
+
+JellySkull
+
+
+Jena the Traveler
+
+
+Jeric
+
+
+Jerry
+
+
+Jessie
+
+
+JesterMask
+
+
+Jhedia
+
+
+Joan
+
+
+Joelin
+
+
+Jonathan
+
+
+Josh
+
+
+Julia
+Julia
+
+KPS Manager
+
+
+Kaan
+
+
+Kaan grins mischieviously.
+
+
+Kadiya
+
+
+Kage Golem
+
+
+Kane
+
+
+Katze
+
+
+Keep in mind this spell only works on yourself or party/guild companions. It will reduce your attack speed so keep this in mind.
+
+
+Keep moving pal.
+
+
+Kekeke... excellent! Yes, here goes your first spell, and it is even a passive: the flying backpack! If you are overloaded, it will take the load off your shoulders.
+
+
+Kfahr
+
+
+Khoenan the Traveler
+
+
+KidBook
+
+
+Kilis
+
+
+Kimarr
+
+
+Knife
+Couteau
+
+KnightsHelmet
+
+
+KnitCap
+
+
+Knitra the Traveler
+
+
+Knowledgeable Tree
+
+
+Knox the Traveler
+
+
+Koyntety
+
+
+Kristian
+
+
+Kullervo
+
+
+Kylian
+Kylian
+
+KylianDebug#1
+
+
+KylianDebug#2
+
+
+Kytty
+
+
+LacedChocolateCake
+
+
+LacedOrangeCupcake
+
+
+LactoseFreeAcorn
+
+
+Lady Skeleton
+
+
+LadyFingers
+
+
+LargeHealingPotion
+
+
+LargeManaElixir
+
+
+Larvern
+
+
+Latif
+
+
+Latoy
+
+
+Lava Slime
+
+
+LazuriteCrystal
+
+
+LazuriteRobe
+
+
+LazuriteShard
+
+
+Leafing through the manuscript, you find that you can read little of the tiny handwriting and understand only a fraction of what is said.
+
+
+Leafing through the manuscript, you find that you understand too little of what is written to make any sense of it.
+
+
+LeatherBall
+
+
+LeatherGloves
+
+
+LeatherGoggles
+
+
+LeatherPatch
+
+
+LeatherShield
+
+
+LeatherShirt
+
+
+LeatherSuitcase
+
+
+LeatherTrousers
+
+
+Leave it alone.
+
+
+Lena
+
+
+Lenita
+
+
+Leofwin
+
+
+Lesser Ghost
+
+
+Let me give you a lifestone to get started with.
+
+
+Let's see whats on the list. Ah ok, I need you to kill me %d %s.
+
+
+Lets start with a basic wand attack: %s.
+
+
+Liana
+
+
+Lieutenant Dausen
+
+
+Lifestone
+
+
+LightBlueBeret
+
+
+LightBlueBowlerHat
+
+
+LightBlueBowlerHatBrown
+
+
+LightBlueContributor
+
+
+LightBlueCottonBoots
+
+
+LightBlueCottonCloth
+
+
+LightBlueCottonGloves
+
+
+LightBlueCottonHeadband
+
+
+LightBlueCottonShirt
+
+
+LightBlueCottonShorts
+
+
+LightBlueCottonSkirt
+
+
+LightBlueCottonTrousers
+
+
+LightBlueDesertHat
+
+
+LightBlueDye
+
+
+LightBlueFineDress
+
+
+LightBlueMiniskirt
+
+
+LightBlueRabbitEars
+
+
+LightBlueShades
+
+
+LightBlueShortTankTop
+
+
+LightBlueSilkRobe
+
+
+LightBlueSorcererBlack
+
+
+LightBlueSorcererDBlue
+
+
+LightBlueSorcererDGreen
+
+
+LightBlueSorcererGreen
+
+
+LightBlueSorcererLBlue
+
+
+LightBlueSorcererOrange
+
+
+LightBlueSorcererPink
+
+
+LightBlueSorcererPurple
+
+
+LightBlueSorcererRed
+
+
+LightBlueSorcererWhite
+
+
+LightBlueSorcererYellow
+
+
+LightBlueTankTop
+
+
+LightBlueTurtleneck
+
+
+LightBlueVNeckSweater
+
+
+LightBlueWizardHat
+
+
+LightCrystal
+
+
+LightPlatemail
+
+
+LimeHitchhikersTowel
+
+
+LockPicks
+
+
+Log Head
+Tête de bûche
+
+LollipopColor1
+
+
+LollipopColor2
+
+
+LollipopColor3
+
+
+LongSword
+
+
+Lora Tay
+
+
+Lora Tay Debug
+
+
+Lorrie
+
+
+Lost? Confused? Want to know why you can't get past a quest, overcome an NPC or find an item? Check %s for player hints, walkthroughs, item lists and more!
+
+
+LoveLetter
+
+
+LovePotion
+
+
+Lovely Maggot
+
+
+Lovers
+
+
+Luca
+
+
+Luvia
+
+
+Luvia?
+
+
+MTJarofOwnBlood
+
+
+MageRing
+
+
+MagentaHint
+
+
+MagentaOrnament
+
+
+Maggot
+Ver
+
+MaggotSlime
+
+
+Magic Sword
+
+
+Magic flows naturally from you, readily and with ease. You feel in perfect control of your magic.
+
+
+MagicGMTopHat
+
+
+Malek
+
+
+Malivox
+
+
+Mallard's Eye
+
+
+Mana Bug
+
+
+Mana Ghost
+
+
+Mana Slayer
+
+
+Mana Tyrant
+
+
+ManaGuardian
+
+
+ManaPotion
+
+
+Manually trigger the current broadcast
+Déclencher manuellement l'annonce actuelle
+
+Maria
+
+
+Marikel
+
+
+Marshmallow
+
+
+Mauve Plant
+
+
+MauveHerb
+
+
+Mede
+
+
+MediumHealingPotion
+
+
+MediumManaElixir
+
+
+Melinda
+
+
+Meluna
+
+
+Meridith the Traveler
+
+
+Merry Christmas!
+
+
+Merry Christmas, adventurer.
+
+
+Merry Christmas, arr yarr!!
+
+
+Message:
+Message :
+
+Michel
+
+
+Mika
+
+
+Mike
+
+
+Mikhail
+
+
+Miler
+
+
+Milis
+
+
+Milk
+
+
+Milly
+
+
+MillyDebugHelper
+
+
+Mine Debug#1
+
+
+Mine Debug#2
+
+
+Mine Debug#3
+
+
+Mine Debug#4
+
+
+Miner
+
+
+MinerGloves
+
+
+MinersHat
+
+
+Miniskirt
+
+
+Mirak
+
+
+Miriam
+
+
+Mirjami
+
+
+Miro
+
+
+Mirror#wiz
+
+
+Mjolnir
+
+
+Mo
+
+
+Mob points: %s
+
+
+Moggun
+
+
+Money transference will have a %d %% fee as well.
+
+
+MoneyChanger
+
+
+Monocle
+
+
+MonsterOilPotion
+
+
+MonsterSkullHelmet
+
+
+Monsters Killed in PvE: %s
+
+
+Moo!
+Moo !
+
+Moonshroom
+
+
+MoonshroomHat
+
+
+Moooo!
+Moooo!
+
+Moooooo!
+Moooooo!
+
+Moooooooooooo!
+Moooooooooooo!
+
+MopoxCurePotion
+
+
+Morgan#_M
+
+
+MorganDebug
+
+
+Motto#wiz
+
+
+Mouboo
+Mouboo
+
+MoubooFigurine
+
+
+MoubooHead
+
+
+MoubootaurHead
+
+
+Mountain Snake
+
+
+MountainSnakeEgg
+
+
+MountainSnakeTongue
+
+
+MovieCap
+
+
+Much better, right?!
+
+
+Munro
+
+
+MurdererCrown
+
+
+MushHat
+
+
+My breath smells bad.
+J'ai une haleine horrible.
+
+My name is Kaan, I'm Tanisha's brother."
+
+
+My spell only works on the very young, sorry.
+
+
+MylarinDust
+
+
+Mystic Sword
+
+
+Naah, you're too weak now! Come back later when you have grown!
+
+
+Naem
+
+
+Narrator
+Narrateur
+
+Nathan
+
+
+Nea
+
+
+Need a healing?
+
+
+Neko
+
+
+Never (only on login)
+Jamais (seulement en se connectant)
+
+Next broadcast: (never)
+Prochaine annonce : (jamais)
+
+Next broadcast: @@
+Prochaine annonce : @@
+
+Next ingredient.
+
+
+Next, I shall teach you a higher-level transmutation spell.
+
+
+Next, a nature spell. Take a cocoon shell. Hold it in your hand. Feel its lightness.
+
+
+Next, say '%s', and feel your skin grow rigid! Very useful against stings and stabs and pokes and pricks and that sort of stuff. Lowers attack speed and only works on yourself, party, or guild allies, though.
+
+
+Nice day to you.
+Bonne journée à toi.
+
+Nicholas
+
+
+Nickos
+
+
+Nigel
+
+
+Nikolai
+
+
+Nina the Traveler
+
+
+Nivalis Dock
+
+
+Nivalis Koga
+
+
+No
+Non
+
+No, I am sorry. Please bring me ten leaves each of gamboge, alizarin, mauve, and cobalt.
+
+
+No, thanks. I already know how things are going.
+
+
+No, you are not powerful enough yet. Please come back and ask me again when you have learned to control more powerful magic, though!
+
+
+No.
+Non.
+
+NohMask
+
+
+Nonsense! You look fine and dandy to me. All you need is a bit more exercise and fresh fruit in your diet!
+
+
+Not in the mood to chat.
+Je ne suis pas dans l'humeur de parler.
+
+Not resync'ing to prevent flood.
+
+
+Not yet.
+Pas maintenant.
+
+Notable mentions and thanks for our [@@https://www.patreon.com/themanaworld|sponsors@@] for their continued support.
+
+
+Note
+Note
+
+Note#bar
+
+
+Note#mirak
+
+
+Note#wiz
+
+
+Note: Transfering items on mail cost %s GP/item
+
+
+Nothing happens.
+
+
+Now get the clothes out of the dresser.
+
+
+Now hold still, this won't hurt a bit...
+
+
+Now leave. Spread chaos with the spells I have taught you!
+
+
+Now that you are a student of mine, I will teach you some spells.
+
+
+Now that you know the basics of nature magic, here is one of my favourites: '%s' will summon rain, whereever you are standing. It will consume a bottle of water, though.
+
+
+Now, listen carefully: to make a short tank top out of three pieces of cloth, you must use the invocation '%s'.
+
+
+Nurse
+
+
+Nutcracker
+
+
+NutcrackerHat
+
+
+Nyle
+
+
+Observe!
+
+
+Oh dear! That looks like poison; hang on...
+
+
+Oh look, it is Cupid!
+
+
+Oh, I can't be sure... but something like '%s', I think.
+
+
+Oh, I have only met Sagatha once or twice, while collecting herbs. She is a warm and gentle person, but she tries to hide it.
+
+
+Oh, and a fruit may even fall for you if you are lucky! But stay alert to pick up your drops.
+Oh, et un fruit peut même tomber si tu as de la chance ! Mais fais attention à ne pas oublier de ramasser les objets abandonnés.
+
+Oh, and by the way my name is Sorfina."
+
+
+Oh, but of course! You are powerful enough to make your own lifestones, using the enchantment '%s'. This will consume a bug leg, a maggot slime and one of each of the four healing herbs, though.
+
+
+Oh, sorry – I don't really know him very well.
+
+
+Oh, you found them all! Good job! Now it's my turn with searching again. Go and hide!
+
+
+Oh.
+
+
+Oh... it seems that you have no room for the lifestones. But please do come back later when you have made a little space.
+
+
+Oh... you managed to put things into every little nook and pocket, haven't you? Well, come back later, I will give it to you then.
+
+
+Ok, done.
+Ok, c'est bon.
+
+Okay let me try this.
+
+
+Olana
+
+
+Old Chest#crastur
+
+
+Old Man
+
+
+Old Wizard#_W
+
+
+Old Woman
+
+
+Omar
+
+
+Once this is done you have to throw it in the air and scream %s and the two roots will turn into toxic darts, a projectile you can throw.
+
+
+Only %s in storage will be counted.
+
+
+Ontas
+
+
+OpenPresentBox
+
+
+OperaMask
+
+
+Or, well, both.
+
+
+Orange
+
+
+OrangeBeret
+
+
+OrangeBowlerHat
+
+
+OrangeBowlerHatBrown
+
+
+OrangeCake
+
+
+OrangeContributor
+
+
+OrangeCottonBoots
+
+
+OrangeCottonCloth
+
+
+OrangeCottonGloves
+
+
+OrangeCottonHeadband
+
+
+OrangeCottonShirt
+
+
+OrangeCottonShorts
+
+
+OrangeCottonSkirt
+
+
+OrangeCottonTrousers
+
+
+OrangeCupcake
+
+
+OrangeDesertHat
+
+
+OrangeDye
+
+
+OrangeEggshellHat
+
+
+OrangeFineDress
+
+
+OrangeHint
+
+
+OrangeHitchhikersTowel
+
+
+OrangeLollipop
+
+
+OrangeMiniskirt
+
+
+OrangeRabbitEars
+
+
+OrangeRose
+
+
+OrangeRoseHat
+
+
+OrangeShades
+
+
+OrangeShortTankTop
+
+
+OrangeSilkRobe
+
+
+OrangeSorcererBlack
+
+
+OrangeSorcererDBlue
+
+
+OrangeSorcererDGreen
+
+
+OrangeSorcererGreen
+
+
+OrangeSorcererLBlue
+
+
+OrangeSorcererOrange
+
+
+OrangeSorcererPink
+
+
+OrangeSorcererPurple
+
+
+OrangeSorcererRed
+
+
+OrangeSorcererWhite
+
+
+OrangeSorcererYellow
+
+
+OrangeSummonFlower
+
+
+OrangeTankTop
+
+
+OrangeTulip
+
+
+OrangeTurtleneck
+
+
+OrangeVNeckSweater
+
+
+OrangeWizardHat
+
+
+OrchidBra
+
+
+Orum
+
+
+Orum#barrier
+
+
+Orum#trap
+
+
+Orum's Homunculus
+
+
+OrumDebug
+
+
+Oscar
+
+
+Oskari
+
+
+Osmo
+
+
+Oswal
+
+
+Other
+Autre
+
+Other.
+Autre.
+
+OverlordsHelmet
+
+
+PS. Doesn't always work. You need an account at %s and to be at ManaPlus Team.
+
+
+PVPCap
+
+
+PVPCoin
+
+
+Pachua
+
+
+Painless, wasn't it?
+
+
+PaladinsHelmet
+
+
+PanHat
+
+
+PaperBag
+
+
+Parcival
+
+
+Parua
+
+
+Pauline
+
+
+PaulineDebug
+
+
+Pear
+
+
+Pearl
+Perle
+
+Peetu
+
+
+Personal Information
+
+
+Peter
+Peter
+
+Phaet
+
+
+Phaet#arena
+
+
+Phil
+
+
+Phylactery
+
+
+PickledBeets
+
+
+PileOfAsh
+
+
+PilotHat
+
+
+Pink Flower
+
+
+PinkAntenna
+
+
+PinkBeret
+
+
+PinkBowlerHat
+
+
+PinkBowlerHatBrown
+
+
+PinkChristmasSweater
+
+
+PinkContributor
+
+
+PinkCottonBoots
+
+
+PinkCottonCloth
+
+
+PinkCottonGloves
+
+
+PinkCottonHeadband
+
+
+PinkCottonShirt
+
+
+PinkCottonShorts
+
+
+PinkCottonSkirt
+
+
+PinkCottonTrousers
+
+
+PinkDesertHat
+
+
+PinkDye
+
+
+PinkEasterEgg
+
+
+PinkFineDress
+
+
+PinkHitchhikersTowel
+
+
+PinkMiniskirt
+
+
+PinkPetal
+
+
+PinkRabbitEars
+
+
+PinkRose
+
+
+PinkRoseHat
+
+
+PinkShades
+
+
+PinkShortTankTop
+
+
+PinkSilkRobe
+
+
+PinkSorcererBlack
+
+
+PinkSorcererDBlue
+
+
+PinkSorcererDGreen
+
+
+PinkSorcererGreen
+
+
+PinkSorcererLBlue
+
+
+PinkSorcererOrange
+
+
+PinkSorcererPink
+
+
+PinkSorcererPurple
+
+
+PinkSorcererRed
+
+
+PinkSorcererWhite
+
+
+PinkSorcererYellow
+
+
+PinkTankTop
+
+
+PinkTicket
+
+
+PinkTulip
+
+
+PinkTurtleneck
+
+
+PinkVNeckSweater
+
+
+PinkWizardHat
+
+
+Pinkie
+Pinkie
+
+Pinkie Scroll
+
+
+PinkieHat
+
+
+PinkieHelmet
+
+
+Pipe
+
+
+PirateHat
+
+
+PlatynaRedDress
+
+
+Players Killed in PvP: %s
+
+
+Players breaking the following rules may be banned for any length of time (even permanently) or have their characters reset at a GM's discretion:
+
+
+Please enter the message:
+Entre s'il-te-plaît le message :
+
+Please equip your ammo first!
+
+
+Please insert your pincode.
+
+
+Please leave me in peace.
+
+
+Please select a quest:
+Sélectionne une quête :
+
+Please select the desired body type:
+
+
+Please select the interval:
+Sélectionne un intervalle :
+
+Please stand still.
+
+
+Plum
+
+
+PlushMouboo
+
+
+PointyWitchHat
+
+
+Poison Skull
+
+
+Pollett
+
+
+PollettEgg
+
+
+Poltergeist
+
+
+PoltergeistPowder
+
+
+Pot
+
+
+Potions#_M
+
+
+Practice! There are no secrets to becoming a warrior.
+L'entraînement ! Il n'y a aucun secret pour devenir un guerrier.
+
+Present#1
+
+
+Present#2
+
+
+Present#3
+
+
+Psi Brain
+
+
+Pumpkin
+Citrouille
+
+PumpkinHelmet
+
+
+PumpkinSeeds
+
+
+PurificationPotion
+
+
+PurpleBeret
+
+
+PurpleBowlerHat
+
+
+PurpleBowlerHatBrown
+
+
+PurpleContributor
+
+
+PurpleCottonBoots
+
+
+PurpleCottonCloth
+
+
+PurpleCottonGloves
+
+
+PurpleCottonHeadband
+
+
+PurpleCottonShirt
+
+
+PurpleCottonShorts
+
+
+PurpleCottonSkirt
+
+
+PurpleCottonTrousers
+
+
+PurpleDesertHat
+
+
+PurpleDye
+
+
+PurpleFineDress
+
+
+PurpleHint
+
+
+PurpleHitchhikersTowel
+
+
+PurpleMiniskirt
+
+
+PurplePresentBox
+
+
+PurpleRabbitEars
+
+
+PurpleShades
+
+
+PurpleShortTankTop
+
+
+PurpleSilkRobe
+
+
+PurpleSorcererBlack
+
+
+PurpleSorcererDBlue
+
+
+PurpleSorcererDGreen
+
+
+PurpleSorcererGreen
+
+
+PurpleSorcererLBlue
+
+
+PurpleSorcererOrange
+
+
+PurpleSorcererPink
+
+
+PurpleSorcererPurple
+
+
+PurpleSorcererRed
+
+
+PurpleSorcererWhite
+
+
+PurpleSorcererYellow
+
+
+PurpleStripedWrap
+
+
+PurpleSummonFlower
+
+
+PurpleTankTop
+
+
+PurpleTicket
+
+
+PurpleTulip
+
+
+PurpleTurtleneck
+
+
+PurpleVNeckSweater
+
+
+PurpleWizardHat
+
+
+PurpleWrap
+
+
+Pyry
+
+
+Quest @@ modified by GM
+
+
+Quest debug
+Débogage de quête
+
+QuillOfBinding
+
+
+Quit
+Quitter
+
+RIP#1
+
+
+RIP#10
+
+
+RIP#2
+
+
+RIP#3
+
+
+RIP#4
+
+
+RIP#5
+
+
+RIP#6
+
+
+RIP#7
+
+
+RIP#8
+
+
+RIP#9
+
+
+RabbitEars
+
+
+RaggedShorts
+
+
+Raging
+
+
+RangerHat
+
+
+Rasin
+
+
+Rauk
+
+
+RawAir
+
+
+RawLog
+
+
+RawTalisman
+
+
+ReadingGlasses
+
+
+RealisticBrain
+
+
+Reaper
+
+
+Reathe
+
+
+Rebecca
+
+
+Receptionist#inn
+
+
+Receptionist#mine
+
+
+Red Bone
+
+
+Red Scorpion
+
+
+Red Slime
+
+
+Red Spark
+
+
+RedApple
+
+
+RedBeret
+
+
+RedBowlerHat
+
+
+RedBowlerHatBrown
+
+
+RedChristmasStocking
+
+
+RedContributor
+
+
+RedCottonBoots
+
+
+RedCottonCloth
+
+
+RedCottonGloves
+
+
+RedCottonHeadband
+
+
+RedCottonShirt
+
+
+RedCottonShorts
+
+
+RedCottonSkirt
+
+
+RedCottonTrousers
+
+
+RedDesertHat
+
+
+RedDottedWrap
+
+
+RedDye
+
+
+RedEasterEgg
+
+
+RedEggshellHat
+
+
+RedFineDress
+
+
+RedGoldenStripedWrap
+
+
+RedHint
+
+
+RedHitchhikersTowel
+
+
+RedMiniskirt
+
+
+RedNose
+
+
+RedOrnament
+
+
+RedPowder
+
+
+RedPresentHat
+
+
+RedRabbitEars
+
+
+RedRose
+
+
+RedRoseHat
+
+
+RedSaddleRug
+
+
+RedScorpionStinger
+
+
+RedShades
+
+
+RedShortTankTop
+
+
+RedSilkRobe
+
+
+RedSorcererBlack
+
+
+RedSorcererDBlue
+
+
+RedSorcererDGreen
+
+
+RedSorcererGreen
+
+
+RedSorcererLBlue
+
+
+RedSorcererOrange
+
+
+RedSorcererPink
+
+
+RedSorcererPurple
+
+
+RedSorcererRed
+
+
+RedSorcererWhite
+
+
+RedSorcererYellow
+
+
+RedStockings
+
+
+RedSummonFlower
+
+
+RedTankTop
+
+
+RedTicket
+
+
+RedTulip
+
+
+RedTurtleneck
+
+
+RedVNeckSweater
+
+
+RedWizardHat
+
+
+ReedBundle
+
+
+Reid's Ghost
+
+
+Reinboo
+
+
+Reino
+
+
+Remember, they're hiding somewhere on the island, you will have to explore to find them. They could be hiding anywhere.
+
+
+Remove all focus skills
+
+
+Repeat how many times?
+Répéter combien de fois ?
+
+Repeat: @@ times
+Répéter : @@ fois
+
+Resist Ailment
+
+
+Return to Super Menu
+Revenir au Super Menu
+
+Return to my sister now. I expect that she shall teach thee one more spell.
+
+
+Rhutan the Traveler
+
+
+Richard
+
+
+Rikhard
+
+
+Riskim
+
+
+RoastedAcorn
+
+
+RoastedMaggot
+
+
+Robert
+
+
+RockKnife
+
+
+Root
+
+
+Rosen
+
+
+Rossy
+
+
+RottenRags
+
+
+Rouge#Duels
+
+
+Roulette
+
+
+Rrrr... Pchhhh...
+Rrrr... Pchhhh...
+
+RubberBat
+
+
+Ruby
+Rubis
+
+RubyPowder
+
+
+RubyRing
+
+
+Rudolph Slime
+
+
+RunestoneA
+
+
+RunestoneL
+
+
+RunestoneN
+
+
+RunestoneT
+
+
+RunestoneW
+
+
+Ryan
+
+
+Rynoh
+
+
+SUSAN
+
+
+Sabine
+
+
+Sabre
+
+
+Sagatha#_M
+
+
+SailorHat
+
+
+Samuel
+
+
+SandCutter
+
+
+Sandra
+
+
+Santa Slime
+
+
+Santa's Helper
+
+
+SantaBeardHat
+
+
+SantaCookie
+
+
+SantaHat
+
+
+SantaSnowGlobe
+
+
+Santaboo
+
+
+Santeri
+
+
+Sapphire
+Saphir
+
+SapphirePowder
+
+
+SapphireRing
+
+
+Sara
+
+
+Sarah
+
+
+Sasquatch
+
+
+Savaric
+
+
+SaviorArmor
+
+
+Say %s to make your roots into toxic darts.
+
+
+Saying#wiz
+
+
+ScarabArmlet
+
+
+Scared Man
+
+
+ScentedCandleHelmet
+
+
+Scheduled broadcasts
+Annonces prévues
+
+Scheduled broadcasts - Create new
+Annonces prévues - Créer une nouvelle
+
+Scimitar
+
+
+Scissors
+Ciseaux
+
+Scorpion
+Scorpion
+
+Scorpion King
+
+
+ScorpionStinger
+
+
+Scythe
+Faux
+
+Sea Slime
+
+
+Sea Slime Mother
+
+
+SealedSoul
+
+
+See you later!
+À plus tard !
+
+See you soon!
+À bientôt !
+
+See you!
+À plus !
+
+Selim
+
+
+Sema
+
+
+Send 10 times
+Envoyer 10 fois
+
+Send 2 times
+Envoyer 2 fois
+
+Send 20 times
+Envoyer 20 fois
+
+Send 3 times
+Envoyer 3 fois
+
+Send 5 times
+Envoyer 5 fois
+
+Send indefinitely
+Envoyer indéfiniment
+
+Send only once
+Envoyer une seule fois
+
+Send this message also on login?
+Envoyer ce message aussi après la connexion ?
+
+Sent on login: @@
+Envoyé lors de la connexion : @@
+
+Sent on login: yes
+Envoyé lors de la connexion : oui
+
+Sent: @@ times out of @@
+Envoyé : @@ fois sur @@
+
+SerfHat
+
+
+Serqet
+
+
+Set a new broadcast
+Établir une nouvelle annonce
+
+Setzer
+Setzer
+
+Shannon
+
+
+SharpKnife
+
+
+She hesistates.
+
+
+She looks at you suspiciously.
+
+
+She performs a complicated gesture.
+
+
+She picks up all forty and presses them together in her hands, then whispers something.
+
+
+She smiles at you.
+
+
+She smiles.
+
+
+She takes away her hands and looks up.
+
+
+She walks up to you, holds your shoulders, and smiles at you.
+
+
+She was babbling at me about it all the morning until I sent her to take care of the maggots in the cafe.
+
+
+Sherman the Traveler
+
+
+ShockSweet
+
+
+ShortBow
+
+
+ShortSword
+
+
+ShortTankTop
+
+
+ShroomHat
+
+
+Sign
+
+
+SilkCocoon
+
+
+SilkGloves
+
+
+SilkHeadband
+
+
+SilkPants
+
+
+SilkRobe
+
+
+SilkSheet
+
+
+Silkworm
+Ver à soie
+
+SilverFourLeafAmulet
+
+
+SilverMirror
+
+
+Silvia
+
+
+SimpleRing
+
+
+Skeleton
+Squelette
+
+SkeletonCharm
+
+
+Skill can only be cast on party or guild members!
+
+
+Skull
+Crâne
+
+SkullMask
+
+
+Sleeping Bandit
+
+
+Slime Blast
+
+
+SlingBullet
+
+
+SlingShot
+
+
+Slots#1
+
+
+Slots#2
+
+
+Slots#3
+
+
+Slots#4
+
+
+Slots#5
+
+
+Slots#6
+
+
+Slots#7
+
+
+SlowPoisonPotion
+
+
+SmallCrack#XmasPassage
+
+
+SmallHealingPotion
+
+
+SmallManaElixir
+
+
+SmallMushroom
+
+
+SmileyCap
+
+
+Snail
+
+
+Snake
+
+
+SnakeEgg
+
+
+SnakeSkin
+
+
+SnakeTongue
+
+
+Snapple
+
+
+Sneaky Bandit
+
+
+SnowGoggles
+
+
+SnowLauncher
+
+
+Snowball
+
+
+Snowman
+
+
+SnowmanSnowGlobe
+
+
+So be it, fellow warrior. Hear the incantation for the blade spell: '%s'
+
+
+So you think you're tough? A warrior must also be loyal and patient.
+Alors tu penses être un dur ? Un guerrier doit aussi être loyal et patient.
+
+So, have you managed to transmute something?
+
+
+Some forest creatures sometimes overgrow their fur or hide. That makes them uncomfortable.
+
+
+Some of it might jog your memory or at least help you catch your bearings.
+
+
+Something else?
+Quelque chose d'autre ?
+
+Sometimes you just need to run from battle.
+
+
+SorcererBlack
+
+
+SorcererDBlue
+
+
+SorcererDGreen
+
+
+SorcererGreen
+
+
+SorcererLBlue
+
+
+SorcererOrange
+
+
+SorcererPink
+
+
+SorcererPurple
+
+
+SorcererRed
+
+
+SorcererWhite
+
+
+SorcererYellow
+
+
+Sorfina
+
+
+Sorry %%i I am really really REALLY busy right now. Maybe later, when I find my toolset, we can start focusing on something.
+
+
+Soul
+
+
+Soul Eater
+
+
+Soul Menhir
+
+
+Soul Menhir#candor
+
+
+Soul Menhir#deadmire
+
+
+Soul Menhir#hurnscald
+
+
+Soul Menhir#nivalis
+
+
+Soul Menhir#tulimshar
+
+
+Soul Snake
+
+
+Speak '%s' 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.
+
+
+Speak to me again once you've cast the spell.
+
+
+Spear
+Lance
+
+Special monsters are not counted.
+
+
+Spectre
+
+
+SpectrePowder
+
+
+Speed
+
+
+Spell#wiz1
+
+
+Spell#wiz2
+
+
+Spell#wiz3
+
+
+Spell#wiz4
+
+
+Spell#wiz5
+
+
+Spell#wiz6
+
+
+Spell#wiz7
+
+
+Spider
+Araignée
+
+Spiky Mushroom
+Champignon épineux
+
+Spiky mushrooms often grow too many spikes, so you can shear the spikes off of some.
+
+
+Squirrel
+
+
+SquirrelPelt
+
+
+StaffOfFire
+
+
+StaffOfIce
+
+
+StaffOfLife
+
+
+Stalker
+Rôdeur
+
+StandardHeadband
+
+
+Start broadcasting
+Commencer l'annonce
+
+Start broadcasting, and make an extra broadcast right now
+Commencer l'annonce, et faire une annonce supplémentaire là maintenant
+
+Start over
+Recommencer
+
+Stats: %s
+
+
+Status Condition Cleared
+
+
+Steak
+
+
+SteelShield
+
+
+Stewen
+
+
+StickReinboo
+
+
+Sticking out of the rock is a sword hilt.
+
+
+Stop broadcasting
+Arrêter l'annonce
+
+Stop it!
+Arrête ça !
+
+Store Policy#1
+
+
+Store Policy#2
+
+
+Strange Stone
+
+
+StrangeCoin
+
+
+Stranger
+
+
+Styx the Traveler
+
+
+Suddenly, you hear a strange, metallic voice in your head, the voice of a woman.
+
+
+SulphurPowder
+
+
+Sunglasses
+Lunettes de Soleil
+
+Supply Chest
+
+
+Surprise me!
+Surprends-moi !
+
+Swashbuckler
+
+
+Swezanne
+
+
+Sword
+
+
+Syntax: @wset <map_mask>
+
+
+TMWBirthdayGift
+
+
+TUTORIAL
+
+
+Taito
+
+
+Take %s arrows, sprinkle sulphur powder over them, and then speak '%s'. Throw them high up in the air, and watch the hail unfold before thy feet.
+
+
+Take a cocoon, living or dead, and suffuse it in magic. Fell the %s, feel its lightness and feel it float! You no longer should be feeling overburned by your stolen goods, kekeke...
+
+
+Take care!
+Prends soin de toi !
+
+Talk to you later!
+On se reparle plus tard !
+
+Talk to you soon!
+On se reparle bientôt !
+
+Talpan
+
+
+Talponian#Female
+
+
+Talponian#Male
+
+
+TamOShanter
+
+
+Tame Scorpion
+
+
+Tanisha
+
+
+TankTop
+
+
+Tathin
+
+
+Taylor
+
+
+TealEasterEgg
+
+
+TealHint
+
+
+TealHitchhikersTowel
+
+
+Tengu
+
+
+Terranite
+
+
+Terranite Armor#Female
+
+
+Terranite Armor#Male
+
+
+TerraniteArrow
+
+
+TerraniteChestArmor
+
+
+TerraniteHead
+
+
+TerraniteHelmet
+
+
+TerraniteLegs
+
+
+TerraniteOre
+
+
+Teuvo
+
+
+Thank you for using our services. Please accept this little gift.
+
+
+Thanks once again for helping with the monsters in the island.
+
+
+Thanks, @@. We just wanted to be sure it was you.
+
+
+That invocation is '%s'.
+
+
+That would be great!
+Ce serait super !
+
+Thats not what I said to do. Please don't skip ahead.
+
+
+The Beheader
+
+
+The Egg cracks open and a living snake comes out of the egg.
+
+
+The Lost
+
+
+The Mana World - Legacy
+
+
+The Witch takes %s and %s and put them togheter calling %s.
+
+
+The Wizard's thank thee as well.
+
+
+The deep basso voice continues.
+
+
+The doctor examines you briefly.
+
+
+The doctor pulls out a syringe and fills it with a white liquid from a jar on his desk.
+
+
+The dresser is empty.
+
+
+The explanations in this tutorial are based on the Manaplus client.
+
+
+The invocation is `%s' followed by the last syllable of the name of the creature you want to shape the log into.
+
+
+The last word on that page is '%s' and it's underlined twice with a comment next to it saying 'finally got it right.'
+
+
+The message cannot be empty
+Ce message ne peut pas être vide
+
+The next spell I have will make a normal tank top out of four pieces of cloth. The invocation is '%s', make sure to write this down.
+
+
+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.'
+
+
+The spell consumes a Small Mushroom and a Dark Crystal. Shove the Dark Crystal into the Small Mushroom and yell %s.
+
+
+The spell fails!
+
+
+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.
+
+
+The spell takes a mind of its own backfires!
+
+
+The voice sounds slightly amused.
+
+
+The witch glares at you in anger.
+
+
+The witch's eyes flare up in anger as she notices you, and she turns away from you.
+
+
+The wizard looks at you with despise.
+
+
+The wizard looks at you, his eyes flashing, and laughs diabolically.
+
+
+The wizard takes the crystal and the egg, mumbling something you don't understand. Suddenly, he throws the egg into the air and throws the crystal right through it midair.
+
+
+Then I fear that I shall not reveal the spell to you either.
+
+
+Then I wish thee well in thy travels, wanderer!
+
+
+Then chant the lesser healing spell, '%s', with whoever you wish to heal targeted.
+
+
+Then come back later.
+
+
+Then concentrate your anger upon the trees hereabouts, you will gain experience whilst leveling your sword skill on them.
+Et bien concentre ta colère sur les arbres par ici, tu obtiendras de l'expérience en même temps qu'améliorer tes compétences d'épée dessus.
+
+Then please stop wasting my precious time.
+
+
+Then say %s and let the mushroom's power take over. It only works on yourself, party or guild allies.
+
+
+Then tell me the ingredients for the mouboo summoning spell and give them to me. Start with the first ingredient and then tell me the second one separately.
+
+
+Then, she rises up on her tiptoes and kisses you on your forehead.
+
+
+There are %d out of 5 found.
+
+
+There is no answer.
+
+
+There is no honor in fighting a weak opponent.
+Il n'y a aucun honneur à combattre un adversaire faible.
+
+There you are, right as rain! Now you take care, all right?
+
+
+These will do just fine.
+
+
+They call me Sagatha.
+
+
+Thinking well, you will not be able to use it yet; you will first have to gain a greater understanding of magic overall.
+
+
+This error is fatal, we stop execution.
+
+
+This is a wand, there are many like it but this one is now yours.
+
+
+This is not a monster; I cannot use monsterinfo on it.
+
+
+This menu allows you to set the scheduled broadcast that is sent to all players at a specific interval.
+Ce menu te permet d'établir l'annonce prévue qui est envoyée aux joueurs à intervalles réguliers.
+
+This menu gives access to quest debug menus for @@ quests.
+Ce menu donne accès aux menus de débogage de quête pour les quêtes @@.
+
+This powder thou shalst need to cast the lightning spell. Throw it up into the air and shout '%s', and smite thine enemies with lightning.
+
+
+This skill can only be used on monsters!
+
+
+This spell makes arrows out of a single wooden log. Its invocation is '%s'.
+
+
+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 and may even injure yourself further.
+
+
+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!
+
+
+Thou hast collected %s Monster Points. For one thousand of them, I shall admit thee to the school of war magic.
+
+
+Thug
+
+
+Thurstan
+
+
+Thurston
+
+
+Tinris
+
+
+TinyHealingPotion
+
+
+TinyManaElixir
+
+
+Tipsy Skeleton
+
+
+To cast a spell open the skill window, select the spell you wish to use, and press the %s button.
+
+
+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.
+
+
+To heal yourself, it's enough to just cast by itself, without a target selected.
+
+
+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.
+
+
+To make a shirt, use the invocation '%s'. This will require five pieces of cloth.
+
+
+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.
+
+
+To summon the snakes use %s.
+
+
+To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.
+
+
+Toggle Focus - Astral Soul
+
+
+Toggle Focus - Brawling
+
+
+Toggle Focus - Mallards Eye
+
+
+Toggle Focus - Raging
+
+
+Toggle Focus - Resist Ailment
+
+
+Toggle Focus - Speed
+
+
+Toichi
+
+
+Tondar
+
+
+Tongue
+Langue
+
+TonoriDelight
+
+
+Toothbrush
+
+
+TopHat
+
+
+Topaz
+Topaze
+
+TopazPowder
+
+
+TopazRing
+
+
+Torch#1
+
+
+Torch#2
+
+
+Torch#3
+
+
+Tormenta
+
+
+Total Gold: %s
+
+
+Total deaths: %s
+
+
+Touch it.
+
+
+Towel
+
+
+ToySabre
+
+
+Trader
+
+
+TreasureKey
+
+
+Troll
+Troll
+
+Troupe Leader
+
+
+Trying to control your magic is still rather troublesome.
+
+
+Tulimshar Dock
+
+
+Tulimshar Koga
+
+
+TurquoiseBra
+
+
+Turtleneck
+
+
+TutDebug
+
+
+Umfrey
+
+
+Umm... no... I... I don't remember anything else...
+
+
+Undead Troll
+
+
+Undead Witch
+
+
+UndeadDebug3
+
+
+UndeadDebug4
+
+
+UndeadDebug5
+
+
+UndeadEar
+
+
+UndeadEye
+
+
+UnderworldKey
+
+
+UnderworldMask
+
+
+Unfortunately, that seems to require more magical power than you can use right now. If only the Mana Seed granted you more power...
+
+
+Unfortunately, you can't make out what the transmutation is for or even whether it requires any materials...
+
+
+Unlike lesser heal, it'll heal instantly, however it still cannot help if the person has a serious injury or has been inflicted with an ailment.
+
+
+Urmas
+
+
+Urn
+
+
+Usage of @exprate without argument is deprecated, please use "@rates" instead.
+
+
+Usage: @translate <npc file>
+
+
+Use
+
+
+Use @@ to cancel.
+
+
+VNeckSweater
+
+
+Valdo
+
+
+Valia
+
+
+Valjas
+
+
+Valon
+
+
+ValonDebug
+
+
+Vampire Bat
+
+
+VampireBatWing
+
+
+Various wands and staffs are found throughout the land with many different strengths and weaknesses.
+
+
+VeganWater
+
+
+Vellamo
+
+
+Veneri
+
+
+Verneri
+
+
+Very well then, see you.
+
+
+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.
+
+
+Vicious Squirrel
+
+
+Vincent
+
+
+Vincent Debug
+
+
+Virus
+
+
+Void Archant
+
+
+Void Bat
+
+
+Void Flower
+
+
+Void Maggot
+
+
+Void Mouboo
+
+
+Void Scorpion
+
+
+Void Shroom
+
+
+Void Slime
+
+
+Void Snake
+
+
+Void Soldier
+
+
+Voltain
+
+
+WARNING: If you insert wrong pincode, you'll be disconnected.
+
+
+Waitress
+
+
+Wand
+
+
+Waric
+
+
+Waric nods at you.
+
+
+Waric#trap
+
+
+WarlordBoots
+
+
+WarlordHelmet
+
+
+WarlordPlate
+
+
+Warning#mirak
+
+
+Warning, %d remaining: %s
+
+
+WarpedLog
+
+
+Water Pump
+
+
+We refuse service to anyone who:
+
+
+We will start with an easy one. I will teach you how to summon a wicked mushroom.
+
+
+We've been taking care of you ever since. Waiting for you to wake up."
+
+
+Wedding Officiator
+
+
+WeddingRing
+
+
+Weellos
+
+
+Welcome back, apprentice.
+
+
+Welcome to my prison, mortal!
+
+
+Well
+
+
+Well %s what else can you tell me about yourself?.
+
+
+Well I can tell you some useful things, if you want to hear.
+
+
+Well, I could. However, I am not sure you are trustworthy.
+
+
+Well, either you are going mad, or that sword in the stone is talking to you.
+
+
+Well, well, well! Look at all those green bubbles coming out of your head; that looks like poisoning to me! Did you eat something rotten?
+
+
+What do you want to do with your money?
+Que veux-tu faire avec ton argent ?
+
+What else do you need?
+Qu'as-tu besoin de plus ?
+
+What is it is that brings thee to this place?
+
+
+What is my current hairstyle and hair color?
+Quelle est ma coupe et ma couleur de cheveux actuelle ?
+
+What would you like me to do?
+Que voudrais-tu que je fasse ?
+
+What're you looking at?!
+Que regardes-tu ?!
+
+What's your race?
+
+
+Whatever the reason, she doesn't seem to like you.
+
+
+Which language do you speak?
+
+
+White Bell
+
+
+White Slime
+
+
+WhiteBellTuber
+
+
+WhiteBlanket
+
+
+WhiteCake
+
+
+WhiteCowboyHat
+
+
+WhiteEvokersRobeBlue
+
+
+WhiteFur
+
+
+WhiteHitchhikersTowel
+
+
+WhitePresentBox
+
+
+WhiteRose
+
+
+WhiteRoseHat
+
+
+WhiteSaddleRug
+
+
+WhiteSummonFlower
+
+
+WhiteTulip
+
+
+WhiteWizardRobe
+
+
+WhiteWrap
+
+
+Why are you wasting my time? Come back when you got everything I need.
+
+
+Wicked Mushroom
+Champignon Méchant
+
+Wight
+
+
+WinterGloves
+
+
+Wisp
+
+
+WispPowder
+
+
+Witch Guard
+
+
+WitchDoctorsMask
+
+
+WitchHat
+
+
+Withdraw.
+Retirer.
+
+WizardHat
+
+
+Wolfgang
+
+
+Wolvern
+
+
+WolvernPelt
+
+
+WolvernTooth
+
+
+WoodenShield
+
+
+WoodenStaff
+
+
+WraithHorn
+
+
+WumpusEgg
+
+
+Wyara is the Hurnscald town witch. She was also the town healer before the Doctor moved there.
+
+
+Wyara the Witch
+
+
+Wyara#_M
+
+
+Xakelbael
+
+
+XmasCake
+
+
+XmasCandyCane
+
+
+XmasDebug#1
+
+
+XmasDebug#2
+
+
+XmasDebug#3
+
+
+XmasDebug#4
+
+
+XmasSpawnCounter#0
+
+
+XmasSpawnCounter#1
+
+
+XmasSpawnCounter#2
+
+
+XmasSpawnManager
+
+
+YOU CAN FEEL THE POWER FLOWING TROUGH YOU.
+
+
+YOU WERE BLESSED BY JESUSALVA
+
+
+Yalina
+
+
+Yanis
+
+
+Yarr arr!
+
+
+Yeah, and she's done with the maggots.
+
+
+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.
+
+
+Yellow Slime
+
+
+YellowBeret
+
+
+YellowBowlerHat
+
+
+YellowBowlerHatBrown
+
+
+YellowContributor
+
+
+YellowCottonBoots
+
+
+YellowCottonCloth
+
+
+YellowCottonGloves
+
+
+YellowCottonHeadband
+
+
+YellowCottonShirt
+
+
+YellowCottonShorts
+
+
+YellowCottonSkirt
+
+
+YellowCottonTrousers
+
+
+YellowDesertHat
+
+
+YellowDottedWrap
+
+
+YellowDye
+
+
+YellowEasterEgg
+
+
+YellowEggshellHat
+
+
+YellowFineDress
+
+
+YellowHint
+
+
+YellowHitchhikersTowel
+
+
+YellowMiniskirt
+
+
+YellowOrnament
+
+
+YellowPowder
+
+
+YellowPresentBox
+
+
+YellowPresentHat
+
+
+YellowRabbitEars
+
+
+YellowRose
+
+
+YellowRoseHat
+
+
+YellowShades
+
+
+YellowShortTankTop
+
+
+YellowSilkRobe
+
+
+YellowSorcererBlack
+
+
+YellowSorcererDBlue
+
+
+YellowSorcererDGreen
+
+
+YellowSorcererGreen
+
+
+YellowSorcererLBlue
+
+
+YellowSorcererOrange
+
+
+YellowSorcererPink
+
+
+YellowSorcererPurple
+
+
+YellowSorcererRed
+
+
+YellowSorcererWhite
+
+
+YellowSorcererYellow
+
+
+YellowSummonFlower
+
+
+YellowTankTop
+
+
+YellowTicket
+
+
+YellowTulip
+
+
+YellowTurtleneck
+
+
+YellowVNeckSweater
+
+
+YellowWizardHat
+
+
+YellowWrap
+
+
+Yerrnk
+
+
+Yes
+Oui
+
+Yes, I helped her with the maggots.
+
+
+Yes, of course.
+
+
+Yes.
+Oui.
+
+Yeti
+
+
+YetiClaw
+
+
+YetiMask
+
+
+YetiSkinShirt
+
+
+You are already a student of Sagatha. I will not teach you anything!
+
+
+You are making progress, but you still need more practice.
+
+
+You are missing required items.
+
+
+You are still at the beginning of your path, but do keep practicing.
+
+
+You can also manually stop it at any time with: @droprate default
+
+
+You can also manually stop it at any time with: @exprate default
+Tu peux aussi l'arrêter manuelle à n'importe quel moment avec : @exprate default
+
+You can call fluffies, too. But for them you must call out '%s' instead, with white fluffy fur instead of a spike. And don't forget the root.
+
+
+You can harden your skin with a hard spike. Hold it in your hands and speak '%s', then draw its hardness into your skin, or the skin of someone's else.
+
+
+You can help them with shearing magic. Press your hands together and say '%s'. Then touch them with your hands, and brush off any excess.
+
+
+You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.
+
+
+You can turn the log into a wooden figurine by imagining the creature whose shape you want in your head and saying `%s' followed by the last syllable of the name of the creature you want to shape it into.
+
+
+You can't make out anything else of value, so you place the manuscript back in the bookshelf.
+
+
+You cannot complete the casting correctly!
+
+
+You currently have @@ GP on your bank account.
+
+
+You didn't have any possessions on you when we found you and no one knows who you are.
+
+
+You do not have enough %s (min %d)
+
+
+You do not have enough Gold Pieces on your bank account.
+
+
+You do not have enough Gold on yourself.
+
+
+You do not have suffice magic power to make rain.
+
+
+You don't have enough magical power to learn the next healing spell yet.
+
+
+You don't look too well; let me treat your wounds.
+
+
+You feel a strange, tingling kind of warmth spread through your body.
+
+
+You feel completely overwhelmed by your magic.
+
+
+You feel in almost perfect control of your magic.
+
+
+You feel mostly in control of your magic.
+
+
+You feel quite in control of your magic.
+
+
+You feel quite overwhelmed by your magic, but are beginning to see patterns.
+
+
+You feel somewhat in control of your magic.
+
+
+You feel that you have only the bare minimum of control over your magic.
+
+
+You feel that you have very good control of your magic.
+
+
+You feel you still have a few difficulties in controlling your magic.
+
+
+You found %d out of 5 us.
+
+
+You have made good progress, but please do continue in your efforts.
+
+
+You have made good progress, but you lack the magical power to advance further. Also, I would like to observe you some more to be certain that you will make a good healer.
+
+
+You look fantastic.
+
+
+You made a cash deposit of @@ GP.
+
+
+You may find that you can transmute the powder more effectively after a while; that is perfectly natural.
+
+
+You must have been thrown off one of the ships sailing during that last tremor."
+
+
+You must practice more first.
+
+
+You need a Dagger, Sharp Knife or Knife to use!
+
+
+You need at least %d %s to use this spell!
+
+
+You need more room in your inventory.
+
+
+You need to be carrying less weight.
+
+
+You need to kill %s: %d/%d.
+
+
+You open your eyes.
+
+
+You see a girl who is holding her hands in front of her face.
+
+
+You seem to be ready to advance as a healer. There is one favor I must ask of you first, though.
+
+
+You should be more careful.
+
+
+You should come back when you have some free space.
+Tu devrais revenir quand tu auras assez de place dans ton inventaire.
+
+You should get dressed now.
+
+
+You still need to find some of my friends. You have found %d out of 5 of my friends.
+
+
+You successfully set the drop rate to @@%. It will reset to @@% (default value) in @@.
+
+
+You successfully set the exp rate to @@%. It will reset to @@% (default value) in @@.
+Tu as établi le taux d'exp à @@% avec succès. Il se réinitialisera à @@% (valeur par défaut) dans @@.
+
+You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the dresser.
+
+
+You were permanently banned by the GM Team.
+
+
+You withdrew a total of @@ GP.
+
+
+Young Man
+
+
+Your GM level is now hidden.
+
+
+Your GM level is now visible.
+
+
+Your hairstyle is @@ and its color is @@.
+Ta as une coupe @@ de couleur @@.
+
+Your magic takes a mind of its own!
+
+
+Zack
+
+
+ZaxDeKagen
+
+
+Zegas
+
+
+ZegasDebug
+
+
+Zitoni
+
+
+Zombie
+
+
+ZombieNachos
+
+
+Zzzzzzzzz...
+Zzzzzzzzz...
+
+_N-Pumpkin
+
+
+a ground!
+une terre !
+
+a quiet place,
+un endroit tranquille,
+
+fifteen
+
+
+no
+non
+
+no active broadcast
+pas d'annonce active
+
+sign#pvp-1
+
+
+sign#pvp-2
+
+
+specialMob027-3
+
+
+specialMob027-4
+
+
+yes
+oui
+
+• Can't walk without stopping after every step
+
+
+• Has a bubblehead
+
+
+• Is not properly shaded
+
+
diff --git a/langs/lang_pt_BR.old b/langs/lang_pt_BR.old
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/langs/lang_pt_BR.old
diff --git a/langs/lang_pt_BR.txt b/langs/lang_pt_BR.txt
new file mode 100644
index 00000000..9e60da50
--- /dev/null
+++ b/langs/lang_pt_BR.txt
@@ -0,0 +1,6673 @@
+Copyright (C) 2010-2015 Evol Online
+"Ah, you woke up. You washed ashore on the beach 3 days ago. You've been asleep since.
+
+
+"Come back and see me when the job is done."
+
+
+"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 '%s', which is the lay on hands magic."
+
+
+"Maybe I should go back to practicing '%s' until I can make potions properly." %%6
+
+
+"My little granddaughter Tanisha found you. Kaan was able to carry you to bed.
+
+
+"She hates maggots.
+
+
+"The first one for the mouboo was %s and the one for the pinkie was %s.
+
+
+"Welcome to the bank!
+
+
+"You're the person I brought here, right?
+
+
+##BHall Of Acorns: TOP15##b
+
+
+##BHall Of Fortune: TOP15##b
+
+
+##BHall Of Guild Level: TOP5##b
+
+
+##BHall Of Job Level: TOP15##b
+
+
+##BHall Of Lethality: TOP15##b
+
+
+##BHall Of Level: TOP15##b
+
+
+%%@
+
+
+%%A
+
+
+%%B
+
+
+%%C
+
+
+%%D
+
+
+%%E
+
+
+%%F
+
+
+%d out of 5 have been found.
+
+
+%s
+
+
+%s - Level %d (~%s HP, ~%s ATK)
+
+
+%s : %s
+
+
+(A mystical aura surrounds this stone. You feel mysteriously attracted to it. Something tells you to touch it. What do you do?)
+
+
+... Tulimshar in Tonori ... I'm a Talpan.
+
+
+1) Do not abuse other players. Insults, swearing, and the like are not to be directed towards a particular person or group.
+
+
+2) No bots – including ##Bany##b AFK activity or automated actions of any sort.
+
+
+3) No spamming or flooding (including messages, whispers, and trade requests).
+
+
+4) No begging.
+
+
+5) Speak ##Bonly##b English in the public chat.
+
+
+6) Treat others how you would like to be treated.
+
+
+7
+
+
+98... 99... 100!
+
+
+?
+
+
+@@
+
+
+A blissful day to thee, mortal!
+
+
+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 '%s' spell.
+
+
+A sunny and hot day,
+
+
+A wicked mushroom will appear to fight for you. Usually.
+
+
+A-hoy matey!
+
+
+AFK botting will be determined by talking to players who are moving and/or attacking.
+
+
+AFKCap
+
+
+Aahna
+
+
+Aaron
+
+
+Abort
+
+
+Acorn
+
+
+ActivatedSulphur
+
+
+Add all focus skills
+
+
+Adrian
+
+
+After a while, you stumble across a section that appears to be written somewhat legibly. The author notes that he (or perhaps she?) is describing a completely new transmutation.
+
+
+After we finish talking, click on the clothes and press the equip button.
+
+
+Agostine
+
+
+Agostine Debug
+
+
+Ah, the Professors will get mad at me again...
+
+
+Ah, yes, your training...
+
+
+Ah.
+
+
+Ah... no beer? Oh well.
+
+
+Aidan
+
+
+Airlia
+
+
+Aisha
+
+
+Aisha looks around as she leans in and hushes you to silence. After a few seconds, she whispers to you:
+
+
+Akseli
+
+
+Alacrius
+
+
+Alan
+
+
+Aldred
+
+
+Alice
+
+
+Alizarin Plant
+
+
+AlizarinHerb
+
+
+All monsters summoned!
+
+
+All of my money.
+
+
+All scoreboards are updated hourly.
+
+
+AmberChristmasSweater
+
+
+Amethyst
+
+
+AmethystPowder
+
+
+AmethystRing
+
+
+Amrak
+
+
+And make sure to keep notes of your spells! Don't rely only on your skill tab (F5).
+
+
+And the first spell, to summon wicked mushrooms, is %s.
+
+
+Andra
+
+
+Angela
+
+
+Angela#house
+
+
+Angry Fire Goblin
+
+
+Angry Green Slime
+
+
+Angry Scorpion
+
+
+Angry Sea Slime
+
+
+AngryScorpionStinger
+
+
+Angus
+
+
+AniManOMat
+
+
+AnimalBones
+
+
+Anne
+
+
+AnniversaryHat
+
+
+Another Sneaky Bandit
+
+
+AntlerHat
+
+
+Antlers
+
+
+Anwar
+
+
+Anything else you can remember?
+
+
+Anything else?
+
+
+AppleCake
+
+
+ApprenticeRobe
+
+
+AquaHint
+
+
+AquaOrnament
+
+
+AquaTicket
+
+
+Aradin
+
+
+Archant
+
+
+Archibald
+
+
+Ardra
+
+
+Are you read for another spell?
+
+
+Arkim
+
+
+Arr!
+
+
+Arr, I'm bored!
+
+
+Arrow
+
+
+Arvo
+
+
+As she opens her hands again, the leaves have turned into ten golden crystals.
+
+
+As the power of your magic grows so will the spells you can cast.
+
+
+As you look at the sword, you suddenly hear a voice in your head!
+
+
+As you want!
+
+
+Ashley
+
+
+AssassinBoots
+
+
+AssassinGloves
+
+
+AssassinPants
+
+
+AssassinShirt
+
+
+Astral Soul
+
+
+AstralCube
+
+
+At this point, the river deepens, slowing down to a leisurely pace. In its center you notice an unusual stone, waves breaking around it.
+
+
+Auldsbel places the logs next to his hut.
+
+
+Auldsbel the Wizard
+
+
+Auldsbel#_M
+
+
+Aureole
+
+
+Automated following will be determined by observation.
+
+
+AutumnMask
+
+
+Avalia
+
+
+Axe
+
+
+AxeHat
+
+
+Ayasha
+
+
+AyashaDebug
+
+
+Azul Slime
+
+
+Back
+
+
+Baktar
+
+
+Ball Lightning
+
+
+Bandana
+
+
+Bandit
+
+
+Bandit Lord
+
+
+BanditHood
+
+
+BansheeBow
+
+
+Banu
+
+
+Bar Rules
+
+
+Barbara Grey
+
+
+Bard
+
+
+Bardiche
+
+
+Barkeeper
+
+
+Barrel#0
+
+
+Barrel#1
+
+
+Barrel#2
+
+
+Barrel#3
+
+
+Barrel#4
+
+
+Barrel#5
+
+
+Barrel#6
+
+
+Barrel#7
+
+
+Bartender
+
+
+Bartender#Casino
+
+
+Bartender#Duels
+
+
+Basil
+
+
+BastardSword
+
+
+Bat
+
+
+BatTeeth
+
+
+BatWing
+
+
+Battle Master#Duels
+
+
+BeanieCopter
+
+
+Bee
+
+
+Beer
+
+
+BeetleJuice
+
+
+Before you stands a beautiful woman, dressed in dark purple robes and wearing a witch's hat.
+
+
+Beheader
+
+
+Ben
+
+
+Bennet
+
+
+BentNeedle
+
+
+Beret
+
+
+Bernard
+
+
+Beware of what thou wishest for, mortal...
+
+
+Birrod
+
+
+Black Scorpion
+
+
+BlackBeret
+
+
+BlackBoots
+
+
+BlackBowlerHat
+
+
+BlackBowlerHatBrown
+
+
+BlackContributor
+
+
+BlackCottonBoots
+
+
+BlackCottonCloth
+
+
+BlackCottonGloves
+
+
+BlackCottonHeadband
+
+
+BlackCottonShirt
+
+
+BlackCottonShorts
+
+
+BlackCottonSkirt
+
+
+BlackCottonTrousers
+
+
+BlackCowboyHat
+
+
+BlackDesertHat
+
+
+BlackDye
+
+
+BlackEvokersRobeBlue
+
+
+BlackFineDress
+
+
+BlackJack
+
+
+BlackMiniskirt
+
+
+BlackPearl
+
+
+BlackRabbitEars
+
+
+BlackRose
+
+
+BlackScorpionStinger
+
+
+BlackShades
+
+
+BlackShortTankTop
+
+
+BlackSilkRobe
+
+
+BlackSorcererBlack
+
+
+BlackSorcererDBlue
+
+
+BlackSorcererDGreen
+
+
+BlackSorcererGreen
+
+
+BlackSorcererLBlue
+
+
+BlackSorcererOrange
+
+
+BlackSorcererPink
+
+
+BlackSorcererPurple
+
+
+BlackSorcererRed
+
+
+BlackSorcererWhite
+
+
+BlackSorcererYellow
+
+
+BlackTankTop
+
+
+BlackTurtleneck
+
+
+BlackVNeckSweater
+
+
+BlackWizardHat
+
+
+BlackWizardRobe
+
+
+Blacksmith
+
+
+BlacksmithsAxe
+
+
+Blackwin
+
+
+BlinkingEvil
+
+
+BlinkingEvilBlue
+
+
+BlinkingEvilHalloween
+
+
+BlinkingEvilPink
+
+
+BlinkingEvilRed
+
+
+BlinkingEvilYellow
+
+
+BlinkingHocus
+
+
+BloodInk
+
+
+BloodWine
+
+
+Bloodstone
+
+
+Blossom
+
+
+Blue Slime
+
+
+Blue Spark
+
+
+BlueChristmasSweater
+
+
+BlueDottedWrap
+
+
+BlueEasterEgg
+
+
+BlueEggshellHat
+
+
+BlueHint
+
+
+BlueHitchhikersTowel
+
+
+BlueOrnament
+
+
+BluePowder
+
+
+BluePresentBox
+
+
+BluePresentHat
+
+
+BlueRose
+
+
+BlueRoseHat
+
+
+BlueTicket
+
+
+BlueWolfHelmet
+
+
+BlueWrap
+
+
+Blueberries
+
+
+Bluepar
+
+
+Body type %i
+
+
+Bone
+
+
+BoneArrows
+
+
+BoneDarts
+
+
+BoneKnife
+
+
+Bones
+
+
+BookPage
+
+
+Bookshelf
+
+
+Boots
+
+
+Boss points: %s
+
+
+BottleOfSand
+
+
+BottleOfWater
+
+
+Bow
+
+
+BowlerHat
+
+
+BowlerHatBrown
+
+
+Bracco
+
+
+BrainStem
+
+
+Brawling
+
+
+Bring me ten bug legs, and I will reveal its invocation to you.
+
+
+Brodomir
+
+
+BrokenDoll
+
+
+BrokenFourLeafAmulet
+
+
+BromenalBoots
+
+
+BromenalChest
+
+
+BromenalFourLeafAmulet
+
+
+BromenalGloves
+
+
+BromenalHelmet
+
+
+BromenalLegs
+
+
+BromenalShield
+
+
+Browsing through the books, you come across a manuscript entitled 'Notes of Potaffe, On Transmutation.'
+
+
+Bryant
+
+
+BucketHat
+
+
+BugLeg
+
+
+BullHelmet
+
+
+BunchOfParsley
+
+
+Bunkmaster Daban
+
+
+Bunkmaster Phict
+
+
+BunnyEars
+
+
+But alas, thou need more magical power for that.
+
+
+But be warned: you won't be able to use advanced healing magic until you are more capable in your regular magic usage.
+
+
+But remember, the game isn't fun when you already know what to do. Use it well or you will lose interest in playing The Mana World! Please help by reporting anything that is unclear, outdated or that needs to be seen on our forums at %s.
+
+
+Butterfly
+
+
+Button#mine-1
+
+
+Button#mine-2
+
+
+Button#mine-3
+
+
+Bye for now.
+
+
+Bye then!
+
+
+Bye!
+
+
+Bye.
+
+
+CactusDrink
+
+
+CactusPotion
+
+
+Cake
+
+
+Can you do something with my color?
+
+
+Can you please go away?
+
+
+Can't talk right now, I'm on patrol duty.
+
+
+Candide
+
+
+Candied Slime
+
+
+CandleHelmet
+
+
+Candor Dock
+
+
+Candor Koga
+
+
+Candy
+
+
+CandyCane
+
+
+CandyPumpkin
+
+
+Cap
+
+
+Capitão Mirc
+
+
+CaptainsHat
+
+
+CaramelApple
+
+
+CaramelCandy
+
+
+CarbonGasMask
+
+
+Caretaker
+
+
+CashiersShade
+
+
+CasinoCoins
+
+
+CatEars
+
+
+Caul
+
+
+Cave Maggot
+
+
+Cave Snake
+
+
+CaveSnakeEgg
+
+
+CaveSnakeLamp
+
+
+CaveSnakeTongue
+
+
+Celestia
+
+
+Celestia BackDoor
+
+
+Celestia Door
+
+
+Cerhan
+
+
+ChainmailShirt
+
+
+Changing your body type will send you back to the character selection screen.
+
+
+Charda
+
+
+Ched
+
+
+Cheers!
+
+
+Chef Armand
+
+
+Chef#dimond
+
+
+Chef#graveyard
+
+
+ChefHat
+
+
+Cherry
+
+
+CherryCake
+
+
+Chest#DemonMask
+
+
+Chest#boring
+
+
+Chest#illia
+
+
+Chest#keshlam
+
+
+Chest#sword
+
+
+ChicSantaHat
+
+
+ChickenLeg
+
+
+Chief Warrick
+
+
+ChocolateBar
+
+
+ChocolateCake
+
+
+ChocolateMouboo
+
+
+ChristmasElfHat
+
+
+ChristmasTreeHat
+
+
+Cindy
+
+
+Cindy#house
+
+
+Circlet
+
+
+Clauquer
+
+
+ClosedChristmasBox
+
+
+Clover Patch
+
+
+CloverHat
+
+
+Coal
+
+
+Cobalt Plant
+
+
+CobaltHerb
+
+
+CoinBag
+
+
+Come back when thou art stronger.
+
+
+Command not permitted on this map! Check npc/functions/weather.conf
+
+
+ConcentrationPotion
+
+
+Connor
+
+
+Constable Bob
+
+
+Constable Perry Graf
+
+
+Contributor
+
+
+Cooky
+
+
+Copper Slime
+
+
+CottonBoots
+
+
+CottonCloth
+
+
+CottonGloves
+
+
+CottonHeadband
+
+
+CottonShirt
+
+
+CottonShorts
+
+
+CottonSkirt
+
+
+CottonTrousers
+
+
+CranberryLollipop
+
+
+Crastur the Ugly
+
+
+CrescentRod
+
+
+CrimsonBra
+
+
+Crotcher Scorpion
+
+
+Crown
+
+
+CrozeniteFourLeafAmulet
+
+
+CrusadeHelmet
+
+
+CryptKey
+
+
+Curlee
+
+
+Current Magic Control
+
+
+Current drop rate is set to @@%, and will reset to @@% (default value) in @@.
+
+
+Current exp rate is set to @@% (default value).
+
+
+Current exp rate is set to @@%, and will reset to @@% (default value) in @@.
+
+
+Cursed Waterfall
+
+
+Custom
+
+
+Cyndala
+
+
+Cynric
+
+
+DEBUG: Changing @@ field @@ to something else.
+
+
+DEBUG: Changing @@, Values: (@@, @@, @@).
+
+
+Dagger
+
+
+DarkBlueBeret
+
+
+DarkBlueBowlerHat
+
+
+DarkBlueBowlerHatBrown
+
+
+DarkBlueContributor
+
+
+DarkBlueCottonBoots
+
+
+DarkBlueCottonCloth
+
+
+DarkBlueCottonGloves
+
+
+DarkBlueCottonHeadband
+
+
+DarkBlueCottonShirt
+
+
+DarkBlueCottonShorts
+
+
+DarkBlueCottonSkirt
+
+
+DarkBlueCottonTrousers
+
+
+DarkBlueDesertHat
+
+
+DarkBlueDye
+
+
+DarkBlueFineDress
+
+
+DarkBlueMiniskirt
+
+
+DarkBlueRabbitEars
+
+
+DarkBlueShades
+
+
+DarkBlueShortTankTop
+
+
+DarkBlueSilkRobe
+
+
+DarkBlueSorcererBlack
+
+
+DarkBlueSorcererDBlue
+
+
+DarkBlueSorcererDGreen
+
+
+DarkBlueSorcererGreen
+
+
+DarkBlueSorcererLBlue
+
+
+DarkBlueSorcererOrange
+
+
+DarkBlueSorcererPink
+
+
+DarkBlueSorcererPurple
+
+
+DarkBlueSorcererRed
+
+
+DarkBlueSorcererWhite
+
+
+DarkBlueSorcererYellow
+
+
+DarkBlueTankTop
+
+
+DarkBlueTurtleneck
+
+
+DarkBlueVNeckSweater
+
+
+DarkBlueWizardHat
+
+
+DarkChristmasSweater
+
+
+DarkConcentrationPotion
+
+
+DarkCrystal
+
+
+DarkEasterEgg
+
+
+DarkEggshellHat
+
+
+DarkGreenBeret
+
+
+DarkGreenBowlerHat
+
+
+DarkGreenBowlerHatBrown
+
+
+DarkGreenContributor
+
+
+DarkGreenCottonBoots
+
+
+DarkGreenCottonCloth
+
+
+DarkGreenCottonGloves
+
+
+DarkGreenCottonHeadband
+
+
+DarkGreenCottonShirt
+
+
+DarkGreenCottonShorts
+
+
+DarkGreenCottonSkirt
+
+
+DarkGreenCottonTrousers
+
+
+DarkGreenDesertHat
+
+
+DarkGreenDye
+
+
+DarkGreenFineDress
+
+
+DarkGreenMiniskirt
+
+
+DarkGreenRabbitEars
+
+
+DarkGreenShades
+
+
+DarkGreenShortTankTop
+
+
+DarkGreenSilkRobe
+
+
+DarkGreenSorcererBlack
+
+
+DarkGreenSorcererDBlue
+
+
+DarkGreenSorcererDGreen
+
+
+DarkGreenSorcererGreen
+
+
+DarkGreenSorcererLBlue
+
+
+DarkGreenSorcererOrange
+
+
+DarkGreenSorcererPink
+
+
+DarkGreenSorcererPurple
+
+
+DarkGreenSorcererRed
+
+
+DarkGreenSorcererWhite
+
+
+DarkGreenSorcererYellow
+
+
+DarkGreenTankTop
+
+
+DarkGreenTurtleneck
+
+
+DarkGreenVNeckSweater
+
+
+DarkGreenWizardHat
+
+
+DarkHelm
+
+
+DarkPetal
+
+
+DarkRedRose
+
+
+DarkTalisman
+
+
+Darnel
+
+
+Darug
+
+
+David
+
+
+Debug#0
+
+
+Debug#1
+
+
+Debug#2
+
+
+Debug#3
+
+
+Debug#Angela
+
+
+Debug#BlueSage
+
+
+Debug#Duels
+
+
+DebugFlowerP
+
+
+DecorCandy
+
+
+DemonMask
+
+
+Demonic Mouboo
+
+
+Demonic Spirit
+
+
+Deposit.
+
+
+DesertBow
+
+
+DesertHat
+
+
+DesertHelmet
+
+
+DesertShirt
+
+
+DevelopersCap
+
+
+Diamond
+
+
+DiamondPowder
+
+
+DiamondRing
+
+
+Did I received any mail?
+
+
+Did you already talk to Tanisha?"
+
+
+Did you see how this spell is cast?
+
+
+DilutedConcentrationPot
+
+
+Dimond
+
+
+Dimonds Cove 1
+
+
+Dimonds Cove 2
+
+
+Directions
+
+
+Diryn the Traveler
+
+
+Discard
+
+
+DiseasedHeart
+
+
+Do I look like a tree? I feel like one.
+
+
+Do you feel too weak even to do damage to this areas wishy-washy wildlife?
+
+
+Do you have a name?
+
+
+Do you really want me to show you the spell again? You will have to bring new ingredients.
+
+
+Do you want to give me these items?
+
+
+Doctor
+
+
+Doll
+
+
+Don't distract me, I have to stay alert.
+
+
+Donald
+
+
+Doom Golem
+
+
+Door
+
+
+Doug
+
+
+Drabur
+
+
+Drag and drop an item from your inventory.
+
+
+Drake the Traveler
+
+
+Dread Pirate Marley
+
+
+Dread Pirate Marley Clone
+
+
+Dresser#tutorial
+
+
+Drinker#1
+
+
+Drinker#2
+
+
+Drop rate has been reset to @@% (default value).
+
+
+Drop rate is set to @@% for the next @@.
+
+
+DruidTreeBranch
+
+
+Drunken Lady Skeleton
+
+
+Drunken Skeleton
+
+
+ERROR: You must set a PinCode to make use of this function.
+
+
+Earmuffs
+
+
+Earth Spirit
+
+
+Easter Eggs
+
+
+Easter Fluffy
+
+
+EasterBasket
+
+
+EasterEgg
+
+
+Ectoplasm
+
+
+Edwin
+
+
+Eevert
+
+
+EggshellHat
+
+
+Ekinu
+
+
+Elanore carefully goes over your leaves, then smiles.
+
+
+Elanore counts the leaves you show her.
+
+
+Elanore shakes her head.
+
+
+Elanore smiles at you.
+
+
+Elanore smiles.
+
+
+Elanore the Healer
+
+
+Elanore#_M
+
+
+ElfNightcap
+
+
+Elias
+
+
+Elijah
+
+
+Eljas
+
+
+Emerald
+
+
+EmeraldPowder
+
+
+EmeraldRing
+
+
+Emergency Exit
+
+
+EmptyBottle
+
+
+Enchanter
+
+
+EnchantersAmulet
+
+
+Engraving#Keshlam
+
+
+Engravings
+
+
+Enjoy your new style.
+
+
+Ensio
+
+
+Entertainer
+
+
+Eomie
+
+
+Equip the wand and lets try out that spell.
+
+
+EskimoHat
+
+
+Estard
+
+
+Estrilda
+
+
+Eurni
+
+
+Every 1 hour
+
+
+Every 12 hours
+
+
+Every 24 hours
+
+
+Every 3 hours
+
+
+Every 5 hours
+
+
+Every 6 hours
+
+
+Evil Mushroom
+
+
+Evil Obelisk
+
+
+Example: @translate Elmo
+
+
+Example: @translate Nard
+
+
+Example: @translate npc/002-1/arpan
+
+
+Excitedly, you turn the page – only to find that it is stuck to the next and can't be freed!
+
+
+Exit
+
+
+Exp rate has been reset to @@% (default value).
+
+
+Exp rate is set to @@% for the next @@.
+
+
+Eyepatch
+
+
+Fabius
+
+
+FaceMask
+
+
+FairTradeSoil
+
+
+FairyHat
+
+
+FakeFangs
+
+
+Falchion
+
+
+Falkurn
+
+
+Fallen
+
+
+FancyHat
+
+
+Farewell.
+
+
+Faris
+
+
+Faris the Traveler
+
+
+Farmer Hinnak
+
+
+Feel free to come visit me another time.
+
+
+Ferry Master#candor
+
+
+Ferry Master#tulimshar
+
+
+Fey Element
+
+
+Fieri
+
+
+FineDress
+
+
+Fire Goblin
+
+
+Fire Skull
+
+
+Five for you and five for me.
+
+
+Flashmob
+
+
+FlawedLens
+
+
+FlightTalisman
+
+
+Fluffy
+
+
+FluffyHat
+
+
+Focus Skill +
+
+
+Focus Skill -
+
+
+Focus list:
+
+
+Forest Mana Seed#_M
+
+
+ForestArmor
+
+
+ForestBow
+
+
+Forwin
+
+
+FourLeafClover
+
+
+FreeRangeMoss
+
+
+From what I have been hearing, you seem to be doing well on your way to becoming a healer. I have decided to accept you as a student of the School of Life Magic.
+
+
+FrozenYetiTear
+
+
+Frozenbeard
+
+
+Fruit Store
+
+
+FunkyChristmasSweater
+
+
+FunkyHat
+
+
+FurBoots
+
+
+GMCap
+
+
+GMRobe
+
+
+GP: %s
+
+
+Gamboge Plant
+
+
+GambogeHerb
+
+
+Game Statistics
+
+
+Garcon#Duels
+
+
+General Krukan
+
+
+General Razha
+
+
+General Store#dimond
+
+
+General Store#hurnscald
+
+
+General Terogan
+
+
+General Terogan#Exit1
+
+
+General Terogan#Exit2
+
+
+General Terogan#Main
+
+
+George#pirate
+
+
+Ggrmm... Grmmmm...
+
+
+Ghada
+
+
+Giant Maggot
+
+
+GiantCaveMaggot
+
+
+GingerBreadMan
+
+
+Gispaan#Female
+
+
+Gispaan#Male
+
+
+Give me some space.
+
+
+Gladys
+
+
+Gm Event#1
+
+
+Gm Event#2
+
+
+Gm Event#3
+
+
+Go back
+
+
+Go back?
+
+
+Go fly a kite.
+
+
+Go on. If you need to think a bit, take your time.
+
+
+GoblinMask
+
+
+Goggles
+
+
+Golbenez
+
+
+GoldTicket
+
+
+GoldenDeliciousApple
+
+
+GoldenFourLeafAmulet
+
+
+GoldenPVPCap
+
+
+GoldenPlatemail
+
+
+GoldenScorpionStinger
+
+
+GoldenWarlordPlate
+
+
+Goodbye!
+
+
+Goodbye.
+
+
+GraduationCap
+
+
+GrapeLollipop
+
+
+Grass Snake
+
+
+GrassFedTofu
+
+
+GrassLiner
+
+
+GrassSeed
+
+
+GrassSnakeEgg
+
+
+GrassSnakeTongue
+
+
+Grave#1
+
+
+Grave#10
+
+
+Grave#11
+
+
+Grave#12
+
+
+Grave#2
+
+
+Grave#3
+
+
+Grave#4
+
+
+Grave#5
+
+
+Grave#6
+
+
+Grave#7
+
+
+Grave#8
+
+
+Grave#9
+
+
+GrayHint
+
+
+Great! Now you can equip it.
+
+
+Great, lets begin your first lesson.
+
+
+GreatDragon
+
+
+Green Slime
+
+
+Green Slime Mother
+
+
+GreenApple
+
+
+GreenBeret
+
+
+GreenBowlerHat
+
+
+GreenBowlerHatBrown
+
+
+GreenContributor
+
+
+GreenCottonBoots
+
+
+GreenCottonCloth
+
+
+GreenCottonGloves
+
+
+GreenCottonHeadband
+
+
+GreenCottonShirt
+
+
+GreenCottonShorts
+
+
+GreenCottonSkirt
+
+
+GreenCottonTrousers
+
+
+GreenDesertHat
+
+
+GreenDye
+
+
+GreenEasterEgg
+
+
+GreenEggshellHat
+
+
+GreenFineDress
+
+
+GreenHint
+
+
+GreenHitchhikersTowel
+
+
+GreenMiniskirt
+
+
+GreenOrnament
+
+
+GreenPresentBox
+
+
+GreenPresentHat
+
+
+GreenRabbitEars
+
+
+GreenRedStripedWrap
+
+
+GreenShades
+
+
+GreenShortTankTop
+
+
+GreenSilkRobe
+
+
+GreenSorcererBlack
+
+
+GreenSorcererDBlue
+
+
+GreenSorcererDGreen
+
+
+GreenSorcererGreen
+
+
+GreenSorcererLBlue
+
+
+GreenSorcererOrange
+
+
+GreenSorcererPink
+
+
+GreenSorcererPurple
+
+
+GreenSorcererRed
+
+
+GreenSorcererWhite
+
+
+GreenSorcererYellow
+
+
+GreenTankTop
+
+
+GreenTicket
+
+
+GreenTurtleneck
+
+
+GreenVNeckSweater
+
+
+GreenWizardHat
+
+
+GreenWrap
+
+
+Grenadier
+
+
+GrimaceOfDementia
+
+
+Grimoire
+
+
+Grinchboo
+
+
+GroovyHat
+
+
+GrubSlime
+
+
+Guard#castle
+
+
+Guard#east1
+
+
+Guard#east3
+
+
+Guard#govt_in
+
+
+Guard#govt_out
+
+
+Guard#port1
+
+
+Guard#port2
+
+
+Guard#school
+
+
+GuardianWings
+
+
+GumiCandy
+
+
+Gungnir
+
+
+Gunney
+
+
+GutBuster
+
+
+GuyFawkesMask
+
+
+Gwendolyn
+
+
+Gwendolyn Bowmaker
+
+
+Hail adventurer! You are well on your way to mastering the beasts of the island.
+
+
+Halas
+
+
+Halberd
+
+
+Hall Of Acorns
+
+
+Hall Of Base Level
+
+
+Hall Of Fortune
+
+
+Hall Of Guilds
+
+
+Hall Of Job Level
+
+
+Hall Of Lethality
+
+
+Hamond
+
+
+HardSpike
+
+
+Harper
+
+
+Hasan
+
+
+Have a good day!
+
+
+Have fun with those spells and use them to cause hate, anger and death.
+
+
+Have you practiced enough?
+
+
+He is a kind old man. He stays mostly with his books and his apprentice, though we have chatted a few times.
+
+
+HeartGlasses
+
+
+HeartNecklace
+
+
+HeartOfIsis
+
+
+HeartOfLazurite
+
+
+Heathin
+
+
+HeathinDebug
+
+
+Hello! Can I help you?
+
+
+Hello! How are you? Did you already visit Hurnscald?
+
+
+Hello, Adventurer! Have you come back to help?
+
+
+Hello, I'm Alacrius.
+
+
+Hello.
+
+
+Henriikka
+
+
+Here is another useful one: '%s'. It will tell you the stats of the target monster, so you can know how dangerous it is.
+
+
+Here you go!
+
+
+Hetchel
+
+
+HetchelDebug
+
+
+Hey! Good to hear from you!
+
+
+Heya!
+
+
+Hi.
+
+
+Hide from monsters: %s
+
+
+HighPriestCrown
+
+
+Hinnak
+
+
+HitchhikersTowel
+
+
+Hm... Shhhh...
+
+
+Hmm. I wanted to teach you something, but I've forgotten what it was... please come back later.
+
+
+Hmm... how about this: you help me with a few of my experiments, and I tell you?
+
+
+Honey
+
+
+House Maggot
+
+
+How about changing my body type?
+
+
+How can I help you?"
+
+
+How did you...
+
+
+How do I know you will not run off to Sagatha with what I would be teaching you?
+
+
+How much do you want to deposit?
+
+
+How much do you want to withdraw?
+
+
+How sad to hear how manners have degenerated in recent centuries. Farewell for now, dear mortal.
+
+
+Howdy?
+
+
+Hrmm, no looks like only %d out of 5 have been found.
+
+
+Hungry Fluffy
+
+
+Huntsman Spider
+
+
+Hurnscald North Dock
+
+
+Hurnscald North Koga
+
+
+Hurnscald South Dock
+
+
+Hurnscald South Koga
+
+
+Hydusun
+
+
+Hyvern
+
+
+HyvernStinger
+
+
+I always need components for my own healing spells. If you bring me ten gamboge leaves, ten alizarin leaves, ten mauve leaves and ten cobalt leaves, I can make ten lifestones; I will give you half of them.
+
+
+I am sorry, but I don't think that I know anything that would help you.
+
+
+I can trade you %d %ss for %d %s and %d GP.
+
+
+I can't stay here and talk all day. I have a job to do.
+
+
+I changed my mind.
+
+
+I do not know, though I suggest to seek out a local alchemist, if there is any.
+
+
+I have homework to do...
+
+
+I have taught thee all I can teach for now.
+
+
+I hope you like this color.
+
+
+I just want to live my life in peace.
+
+
+I know not what brought thee hither, but I kindly ask that thou leavest me alone in my sorrow.
+
+
+I like you, so I'll tell you the bad word. But you can't tell anyone else about it! The bad word is %s.'
+
+
+I lost my towel...
+
+
+I need to finish studying for my test...
+
+
+I said %s.
+
+
+I see you killed all the %s needed.
+
+
+I think I would like to observe you for a little longer to see if you would make a good healer.
+
+
+I want to sleep...
+
+
+I want to teach you my favorite. However, you are not powerful enough to use it yet; You will first have to absorb more magic from the mana seed.
+
+
+I will make quick work of your wounds.
+
+
+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.
+
+
+I will only teach you magic of the school of Life, and that only if you prove yourself to be a good healer – that is, if you use your powers to help others.
+
+
+I would like to perform money transactions.
+
+
+I would like to store some items.
+
+
+I'd like to get a different style.
+
+
+I'll be waiting here, come back and see after you've killed those mobs.
+
+
+I'm a little busy right now.
+
+
+I'm done.
+
+
+I'm fine for now, thank you.
+
+
+I'm hoping to animate them into the shape of one of those odd log heads.
+
+
+I'm sorry, but I am not yet convinced that you are a good enough healer. Please continue in your endeavors.
+
+
+I'm sorry, but I can't help you with that.
+
+
+I'm supposed to combine two potions to create a %s, but I can't seem to figure out which two to combine...
+
+
+I'm trying to get work on my Alchemy homework, but I'm having some trouble.
+
+
+Ian
+
+
+Ian the Guide
+
+
+Ice Element
+
+
+Ice Goblin
+
+
+Ice Skull
+
+
+IceCube
+
+
+IceGladius
+
+
+IcedWater
+
+
+If the rumors are true and there really is a Mana Seed, then that would be wonderful news – perhaps we will have a few more healers soon!
+
+
+If you meant to reset the drop rate to its default value: @droprate default
+
+
+If you meant to reset the exp rate to its default value: @exprate default
+
+
+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: '%s'. Then press the root to the ground.
+
+
+If you're using another client, settings and controls may be different.
+
+
+Iivo
+
+
+IlliaCMobs051-3
+
+
+IlliaDMobs051-1
+
+
+IlliaFMobs051-1
+
+
+Imec
+
+
+Impossible to resync: You are dead.
+
+
+In that dresser there are some clothes you can wear.
+
+
+Inac
+
+
+Inar
+
+
+InfantryHelmet
+
+
+Inn
+
+
+Inspector#Hurnscald
+
+
+Internalize this feeling, and if your backpack was pressing on you you should no longer feel it now. We call it %s and it is a passive spell.
+
+
+Interval: (none, only sent on login)
+
+
+Interval: every @@ hour(s)
+
+
+Invalid map mask
+
+
+Invalid parameter specified, blame saulc.
+
+
+Inya
+
+
+Iormo
+
+
+IronArrow
+
+
+IronIngot
+
+
+IronOre
+
+
+IronPotion
+
+
+IronPowder
+
+
+Ishi
+
+
+Ishyah
+
+
+Ismo
+
+
+Issay
+
+
+It appears to be an ordinary sword.
+
+
+It is a sunny day, don't you think?
+
+
+It is already raining!
+
+
+It looks like you can't carry anything else for now.
+
+
+It might be a good idea to drag the spell to the shortcut window, so you can target and attack using your keyboard instead of mouse.
+
+
+It seems you did not tell me the correct ingredients. Come back when you find the correct ones.
+
+
+It seems you found %d out of 5 of my friends.
+
+
+It seems you managed to amass quite a fortune!
+
+
+It was impossible to conjure rain clouds on this map.
+
+
+It worked!
+
+
+Items: %s
+
+
+Iten
+
+
+Itka
+
+
+J.P. Morbid
+
+
+Jack
+
+
+Jack O
+
+
+JackOLantern
+
+
+Jackal
+
+
+JadeEgg
+
+
+Jail Lock 1
+
+
+Jail Lock 2
+
+
+Jail Lock 3
+
+
+Jail Lock 4
+
+
+Janika
+
+
+JarofBlood
+
+
+JarofOwnBlood
+
+
+JazzyHat
+
+
+JeansChaps
+
+
+JeansShorts
+
+
+JellAhh
+
+
+JellyBeans
+
+
+JellySkull
+
+
+Jena the Traveler
+
+
+Jeric
+
+
+Jerry
+
+
+Jessie
+
+
+JesterMask
+
+
+Jhedia
+
+
+Joan
+
+
+Joelin
+
+
+Jonathan
+
+
+Josh
+
+
+Julia
+
+
+KPS Manager
+
+
+Kaan
+
+
+Kaan grins mischieviously.
+
+
+Kadiya
+
+
+Kage Golem
+
+
+Kane
+
+
+Katze
+
+
+Keep in mind this spell only works on yourself or party/guild companions. It will reduce your attack speed so keep this in mind.
+
+
+Keep moving pal.
+
+
+Kekeke... excellent! Yes, here goes your first spell, and it is even a passive: the flying backpack! If you are overloaded, it will take the load off your shoulders.
+
+
+Kfahr
+
+
+Khoenan the Traveler
+
+
+KidBook
+
+
+Kilis
+
+
+Kimarr
+
+
+Knife
+
+
+KnightsHelmet
+
+
+KnitCap
+
+
+Knitra the Traveler
+
+
+Knowledgeable Tree
+
+
+Knox the Traveler
+
+
+Koyntety
+
+
+Kristian
+
+
+Kullervo
+
+
+Kylian
+
+
+KylianDebug#1
+
+
+KylianDebug#2
+
+
+Kytty
+
+
+LacedChocolateCake
+
+
+LacedOrangeCupcake
+
+
+LactoseFreeAcorn
+
+
+Lady Skeleton
+
+
+LadyFingers
+
+
+LargeHealingPotion
+
+
+LargeManaElixir
+
+
+Larvern
+
+
+Latif
+
+
+Latoy
+
+
+Lava Slime
+
+
+LazuriteCrystal
+
+
+LazuriteRobe
+
+
+LazuriteShard
+
+
+Leafing through the manuscript, you find that you can read little of the tiny handwriting and understand only a fraction of what is said.
+
+
+Leafing through the manuscript, you find that you understand too little of what is written to make any sense of it.
+
+
+LeatherBall
+
+
+LeatherGloves
+
+
+LeatherGoggles
+
+
+LeatherPatch
+
+
+LeatherShield
+
+
+LeatherShirt
+
+
+LeatherSuitcase
+
+
+LeatherTrousers
+
+
+Leave it alone.
+
+
+Lena
+
+
+Lenita
+
+
+Leofwin
+
+
+Lesser Ghost
+
+
+Let me give you a lifestone to get started with.
+
+
+Let's see whats on the list. Ah ok, I need you to kill me %d %s.
+
+
+Lets start with a basic wand attack: %s.
+
+
+Liana
+
+
+Lieutenant Dausen
+
+
+Lifestone
+
+
+LightBlueBeret
+
+
+LightBlueBowlerHat
+
+
+LightBlueBowlerHatBrown
+
+
+LightBlueContributor
+
+
+LightBlueCottonBoots
+
+
+LightBlueCottonCloth
+
+
+LightBlueCottonGloves
+
+
+LightBlueCottonHeadband
+
+
+LightBlueCottonShirt
+
+
+LightBlueCottonShorts
+
+
+LightBlueCottonSkirt
+
+
+LightBlueCottonTrousers
+
+
+LightBlueDesertHat
+
+
+LightBlueDye
+
+
+LightBlueFineDress
+
+
+LightBlueMiniskirt
+
+
+LightBlueRabbitEars
+
+
+LightBlueShades
+
+
+LightBlueShortTankTop
+
+
+LightBlueSilkRobe
+
+
+LightBlueSorcererBlack
+
+
+LightBlueSorcererDBlue
+
+
+LightBlueSorcererDGreen
+
+
+LightBlueSorcererGreen
+
+
+LightBlueSorcererLBlue
+
+
+LightBlueSorcererOrange
+
+
+LightBlueSorcererPink
+
+
+LightBlueSorcererPurple
+
+
+LightBlueSorcererRed
+
+
+LightBlueSorcererWhite
+
+
+LightBlueSorcererYellow
+
+
+LightBlueTankTop
+
+
+LightBlueTurtleneck
+
+
+LightBlueVNeckSweater
+
+
+LightBlueWizardHat
+
+
+LightCrystal
+
+
+LightPlatemail
+
+
+LimeHitchhikersTowel
+
+
+LockPicks
+
+
+Log Head
+
+
+LollipopColor1
+
+
+LollipopColor2
+
+
+LollipopColor3
+
+
+LongSword
+
+
+Lora Tay
+
+
+Lora Tay Debug
+
+
+Lorrie
+
+
+Lost? Confused? Want to know why you can't get past a quest, overcome an NPC or find an item? Check %s for player hints, walkthroughs, item lists and more!
+
+
+LoveLetter
+
+
+LovePotion
+
+
+Lovely Maggot
+
+
+Lovers
+
+
+Luca
+
+
+Luvia
+
+
+Luvia?
+
+
+MTJarofOwnBlood
+
+
+MageRing
+
+
+MagentaHint
+
+
+MagentaOrnament
+
+
+Maggot
+
+
+MaggotSlime
+
+
+Magic Sword
+
+
+Magic flows naturally from you, readily and with ease. You feel in perfect control of your magic.
+
+
+MagicGMTopHat
+
+
+Malek
+
+
+Malivox
+
+
+Mallard's Eye
+
+
+Mana Bug
+
+
+Mana Ghost
+
+
+Mana Slayer
+
+
+Mana Tyrant
+
+
+ManaGuardian
+
+
+ManaPotion
+
+
+Manually trigger the current broadcast
+
+
+Maria
+
+
+Marikel
+
+
+Marshmallow
+
+
+Mauve Plant
+
+
+MauveHerb
+
+
+Mede
+
+
+MediumHealingPotion
+
+
+MediumManaElixir
+
+
+Melinda
+
+
+Meluna
+
+
+Meridith the Traveler
+
+
+Merry Christmas!
+
+
+Merry Christmas, adventurer.
+
+
+Merry Christmas, arr yarr!!
+
+
+Message:
+
+
+Michel
+
+
+Mika
+
+
+Mike
+
+
+Mikhail
+
+
+Miler
+
+
+Milis
+
+
+Milk
+
+
+Milly
+
+
+MillyDebugHelper
+
+
+Mine Debug#1
+
+
+Mine Debug#2
+
+
+Mine Debug#3
+
+
+Mine Debug#4
+
+
+Miner
+
+
+MinerGloves
+
+
+MinersHat
+
+
+Miniskirt
+
+
+Mirak
+
+
+Miriam
+
+
+Mirjami
+
+
+Miro
+
+
+Mirror#wiz
+
+
+Mjolnir
+
+
+Mo
+
+
+Mob points: %s
+
+
+Moggun
+
+
+Money transference will have a %d %% fee as well.
+
+
+MoneyChanger
+
+
+Monocle
+
+
+MonsterOilPotion
+
+
+MonsterSkullHelmet
+
+
+Monsters Killed in PvE: %s
+
+
+Moo!
+
+
+Moonshroom
+
+
+MoonshroomHat
+
+
+Moooo!
+
+
+Moooooo!
+
+
+Moooooooooooo!
+
+
+MopoxCurePotion
+
+
+Morgan#_M
+
+
+MorganDebug
+
+
+Motto#wiz
+
+
+Mouboo
+
+
+MoubooFigurine
+
+
+MoubooHead
+
+
+MoubootaurHead
+
+
+Mountain Snake
+
+
+MountainSnakeEgg
+
+
+MountainSnakeTongue
+
+
+MovieCap
+
+
+Much better, right?!
+
+
+Munro
+
+
+MurdererCrown
+
+
+MushHat
+
+
+My breath smells bad.
+
+
+My name is Kaan, I'm Tanisha's brother."
+
+
+My spell only works on the very young, sorry.
+
+
+MylarinDust
+
+
+Mystic Sword
+
+
+Naah, you're too weak now! Come back later when you have grown!
+
+
+Naem
+
+
+Narrator
+
+
+Nathan
+
+
+Nea
+
+
+Need a healing?
+
+
+Neko
+
+
+Never (only on login)
+
+
+Next broadcast: (never)
+
+
+Next broadcast: @@
+
+
+Next ingredient.
+
+
+Next, I shall teach you a higher-level transmutation spell.
+
+
+Next, a nature spell. Take a cocoon shell. Hold it in your hand. Feel its lightness.
+
+
+Next, say '%s', and feel your skin grow rigid! Very useful against stings and stabs and pokes and pricks and that sort of stuff. Lowers attack speed and only works on yourself, party, or guild allies, though.
+
+
+Nice day to you.
+
+
+Nicholas
+
+
+Nickos
+
+
+Nigel
+
+
+Nikolai
+
+
+Nina the Traveler
+
+
+Nivalis Dock
+
+
+Nivalis Koga
+
+
+No
+
+
+No, I am sorry. Please bring me ten leaves each of gamboge, alizarin, mauve, and cobalt.
+
+
+No, thanks. I already know how things are going.
+
+
+No, you are not powerful enough yet. Please come back and ask me again when you have learned to control more powerful magic, though!
+
+
+No.
+
+
+NohMask
+
+
+Nonsense! You look fine and dandy to me. All you need is a bit more exercise and fresh fruit in your diet!
+
+
+Not in the mood to chat.
+
+
+Not resync'ing to prevent flood.
+
+
+Not yet.
+
+
+Notable mentions and thanks for our [@@https://www.patreon.com/themanaworld|sponsors@@] for their continued support.
+
+
+Note
+
+
+Note#bar
+
+
+Note#mirak
+
+
+Note#wiz
+
+
+Note: Transfering items on mail cost %s GP/item
+
+
+Nothing happens.
+
+
+Now get the clothes out of the dresser.
+
+
+Now hold still, this won't hurt a bit...
+
+
+Now leave. Spread chaos with the spells I have taught you!
+
+
+Now that you are a student of mine, I will teach you some spells.
+
+
+Now that you know the basics of nature magic, here is one of my favourites: '%s' will summon rain, whereever you are standing. It will consume a bottle of water, though.
+
+
+Now, listen carefully: to make a short tank top out of three pieces of cloth, you must use the invocation '%s'.
+
+
+Nurse
+
+
+Nutcracker
+
+
+NutcrackerHat
+
+
+Nyle
+
+
+Observe!
+
+
+Oh dear! That looks like poison; hang on...
+
+
+Oh look, it is Cupid!
+
+
+Oh, I can't be sure... but something like '%s', I think.
+
+
+Oh, I have only met Sagatha once or twice, while collecting herbs. She is a warm and gentle person, but she tries to hide it.
+
+
+Oh, and a fruit may even fall for you if you are lucky! But stay alert to pick up your drops.
+
+
+Oh, and by the way my name is Sorfina."
+
+
+Oh, but of course! You are powerful enough to make your own lifestones, using the enchantment '%s'. This will consume a bug leg, a maggot slime and one of each of the four healing herbs, though.
+
+
+Oh, sorry – I don't really know him very well.
+
+
+Oh, you found them all! Good job! Now it's my turn with searching again. Go and hide!
+
+
+Oh.
+
+
+Oh... it seems that you have no room for the lifestones. But please do come back later when you have made a little space.
+
+
+Oh... you managed to put things into every little nook and pocket, haven't you? Well, come back later, I will give it to you then.
+
+
+Ok, done.
+
+
+Okay let me try this.
+
+
+Olana
+
+
+Old Chest#crastur
+
+
+Old Man
+
+
+Old Wizard#_W
+
+
+Old Woman
+
+
+Omar
+
+
+Once this is done you have to throw it in the air and scream %s and the two roots will turn into toxic darts, a projectile you can throw.
+
+
+Only %s in storage will be counted.
+
+
+Ontas
+
+
+OpenPresentBox
+
+
+OperaMask
+
+
+Or, well, both.
+
+
+Orange
+
+
+OrangeBeret
+
+
+OrangeBowlerHat
+
+
+OrangeBowlerHatBrown
+
+
+OrangeCake
+
+
+OrangeContributor
+
+
+OrangeCottonBoots
+
+
+OrangeCottonCloth
+
+
+OrangeCottonGloves
+
+
+OrangeCottonHeadband
+
+
+OrangeCottonShirt
+
+
+OrangeCottonShorts
+
+
+OrangeCottonSkirt
+
+
+OrangeCottonTrousers
+
+
+OrangeCupcake
+
+
+OrangeDesertHat
+
+
+OrangeDye
+
+
+OrangeEggshellHat
+
+
+OrangeFineDress
+
+
+OrangeHint
+
+
+OrangeHitchhikersTowel
+
+
+OrangeLollipop
+
+
+OrangeMiniskirt
+
+
+OrangeRabbitEars
+
+
+OrangeRose
+
+
+OrangeRoseHat
+
+
+OrangeShades
+
+
+OrangeShortTankTop
+
+
+OrangeSilkRobe
+
+
+OrangeSorcererBlack
+
+
+OrangeSorcererDBlue
+
+
+OrangeSorcererDGreen
+
+
+OrangeSorcererGreen
+
+
+OrangeSorcererLBlue
+
+
+OrangeSorcererOrange
+
+
+OrangeSorcererPink
+
+
+OrangeSorcererPurple
+
+
+OrangeSorcererRed
+
+
+OrangeSorcererWhite
+
+
+OrangeSorcererYellow
+
+
+OrangeSummonFlower
+
+
+OrangeTankTop
+
+
+OrangeTulip
+
+
+OrangeTurtleneck
+
+
+OrangeVNeckSweater
+
+
+OrangeWizardHat
+
+
+OrchidBra
+
+
+Orum
+
+
+Orum#barrier
+
+
+Orum#trap
+
+
+Orum's Homunculus
+
+
+OrumDebug
+
+
+Oscar
+
+
+Oskari
+
+
+Osmo
+
+
+Oswal
+
+
+Other
+
+
+Other.
+
+
+OverlordsHelmet
+
+
+PS. Doesn't always work. You need an account at %s and to be at ManaPlus Team.
+
+
+PVPCap
+
+
+PVPCoin
+
+
+Pachua
+
+
+Painless, wasn't it?
+
+
+PaladinsHelmet
+
+
+PanHat
+
+
+PaperBag
+
+
+Parcival
+
+
+Parua
+
+
+Pauline
+
+
+PaulineDebug
+
+
+Pear
+
+
+Pearl
+
+
+Peetu
+
+
+Personal Information
+
+
+Peter
+
+
+Phaet
+
+
+Phaet#arena
+
+
+Phil
+
+
+Phylactery
+
+
+PickledBeets
+
+
+PileOfAsh
+
+
+PilotHat
+
+
+Pink Flower
+
+
+PinkAntenna
+
+
+PinkBeret
+
+
+PinkBowlerHat
+
+
+PinkBowlerHatBrown
+
+
+PinkChristmasSweater
+
+
+PinkContributor
+
+
+PinkCottonBoots
+
+
+PinkCottonCloth
+
+
+PinkCottonGloves
+
+
+PinkCottonHeadband
+
+
+PinkCottonShirt
+
+
+PinkCottonShorts
+
+
+PinkCottonSkirt
+
+
+PinkCottonTrousers
+
+
+PinkDesertHat
+
+
+PinkDye
+
+
+PinkEasterEgg
+
+
+PinkFineDress
+
+
+PinkHitchhikersTowel
+
+
+PinkMiniskirt
+
+
+PinkPetal
+
+
+PinkRabbitEars
+
+
+PinkRose
+
+
+PinkRoseHat
+
+
+PinkShades
+
+
+PinkShortTankTop
+
+
+PinkSilkRobe
+
+
+PinkSorcererBlack
+
+
+PinkSorcererDBlue
+
+
+PinkSorcererDGreen
+
+
+PinkSorcererGreen
+
+
+PinkSorcererLBlue
+
+
+PinkSorcererOrange
+
+
+PinkSorcererPink
+
+
+PinkSorcererPurple
+
+
+PinkSorcererRed
+
+
+PinkSorcererWhite
+
+
+PinkSorcererYellow
+
+
+PinkTankTop
+
+
+PinkTicket
+
+
+PinkTulip
+
+
+PinkTurtleneck
+
+
+PinkVNeckSweater
+
+
+PinkWizardHat
+
+
+Pinkie
+
+
+Pinkie Scroll
+
+
+PinkieHat
+
+
+PinkieHelmet
+
+
+Pipe
+
+
+PirateHat
+
+
+PlatynaRedDress
+
+
+Players Killed in PvP: %s
+
+
+Players breaking the following rules may be banned for any length of time (even permanently) or have their characters reset at a GM's discretion:
+
+
+Please enter the message:
+
+
+Please equip your ammo first!
+
+
+Please insert your pincode.
+
+
+Please leave me in peace.
+
+
+Please select a quest:
+
+
+Please select the desired body type:
+
+
+Please select the interval:
+
+
+Please stand still.
+
+
+Plum
+
+
+PlushMouboo
+
+
+PointyWitchHat
+
+
+Poison Skull
+
+
+Pollett
+
+
+PollettEgg
+
+
+Poltergeist
+
+
+PoltergeistPowder
+
+
+Pot
+
+
+Potions#_M
+
+
+Practice! There are no secrets to becoming a warrior.
+
+
+Present#1
+
+
+Present#2
+
+
+Present#3
+
+
+Psi Brain
+
+
+Pumpkin
+
+
+PumpkinHelmet
+
+
+PumpkinSeeds
+
+
+PurificationPotion
+
+
+PurpleBeret
+
+
+PurpleBowlerHat
+
+
+PurpleBowlerHatBrown
+
+
+PurpleContributor
+
+
+PurpleCottonBoots
+
+
+PurpleCottonCloth
+
+
+PurpleCottonGloves
+
+
+PurpleCottonHeadband
+
+
+PurpleCottonShirt
+
+
+PurpleCottonShorts
+
+
+PurpleCottonSkirt
+
+
+PurpleCottonTrousers
+
+
+PurpleDesertHat
+
+
+PurpleDye
+
+
+PurpleFineDress
+
+
+PurpleHint
+
+
+PurpleHitchhikersTowel
+
+
+PurpleMiniskirt
+
+
+PurplePresentBox
+
+
+PurpleRabbitEars
+
+
+PurpleShades
+
+
+PurpleShortTankTop
+
+
+PurpleSilkRobe
+
+
+PurpleSorcererBlack
+
+
+PurpleSorcererDBlue
+
+
+PurpleSorcererDGreen
+
+
+PurpleSorcererGreen
+
+
+PurpleSorcererLBlue
+
+
+PurpleSorcererOrange
+
+
+PurpleSorcererPink
+
+
+PurpleSorcererPurple
+
+
+PurpleSorcererRed
+
+
+PurpleSorcererWhite
+
+
+PurpleSorcererYellow
+
+
+PurpleStripedWrap
+
+
+PurpleSummonFlower
+
+
+PurpleTankTop
+
+
+PurpleTicket
+
+
+PurpleTulip
+
+
+PurpleTurtleneck
+
+
+PurpleVNeckSweater
+
+
+PurpleWizardHat
+
+
+PurpleWrap
+
+
+Pyry
+
+
+Quest @@ modified by GM
+
+
+Quest debug
+
+
+QuillOfBinding
+
+
+Quit
+
+
+RIP#1
+
+
+RIP#10
+
+
+RIP#2
+
+
+RIP#3
+
+
+RIP#4
+
+
+RIP#5
+
+
+RIP#6
+
+
+RIP#7
+
+
+RIP#8
+
+
+RIP#9
+
+
+RabbitEars
+
+
+RaggedShorts
+
+
+Raging
+
+
+RangerHat
+
+
+Rasin
+
+
+Rauk
+
+
+RawAir
+
+
+RawLog
+
+
+RawTalisman
+
+
+ReadingGlasses
+
+
+RealisticBrain
+
+
+Reaper
+
+
+Reathe
+
+
+Rebecca
+
+
+Receptionist#inn
+
+
+Receptionist#mine
+
+
+Red Bone
+
+
+Red Scorpion
+
+
+Red Slime
+
+
+Red Spark
+
+
+RedApple
+
+
+RedBeret
+
+
+RedBowlerHat
+
+
+RedBowlerHatBrown
+
+
+RedChristmasStocking
+
+
+RedContributor
+
+
+RedCottonBoots
+
+
+RedCottonCloth
+
+
+RedCottonGloves
+
+
+RedCottonHeadband
+
+
+RedCottonShirt
+
+
+RedCottonShorts
+
+
+RedCottonSkirt
+
+
+RedCottonTrousers
+
+
+RedDesertHat
+
+
+RedDottedWrap
+
+
+RedDye
+
+
+RedEasterEgg
+
+
+RedEggshellHat
+
+
+RedFineDress
+
+
+RedGoldenStripedWrap
+
+
+RedHint
+
+
+RedHitchhikersTowel
+
+
+RedMiniskirt
+
+
+RedNose
+
+
+RedOrnament
+
+
+RedPowder
+
+
+RedPresentHat
+
+
+RedRabbitEars
+
+
+RedRose
+
+
+RedRoseHat
+
+
+RedSaddleRug
+
+
+RedScorpionStinger
+
+
+RedShades
+
+
+RedShortTankTop
+
+
+RedSilkRobe
+
+
+RedSorcererBlack
+
+
+RedSorcererDBlue
+
+
+RedSorcererDGreen
+
+
+RedSorcererGreen
+
+
+RedSorcererLBlue
+
+
+RedSorcererOrange
+
+
+RedSorcererPink
+
+
+RedSorcererPurple
+
+
+RedSorcererRed
+
+
+RedSorcererWhite
+
+
+RedSorcererYellow
+
+
+RedStockings
+
+
+RedSummonFlower
+
+
+RedTankTop
+
+
+RedTicket
+
+
+RedTulip
+
+
+RedTurtleneck
+
+
+RedVNeckSweater
+
+
+RedWizardHat
+
+
+ReedBundle
+
+
+Reid's Ghost
+
+
+Reinboo
+
+
+Reino
+
+
+Remember, they're hiding somewhere on the island, you will have to explore to find them. They could be hiding anywhere.
+
+
+Remove all focus skills
+
+
+Repeat how many times?
+
+
+Repeat: @@ times
+
+
+Resist Ailment
+
+
+Return to Super Menu
+
+
+Return to my sister now. I expect that she shall teach thee one more spell.
+
+
+Rhutan the Traveler
+
+
+Richard
+
+
+Rikhard
+
+
+Riskim
+
+
+RoastedAcorn
+
+
+RoastedMaggot
+
+
+Robert
+
+
+RockKnife
+
+
+Root
+
+
+Rosen
+
+
+Rossy
+
+
+RottenRags
+
+
+Rouge#Duels
+
+
+Roulette
+
+
+Rrrr... Pchhhh...
+
+
+RubberBat
+
+
+Ruby
+
+
+RubyPowder
+
+
+RubyRing
+
+
+Rudolph Slime
+
+
+RunestoneA
+
+
+RunestoneL
+
+
+RunestoneN
+
+
+RunestoneT
+
+
+RunestoneW
+
+
+Ryan
+
+
+Rynoh
+
+
+SUSAN
+
+
+Sabine
+
+
+Sabre
+
+
+Sagatha#_M
+
+
+SailorHat
+
+
+Samuel
+
+
+SandCutter
+
+
+Sandra
+
+
+Santa Slime
+
+
+Santa's Helper
+
+
+SantaBeardHat
+
+
+SantaCookie
+
+
+SantaHat
+
+
+SantaSnowGlobe
+
+
+Santaboo
+
+
+Santeri
+
+
+Sapphire
+
+
+SapphirePowder
+
+
+SapphireRing
+
+
+Sara
+
+
+Sarah
+
+
+Sasquatch
+
+
+Savaric
+
+
+SaviorArmor
+
+
+Say %s to make your roots into toxic darts.
+
+
+Saying#wiz
+
+
+ScarabArmlet
+
+
+Scared Man
+
+
+ScentedCandleHelmet
+
+
+Scheduled broadcasts
+
+
+Scheduled broadcasts - Create new
+
+
+Scimitar
+
+
+Scissors
+
+
+Scorpion
+
+
+Scorpion King
+
+
+ScorpionStinger
+
+
+Scythe
+
+
+Sea Slime
+
+
+Sea Slime Mother
+
+
+SealedSoul
+
+
+See you later!
+
+
+See you soon!
+
+
+See you!
+
+
+Selim
+
+
+Sema
+
+
+Send 10 times
+
+
+Send 2 times
+
+
+Send 20 times
+
+
+Send 3 times
+
+
+Send 5 times
+
+
+Send indefinitely
+
+
+Send only once
+
+
+Send this message also on login?
+
+
+Sent on login: @@
+
+
+Sent on login: yes
+
+
+Sent: @@ times out of @@
+
+
+SerfHat
+
+
+Serqet
+
+
+Set a new broadcast
+
+
+Setzer
+
+
+Shannon
+
+
+SharpKnife
+
+
+She hesistates.
+
+
+She looks at you suspiciously.
+
+
+She performs a complicated gesture.
+
+
+She picks up all forty and presses them together in her hands, then whispers something.
+
+
+She smiles at you.
+
+
+She smiles.
+
+
+She takes away her hands and looks up.
+
+
+She walks up to you, holds your shoulders, and smiles at you.
+
+
+She was babbling at me about it all the morning until I sent her to take care of the maggots in the cafe.
+
+
+Sherman the Traveler
+
+
+ShockSweet
+
+
+ShortBow
+
+
+ShortSword
+
+
+ShortTankTop
+
+
+ShroomHat
+
+
+Sign
+
+
+SilkCocoon
+
+
+SilkGloves
+
+
+SilkHeadband
+
+
+SilkPants
+
+
+SilkRobe
+
+
+SilkSheet
+
+
+Silkworm
+
+
+SilverFourLeafAmulet
+
+
+SilverMirror
+
+
+Silvia
+
+
+SimpleRing
+
+
+Skeleton
+
+
+SkeletonCharm
+
+
+Skill can only be cast on party or guild members!
+
+
+Skull
+
+
+SkullMask
+
+
+Sleeping Bandit
+
+
+Slime Blast
+
+
+SlingBullet
+
+
+SlingShot
+
+
+Slots#1
+
+
+Slots#2
+
+
+Slots#3
+
+
+Slots#4
+
+
+Slots#5
+
+
+Slots#6
+
+
+Slots#7
+
+
+SlowPoisonPotion
+
+
+SmallCrack#XmasPassage
+
+
+SmallHealingPotion
+
+
+SmallManaElixir
+
+
+SmallMushroom
+
+
+SmileyCap
+
+
+Snail
+
+
+Snake
+
+
+SnakeEgg
+
+
+SnakeSkin
+
+
+SnakeTongue
+
+
+Snapple
+
+
+Sneaky Bandit
+
+
+SnowGoggles
+
+
+SnowLauncher
+
+
+Snowball
+
+
+Snowman
+
+
+SnowmanSnowGlobe
+
+
+So be it, fellow warrior. Hear the incantation for the blade spell: '%s'
+
+
+So you think you're tough? A warrior must also be loyal and patient.
+
+
+So, have you managed to transmute something?
+
+
+Some forest creatures sometimes overgrow their fur or hide. That makes them uncomfortable.
+
+
+Some of it might jog your memory or at least help you catch your bearings.
+
+
+Something else?
+
+
+Sometimes you just need to run from battle.
+
+
+SorcererBlack
+
+
+SorcererDBlue
+
+
+SorcererDGreen
+
+
+SorcererGreen
+
+
+SorcererLBlue
+
+
+SorcererOrange
+
+
+SorcererPink
+
+
+SorcererPurple
+
+
+SorcererRed
+
+
+SorcererWhite
+
+
+SorcererYellow
+
+
+Sorfina
+
+
+Sorry %%i I am really really REALLY busy right now. Maybe later, when I find my toolset, we can start focusing on something.
+
+
+Soul
+
+
+Soul Eater
+
+
+Soul Menhir
+
+
+Soul Menhir#candor
+
+
+Soul Menhir#deadmire
+
+
+Soul Menhir#hurnscald
+
+
+Soul Menhir#nivalis
+
+
+Soul Menhir#tulimshar
+
+
+Soul Snake
+
+
+Speak '%s' 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.
+
+
+Speak to me again once you've cast the spell.
+
+
+Spear
+
+
+Special monsters are not counted.
+
+
+Spectre
+
+
+SpectrePowder
+
+
+Speed
+
+
+Spell#wiz1
+
+
+Spell#wiz2
+
+
+Spell#wiz3
+
+
+Spell#wiz4
+
+
+Spell#wiz5
+
+
+Spell#wiz6
+
+
+Spell#wiz7
+
+
+Spider
+
+
+Spiky Mushroom
+
+
+Spiky mushrooms often grow too many spikes, so you can shear the spikes off of some.
+
+
+Squirrel
+
+
+SquirrelPelt
+
+
+StaffOfFire
+
+
+StaffOfIce
+
+
+StaffOfLife
+
+
+Stalker
+
+
+StandardHeadband
+
+
+Start broadcasting
+
+
+Start broadcasting, and make an extra broadcast right now
+
+
+Start over
+
+
+Stats: %s
+
+
+Status Condition Cleared
+
+
+Steak
+
+
+SteelShield
+
+
+Stewen
+
+
+StickReinboo
+
+
+Sticking out of the rock is a sword hilt.
+
+
+Stop broadcasting
+
+
+Stop it!
+
+
+Store Policy#1
+
+
+Store Policy#2
+
+
+Strange Stone
+
+
+StrangeCoin
+
+
+Stranger
+
+
+Styx the Traveler
+
+
+Suddenly, you hear a strange, metallic voice in your head, the voice of a woman.
+
+
+SulphurPowder
+
+
+Sunglasses
+
+
+Supply Chest
+
+
+Surprise me!
+
+
+Swashbuckler
+
+
+Swezanne
+
+
+Sword
+
+
+Syntax: @wset <map_mask>
+
+
+TMWBirthdayGift
+
+
+TUTORIAL
+
+
+Taito
+
+
+Take %s arrows, sprinkle sulphur powder over them, and then speak '%s'. Throw them high up in the air, and watch the hail unfold before thy feet.
+
+
+Take a cocoon, living or dead, and suffuse it in magic. Fell the %s, feel its lightness and feel it float! You no longer should be feeling overburned by your stolen goods, kekeke...
+
+
+Take care!
+
+
+Talk to you later!
+
+
+Talk to you soon!
+
+
+Talpan
+
+
+Talponian#Female
+
+
+Talponian#Male
+
+
+TamOShanter
+
+
+Tame Scorpion
+
+
+Tanisha
+
+
+TankTop
+
+
+Tathin
+
+
+Taylor
+
+
+TealEasterEgg
+
+
+TealHint
+
+
+TealHitchhikersTowel
+
+
+Tengu
+
+
+Terranite
+
+
+Terranite Armor#Female
+
+
+Terranite Armor#Male
+
+
+TerraniteArrow
+
+
+TerraniteChestArmor
+
+
+TerraniteHead
+
+
+TerraniteHelmet
+
+
+TerraniteLegs
+
+
+TerraniteOre
+
+
+Teuvo
+
+
+Thank you for using our services. Please accept this little gift.
+
+
+Thanks once again for helping with the monsters in the island.
+
+
+Thanks, @@. We just wanted to be sure it was you.
+
+
+That invocation is '%s'.
+
+
+That would be great!
+
+
+Thats not what I said to do. Please don't skip ahead.
+
+
+The Beheader
+
+
+The Egg cracks open and a living snake comes out of the egg.
+
+
+The Lost
+
+
+The Mana World - Legacy
+
+
+The Witch takes %s and %s and put them togheter calling %s.
+
+
+The Wizard's thank thee as well.
+
+
+The deep basso voice continues.
+
+
+The doctor examines you briefly.
+
+
+The doctor pulls out a syringe and fills it with a white liquid from a jar on his desk.
+
+
+The dresser is empty.
+
+
+The explanations in this tutorial are based on the Manaplus client.
+
+
+The invocation is `%s' followed by the last syllable of the name of the creature you want to shape the log into.
+
+
+The last word on that page is '%s' and it's underlined twice with a comment next to it saying 'finally got it right.'
+
+
+The message cannot be empty
+
+
+The next spell I have will make a normal tank top out of four pieces of cloth. The invocation is '%s', make sure to write this down.
+
+
+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.'
+
+
+The spell consumes a Small Mushroom and a Dark Crystal. Shove the Dark Crystal into the Small Mushroom and yell %s.
+
+
+The spell fails!
+
+
+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.
+
+
+The spell takes a mind of its own backfires!
+
+
+The voice sounds slightly amused.
+
+
+The witch glares at you in anger.
+
+
+The witch's eyes flare up in anger as she notices you, and she turns away from you.
+
+
+The wizard looks at you with despise.
+
+
+The wizard looks at you, his eyes flashing, and laughs diabolically.
+
+
+The wizard takes the crystal and the egg, mumbling something you don't understand. Suddenly, he throws the egg into the air and throws the crystal right through it midair.
+
+
+Then I fear that I shall not reveal the spell to you either.
+
+
+Then I wish thee well in thy travels, wanderer!
+
+
+Then chant the lesser healing spell, '%s', with whoever you wish to heal targeted.
+
+
+Then come back later.
+
+
+Then concentrate your anger upon the trees hereabouts, you will gain experience whilst leveling your sword skill on them.
+
+
+Then please stop wasting my precious time.
+
+
+Then say %s and let the mushroom's power take over. It only works on yourself, party or guild allies.
+
+
+Then tell me the ingredients for the mouboo summoning spell and give them to me. Start with the first ingredient and then tell me the second one separately.
+
+
+Then, she rises up on her tiptoes and kisses you on your forehead.
+
+
+There are %d out of 5 found.
+
+
+There is no answer.
+
+
+There is no honor in fighting a weak opponent.
+
+
+There you are, right as rain! Now you take care, all right?
+
+
+These will do just fine.
+
+
+They call me Sagatha.
+
+
+Thinking well, you will not be able to use it yet; you will first have to gain a greater understanding of magic overall.
+
+
+This error is fatal, we stop execution.
+
+
+This is a wand, there are many like it but this one is now yours.
+
+
+This is not a monster; I cannot use monsterinfo on it.
+
+
+This menu allows you to set the scheduled broadcast that is sent to all players at a specific interval.
+
+
+This menu gives access to quest debug menus for @@ quests.
+
+
+This powder thou shalst need to cast the lightning spell. Throw it up into the air and shout '%s', and smite thine enemies with lightning.
+
+
+This skill can only be used on monsters!
+
+
+This spell makes arrows out of a single wooden log. Its invocation is '%s'.
+
+
+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 and may even injure yourself further.
+
+
+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!
+
+
+Thou hast collected %s Monster Points. For one thousand of them, I shall admit thee to the school of war magic.
+
+
+Thug
+
+
+Thurstan
+
+
+Thurston
+
+
+Tinris
+
+
+TinyHealingPotion
+
+
+TinyManaElixir
+
+
+Tipsy Skeleton
+
+
+To cast a spell open the skill window, select the spell you wish to use, and press the %s button.
+
+
+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.
+
+
+To heal yourself, it's enough to just cast by itself, without a target selected.
+
+
+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.
+
+
+To make a shirt, use the invocation '%s'. This will require five pieces of cloth.
+
+
+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.
+
+
+To summon the snakes use %s.
+
+
+To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.
+
+
+Toggle Focus - Astral Soul
+
+
+Toggle Focus - Brawling
+
+
+Toggle Focus - Mallards Eye
+
+
+Toggle Focus - Raging
+
+
+Toggle Focus - Resist Ailment
+
+
+Toggle Focus - Speed
+
+
+Toichi
+
+
+Tondar
+
+
+Tongue
+
+
+TonoriDelight
+
+
+Toothbrush
+
+
+TopHat
+
+
+Topaz
+
+
+TopazPowder
+
+
+TopazRing
+
+
+Torch#1
+
+
+Torch#2
+
+
+Torch#3
+
+
+Tormenta
+
+
+Total Gold: %s
+
+
+Total deaths: %s
+
+
+Touch it.
+
+
+Towel
+
+
+ToySabre
+
+
+Trader
+
+
+TreasureKey
+
+
+Troll
+
+
+Troupe Leader
+
+
+Trying to control your magic is still rather troublesome.
+
+
+Tulimshar Dock
+
+
+Tulimshar Koga
+
+
+TurquoiseBra
+
+
+Turtleneck
+
+
+TutDebug
+
+
+Umfrey
+
+
+Umm... no... I... I don't remember anything else...
+
+
+Undead Troll
+
+
+Undead Witch
+
+
+UndeadDebug3
+
+
+UndeadDebug4
+
+
+UndeadDebug5
+
+
+UndeadEar
+
+
+UndeadEye
+
+
+UnderworldKey
+
+
+UnderworldMask
+
+
+Unfortunately, that seems to require more magical power than you can use right now. If only the Mana Seed granted you more power...
+
+
+Unfortunately, you can't make out what the transmutation is for or even whether it requires any materials...
+
+
+Unlike lesser heal, it'll heal instantly, however it still cannot help if the person has a serious injury or has been inflicted with an ailment.
+
+
+Urmas
+
+
+Urn
+
+
+Usage of @exprate without argument is deprecated, please use "@rates" instead.
+
+
+Usage: @translate <npc file>
+
+
+Use
+
+
+Use @@ to cancel.
+
+
+VNeckSweater
+
+
+Valdo
+
+
+Valia
+
+
+Valjas
+
+
+Valon
+
+
+ValonDebug
+
+
+Vampire Bat
+
+
+VampireBatWing
+
+
+Various wands and staffs are found throughout the land with many different strengths and weaknesses.
+
+
+VeganWater
+
+
+Vellamo
+
+
+Veneri
+
+
+Verneri
+
+
+Very well then, see you.
+
+
+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.
+
+
+Vicious Squirrel
+
+
+Vincent
+
+
+Vincent Debug
+
+
+Virus
+
+
+Void Archant
+
+
+Void Bat
+
+
+Void Flower
+
+
+Void Maggot
+
+
+Void Mouboo
+
+
+Void Scorpion
+
+
+Void Shroom
+
+
+Void Slime
+
+
+Void Snake
+
+
+Void Soldier
+
+
+Voltain
+
+
+WARNING: If you insert wrong pincode, you'll be disconnected.
+
+
+Waitress
+
+
+Wand
+
+
+Waric
+
+
+Waric nods at you.
+
+
+Waric#trap
+
+
+WarlordBoots
+
+
+WarlordHelmet
+
+
+WarlordPlate
+
+
+Warning#mirak
+
+
+Warning, %d remaining: %s
+
+
+WarpedLog
+
+
+Water Pump
+
+
+We refuse service to anyone who:
+
+
+We will start with an easy one. I will teach you how to summon a wicked mushroom.
+
+
+We've been taking care of you ever since. Waiting for you to wake up."
+
+
+Wedding Officiator
+
+
+WeddingRing
+
+
+Weellos
+
+
+Welcome back, apprentice.
+
+
+Welcome to my prison, mortal!
+
+
+Well
+
+
+Well %s what else can you tell me about yourself?.
+
+
+Well I can tell you some useful things, if you want to hear.
+
+
+Well, I could. However, I am not sure you are trustworthy.
+
+
+Well, either you are going mad, or that sword in the stone is talking to you.
+
+
+Well, well, well! Look at all those green bubbles coming out of your head; that looks like poisoning to me! Did you eat something rotten?
+
+
+What do you want to do with your money?
+
+
+What else do you need?
+
+
+What is it is that brings thee to this place?
+
+
+What is my current hairstyle and hair color?
+
+
+What would you like me to do?
+
+
+What're you looking at?!
+
+
+What's your race?
+
+
+Whatever the reason, she doesn't seem to like you.
+
+
+Which language do you speak?
+
+
+White Bell
+
+
+White Slime
+
+
+WhiteBellTuber
+
+
+WhiteBlanket
+
+
+WhiteCake
+
+
+WhiteCowboyHat
+
+
+WhiteEvokersRobeBlue
+
+
+WhiteFur
+
+
+WhiteHitchhikersTowel
+
+
+WhitePresentBox
+
+
+WhiteRose
+
+
+WhiteRoseHat
+
+
+WhiteSaddleRug
+
+
+WhiteSummonFlower
+
+
+WhiteTulip
+
+
+WhiteWizardRobe
+
+
+WhiteWrap
+
+
+Why are you wasting my time? Come back when you got everything I need.
+
+
+Wicked Mushroom
+
+
+Wight
+
+
+WinterGloves
+
+
+Wisp
+
+
+WispPowder
+
+
+Witch Guard
+
+
+WitchDoctorsMask
+
+
+WitchHat
+
+
+Withdraw.
+
+
+WizardHat
+
+
+Wolfgang
+
+
+Wolvern
+
+
+WolvernPelt
+
+
+WolvernTooth
+
+
+WoodenShield
+
+
+WoodenStaff
+
+
+WraithHorn
+
+
+WumpusEgg
+
+
+Wyara is the Hurnscald town witch. She was also the town healer before the Doctor moved there.
+
+
+Wyara the Witch
+
+
+Wyara#_M
+
+
+Xakelbael
+
+
+XmasCake
+
+
+XmasCandyCane
+
+
+XmasDebug#1
+
+
+XmasDebug#2
+
+
+XmasDebug#3
+
+
+XmasDebug#4
+
+
+XmasSpawnCounter#0
+
+
+XmasSpawnCounter#1
+
+
+XmasSpawnCounter#2
+
+
+XmasSpawnManager
+
+
+YOU CAN FEEL THE POWER FLOWING TROUGH YOU.
+
+
+YOU WERE BLESSED BY JESUSALVA
+
+
+Yalina
+
+
+Yanis
+
+
+Yarr arr!
+
+
+Yeah, and she's done with the maggots.
+
+
+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.
+
+
+Yellow Slime
+
+
+YellowBeret
+
+
+YellowBowlerHat
+
+
+YellowBowlerHatBrown
+
+
+YellowContributor
+
+
+YellowCottonBoots
+
+
+YellowCottonCloth
+
+
+YellowCottonGloves
+
+
+YellowCottonHeadband
+
+
+YellowCottonShirt
+
+
+YellowCottonShorts
+
+
+YellowCottonSkirt
+
+
+YellowCottonTrousers
+
+
+YellowDesertHat
+
+
+YellowDottedWrap
+
+
+YellowDye
+
+
+YellowEasterEgg
+
+
+YellowEggshellHat
+
+
+YellowFineDress
+
+
+YellowHint
+
+
+YellowHitchhikersTowel
+
+
+YellowMiniskirt
+
+
+YellowOrnament
+
+
+YellowPowder
+
+
+YellowPresentBox
+
+
+YellowPresentHat
+
+
+YellowRabbitEars
+
+
+YellowRose
+
+
+YellowRoseHat
+
+
+YellowShades
+
+
+YellowShortTankTop
+
+
+YellowSilkRobe
+
+
+YellowSorcererBlack
+
+
+YellowSorcererDBlue
+
+
+YellowSorcererDGreen
+
+
+YellowSorcererGreen
+
+
+YellowSorcererLBlue
+
+
+YellowSorcererOrange
+
+
+YellowSorcererPink
+
+
+YellowSorcererPurple
+
+
+YellowSorcererRed
+
+
+YellowSorcererWhite
+
+
+YellowSorcererYellow
+
+
+YellowSummonFlower
+
+
+YellowTankTop
+
+
+YellowTicket
+
+
+YellowTulip
+
+
+YellowTurtleneck
+
+
+YellowVNeckSweater
+
+
+YellowWizardHat
+
+
+YellowWrap
+
+
+Yerrnk
+
+
+Yes
+
+
+Yes, I helped her with the maggots.
+
+
+Yes, of course.
+
+
+Yes.
+
+
+Yeti
+
+
+YetiClaw
+
+
+YetiMask
+
+
+YetiSkinShirt
+
+
+You are already a student of Sagatha. I will not teach you anything!
+
+
+You are making progress, but you still need more practice.
+
+
+You are missing required items.
+
+
+You are still at the beginning of your path, but do keep practicing.
+
+
+You can also manually stop it at any time with: @droprate default
+
+
+You can also manually stop it at any time with: @exprate default
+
+
+You can call fluffies, too. But for them you must call out '%s' instead, with white fluffy fur instead of a spike. And don't forget the root.
+
+
+You can harden your skin with a hard spike. Hold it in your hands and speak '%s', then draw its hardness into your skin, or the skin of someone's else.
+
+
+You can help them with shearing magic. Press your hands together and say '%s'. Then touch them with your hands, and brush off any excess.
+
+
+You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.
+
+
+You can turn the log into a wooden figurine by imagining the creature whose shape you want in your head and saying `%s' followed by the last syllable of the name of the creature you want to shape it into.
+
+
+You can't make out anything else of value, so you place the manuscript back in the bookshelf.
+
+
+You cannot complete the casting correctly!
+
+
+You currently have @@ GP on your bank account.
+
+
+You didn't have any possessions on you when we found you and no one knows who you are.
+
+
+You do not have enough %s (min %d)
+
+
+You do not have enough Gold Pieces on your bank account.
+
+
+You do not have enough Gold on yourself.
+
+
+You do not have suffice magic power to make rain.
+
+
+You don't have enough magical power to learn the next healing spell yet.
+
+
+You don't look too well; let me treat your wounds.
+
+
+You feel a strange, tingling kind of warmth spread through your body.
+
+
+You feel completely overwhelmed by your magic.
+
+
+You feel in almost perfect control of your magic.
+
+
+You feel mostly in control of your magic.
+
+
+You feel quite in control of your magic.
+
+
+You feel quite overwhelmed by your magic, but are beginning to see patterns.
+
+
+You feel somewhat in control of your magic.
+
+
+You feel that you have only the bare minimum of control over your magic.
+
+
+You feel that you have very good control of your magic.
+
+
+You feel you still have a few difficulties in controlling your magic.
+
+
+You found %d out of 5 us.
+
+
+You have made good progress, but please do continue in your efforts.
+
+
+You have made good progress, but you lack the magical power to advance further. Also, I would like to observe you some more to be certain that you will make a good healer.
+
+
+You look fantastic.
+
+
+You made a cash deposit of @@ GP.
+
+
+You may find that you can transmute the powder more effectively after a while; that is perfectly natural.
+
+
+You must have been thrown off one of the ships sailing during that last tremor."
+
+
+You must practice more first.
+
+
+You need a Dagger, Sharp Knife or Knife to use!
+
+
+You need at least %d %s to use this spell!
+
+
+You need more room in your inventory.
+
+
+You need to be carrying less weight.
+
+
+You need to kill %s: %d/%d.
+
+
+You open your eyes.
+
+
+You see a girl who is holding her hands in front of her face.
+
+
+You seem to be ready to advance as a healer. There is one favor I must ask of you first, though.
+
+
+You should be more careful.
+
+
+You should come back when you have some free space.
+
+
+You should get dressed now.
+
+
+You still need to find some of my friends. You have found %d out of 5 of my friends.
+
+
+You successfully set the drop rate to @@%. It will reset to @@% (default value) in @@.
+
+
+You successfully set the exp rate to @@%. It will reset to @@% (default value) in @@.
+
+
+You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the dresser.
+
+
+You were permanently banned by the GM Team.
+
+
+You withdrew a total of @@ GP.
+
+
+Young Man
+
+
+Your GM level is now hidden.
+
+
+Your GM level is now visible.
+
+
+Your hairstyle is @@ and its color is @@.
+
+
+Your magic takes a mind of its own!
+
+
+Zack
+
+
+ZaxDeKagen
+
+
+Zegas
+
+
+ZegasDebug
+
+
+Zitoni
+
+
+Zombie
+
+
+ZombieNachos
+
+
+Zzzzzzzzz...
+
+
+_N-Pumpkin
+
+
+a ground!
+
+
+a quiet place,
+
+
+fifteen
+
+
+no
+
+
+no active broadcast
+
+
+sign#pvp-1
+
+
+sign#pvp-2
+
+
+specialMob027-3
+
+
+specialMob027-4
+
+
+yes
+
+
+• Can't walk without stopping after every step
+
+
+• Has a bubblehead
+
+
+• Is not properly shaded
+
+
diff --git a/langs/langs.txt b/langs/langs.txt
new file mode 100644
index 00000000..89b61386
--- /dev/null
+++ b/langs/langs.txt
@@ -0,0 +1,5 @@
+en
+pt_BR
+fr
+de
+es
diff --git a/log/.placeholder b/log/.placeholder
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/log/.placeholder
diff --git a/maps/pre-re/000-1.mcache b/maps/pre-re/000-1.mcache
new file mode 100644
index 00000000..cbf96b68
--- /dev/null
+++ b/maps/pre-re/000-1.mcache
Binary files differ
diff --git a/maps/pre-re/001-1.mcache b/maps/pre-re/001-1.mcache
new file mode 100644
index 00000000..1860cbe1
--- /dev/null
+++ b/maps/pre-re/001-1.mcache
Binary files differ
diff --git a/maps/pre-re/001-2.mcache b/maps/pre-re/001-2.mcache
new file mode 100644
index 00000000..66e2394b
--- /dev/null
+++ b/maps/pre-re/001-2.mcache
Binary files differ
diff --git a/maps/pre-re/001-3.mcache b/maps/pre-re/001-3.mcache
new file mode 100644
index 00000000..234d6146
--- /dev/null
+++ b/maps/pre-re/001-3.mcache
Binary files differ
diff --git a/maps/pre-re/002-1.mcache b/maps/pre-re/002-1.mcache
new file mode 100644
index 00000000..a471eb01
--- /dev/null
+++ b/maps/pre-re/002-1.mcache
Binary files differ
diff --git a/maps/pre-re/002-2.mcache b/maps/pre-re/002-2.mcache
new file mode 100644
index 00000000..46c02ca9
--- /dev/null
+++ b/maps/pre-re/002-2.mcache
Binary files differ
diff --git a/maps/pre-re/002-3.mcache b/maps/pre-re/002-3.mcache
new file mode 100644
index 00000000..cf69442a
--- /dev/null
+++ b/maps/pre-re/002-3.mcache
Binary files differ
diff --git a/maps/pre-re/002-4.mcache b/maps/pre-re/002-4.mcache
new file mode 100644
index 00000000..99534939
--- /dev/null
+++ b/maps/pre-re/002-4.mcache
Binary files differ
diff --git a/maps/pre-re/002-5.mcache b/maps/pre-re/002-5.mcache
new file mode 100644
index 00000000..965ad00a
--- /dev/null
+++ b/maps/pre-re/002-5.mcache
Binary files differ
diff --git a/maps/pre-re/003-1.mcache b/maps/pre-re/003-1.mcache
new file mode 100644
index 00000000..a42d8fa2
--- /dev/null
+++ b/maps/pre-re/003-1.mcache
Binary files differ
diff --git a/maps/pre-re/003-4.mcache b/maps/pre-re/003-4.mcache
new file mode 100644
index 00000000..4f609783
--- /dev/null
+++ b/maps/pre-re/003-4.mcache
Binary files differ
diff --git a/maps/pre-re/004-1.mcache b/maps/pre-re/004-1.mcache
new file mode 100644
index 00000000..dcfc3e7d
--- /dev/null
+++ b/maps/pre-re/004-1.mcache
Binary files differ
diff --git a/maps/pre-re/004-3.mcache b/maps/pre-re/004-3.mcache
new file mode 100644
index 00000000..e8953577
--- /dev/null
+++ b/maps/pre-re/004-3.mcache
Binary files differ
diff --git a/maps/pre-re/004-4.mcache b/maps/pre-re/004-4.mcache
new file mode 100644
index 00000000..303c2d95
--- /dev/null
+++ b/maps/pre-re/004-4.mcache
Binary files differ
diff --git a/maps/pre-re/004-5.mcache b/maps/pre-re/004-5.mcache
new file mode 100644
index 00000000..5749c292
--- /dev/null
+++ b/maps/pre-re/004-5.mcache
Binary files differ
diff --git a/maps/pre-re/005-3.mcache b/maps/pre-re/005-3.mcache
new file mode 100644
index 00000000..f0550e57
--- /dev/null
+++ b/maps/pre-re/005-3.mcache
Binary files differ
diff --git a/maps/pre-re/006-1.mcache b/maps/pre-re/006-1.mcache
new file mode 100644
index 00000000..32d90df7
--- /dev/null
+++ b/maps/pre-re/006-1.mcache
Binary files differ
diff --git a/maps/pre-re/006-2.mcache b/maps/pre-re/006-2.mcache
new file mode 100644
index 00000000..e7a8eebf
--- /dev/null
+++ b/maps/pre-re/006-2.mcache
Binary files differ
diff --git a/maps/pre-re/006-3.mcache b/maps/pre-re/006-3.mcache
new file mode 100644
index 00000000..d7b38ec0
--- /dev/null
+++ b/maps/pre-re/006-3.mcache
Binary files differ
diff --git a/maps/pre-re/007-1.mcache b/maps/pre-re/007-1.mcache
new file mode 100644
index 00000000..da9f6439
--- /dev/null
+++ b/maps/pre-re/007-1.mcache
Binary files differ
diff --git a/maps/pre-re/007-2.mcache b/maps/pre-re/007-2.mcache
new file mode 100644
index 00000000..05a68293
--- /dev/null
+++ b/maps/pre-re/007-2.mcache
Binary files differ
diff --git a/maps/pre-re/008-1.mcache b/maps/pre-re/008-1.mcache
new file mode 100644
index 00000000..64509d51
--- /dev/null
+++ b/maps/pre-re/008-1.mcache
Binary files differ
diff --git a/maps/pre-re/009-1.mcache b/maps/pre-re/009-1.mcache
new file mode 100644
index 00000000..c5be8f59
--- /dev/null
+++ b/maps/pre-re/009-1.mcache
Binary files differ
diff --git a/maps/pre-re/009-2.mcache b/maps/pre-re/009-2.mcache
new file mode 100644
index 00000000..9bab56c7
--- /dev/null
+++ b/maps/pre-re/009-2.mcache
Binary files differ
diff --git a/maps/pre-re/009-3.mcache b/maps/pre-re/009-3.mcache
new file mode 100644
index 00000000..3f099b59
--- /dev/null
+++ b/maps/pre-re/009-3.mcache
Binary files differ
diff --git a/maps/pre-re/009-4.mcache b/maps/pre-re/009-4.mcache
new file mode 100644
index 00000000..be239e09
--- /dev/null
+++ b/maps/pre-re/009-4.mcache
Binary files differ
diff --git a/maps/pre-re/009-5.mcache b/maps/pre-re/009-5.mcache
new file mode 100644
index 00000000..15e48843
--- /dev/null
+++ b/maps/pre-re/009-5.mcache
Binary files differ
diff --git a/maps/pre-re/009-6.mcache b/maps/pre-re/009-6.mcache
new file mode 100644
index 00000000..42b73b19
--- /dev/null
+++ b/maps/pre-re/009-6.mcache
Binary files differ
diff --git a/maps/pre-re/009-7.mcache b/maps/pre-re/009-7.mcache
new file mode 100644
index 00000000..7f7c9645
--- /dev/null
+++ b/maps/pre-re/009-7.mcache
Binary files differ
diff --git a/maps/pre-re/009-8.mcache b/maps/pre-re/009-8.mcache
new file mode 100644
index 00000000..3ec0b98a
--- /dev/null
+++ b/maps/pre-re/009-8.mcache
Binary files differ
diff --git a/maps/pre-re/010-1.mcache b/maps/pre-re/010-1.mcache
new file mode 100644
index 00000000..9d0d3917
--- /dev/null
+++ b/maps/pre-re/010-1.mcache
Binary files differ
diff --git a/maps/pre-re/010-2.mcache b/maps/pre-re/010-2.mcache
new file mode 100644
index 00000000..c87be1a1
--- /dev/null
+++ b/maps/pre-re/010-2.mcache
Binary files differ
diff --git a/maps/pre-re/011-1.mcache b/maps/pre-re/011-1.mcache
new file mode 100644
index 00000000..c921a612
--- /dev/null
+++ b/maps/pre-re/011-1.mcache
Binary files differ
diff --git a/maps/pre-re/011-3.mcache b/maps/pre-re/011-3.mcache
new file mode 100644
index 00000000..297c3432
--- /dev/null
+++ b/maps/pre-re/011-3.mcache
Binary files differ
diff --git a/maps/pre-re/011-4.mcache b/maps/pre-re/011-4.mcache
new file mode 100644
index 00000000..fc2f692b
--- /dev/null
+++ b/maps/pre-re/011-4.mcache
Binary files differ
diff --git a/maps/pre-re/011-6.mcache b/maps/pre-re/011-6.mcache
new file mode 100644
index 00000000..f35aa6be
--- /dev/null
+++ b/maps/pre-re/011-6.mcache
Binary files differ
diff --git a/maps/pre-re/012-1.mcache b/maps/pre-re/012-1.mcache
new file mode 100644
index 00000000..b4b5deb9
--- /dev/null
+++ b/maps/pre-re/012-1.mcache
Binary files differ
diff --git a/maps/pre-re/012-3.mcache b/maps/pre-re/012-3.mcache
new file mode 100644
index 00000000..248f9284
--- /dev/null
+++ b/maps/pre-re/012-3.mcache
Binary files differ
diff --git a/maps/pre-re/012-4.mcache b/maps/pre-re/012-4.mcache
new file mode 100644
index 00000000..0c675586
--- /dev/null
+++ b/maps/pre-re/012-4.mcache
Binary files differ
diff --git a/maps/pre-re/013-1.mcache b/maps/pre-re/013-1.mcache
new file mode 100644
index 00000000..e060930c
--- /dev/null
+++ b/maps/pre-re/013-1.mcache
Binary files differ
diff --git a/maps/pre-re/013-2.mcache b/maps/pre-re/013-2.mcache
new file mode 100644
index 00000000..01dc1dfe
--- /dev/null
+++ b/maps/pre-re/013-2.mcache
Binary files differ
diff --git a/maps/pre-re/013-3.mcache b/maps/pre-re/013-3.mcache
new file mode 100644
index 00000000..a6d3fb7d
--- /dev/null
+++ b/maps/pre-re/013-3.mcache
Binary files differ
diff --git a/maps/pre-re/014-1.mcache b/maps/pre-re/014-1.mcache
new file mode 100644
index 00000000..44d8a875
--- /dev/null
+++ b/maps/pre-re/014-1.mcache
Binary files differ
diff --git a/maps/pre-re/014-3.mcache b/maps/pre-re/014-3.mcache
new file mode 100644
index 00000000..48686053
--- /dev/null
+++ b/maps/pre-re/014-3.mcache
Binary files differ
diff --git a/maps/pre-re/015-1.mcache b/maps/pre-re/015-1.mcache
new file mode 100644
index 00000000..823e0b0a
--- /dev/null
+++ b/maps/pre-re/015-1.mcache
Binary files differ
diff --git a/maps/pre-re/015-3.mcache b/maps/pre-re/015-3.mcache
new file mode 100644
index 00000000..10f22c54
--- /dev/null
+++ b/maps/pre-re/015-3.mcache
Binary files differ
diff --git a/maps/pre-re/016-1.mcache b/maps/pre-re/016-1.mcache
new file mode 100644
index 00000000..4ccb5482
--- /dev/null
+++ b/maps/pre-re/016-1.mcache
Binary files differ
diff --git a/maps/pre-re/016-2.mcache b/maps/pre-re/016-2.mcache
new file mode 100644
index 00000000..a2dc2b29
--- /dev/null
+++ b/maps/pre-re/016-2.mcache
Binary files differ
diff --git a/maps/pre-re/017-1.mcache b/maps/pre-re/017-1.mcache
new file mode 100644
index 00000000..4b091deb
--- /dev/null
+++ b/maps/pre-re/017-1.mcache
Binary files differ
diff --git a/maps/pre-re/017-2.mcache b/maps/pre-re/017-2.mcache
new file mode 100644
index 00000000..a6cec5f9
--- /dev/null
+++ b/maps/pre-re/017-2.mcache
Binary files differ
diff --git a/maps/pre-re/017-3.mcache b/maps/pre-re/017-3.mcache
new file mode 100644
index 00000000..c2e0057d
--- /dev/null
+++ b/maps/pre-re/017-3.mcache
Binary files differ
diff --git a/maps/pre-re/017-4.mcache b/maps/pre-re/017-4.mcache
new file mode 100644
index 00000000..1ac8b6cb
--- /dev/null
+++ b/maps/pre-re/017-4.mcache
Binary files differ
diff --git a/maps/pre-re/017-9.mcache b/maps/pre-re/017-9.mcache
new file mode 100644
index 00000000..c00ba6a9
--- /dev/null
+++ b/maps/pre-re/017-9.mcache
Binary files differ
diff --git a/maps/pre-re/018-1.mcache b/maps/pre-re/018-1.mcache
new file mode 100644
index 00000000..d867b071
--- /dev/null
+++ b/maps/pre-re/018-1.mcache
Binary files differ
diff --git a/maps/pre-re/018-2.mcache b/maps/pre-re/018-2.mcache
new file mode 100644
index 00000000..793426ab
--- /dev/null
+++ b/maps/pre-re/018-2.mcache
Binary files differ
diff --git a/maps/pre-re/018-3.mcache b/maps/pre-re/018-3.mcache
new file mode 100644
index 00000000..3bc52f01
--- /dev/null
+++ b/maps/pre-re/018-3.mcache
Binary files differ
diff --git a/maps/pre-re/019-1.mcache b/maps/pre-re/019-1.mcache
new file mode 100644
index 00000000..33652144
--- /dev/null
+++ b/maps/pre-re/019-1.mcache
Binary files differ
diff --git a/maps/pre-re/019-3.mcache b/maps/pre-re/019-3.mcache
new file mode 100644
index 00000000..22255c48
--- /dev/null
+++ b/maps/pre-re/019-3.mcache
Binary files differ
diff --git a/maps/pre-re/019-4.mcache b/maps/pre-re/019-4.mcache
new file mode 100644
index 00000000..81bf7644
--- /dev/null
+++ b/maps/pre-re/019-4.mcache
Binary files differ
diff --git a/maps/pre-re/020-1.mcache b/maps/pre-re/020-1.mcache
new file mode 100644
index 00000000..1f666f13
--- /dev/null
+++ b/maps/pre-re/020-1.mcache
Binary files differ
diff --git a/maps/pre-re/020-2.mcache b/maps/pre-re/020-2.mcache
new file mode 100644
index 00000000..16f29dfa
--- /dev/null
+++ b/maps/pre-re/020-2.mcache
Binary files differ
diff --git a/maps/pre-re/020-3.mcache b/maps/pre-re/020-3.mcache
new file mode 100644
index 00000000..b96e7d58
--- /dev/null
+++ b/maps/pre-re/020-3.mcache
Binary files differ
diff --git a/maps/pre-re/021-3.mcache b/maps/pre-re/021-3.mcache
new file mode 100644
index 00000000..6d4bfcc4
--- /dev/null
+++ b/maps/pre-re/021-3.mcache
Binary files differ
diff --git a/maps/pre-re/023-1.mcache b/maps/pre-re/023-1.mcache
new file mode 100644
index 00000000..ffbc17f7
--- /dev/null
+++ b/maps/pre-re/023-1.mcache
Binary files differ
diff --git a/maps/pre-re/023-2.mcache b/maps/pre-re/023-2.mcache
new file mode 100644
index 00000000..02f650c0
--- /dev/null
+++ b/maps/pre-re/023-2.mcache
Binary files differ
diff --git a/maps/pre-re/023-3.mcache b/maps/pre-re/023-3.mcache
new file mode 100644
index 00000000..455b6556
--- /dev/null
+++ b/maps/pre-re/023-3.mcache
Binary files differ
diff --git a/maps/pre-re/025-1.mcache b/maps/pre-re/025-1.mcache
new file mode 100644
index 00000000..2fec541a
--- /dev/null
+++ b/maps/pre-re/025-1.mcache
Binary files differ
diff --git a/maps/pre-re/025-3.mcache b/maps/pre-re/025-3.mcache
new file mode 100644
index 00000000..ee46ff8f
--- /dev/null
+++ b/maps/pre-re/025-3.mcache
Binary files differ
diff --git a/maps/pre-re/025-4.mcache b/maps/pre-re/025-4.mcache
new file mode 100644
index 00000000..9c4cc0fa
--- /dev/null
+++ b/maps/pre-re/025-4.mcache
Binary files differ
diff --git a/maps/pre-re/026-1.mcache b/maps/pre-re/026-1.mcache
new file mode 100644
index 00000000..931044df
--- /dev/null
+++ b/maps/pre-re/026-1.mcache
Binary files differ
diff --git a/maps/pre-re/026-2.mcache b/maps/pre-re/026-2.mcache
new file mode 100644
index 00000000..c554a23e
--- /dev/null
+++ b/maps/pre-re/026-2.mcache
Binary files differ
diff --git a/maps/pre-re/027-1.mcache b/maps/pre-re/027-1.mcache
new file mode 100644
index 00000000..3c9fa219
--- /dev/null
+++ b/maps/pre-re/027-1.mcache
Binary files differ
diff --git a/maps/pre-re/027-2.mcache b/maps/pre-re/027-2.mcache
new file mode 100644
index 00000000..282acff5
--- /dev/null
+++ b/maps/pre-re/027-2.mcache
Binary files differ
diff --git a/maps/pre-re/027-3.mcache b/maps/pre-re/027-3.mcache
new file mode 100644
index 00000000..7d2d1ee9
--- /dev/null
+++ b/maps/pre-re/027-3.mcache
Binary files differ
diff --git a/maps/pre-re/027-4.mcache b/maps/pre-re/027-4.mcache
new file mode 100644
index 00000000..08cef53e
--- /dev/null
+++ b/maps/pre-re/027-4.mcache
Binary files differ
diff --git a/maps/pre-re/027-5.mcache b/maps/pre-re/027-5.mcache
new file mode 100644
index 00000000..7ad99af0
--- /dev/null
+++ b/maps/pre-re/027-5.mcache
Binary files differ
diff --git a/maps/pre-re/027-6.mcache b/maps/pre-re/027-6.mcache
new file mode 100644
index 00000000..ffa13651
--- /dev/null
+++ b/maps/pre-re/027-6.mcache
Binary files differ
diff --git a/maps/pre-re/027-7.mcache b/maps/pre-re/027-7.mcache
new file mode 100644
index 00000000..d3075cc6
--- /dev/null
+++ b/maps/pre-re/027-7.mcache
Binary files differ
diff --git a/maps/pre-re/027-8.mcache b/maps/pre-re/027-8.mcache
new file mode 100644
index 00000000..9c2b5544
--- /dev/null
+++ b/maps/pre-re/027-8.mcache
Binary files differ
diff --git a/maps/pre-re/028-1.mcache b/maps/pre-re/028-1.mcache
new file mode 100644
index 00000000..80e6c7e3
--- /dev/null
+++ b/maps/pre-re/028-1.mcache
Binary files differ
diff --git a/maps/pre-re/028-3.mcache b/maps/pre-re/028-3.mcache
new file mode 100644
index 00000000..13d1cd74
--- /dev/null
+++ b/maps/pre-re/028-3.mcache
Binary files differ
diff --git a/maps/pre-re/029-1.mcache b/maps/pre-re/029-1.mcache
new file mode 100644
index 00000000..4e12c45c
--- /dev/null
+++ b/maps/pre-re/029-1.mcache
Binary files differ
diff --git a/maps/pre-re/029-2.mcache b/maps/pre-re/029-2.mcache
new file mode 100644
index 00000000..e6914819
--- /dev/null
+++ b/maps/pre-re/029-2.mcache
Binary files differ
diff --git a/maps/pre-re/029-3.mcache b/maps/pre-re/029-3.mcache
new file mode 100644
index 00000000..f0c5e20e
--- /dev/null
+++ b/maps/pre-re/029-3.mcache
Binary files differ
diff --git a/maps/pre-re/029-4.mcache b/maps/pre-re/029-4.mcache
new file mode 100644
index 00000000..94dbc60f
--- /dev/null
+++ b/maps/pre-re/029-4.mcache
Binary files differ
diff --git a/maps/pre-re/030-1.mcache b/maps/pre-re/030-1.mcache
new file mode 100644
index 00000000..49b0186c
--- /dev/null
+++ b/maps/pre-re/030-1.mcache
Binary files differ
diff --git a/maps/pre-re/030-2.mcache b/maps/pre-re/030-2.mcache
new file mode 100644
index 00000000..174d1ab3
--- /dev/null
+++ b/maps/pre-re/030-2.mcache
Binary files differ
diff --git a/maps/pre-re/030-3.mcache b/maps/pre-re/030-3.mcache
new file mode 100644
index 00000000..dacc127b
--- /dev/null
+++ b/maps/pre-re/030-3.mcache
Binary files differ
diff --git a/maps/pre-re/030-4.mcache b/maps/pre-re/030-4.mcache
new file mode 100644
index 00000000..c58411ac
--- /dev/null
+++ b/maps/pre-re/030-4.mcache
Binary files differ
diff --git a/maps/pre-re/031-1.mcache b/maps/pre-re/031-1.mcache
new file mode 100644
index 00000000..00c3aa24
--- /dev/null
+++ b/maps/pre-re/031-1.mcache
Binary files differ
diff --git a/maps/pre-re/031-2.mcache b/maps/pre-re/031-2.mcache
new file mode 100644
index 00000000..32587b74
--- /dev/null
+++ b/maps/pre-re/031-2.mcache
Binary files differ
diff --git a/maps/pre-re/031-3.mcache b/maps/pre-re/031-3.mcache
new file mode 100644
index 00000000..89b9cacd
--- /dev/null
+++ b/maps/pre-re/031-3.mcache
Binary files differ
diff --git a/maps/pre-re/031-4.mcache b/maps/pre-re/031-4.mcache
new file mode 100644
index 00000000..837a8021
--- /dev/null
+++ b/maps/pre-re/031-4.mcache
Binary files differ
diff --git a/maps/pre-re/032-3.mcache b/maps/pre-re/032-3.mcache
new file mode 100644
index 00000000..a4b4559a
--- /dev/null
+++ b/maps/pre-re/032-3.mcache
Binary files differ
diff --git a/maps/pre-re/033-1.mcache b/maps/pre-re/033-1.mcache
new file mode 100644
index 00000000..9e472074
--- /dev/null
+++ b/maps/pre-re/033-1.mcache
Binary files differ
diff --git a/maps/pre-re/034-1.mcache b/maps/pre-re/034-1.mcache
new file mode 100644
index 00000000..56710753
--- /dev/null
+++ b/maps/pre-re/034-1.mcache
Binary files differ
diff --git a/maps/pre-re/034-2.mcache b/maps/pre-re/034-2.mcache
new file mode 100644
index 00000000..ec77237f
--- /dev/null
+++ b/maps/pre-re/034-2.mcache
Binary files differ
diff --git a/maps/pre-re/035-2.mcache b/maps/pre-re/035-2.mcache
new file mode 100644
index 00000000..d41ba3d4
--- /dev/null
+++ b/maps/pre-re/035-2.mcache
Binary files differ
diff --git a/maps/pre-re/036-2.mcache b/maps/pre-re/036-2.mcache
new file mode 100644
index 00000000..d41ba3d4
--- /dev/null
+++ b/maps/pre-re/036-2.mcache
Binary files differ
diff --git a/maps/pre-re/041-1.mcache b/maps/pre-re/041-1.mcache
new file mode 100644
index 00000000..dc04e171
--- /dev/null
+++ b/maps/pre-re/041-1.mcache
Binary files differ
diff --git a/maps/pre-re/042-1.mcache b/maps/pre-re/042-1.mcache
new file mode 100644
index 00000000..b6551444
--- /dev/null
+++ b/maps/pre-re/042-1.mcache
Binary files differ
diff --git a/maps/pre-re/043-1.mcache b/maps/pre-re/043-1.mcache
new file mode 100644
index 00000000..5c81d4d7
--- /dev/null
+++ b/maps/pre-re/043-1.mcache
Binary files differ
diff --git a/maps/pre-re/043-3.mcache b/maps/pre-re/043-3.mcache
new file mode 100644
index 00000000..e1dd1843
--- /dev/null
+++ b/maps/pre-re/043-3.mcache
Binary files differ
diff --git a/maps/pre-re/043-4.mcache b/maps/pre-re/043-4.mcache
new file mode 100644
index 00000000..d14f491f
--- /dev/null
+++ b/maps/pre-re/043-4.mcache
Binary files differ
diff --git a/maps/pre-re/045-1.mcache b/maps/pre-re/045-1.mcache
new file mode 100644
index 00000000..e0c82063
--- /dev/null
+++ b/maps/pre-re/045-1.mcache
Binary files differ
diff --git a/maps/pre-re/046-1.mcache b/maps/pre-re/046-1.mcache
new file mode 100644
index 00000000..1065b7df
--- /dev/null
+++ b/maps/pre-re/046-1.mcache
Binary files differ
diff --git a/maps/pre-re/046-3.mcache b/maps/pre-re/046-3.mcache
new file mode 100644
index 00000000..dace7565
--- /dev/null
+++ b/maps/pre-re/046-3.mcache
Binary files differ
diff --git a/maps/pre-re/047-1.mcache b/maps/pre-re/047-1.mcache
new file mode 100644
index 00000000..237c07c7
--- /dev/null
+++ b/maps/pre-re/047-1.mcache
Binary files differ
diff --git a/maps/pre-re/047-3.mcache b/maps/pre-re/047-3.mcache
new file mode 100644
index 00000000..0647120d
--- /dev/null
+++ b/maps/pre-re/047-3.mcache
Binary files differ
diff --git a/maps/pre-re/048-2.mcache b/maps/pre-re/048-2.mcache
new file mode 100644
index 00000000..a66d4722
--- /dev/null
+++ b/maps/pre-re/048-2.mcache
Binary files differ
diff --git a/maps/pre-re/051-1.mcache b/maps/pre-re/051-1.mcache
new file mode 100644
index 00000000..4ccc14d5
--- /dev/null
+++ b/maps/pre-re/051-1.mcache
Binary files differ
diff --git a/maps/pre-re/051-3.mcache b/maps/pre-re/051-3.mcache
new file mode 100644
index 00000000..d21013f3
--- /dev/null
+++ b/maps/pre-re/051-3.mcache
Binary files differ
diff --git a/maps/pre-re/052-1.mcache b/maps/pre-re/052-1.mcache
new file mode 100644
index 00000000..047f60ee
--- /dev/null
+++ b/maps/pre-re/052-1.mcache
Binary files differ
diff --git a/maps/pre-re/052-2.mcache b/maps/pre-re/052-2.mcache
new file mode 100644
index 00000000..53f2f4b9
--- /dev/null
+++ b/maps/pre-re/052-2.mcache
Binary files differ
diff --git a/maps/pre-re/055-1.mcache b/maps/pre-re/055-1.mcache
new file mode 100644
index 00000000..c40d664b
--- /dev/null
+++ b/maps/pre-re/055-1.mcache
Binary files differ
diff --git a/maps/pre-re/055-3.mcache b/maps/pre-re/055-3.mcache
new file mode 100644
index 00000000..102b3550
--- /dev/null
+++ b/maps/pre-re/055-3.mcache
Binary files differ
diff --git a/maps/pre-re/056-2.mcache b/maps/pre-re/056-2.mcache
new file mode 100644
index 00000000..fe2271c5
--- /dev/null
+++ b/maps/pre-re/056-2.mcache
Binary files differ
diff --git a/maps/pre-re/057-1.mcache b/maps/pre-re/057-1.mcache
new file mode 100644
index 00000000..1ddb9c67
--- /dev/null
+++ b/maps/pre-re/057-1.mcache
Binary files differ
diff --git a/maps/pre-re/069-2.mcache b/maps/pre-re/069-2.mcache
new file mode 100644
index 00000000..46c84bd8
--- /dev/null
+++ b/maps/pre-re/069-2.mcache
Binary files differ
diff --git a/maps/pre-re/070-1.mcache b/maps/pre-re/070-1.mcache
new file mode 100644
index 00000000..822ae875
--- /dev/null
+++ b/maps/pre-re/070-1.mcache
Binary files differ
diff --git a/maps/pre-re/070-3.mcache b/maps/pre-re/070-3.mcache
new file mode 100644
index 00000000..112929ed
--- /dev/null
+++ b/maps/pre-re/070-3.mcache
Binary files differ
diff --git a/maps/pre-re/099-1.mcache b/maps/pre-re/099-1.mcache
new file mode 100644
index 00000000..20d03357
--- /dev/null
+++ b/maps/pre-re/099-1.mcache
Binary files differ
diff --git a/maps/pre-re/099-2.mcache b/maps/pre-re/099-2.mcache
new file mode 100644
index 00000000..ac59ae30
--- /dev/null
+++ b/maps/pre-re/099-2.mcache
Binary files differ
diff --git a/maps/pre-re/099-3.mcache b/maps/pre-re/099-3.mcache
new file mode 100644
index 00000000..8293b732
--- /dev/null
+++ b/maps/pre-re/099-3.mcache
Binary files differ
diff --git a/maps/pre-re/099-4.mcache b/maps/pre-re/099-4.mcache
new file mode 100644
index 00000000..2272bb8e
--- /dev/null
+++ b/maps/pre-re/099-4.mcache
Binary files differ
diff --git a/maps/pre-re/099-5.mcache b/maps/pre-re/099-5.mcache
new file mode 100644
index 00000000..2272bb8e
--- /dev/null
+++ b/maps/pre-re/099-5.mcache
Binary files differ
diff --git a/maps/pre-re/099-6.mcache b/maps/pre-re/099-6.mcache
new file mode 100644
index 00000000..c1406542
--- /dev/null
+++ b/maps/pre-re/099-6.mcache
Binary files differ
diff --git a/maps/pre-re/099-7.mcache b/maps/pre-re/099-7.mcache
new file mode 100644
index 00000000..90ee6e35
--- /dev/null
+++ b/maps/pre-re/099-7.mcache
Binary files differ
diff --git a/maps/pre-re/099-8.mcache b/maps/pre-re/099-8.mcache
new file mode 100644
index 00000000..21890ea5
--- /dev/null
+++ b/maps/pre-re/099-8.mcache
Binary files differ
diff --git a/maps/pre-re/botcheck.mcache b/maps/pre-re/botcheck.mcache
new file mode 100644
index 00000000..14f52d73
--- /dev/null
+++ b/maps/pre-re/botcheck.mcache
Binary files differ
diff --git a/maps/pre-re/fermi.mcache b/maps/pre-re/fermi.mcache
new file mode 100644
index 00000000..949c4a62
--- /dev/null
+++ b/maps/pre-re/fermi.mcache
Binary files differ
diff --git a/maps/pre-re/sec_pri.mcache b/maps/pre-re/sec_pri.mcache
new file mode 100644
index 00000000..b6f9e7d8
--- /dev/null
+++ b/maps/pre-re/sec_pri.mcache
Binary files differ
diff --git a/maps/re/001-1.mcache b/maps/re/001-1.mcache
new file mode 100644
index 00000000..b5507d5f
--- /dev/null
+++ b/maps/re/001-1.mcache
Binary files differ
diff --git a/maps/re/001-2.mcache b/maps/re/001-2.mcache
new file mode 100644
index 00000000..66e2394b
--- /dev/null
+++ b/maps/re/001-2.mcache
Binary files differ
diff --git a/maps/re/001-3.mcache b/maps/re/001-3.mcache
new file mode 100644
index 00000000..234d6146
--- /dev/null
+++ b/maps/re/001-3.mcache
Binary files differ
diff --git a/maps/re/002-1.mcache b/maps/re/002-1.mcache
new file mode 100644
index 00000000..a471eb01
--- /dev/null
+++ b/maps/re/002-1.mcache
Binary files differ
diff --git a/maps/re/002-2.mcache b/maps/re/002-2.mcache
new file mode 100644
index 00000000..46c02ca9
--- /dev/null
+++ b/maps/re/002-2.mcache
Binary files differ
diff --git a/maps/re/002-3.mcache b/maps/re/002-3.mcache
new file mode 100644
index 00000000..cf69442a
--- /dev/null
+++ b/maps/re/002-3.mcache
Binary files differ
diff --git a/maps/re/002-4.mcache b/maps/re/002-4.mcache
new file mode 100644
index 00000000..99534939
--- /dev/null
+++ b/maps/re/002-4.mcache
Binary files differ
diff --git a/maps/re/002-5.mcache b/maps/re/002-5.mcache
new file mode 100644
index 00000000..965ad00a
--- /dev/null
+++ b/maps/re/002-5.mcache
Binary files differ
diff --git a/maps/re/003-1.mcache b/maps/re/003-1.mcache
new file mode 100644
index 00000000..a42d8fa2
--- /dev/null
+++ b/maps/re/003-1.mcache
Binary files differ
diff --git a/maps/re/003-4.mcache b/maps/re/003-4.mcache
new file mode 100644
index 00000000..4f609783
--- /dev/null
+++ b/maps/re/003-4.mcache
Binary files differ
diff --git a/maps/re/004-1.mcache b/maps/re/004-1.mcache
new file mode 100644
index 00000000..dcfc3e7d
--- /dev/null
+++ b/maps/re/004-1.mcache
Binary files differ
diff --git a/maps/re/004-3.mcache b/maps/re/004-3.mcache
new file mode 100644
index 00000000..e8953577
--- /dev/null
+++ b/maps/re/004-3.mcache
Binary files differ
diff --git a/maps/re/004-4.mcache b/maps/re/004-4.mcache
new file mode 100644
index 00000000..303c2d95
--- /dev/null
+++ b/maps/re/004-4.mcache
Binary files differ
diff --git a/maps/re/004-5.mcache b/maps/re/004-5.mcache
new file mode 100644
index 00000000..65bab4e7
--- /dev/null
+++ b/maps/re/004-5.mcache
Binary files differ
diff --git a/maps/re/005-3.mcache b/maps/re/005-3.mcache
new file mode 100644
index 00000000..f0550e57
--- /dev/null
+++ b/maps/re/005-3.mcache
Binary files differ
diff --git a/maps/re/006-1.mcache b/maps/re/006-1.mcache
new file mode 100644
index 00000000..32d90df7
--- /dev/null
+++ b/maps/re/006-1.mcache
Binary files differ
diff --git a/maps/re/006-2.mcache b/maps/re/006-2.mcache
new file mode 100644
index 00000000..e7a8eebf
--- /dev/null
+++ b/maps/re/006-2.mcache
Binary files differ
diff --git a/maps/re/006-3.mcache b/maps/re/006-3.mcache
new file mode 100644
index 00000000..d7b38ec0
--- /dev/null
+++ b/maps/re/006-3.mcache
Binary files differ
diff --git a/maps/re/007-1.mcache b/maps/re/007-1.mcache
new file mode 100644
index 00000000..da9f6439
--- /dev/null
+++ b/maps/re/007-1.mcache
Binary files differ
diff --git a/maps/re/007-2.mcache b/maps/re/007-2.mcache
new file mode 100644
index 00000000..6c29ec87
--- /dev/null
+++ b/maps/re/007-2.mcache
Binary files differ
diff --git a/maps/re/008-1.mcache b/maps/re/008-1.mcache
new file mode 100644
index 00000000..64509d51
--- /dev/null
+++ b/maps/re/008-1.mcache
Binary files differ
diff --git a/maps/re/009-1.mcache b/maps/re/009-1.mcache
new file mode 100644
index 00000000..c5be8f59
--- /dev/null
+++ b/maps/re/009-1.mcache
Binary files differ
diff --git a/maps/re/009-2.mcache b/maps/re/009-2.mcache
new file mode 100644
index 00000000..2766eac9
--- /dev/null
+++ b/maps/re/009-2.mcache
Binary files differ
diff --git a/maps/re/009-3.mcache b/maps/re/009-3.mcache
new file mode 100644
index 00000000..3f099b59
--- /dev/null
+++ b/maps/re/009-3.mcache
Binary files differ
diff --git a/maps/re/009-4.mcache b/maps/re/009-4.mcache
new file mode 100644
index 00000000..be239e09
--- /dev/null
+++ b/maps/re/009-4.mcache
Binary files differ
diff --git a/maps/re/009-5.mcache b/maps/re/009-5.mcache
new file mode 100644
index 00000000..15e48843
--- /dev/null
+++ b/maps/re/009-5.mcache
Binary files differ
diff --git a/maps/re/009-6.mcache b/maps/re/009-6.mcache
new file mode 100644
index 00000000..42b73b19
--- /dev/null
+++ b/maps/re/009-6.mcache
Binary files differ
diff --git a/maps/re/009-7.mcache b/maps/re/009-7.mcache
new file mode 100644
index 00000000..7f7c9645
--- /dev/null
+++ b/maps/re/009-7.mcache
Binary files differ
diff --git a/maps/re/009-8.mcache b/maps/re/009-8.mcache
new file mode 100644
index 00000000..1b1681dc
--- /dev/null
+++ b/maps/re/009-8.mcache
Binary files differ
diff --git a/maps/re/010-1.mcache b/maps/re/010-1.mcache
new file mode 100644
index 00000000..77e03457
--- /dev/null
+++ b/maps/re/010-1.mcache
Binary files differ
diff --git a/maps/re/010-2.mcache b/maps/re/010-2.mcache
new file mode 100644
index 00000000..c87be1a1
--- /dev/null
+++ b/maps/re/010-2.mcache
Binary files differ
diff --git a/maps/re/011-1.mcache b/maps/re/011-1.mcache
new file mode 100644
index 00000000..2cb47382
--- /dev/null
+++ b/maps/re/011-1.mcache
Binary files differ
diff --git a/maps/re/011-3.mcache b/maps/re/011-3.mcache
new file mode 100644
index 00000000..0c6018ed
--- /dev/null
+++ b/maps/re/011-3.mcache
Binary files differ
diff --git a/maps/re/011-4.mcache b/maps/re/011-4.mcache
new file mode 100644
index 00000000..21c65815
--- /dev/null
+++ b/maps/re/011-4.mcache
Binary files differ
diff --git a/maps/re/011-6.mcache b/maps/re/011-6.mcache
new file mode 100644
index 00000000..f35aa6be
--- /dev/null
+++ b/maps/re/011-6.mcache
Binary files differ
diff --git a/maps/re/012-1.mcache b/maps/re/012-1.mcache
new file mode 100644
index 00000000..7ec3537f
--- /dev/null
+++ b/maps/re/012-1.mcache
Binary files differ
diff --git a/maps/re/012-3.mcache b/maps/re/012-3.mcache
new file mode 100644
index 00000000..17033a8a
--- /dev/null
+++ b/maps/re/012-3.mcache
Binary files differ
diff --git a/maps/re/012-4.mcache b/maps/re/012-4.mcache
new file mode 100644
index 00000000..0c675586
--- /dev/null
+++ b/maps/re/012-4.mcache
Binary files differ
diff --git a/maps/re/013-1.mcache b/maps/re/013-1.mcache
new file mode 100644
index 00000000..e060930c
--- /dev/null
+++ b/maps/re/013-1.mcache
Binary files differ
diff --git a/maps/re/013-2.mcache b/maps/re/013-2.mcache
new file mode 100644
index 00000000..01dc1dfe
--- /dev/null
+++ b/maps/re/013-2.mcache
Binary files differ
diff --git a/maps/re/013-3.mcache b/maps/re/013-3.mcache
new file mode 100644
index 00000000..a6d3fb7d
--- /dev/null
+++ b/maps/re/013-3.mcache
Binary files differ
diff --git a/maps/re/014-1.mcache b/maps/re/014-1.mcache
new file mode 100644
index 00000000..7e1f8498
--- /dev/null
+++ b/maps/re/014-1.mcache
Binary files differ
diff --git a/maps/re/014-3.mcache b/maps/re/014-3.mcache
new file mode 100644
index 00000000..48686053
--- /dev/null
+++ b/maps/re/014-3.mcache
Binary files differ
diff --git a/maps/re/015-1.mcache b/maps/re/015-1.mcache
new file mode 100644
index 00000000..823e0b0a
--- /dev/null
+++ b/maps/re/015-1.mcache
Binary files differ
diff --git a/maps/re/015-3.mcache b/maps/re/015-3.mcache
new file mode 100644
index 00000000..10f22c54
--- /dev/null
+++ b/maps/re/015-3.mcache
Binary files differ
diff --git a/maps/re/016-1.mcache b/maps/re/016-1.mcache
new file mode 100644
index 00000000..4ccb5482
--- /dev/null
+++ b/maps/re/016-1.mcache
Binary files differ
diff --git a/maps/re/016-2.mcache b/maps/re/016-2.mcache
new file mode 100644
index 00000000..a2dc2b29
--- /dev/null
+++ b/maps/re/016-2.mcache
Binary files differ
diff --git a/maps/re/017-1.mcache b/maps/re/017-1.mcache
new file mode 100644
index 00000000..4b091deb
--- /dev/null
+++ b/maps/re/017-1.mcache
Binary files differ
diff --git a/maps/re/017-2.mcache b/maps/re/017-2.mcache
new file mode 100644
index 00000000..a8220dc1
--- /dev/null
+++ b/maps/re/017-2.mcache
Binary files differ
diff --git a/maps/re/017-3.mcache b/maps/re/017-3.mcache
new file mode 100644
index 00000000..c2e0057d
--- /dev/null
+++ b/maps/re/017-3.mcache
Binary files differ
diff --git a/maps/re/017-4.mcache b/maps/re/017-4.mcache
new file mode 100644
index 00000000..1ac8b6cb
--- /dev/null
+++ b/maps/re/017-4.mcache
Binary files differ
diff --git a/maps/re/017-9.mcache b/maps/re/017-9.mcache
new file mode 100644
index 00000000..22967b04
--- /dev/null
+++ b/maps/re/017-9.mcache
Binary files differ
diff --git a/maps/re/018-1.mcache b/maps/re/018-1.mcache
new file mode 100644
index 00000000..d867b071
--- /dev/null
+++ b/maps/re/018-1.mcache
Binary files differ
diff --git a/maps/re/018-2.mcache b/maps/re/018-2.mcache
new file mode 100644
index 00000000..793426ab
--- /dev/null
+++ b/maps/re/018-2.mcache
Binary files differ
diff --git a/maps/re/018-3.mcache b/maps/re/018-3.mcache
new file mode 100644
index 00000000..3bc52f01
--- /dev/null
+++ b/maps/re/018-3.mcache
Binary files differ
diff --git a/maps/re/019-1.mcache b/maps/re/019-1.mcache
new file mode 100644
index 00000000..33652144
--- /dev/null
+++ b/maps/re/019-1.mcache
Binary files differ
diff --git a/maps/re/019-3.mcache b/maps/re/019-3.mcache
new file mode 100644
index 00000000..22255c48
--- /dev/null
+++ b/maps/re/019-3.mcache
Binary files differ
diff --git a/maps/re/019-4.mcache b/maps/re/019-4.mcache
new file mode 100644
index 00000000..81bf7644
--- /dev/null
+++ b/maps/re/019-4.mcache
Binary files differ
diff --git a/maps/re/020-1.mcache b/maps/re/020-1.mcache
new file mode 100644
index 00000000..1f666f13
--- /dev/null
+++ b/maps/re/020-1.mcache
Binary files differ
diff --git a/maps/re/020-2.mcache b/maps/re/020-2.mcache
new file mode 100644
index 00000000..34a634de
--- /dev/null
+++ b/maps/re/020-2.mcache
Binary files differ
diff --git a/maps/re/020-3.mcache b/maps/re/020-3.mcache
new file mode 100644
index 00000000..b96e7d58
--- /dev/null
+++ b/maps/re/020-3.mcache
Binary files differ
diff --git a/maps/re/021-3.mcache b/maps/re/021-3.mcache
new file mode 100644
index 00000000..6d4bfcc4
--- /dev/null
+++ b/maps/re/021-3.mcache
Binary files differ
diff --git a/maps/re/023-1.mcache b/maps/re/023-1.mcache
new file mode 100644
index 00000000..ffbc17f7
--- /dev/null
+++ b/maps/re/023-1.mcache
Binary files differ
diff --git a/maps/re/023-2.mcache b/maps/re/023-2.mcache
new file mode 100644
index 00000000..6d1e4aab
--- /dev/null
+++ b/maps/re/023-2.mcache
Binary files differ
diff --git a/maps/re/023-3.mcache b/maps/re/023-3.mcache
new file mode 100644
index 00000000..455b6556
--- /dev/null
+++ b/maps/re/023-3.mcache
Binary files differ
diff --git a/maps/re/025-1.mcache b/maps/re/025-1.mcache
new file mode 100644
index 00000000..aceb0a24
--- /dev/null
+++ b/maps/re/025-1.mcache
Binary files differ
diff --git a/maps/re/025-3.mcache b/maps/re/025-3.mcache
new file mode 100644
index 00000000..ee46ff8f
--- /dev/null
+++ b/maps/re/025-3.mcache
Binary files differ
diff --git a/maps/re/025-4.mcache b/maps/re/025-4.mcache
new file mode 100644
index 00000000..9c4cc0fa
--- /dev/null
+++ b/maps/re/025-4.mcache
Binary files differ
diff --git a/maps/re/026-1.mcache b/maps/re/026-1.mcache
new file mode 100644
index 00000000..931044df
--- /dev/null
+++ b/maps/re/026-1.mcache
Binary files differ
diff --git a/maps/re/026-2.mcache b/maps/re/026-2.mcache
new file mode 100644
index 00000000..c554a23e
--- /dev/null
+++ b/maps/re/026-2.mcache
Binary files differ
diff --git a/maps/re/027-1.mcache b/maps/re/027-1.mcache
new file mode 100644
index 00000000..eeb01b2c
--- /dev/null
+++ b/maps/re/027-1.mcache
Binary files differ
diff --git a/maps/re/027-2.mcache b/maps/re/027-2.mcache
new file mode 100644
index 00000000..282acff5
--- /dev/null
+++ b/maps/re/027-2.mcache
Binary files differ
diff --git a/maps/re/027-3.mcache b/maps/re/027-3.mcache
new file mode 100644
index 00000000..0d2f17b8
--- /dev/null
+++ b/maps/re/027-3.mcache
Binary files differ
diff --git a/maps/re/027-4.mcache b/maps/re/027-4.mcache
new file mode 100644
index 00000000..08cef53e
--- /dev/null
+++ b/maps/re/027-4.mcache
Binary files differ
diff --git a/maps/re/027-5.mcache b/maps/re/027-5.mcache
new file mode 100644
index 00000000..7ad99af0
--- /dev/null
+++ b/maps/re/027-5.mcache
Binary files differ
diff --git a/maps/re/027-6.mcache b/maps/re/027-6.mcache
new file mode 100644
index 00000000..ffa13651
--- /dev/null
+++ b/maps/re/027-6.mcache
Binary files differ
diff --git a/maps/re/027-7.mcache b/maps/re/027-7.mcache
new file mode 100644
index 00000000..d3075cc6
--- /dev/null
+++ b/maps/re/027-7.mcache
Binary files differ
diff --git a/maps/re/027-8.mcache b/maps/re/027-8.mcache
new file mode 100644
index 00000000..9c2b5544
--- /dev/null
+++ b/maps/re/027-8.mcache
Binary files differ
diff --git a/maps/re/028-1.mcache b/maps/re/028-1.mcache
new file mode 100644
index 00000000..80e6c7e3
--- /dev/null
+++ b/maps/re/028-1.mcache
Binary files differ
diff --git a/maps/re/028-3.mcache b/maps/re/028-3.mcache
new file mode 100644
index 00000000..13d1cd74
--- /dev/null
+++ b/maps/re/028-3.mcache
Binary files differ
diff --git a/maps/re/029-1.mcache b/maps/re/029-1.mcache
new file mode 100644
index 00000000..4e12c45c
--- /dev/null
+++ b/maps/re/029-1.mcache
Binary files differ
diff --git a/maps/re/029-2.mcache b/maps/re/029-2.mcache
new file mode 100644
index 00000000..e6914819
--- /dev/null
+++ b/maps/re/029-2.mcache
Binary files differ
diff --git a/maps/re/029-3.mcache b/maps/re/029-3.mcache
new file mode 100644
index 00000000..f0c5e20e
--- /dev/null
+++ b/maps/re/029-3.mcache
Binary files differ
diff --git a/maps/re/029-4.mcache b/maps/re/029-4.mcache
new file mode 100644
index 00000000..94dbc60f
--- /dev/null
+++ b/maps/re/029-4.mcache
Binary files differ
diff --git a/maps/re/030-1.mcache b/maps/re/030-1.mcache
new file mode 100644
index 00000000..49b0186c
--- /dev/null
+++ b/maps/re/030-1.mcache
Binary files differ
diff --git a/maps/re/030-2.mcache b/maps/re/030-2.mcache
new file mode 100644
index 00000000..174d1ab3
--- /dev/null
+++ b/maps/re/030-2.mcache
Binary files differ
diff --git a/maps/re/030-3.mcache b/maps/re/030-3.mcache
new file mode 100644
index 00000000..dacc127b
--- /dev/null
+++ b/maps/re/030-3.mcache
Binary files differ
diff --git a/maps/re/030-4.mcache b/maps/re/030-4.mcache
new file mode 100644
index 00000000..c58411ac
--- /dev/null
+++ b/maps/re/030-4.mcache
Binary files differ
diff --git a/maps/re/031-1.mcache b/maps/re/031-1.mcache
new file mode 100644
index 00000000..00c3aa24
--- /dev/null
+++ b/maps/re/031-1.mcache
Binary files differ
diff --git a/maps/re/031-2.mcache b/maps/re/031-2.mcache
new file mode 100644
index 00000000..32587b74
--- /dev/null
+++ b/maps/re/031-2.mcache
Binary files differ
diff --git a/maps/re/031-3.mcache b/maps/re/031-3.mcache
new file mode 100644
index 00000000..89b9cacd
--- /dev/null
+++ b/maps/re/031-3.mcache
Binary files differ
diff --git a/maps/re/031-4.mcache b/maps/re/031-4.mcache
new file mode 100644
index 00000000..837a8021
--- /dev/null
+++ b/maps/re/031-4.mcache
Binary files differ
diff --git a/maps/re/032-3.mcache b/maps/re/032-3.mcache
new file mode 100644
index 00000000..809e81c4
--- /dev/null
+++ b/maps/re/032-3.mcache
Binary files differ
diff --git a/maps/re/033-1.mcache b/maps/re/033-1.mcache
new file mode 100644
index 00000000..9e472074
--- /dev/null
+++ b/maps/re/033-1.mcache
Binary files differ
diff --git a/maps/re/034-1.mcache b/maps/re/034-1.mcache
new file mode 100644
index 00000000..56710753
--- /dev/null
+++ b/maps/re/034-1.mcache
Binary files differ
diff --git a/maps/re/034-2.mcache b/maps/re/034-2.mcache
new file mode 100644
index 00000000..ec77237f
--- /dev/null
+++ b/maps/re/034-2.mcache
Binary files differ
diff --git a/maps/re/035-2.mcache b/maps/re/035-2.mcache
new file mode 100644
index 00000000..d41ba3d4
--- /dev/null
+++ b/maps/re/035-2.mcache
Binary files differ
diff --git a/maps/re/036-2.mcache b/maps/re/036-2.mcache
new file mode 100644
index 00000000..d41ba3d4
--- /dev/null
+++ b/maps/re/036-2.mcache
Binary files differ
diff --git a/maps/re/041-1.mcache b/maps/re/041-1.mcache
new file mode 100644
index 00000000..520655c8
--- /dev/null
+++ b/maps/re/041-1.mcache
Binary files differ
diff --git a/maps/re/042-1.mcache b/maps/re/042-1.mcache
new file mode 100644
index 00000000..b6551444
--- /dev/null
+++ b/maps/re/042-1.mcache
Binary files differ
diff --git a/maps/re/043-1.mcache b/maps/re/043-1.mcache
new file mode 100644
index 00000000..5c81d4d7
--- /dev/null
+++ b/maps/re/043-1.mcache
Binary files differ
diff --git a/maps/re/043-3.mcache b/maps/re/043-3.mcache
new file mode 100644
index 00000000..e1dd1843
--- /dev/null
+++ b/maps/re/043-3.mcache
Binary files differ
diff --git a/maps/re/043-4.mcache b/maps/re/043-4.mcache
new file mode 100644
index 00000000..d14f491f
--- /dev/null
+++ b/maps/re/043-4.mcache
Binary files differ
diff --git a/maps/re/045-1.mcache b/maps/re/045-1.mcache
new file mode 100644
index 00000000..e0c82063
--- /dev/null
+++ b/maps/re/045-1.mcache
Binary files differ
diff --git a/maps/re/046-1.mcache b/maps/re/046-1.mcache
new file mode 100644
index 00000000..cf1e727d
--- /dev/null
+++ b/maps/re/046-1.mcache
Binary files differ
diff --git a/maps/re/046-3.mcache b/maps/re/046-3.mcache
new file mode 100644
index 00000000..dace7565
--- /dev/null
+++ b/maps/re/046-3.mcache
Binary files differ
diff --git a/maps/re/047-1.mcache b/maps/re/047-1.mcache
new file mode 100644
index 00000000..237c07c7
--- /dev/null
+++ b/maps/re/047-1.mcache
Binary files differ
diff --git a/maps/re/047-3.mcache b/maps/re/047-3.mcache
new file mode 100644
index 00000000..0647120d
--- /dev/null
+++ b/maps/re/047-3.mcache
Binary files differ
diff --git a/maps/re/048-2.mcache b/maps/re/048-2.mcache
new file mode 100644
index 00000000..a66d4722
--- /dev/null
+++ b/maps/re/048-2.mcache
Binary files differ
diff --git a/maps/re/051-1.mcache b/maps/re/051-1.mcache
new file mode 100644
index 00000000..4ccc14d5
--- /dev/null
+++ b/maps/re/051-1.mcache
Binary files differ
diff --git a/maps/re/051-3.mcache b/maps/re/051-3.mcache
new file mode 100644
index 00000000..4dc5fb8f
--- /dev/null
+++ b/maps/re/051-3.mcache
Binary files differ
diff --git a/maps/re/052-1.mcache b/maps/re/052-1.mcache
new file mode 100644
index 00000000..047f60ee
--- /dev/null
+++ b/maps/re/052-1.mcache
Binary files differ
diff --git a/maps/re/052-2.mcache b/maps/re/052-2.mcache
new file mode 100644
index 00000000..fd9912ee
--- /dev/null
+++ b/maps/re/052-2.mcache
Binary files differ
diff --git a/maps/re/055-1.mcache b/maps/re/055-1.mcache
new file mode 100644
index 00000000..c40d664b
--- /dev/null
+++ b/maps/re/055-1.mcache
Binary files differ
diff --git a/maps/re/055-3.mcache b/maps/re/055-3.mcache
new file mode 100644
index 00000000..102b3550
--- /dev/null
+++ b/maps/re/055-3.mcache
Binary files differ
diff --git a/maps/re/056-2.mcache b/maps/re/056-2.mcache
new file mode 100644
index 00000000..fe2271c5
--- /dev/null
+++ b/maps/re/056-2.mcache
Binary files differ
diff --git a/maps/re/057-1.mcache b/maps/re/057-1.mcache
new file mode 100644
index 00000000..1ddb9c67
--- /dev/null
+++ b/maps/re/057-1.mcache
Binary files differ
diff --git a/maps/re/069-2.mcache b/maps/re/069-2.mcache
new file mode 100644
index 00000000..46c84bd8
--- /dev/null
+++ b/maps/re/069-2.mcache
Binary files differ
diff --git a/maps/re/070-1.mcache b/maps/re/070-1.mcache
new file mode 100644
index 00000000..822ae875
--- /dev/null
+++ b/maps/re/070-1.mcache
Binary files differ
diff --git a/maps/re/070-3.mcache b/maps/re/070-3.mcache
new file mode 100644
index 00000000..112929ed
--- /dev/null
+++ b/maps/re/070-3.mcache
Binary files differ
diff --git a/maps/re/099-1.mcache b/maps/re/099-1.mcache
new file mode 100644
index 00000000..1b9921c9
--- /dev/null
+++ b/maps/re/099-1.mcache
Binary files differ
diff --git a/maps/re/099-2.mcache b/maps/re/099-2.mcache
new file mode 100644
index 00000000..3887f059
--- /dev/null
+++ b/maps/re/099-2.mcache
Binary files differ
diff --git a/maps/re/099-3.mcache b/maps/re/099-3.mcache
new file mode 100644
index 00000000..8293b732
--- /dev/null
+++ b/maps/re/099-3.mcache
Binary files differ
diff --git a/maps/re/099-4.mcache b/maps/re/099-4.mcache
new file mode 100644
index 00000000..2272bb8e
--- /dev/null
+++ b/maps/re/099-4.mcache
Binary files differ
diff --git a/maps/re/099-5.mcache b/maps/re/099-5.mcache
new file mode 100644
index 00000000..2272bb8e
--- /dev/null
+++ b/maps/re/099-5.mcache
Binary files differ
diff --git a/maps/re/099-6.mcache b/maps/re/099-6.mcache
new file mode 100644
index 00000000..2a26dece
--- /dev/null
+++ b/maps/re/099-6.mcache
Binary files differ
diff --git a/maps/re/099-7.mcache b/maps/re/099-7.mcache
new file mode 100644
index 00000000..82b865c3
--- /dev/null
+++ b/maps/re/099-7.mcache
Binary files differ
diff --git a/maps/re/099-8.mcache b/maps/re/099-8.mcache
new file mode 100644
index 00000000..21890ea5
--- /dev/null
+++ b/maps/re/099-8.mcache
Binary files differ
diff --git a/maps/re/botcheck.mcache b/maps/re/botcheck.mcache
new file mode 100644
index 00000000..14f52d73
--- /dev/null
+++ b/maps/re/botcheck.mcache
Binary files differ
diff --git a/npc/000-1/_import.txt b/npc/000-1/_import.txt
new file mode 100644
index 00000000..ec2c18b7
--- /dev/null
+++ b/npc/000-1/_import.txt
@@ -0,0 +1,3 @@
+// Map 000-1: Jesusalva's Trap
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/000-1/exit.txt",
diff --git a/npc/000-1/exit.txt b/npc/000-1/exit.txt
new file mode 100644
index 00000000..d4a6821a
--- /dev/null
+++ b/npc/000-1/exit.txt
@@ -0,0 +1,22 @@
+// TMW2 scripts.
+// Author:
+// Jesusalva
+// Description:
+// Special Soul Menhir which only allows leaving the map.
+
+000-1,22,22,0 script Emergency Exit NPC_NO_SPRITE,2,2,{
+OnTouch:
+OnTalk:
+OnTalkNearby:
+ if (LOCATION$ != "") goto L_ToLoc;
+ if (Sex)
+ warp "029-2", 25, 24;
+ else
+ warp "029-2", 22, 24;
+ end;
+L_ToLoc:
+ // Possibly could warp to "Save" as well?
+ ReturnTown();
+ end;
+}
+
diff --git a/npc/001-1/_import.txt b/npc/001-1/_import.txt
new file mode 100644
index 00000000..5333d5d4
--- /dev/null
+++ b/npc/001-1/_import.txt
@@ -0,0 +1,24 @@
+// Map 001-1: Tulimshar Port
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/001-1/_mobs.txt",
+"npc/001-1/_warps.txt",
+"npc/001-1/adrian.txt",
+"npc/001-1/ched.txt",
+"npc/001-1/children.txt",
+"npc/001-1/constable.txt",
+"npc/001-1/dock.txt",
+"npc/001-1/eomie.txt",
+"npc/001-1/ferry_master.txt",
+"npc/001-1/gate_guards.txt",
+"npc/001-1/gossip.txt",
+"npc/001-1/guards.txt",
+"npc/001-1/inac.txt",
+"npc/001-1/mapflags.txt",
+"npc/001-1/north_shops.txt",
+"npc/001-1/npcs.txt",
+"npc/001-1/sewer_east.txt",
+"npc/001-1/sewer_north.txt",
+"npc/001-1/stat_reset.txt",
+"npc/001-1/tinris.txt",
+"npc/001-1/tombstones.txt",
+"npc/001-1/weellos.txt",
diff --git a/npc/001-1/_mobs.txt b/npc/001-1/_mobs.txt
new file mode 100644
index 00000000..bc0d50f6
--- /dev/null
+++ b/npc/001-1/_mobs.txt
@@ -0,0 +1,7 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 001-1: Tulimshar Port mobs
+001-1,32,59,5,5 monster Green Slime 1005,8,100000,30000
+001-1,45,100,5,5 monster Green Slime 1005,8,100000,30000
+001-1,37,75,4,17 monster Sea Slime 1033,8,100000,30000
+001-1,86,84,32,27 monster Maggot 1002,11,100000,30000
+001-1,86,84,32,27 monster Sea Slime 1033,8,100000,30000
diff --git a/npc/001-1/_warps.txt b/npc/001-1/_warps.txt
new file mode 100644
index 00000000..33f9ba6c
--- /dev/null
+++ b/npc/001-1/_warps.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 001-1: Tulimshar Port warps
+001-1,63,119,0 warp #001-1_63_119 4,0,002-1,63,21
+001-1,103,119,0 warp #001-1_103_119 4,0,002-1,103,21
+001-1,55,71,0 warp #001-1_55_71 0,0,001-2,31,27
+001-1,52,71,0 warp #001-1_52_71 0,0,001-2,28,27
+001-1,49,71,0 warp #001-1_49_71 0,0,001-2,25,27
+001-1,114,99,0 warp #001-1_114_99 0,0,001-2,25,64
+001-1,27,32,0 warp #001-1_27_32 0,0,001-2,28,101
+001-1,37,32,0 warp #001-1_37_32 0,0,001-2,71,101
+001-1,55,34,0 warp #001-1_55_34 1,0,001-2,104,101
+001-1,52,22,0 warp #001-1_52_22 0,0,001-2,95,52
+001-1,57,22,0 warp #001-1_57_22 0,0,001-2,114,52
+001-1,28,23,0 warp #001-1_28_23 0,0,001-2,28,87
+001-1,28,44,0 warp #001-1_28_44 0,0,021-3,29,61
+001-1,59,98,0 warp #001-1_59_98 0,0,001-2,65,25
diff --git a/npc/001-1/adrian.txt b/npc/001-1/adrian.txt
new file mode 100644
index 00000000..03ec3802
--- /dev/null
+++ b/npc/001-1/adrian.txt
@@ -0,0 +1,42 @@
+001-1,113,64,0 script Adrian NPC213,{
+ mes "[Adrian]";
+ mes "\"Hello. Are you here to pick up some luggage?\"";
+ if (QL_KYLIAN == 1)
+ menu
+ "Yes. Kylian sent me to get his luggage.",L_Get,
+ "No.",L_No;
+ menu
+ "No.",L_No;
+L_No:
+ next;
+ mes "[Adrian]";
+ mes "\"Too bad. I'd like to go get a beer, but I have to wait here until all the luggage is picked up.\"";
+ mes "He sighs.";
+ goto L_close;
+
+L_Get:
+ next;
+ mes "[Adrian]";
+ mes "\"Wonderful! Please show me your ticket.\"";
+ mes "He checks the paper Kylian gave you and then gives you a critical look.";
+ next;
+ getinventorylist;
+ if ((checkweight("LeatherSuitcase", 1) == 0) || (@inventorylist_count == 100))
+ goto L_Inventory;
+ mes "[Adrian]";
+ mes "\"Alright. Here it is. Good luck carrying that thing.\"";
+ mes "Adrain hands you a very heavy suitcase.";
+ getitem "LeatherSuitcase", 1;
+ QL_KYLIAN = 2;
+ goto L_close;
+
+L_Inventory:
+ mes "[Adrian]";
+ mes "\"The suitcase is rather heavy. No offense, but you don't look like you can carry it.\"";
+ mes "Maybe you should get rid of some of the other stuff you're carrying.\"";
+ goto L_close;
+
+L_close:
+ @inventorylist_count = 0;
+ close;
+}
diff --git a/npc/001-1/ched.txt b/npc/001-1/ched.txt
new file mode 100644
index 00000000..8bcd94fa
--- /dev/null
+++ b/npc/001-1/ched.txt
@@ -0,0 +1,14 @@
+
+001-1,43,48,0 script Ched NPC113,{
+ mesn;
+ mesq l("I'm trying to get work on my Alchemy homework, but I'm having some trouble.");
+ next;
+ mesn;
+ mesq l("I'm supposed to combine two potions to create a %s, but I can't seem to figure out which two to combine...", getitemlink(ConcentrationPotion));
+ next;
+ mesn;
+ mes l("\"Maybe I should go back to practicing '%s' until I can make potions properly.\" %%6", (getskilllv(SKILL_MAGIC) ? b("miteyo") : b("monsterinfo spell")));
+ if (getskilllv(SKILL_MAGIC) > 1)
+ learnskill SKILL_MONSTERINFO;
+ close;
+}
diff --git a/npc/001-1/children.txt b/npc/001-1/children.txt
new file mode 100644
index 00000000..dd7f7668
--- /dev/null
+++ b/npc/001-1/children.txt
@@ -0,0 +1,91 @@
+
+001-1,102,27,0 script Aisha NPC108,{
+ @temp = rand(10);
+ if(@temp == 1) goto L_1;
+ if(@temp == 2) goto L_2;
+ if(@temp == 3) goto L_3;
+ if(@temp == 4) goto L_4;
+ if(@temp == 5) goto L_5;
+ if(@temp == 6) goto L_6;
+ if(@temp == 7) goto L_7;
+ if(@temp == 8) goto L_8;
+ if(@temp == 9) goto L_9;
+ goto L_1;
+
+L_1:
+ mes "[Aisha]";
+ mes "\"Maggots are so slimey!\" %%^";
+ goto L_close;
+
+L_2:
+ mes "[Aisha]";
+ mes "\"Want to play ball with me?\"";
+ goto L_close;
+
+L_3:
+ mes "[Aisha]";
+ mes "\"There are so many monsters! I hate scorpions!\" %%3";
+ goto L_close;
+
+L_4:
+ mes "[Aisha]";
+ mes "\"When I grow up, I want to be strong enough to kill a scorpion!\" %%=";
+ goto L_close;
+
+L_5:
+ mes "[Aisha]";
+ mes "\"Mommy told me that you can sell the things that monsters drop.\"";
+ goto L_close;
+
+L_6:
+ mes "[Aisha]";
+ mes "\"Have you tried to eat a roasted maggot? They're sooo yummy! Mommy says they're healthy too!\" %%8";
+ goto L_close;
+
+L_7:
+ mes "[Aisha]";
+ mes "\"I want to be a Doctor when I grow up!\"";
+ goto L_close;
+
+L_8:
+ mes "[Aisha]";
+ mes "\"That earthquake was sooo scary! The earth was shaking and everything was breaking down... but now they've rebuilt everything.\"";
+ goto L_close;
+
+L_9:
+ mes "\"I know a very bad word. But I can't say it because monsters will come and get me if I do!\"";
+ next;
+ menu
+ "A bad word?", L_tell,
+ "Oh. You better keep it to yourself then.", L_close;
+
+L_tell:
+ mes "[Aisha]";
+ mes "\"I heard my mother say it once, and she made me promise her to never say it. ##BNever##b!\"";
+ next;
+ menu
+ "If I promise to never tell anyone, can you tell me the word?", L_keepword,
+ "I understand. You don't need to tell me...", L_Giveword,
+ "Goodbye!", L_close;
+
+L_keepword:
+ mesn;
+ mesq l("No.");
+ goto L_close;
+
+L_Giveword:
+ mesn;
+ mes l("Aisha looks around as she leans in and hushes you to silence. After a few seconds, she whispers to you:");
+ mesq l("I like you, so I'll tell you the bad word. But you can't tell anyone else about it! The bad word is %s.'", b("itenplz"));
+ learnskill EVOL_AREA_PROVOKE, 1;
+ next;
+
+ mes "[Aisha]";
+ mes "Terrified, she looks around once more.";
+ mes "\"But you can't tell anyone!\" %%>";
+ goto L_close;
+
+L_close:
+ @temp = 0;
+ close;
+}
diff --git a/npc/001-1/constable.txt b/npc/001-1/constable.txt
new file mode 100644
index 00000000..36e3c224
--- /dev/null
+++ b/npc/001-1/constable.txt
@@ -0,0 +1,7 @@
+
+001-1,50,74,0 script Constable Perry Graf NPC150,{
+ mes "[Constable Perry Graf]";
+ mes "\"Hello. Make sure to follow the rules!\"";
+ callfunc "GameRules";
+ close;
+}
diff --git a/npc/001-1/dock.txt b/npc/001-1/dock.txt
new file mode 100644
index 00000000..dc7195e9
--- /dev/null
+++ b/npc/001-1/dock.txt
@@ -0,0 +1,42 @@
+
+001-1,75,70,0 script Tulimshar Koga NPC395,9,4,{
+ @npc_distance = 10;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "BoardFerry";
+ end;
+
+OnTouch:
+ addtimer get(.warp_delay, "#FerryConfig"), strnpcinfo(0)+"::OnBoard";
+ end;
+
+OnBoard:
+ callfunc "BoardFerry";
+ end;
+}
+
+001-1,68,72,0 script Tulimshar Dock NPC400,2,2,{
+ @npc_distance = 3;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "BoardFerry";
+ end;
+}
+
+001-1,70,70,0 script #TulimsharDock NPC32767,{
+ end;
+OnCommandArrive:
+ disablenpc "Tulimshar Dock";
+ enablenpc "Tulimshar Koga";
+ areatimer 0, "001-1", 66, 71, 77, 73, get(.warp_delay, "#FerryConfig"), strnpcinfo(0)+"::OnAreaWarp"; // warp players on dock
+ end;
+
+OnAreaWarp:
+ callfunc "BoardFerry";
+ end;
+
+OnCommandWarp:
+ disablenpc "Tulimshar Koga";
+ enablenpc "Tulimshar Dock";
+ end;
+}
diff --git a/npc/001-1/eomie.txt b/npc/001-1/eomie.txt
new file mode 100644
index 00000000..44424d26
--- /dev/null
+++ b/npc/001-1/eomie.txt
@@ -0,0 +1,111 @@
+001-1,71,23,0 script Eomie NPC164,{
+ @grass_amount = 5;
+ @water_amount = 2;
+ @ice_amount = 2;
+
+ @silk_exp = 600;
+
+ if (.@q >= 14) goto L_Done;
+ if (.@q >= 9) goto L_CastedSpell;
+ if (.@q == 8) goto L_GetStuff;
+
+ mesn;
+ mes "\"I maintain this little oasis in the desert.\"";
+ if (.@q != 7)
+ goto L_close;
+ menu
+ "I need to learn a spell to use Tinris' magic fertilizer. Can you help me out?",L_Next;
+
+L_Next:
+ mesn;
+ mes "\"Oh? Well, that's a rather difficult task.";
+ mes "I'd be glad to help you, but unfortunately, I can't. If I were to interrupt the magic I use to keep this alive, it would die.\"";
+ next;
+ mes "\"It's unusually hot at the moment – even for this desert area – so it's really out of the question.\"";
+ menu
+ "Is there any chance you could help me?",L_Continue;
+
+L_Continue:
+ mes "She hesitates.";
+ .@q = 8;
+ goto L_GetStuff;
+
+L_GetStuff:
+ // .@q == 8
+ mesn;
+ mes "\"I could try to briefly interrupt my magic and then cast the spell on the fertilizer, but I would need to prepare the grass beforehand.";
+ mes "Bring me " + @grass_amount + " " + getitemlink("GrassSeed") + ", " + @water_amount + " " + getitemlink("BottleOfWater") + ", and " + @ice_amount + " " + getitemlink("IceCube") + ".\"";
+ menu
+ "I've got everything.",L_More,
+ "Where can I get Grass Seeds?",L_Hurnscald,
+ "How can I get Ice Cubes? We're in the middle of the desert!",L_Mine,
+ "Ok. I'll go and get them.",L_close;
+L_More:
+ if ((countitem("GrassSeed") < @grass_amount) || (countitem("BottleOfWater") < @water_amount) || (countitem("IceCube") < @ice_amount))
+ goto L_NoItem;
+
+ delitem "GrassSeed", @grass_amount;
+ delitem "BottleOfWater", @water_amount;
+ delitem "IceCube", @ice_amount;
+ .@q = 9;
+ mesn;
+ mes "\"Very good!\"";
+ mes "She takes the ingredients you brought her and uses them to cast a cool mist into the air.";
+ misceffect sfx_magic_nature;
+ next;
+ mesn;
+ mes "\"That should last long enough to keep the plants alive while I cast the spell on the fertilizer. Besides, I can replant anything that dies with the seeds you brought me.\"";
+ next;
+ mes "She takes the fertilizer and casts some invocations. After a minute, she hands the now-glowing substance back to you.";
+ mesn;
+ mes "\"That should work now. I'm glad you're taking care of the plants! Not enough people do that nowadays.\" %%1";
+ goto L_close;
+
+L_Hurnscald: // player asked how to get Grass Seeds
+ mesn;
+ mes "\"Squirrels tend to pick up " + getitemlink("GrassSeed") + " as they gather food. You can find them around Hurnscald if you ride the ferry over.\"";
+ goto L_close;
+
+L_Mine: // player asked how to get Ice Cubes
+ mesn;
+ mes "\"Quite the quandary – isn't it? Naturally, you can easily find them on the continent of Kaizei, which is far up north and covered with snow most time of the year. But it might be a bit difficult to get there.\"";
+ next;
+ mes "\"I heard that Ice Goblins were seen in the caves surrounding Nivalis. Maybe you can find " + getitemlink("IceCube") + " there.\"";
+ goto L_close;
+
+L_CastedSpell: // .@q >= 9 but below 14
+ mesn;
+ mes "\"Thankfully, the grass wasn't damaged. I hope Anwar finds the magic fertilizer to be useful.\"";
+ if (.@q != 13)
+ goto L_close;
+ menu
+ "It was. He even created this Silk Headband as a present for you!",L_Present,
+ "(Mumble something and leave)",L_close;
+
+L_Present:
+ if (countitem("SilkHeadband") < 1)
+ goto L_NoItem;
+ delitem "SilkHeadband", 1;
+ getexp @silk_exp, 0;
+ .@q = 14;
+ mesn;
+ mes "\"Oh, that's so nice of him! Please tell him that I really like it!\"";
+ mes "She smiles.";
+ goto L_close;
+
+L_Done: // .@q >= 14
+ mesn;
+ mes "\"Hello! I'm happy to see someone like you so dedicated to the environment.\" %%8";
+ goto L_close;
+
+L_NoItem:
+ mesn;
+ mes "\"Where is it?\" %%3";
+ goto L_close;
+
+L_close:
+ @grass_amount = 0;
+ @water_amount = 0;
+ @ice_amount = 0;
+ close;
+}
diff --git a/npc/001-1/ferry_master.txt b/npc/001-1/ferry_master.txt
new file mode 100644
index 00000000..db5c6ec8
--- /dev/null
+++ b/npc/001-1/ferry_master.txt
@@ -0,0 +1,19 @@
+
+001-1,64,75,0 script Ferry Master#tulimshar NPC138,{
+ mes "[Ferry Master]";
+ mes "\"Hello! Do you need something?\"";
+ goto L_Main;
+
+L_Main:
+ menu
+ "How do I use the ferry?", L_Explain,
+ "Nothing, I guess.", L_close;
+
+L_Explain:
+ mes "[Ferry Master]";
+ callfunc "FerryHelp";
+ goto L_Main;
+
+L_close:
+ close;
+}
diff --git a/npc/001-1/gate_guards.txt b/npc/001-1/gate_guards.txt
new file mode 100644
index 00000000..5908bb77
--- /dev/null
+++ b/npc/001-1/gate_guards.txt
@@ -0,0 +1,21 @@
+001-1,39,33,0 script Guard#school NPC104,{
+ mes "[Guard]";
+ mes "\"My presence here is just a formality. The mages inside can easily defend themselves.\"";
+ close;
+}
+001-1,56,47,0 script Guard#castle NPC104,{
+ mes "[Guard]";
+ mes "\"Tulimshar is a resilient city; its citizens have made quite a comeback after the earthquake.\"";
+ close;
+}
+
+001-1,61,99,0 script Guard#east3 NPC104,{
+ mes "[Guard]";
+ mes "\"Just north of here is a palace where you can find both the Council of Wizards and the Magic Institute of Tulimshar.\"";
+ close;
+}
+001-1,53,72,0 script Guard#govt_out NPC123,{
+ mes "[Guard]";
+ mes "\"There are government officials inside who can help you form a party, obtain a trade license, or even get married.\"";
+ close;
+}
diff --git a/npc/001-1/gossip.txt b/npc/001-1/gossip.txt
new file mode 100644
index 00000000..694124a0
--- /dev/null
+++ b/npc/001-1/gossip.txt
@@ -0,0 +1,57 @@
+
+001-1,66,104,0 script Gladys NPC154,{
+ mes "[Gladys]";
+ mes "\"Hello deary! I hear some of the most fascinating rumors!\"";
+ next;
+ mes "\"Would you like me to let you in on the good stuff?\"";
+ menu
+ "Tell me about Lt. Dausen.", L_Intro,
+ "Tell me about Fieri.", L_Cook,
+ "Tell me about Sarah.", L_Sarah,
+ "Tell me about Sandra.", L_Sandra,
+ "Tell me about the Desert Mine.", L_Desert,
+ "Tell me about the Ferry.", L_Ferry,
+ "No thanks.", L_No;
+
+L_No:
+ mes "[Gladys]";
+ mes "\"Very well. Come back later if you want to hear some juicy news!\"";
+ goto L_close;
+
+L_Intro:
+ mes "[Gladys]";
+ mes "\"Have you met our lovely guard captain yet? He usually keeps post just outside the gates to keep an eye on things. He likes to talk to new adventurers too.\"";
+ goto L_close;
+
+L_Cook:
+ mes "[Gladys]";
+ mes "\"I hear the kitchen at the Magic Institute of Tulimshar is in need of some help.\"";
+ next;
+ mes "\"The only thing bigger then a wizard's ego is their waistline. Hehe.\" %%8";
+ goto L_close;
+
+L_Sarah:
+ mes "[Gladys]";
+ mes "\"Do you believe what parents will let their kids do these days?! I heard about this girl in the southeast side of town who does nothing but eat sweets all day! Honestly, what is this world coming to?\"";
+ goto L_close;
+
+L_Sandra:
+ mes "[Gladys]";
+ mes "\"The students and wizards at the Magic Institute of Tulimshar are always looking for people to gather the reagents they need for spells as they are far too busy studying to gather the materials themselves.\"";
+ goto L_close;
+
+L_Desert:
+ mes "[Gladys]";
+ mes "\"If you're still looking for adventure, I would suggest talking to some of the guards. I hear there's a sizable monster threat outside the city walls!\"";
+ goto L_close;
+
+L_Ferry:
+ mes "[Gladys]";
+ mes "\"There's a ferry in the northern part of town that takes travelers to exotic new places!\"";
+ next;
+ mes "\"I haven't been on it myself, but I hear it travels all over the world!\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/001-1/guards.txt b/npc/001-1/guards.txt
new file mode 100644
index 00000000..8727a9bf
--- /dev/null
+++ b/npc/001-1/guards.txt
@@ -0,0 +1,93 @@
+
+001-1,103,99,0 script Ekinu NPC104,{
+ mes "[Ekinu the Town Guard]";
+ mes "\"What a disaster... I can't believe that we managed to rebuild the town so quickly.\"";
+ next;
+ menu "Can you give me any tips?", L_Tip,
+ "Do you have any information?", L_Info,
+ "What disaster?", L_disaster;
+
+L_Tip:
+ @temp = rand(7);
+ if(@temp == 1) goto L_1;
+ if(@temp == 2) goto L_2;
+ if(@temp == 3) goto L_3;
+ if(@temp == 4) goto L_4;
+ if(@temp == 5) goto L_5;
+ if(@temp == 6) goto L_6;
+ goto L_0;
+
+L_1:
+ mes "[Ekinu the Town Guard]";
+ mes "\"Try to carry spare food when on quests or in dungeons – they will come in handy. I always take beer, but don't tell the Sergeant...\"";
+ goto L_close;
+
+L_2:
+ mes "[Ekinu the Town Guard]";
+ mes "\"If you ever get lost, check your map to get your bearings and figure out where you need to go.\"";
+ goto L_close;
+
+L_3:
+ mes "[Ekinu the Town Guard]";
+ mes "\"When in a dungeon, monsters are more aggressive – and often more powerful – than if they were outside.\"";
+ goto L_close;
+
+L_4:
+ mes "[Ekinu the Town Guard]";
+ mes "\"When gambling in casinos, make sure to not bet too much or you might become broke.\"";
+ goto L_close;
+
+L_5:
+ mes "[Ekinu the Town Guard]";
+ mes "\"Never underestimate your enemy.\"";
+ goto L_close;
+
+L_6:
+ mes "[Ekinu the Town Guard]";
+ mes "\"When fighting more than one enemy, try to focus on one at a time.\"";
+ goto L_close;
+
+L_0:
+ mes "[Ekinu the Town Guard]";
+ mes "\"Let me think of something... Oh! Do NOT attack the red or black scorpions unless you're sure you can kill it!\"";
+ goto L_close;
+
+L_Info:
+ mes "[Ekinu the Town Guard]";
+ mes "\"Everyone seems to want information... You won't get it – at least not here. I'm not even sure what you mean, to be honest.\"";
+ goto L_close;
+
+L_disaster:
+ mes "[Ekinu the Town Guard]";
+ mes "\"What do you mean, 'what disaster?' Weren't you there? That huge volcano ex...rusion... – whatever they call it – and then the earthquake!\"";
+ next;
+ mes "[Ekinu the Town Guard]";
+ mes "\"Half the town was reduced to rubble! Somehow, no one was seriously injured, so I guess we were lucky...\"";
+ next;
+ mes "[Ekinu the Town Guard]";
+ mes "\"Well, the mayor rebuilt everything quickly, but I still have no idea where he got all the GP from...\"";
+ goto L_close;
+
+L_close:
+ @temp = 0;
+ close;
+}
+
+001-1,107,42,0 script Ryan NPC104,{
+ if (getskilllv(SKILL_MAGIC)) goto L_message;
+
+ mes "[Ryan the Town Guard]";
+ mes "Zzzz... Zzzz...";
+ next;
+ mes "[Ryan the Town Guard]";
+ mes "\"Hmmmmmmh...?";
+ mes "Oh, what? I wasn't sleeping! I was just resting my eyes!\"";
+ close;
+
+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 '" + $@SPELL_AGGRAVATE$ + ".' Somehow, this distracts it so Ekinu can kill it.\"";
+ close;
+}
diff --git a/npc/001-1/inac.txt b/npc/001-1/inac.txt
new file mode 100644
index 00000000..56392535
--- /dev/null
+++ b/npc/001-1/inac.txt
@@ -0,0 +1,15 @@
+
+001-1,58,81,0 script Inac NPC156,{
+ @halloween_npc_id = $@halloween_npc_inac;
+ callfunc "TrickOrTreat";
+
+ mes "[Inac]";
+ mes "\"This cities water system is amazing. It was built centuries ago after the cataclysm that turned Tonori into this desert.\"";
+ next;
+ mes "[Inac]";
+ mes "\"They say that not much maintenance is needed, even though it's so old.\"";
+ next;
+ mes "[Inac]";
+ mes "\"They also say monsters have moved into the underground tunnels that bring and distribute water.\"";
+ close;
+}
diff --git a/npc/001-1/mapflags.txt b/npc/001-1/mapflags.txt
new file mode 100644
index 00000000..4285d7f7
--- /dev/null
+++ b/npc/001-1/mapflags.txt
@@ -0,0 +1,2 @@
+//001-1 mapflag town
+//001-1 mapflag resave 001-1,60,105
diff --git a/npc/001-1/north_shops.txt b/npc/001-1/north_shops.txt
new file mode 100644
index 00000000..36d7df47
--- /dev/null
+++ b/npc/001-1/north_shops.txt
@@ -0,0 +1,43 @@
+// The Mana World Script
+// (C) Jesusalva, 2021
+// Licensed under GPLv2 or later
+
+001-1,106,105,0 script Neko NPC101,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem TonoriDelight;
+ sellitem CactusDrink;
+ sellitem CactusPotion;
+ sellitem RoastedMaggot;
+ sellitem Beer;
+ sellitem ChickenLeg;
+ .distance = 5;
+ end;
+}
+
+001-1,111,108,0 script Inar NPC108,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem CottonShirt;
+ sellitem SerfHat;
+ sellitem CottonShorts;
+ sellitem CottonBoots;
+ sellitem DesertShirt;
+ sellitem CottonHeadband;
+ sellitem DesertHat;
+ .distance = 5;
+ end;
+}
+
+001-1,48,79,0 script Well NPC400,{
+ callfunc "WaterBottle";
+ end;
+}
diff --git a/npc/001-1/npcs.txt b/npc/001-1/npcs.txt
new file mode 100644
index 00000000..4d65a5ba
--- /dev/null
+++ b/npc/001-1/npcs.txt
@@ -0,0 +1,70 @@
+001-1,49,82,0 script Cyndala NPC210,{
+ @npcname$ = "Cyndala";
+
+ mes "[" + @npcname$ + "]";
+ mes "\"I used to visit the beach, but then the green slimes went crazy. I heard they ate a bunch of pirates that robbed some of Tulimshar's gold ships.\"";
+ next;
+ mes "\"Good riddance!\"";
+ @npcname$ = "";
+ close;
+}
+001-1,100,79,0 script Marikel NPC211,{
+ @npcname$ = "Marikel";
+
+ mes "[" + @npcname$ + "]";
+ mes "\"Working on the docks can be hard nowadays.\"";
+ next;
+ mes "\"At least it pays well.\"";
+ menu
+ "Why does it pay well?",L_Marikel_1,
+ "Pfft! Working on the docks is for the birds.",L_Marikel_2;
+
+L_Marikel_1:
+ mes "[" + @npcname$ + "]";
+ mes "\"Tulimshar is the wealthiest and most powerful city in the world!\"";
+ close;
+
+L_Marikel_2:
+ mes "[" + @npcname$ + "]";
+ mes "\"Yeah, killing monsters may pay well, but I'd need more hazard pay than a tower mason to hunt monsters.\"";
+ next;
+ mes "\"I'll just play safe and stick to putting our stock away. Be careful, the monsters outside the city can be dangerous.\"";
+ next;
+ mes "\"The Sandstorm mine, just South of Tulimshar, is blocked from most but miners, soldiers and seasoned monster slayers.\"";
+ close;
+}
+
+001-1,105,53,0 script Joelin NPC212,{
+ @npcname$ = "Joelin";
+
+ mes "[" + @npcname$ + "]";
+ mes "\"My ship's to set sail soon. We'll tour around the Acean Isles, then back around to Argaes, then here in Tonori.\"";
+ next;
+ mes "\"Tulimshar's Fleets also are sending exploration teams to build a dock in Nivalis on Kaizei, which I'm not really hoping for. It's cold up there!\"";
+ close;
+}
+
+001-1,107,53,0 script Harper NPC213,{
+ @npcname$ = "Harper";
+
+ mes "[" + @npcname$ + "]";
+ mes "\"My captain knows an awlful lot about the world's continents.\"";
+ close;
+}
+001-1,75,99,0 script Swezanne NPC206,{
+ @npcname$ = "Swezanne";
+
+ mes "[" + @npcname$ + "]";
+ mes "\"Just through over this bridge is the bazaar. I go to the Bazaar and shop at Neko's.\"";
+ close;
+}
+001-1,92,107,0 script Michel NPC215,{
+ @npcname$ = "Michel";
+
+ mes "[" + @npcname$ + "]";
+ mes "\"Elanore is a magician in Southern Tulimshar that helps young adventurers by healing their battle wounds. When they are experienced enough, she stops healing them.\"";
+ next;
+ mes "\"You can find her by going out the south gate and to the east.\"";
+ @npcname$ = "";
+ close;
+}
diff --git a/npc/001-1/sewer_east.txt b/npc/001-1/sewer_east.txt
new file mode 100644
index 00000000..1311b536
--- /dev/null
+++ b/npc/001-1/sewer_east.txt
@@ -0,0 +1,15 @@
+
+001-1,117,110,0 script #tulimsharsewer2 NPC45,0,0,{
+ mes "Descend into the sewers?";
+ next;
+ menu
+ "Yes.", L_Sewer,
+ "Nevermind.", L_close;
+
+L_Sewer:
+ warp "021-3",143,129;
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/001-1/sewer_north.txt b/npc/001-1/sewer_north.txt
new file mode 100644
index 00000000..6a77a9b4
--- /dev/null
+++ b/npc/001-1/sewer_north.txt
@@ -0,0 +1,15 @@
+
+001-1,58,83,0 script #tulimsharsewer1 NPC45,0,0,{
+ mes "Descend into the sewers?";
+ next;
+ menu
+ "Yes.", L_Sewer,
+ "Nevermind.", L_close;
+
+L_Sewer:
+ warp "021-3",57,100;
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/001-1/stat_reset.txt b/npc/001-1/stat_reset.txt
new file mode 100644
index 00000000..ab326064
--- /dev/null
+++ b/npc/001-1/stat_reset.txt
@@ -0,0 +1,6 @@
+
+001-1,117,105,0 script Malivox NPC103,{
+ @npcname$ = "Malivox";
+ callfunc "StatReset";
+ close;
+}
diff --git a/npc/001-1/tinris.txt b/npc/001-1/tinris.txt
new file mode 100644
index 00000000..1e23ad51
--- /dev/null
+++ b/npc/001-1/tinris.txt
@@ -0,0 +1,186 @@
+001-1,69,29,0 script Tinris NPC160,{
+ @cake_exp = 50;
+ @sweater_exp = 400;
+
+ @slime_amount1 = 6;
+ @slime_amount2 = 4;
+ @bugleg_amount1 = 4;
+ @bugleg_amount2 = 5;
+ @stinger_amount1 = 3;
+ @stinger_amount2 = 2;
+ @ash_amount1 = 1;
+ @ash_amount2 = 2;
+ @cactusp_amount = 1;
+
+ if (.@q >= 12) goto L_Done;
+ if (.@q == 11) goto L_GiveGift;
+ if (.@q == 9) goto L_FertilizerDone;
+ if (.@q >= 7) goto L_Eomie;
+ if (.@q == 6) goto L_SecondTry;
+ if (.@q >= 4) goto L_FirstTryDone;
+ if (.@q == 3) goto L_FirstTry;
+ if (.@q == 2) goto L_Annual;
+
+ mesn;
+ mes "\"This is a magic school. I'm a student here and focus on ways to magically enhance growth of plants.";
+ mes "That topic is very important in a desert area.\"";
+ if (.@q != 1)
+ goto L_close;
+ menu
+ "The farmer Anwar sent me to ask for exactly that! Can you give me something for his field?",L_Next;
+
+L_Next:
+ mesn;
+ mes "\"Well... in principle yes. I can try to prepare something for him. But...\"";
+ next;
+ mes "\"The thing is, my girlfriend and I have our anniversary today. And the teachers won't let me leave the campus to get something for her!";
+ mes "Please go to the bakery and buy a Chocolate Cake for me. She loves Chocolate Cakes.\"";
+ next;
+ mes "\"When I have a present for her I can focus on creating some magic fertilizer.\"";
+ .@q = 2;
+ goto L_close;
+
+L_Annual: // .@q == 2
+ mesn;
+ mes "\"Hello, did you get the Chocolate Cake for my girlfriend? After that I can focus on creating some magic fertilizer for you.\"";
+ menu
+ "Fresh from the bakery!",L_FreshFrom,
+ "I didn't get it yet.",L_close;
+
+L_FreshFrom:
+ if (countitem("ChocolateCake") < 1)
+ goto L_NoItem;
+ delitem "ChocolateCake", 1;
+ getexp @cake_exp, 0;
+ .@q = 3;
+ mesn;
+ mes "\"Oh, thank you! You saved me!";
+ mes "All right, now we can start with the magic fertilizer.\"";
+ next;
+ goto L_FirstTry;
+
+L_FirstTry:
+ // .@q == 3
+ mesn;
+ mes "\"You need to bring me some ingredients.";
+ mes "The ingredients are " + @slime_amount1 + " Maggot Slimes, " + @bugleg_amount1 + " Bug Legs, " + @stinger_amount1 + " Scorpion Stingers and " + @ash_amount1 + " Piles of Ash.\"";
+ menu
+ "I have it.",L_Continue,
+ "Ok, I'll go and get it.",L_close;
+
+L_Continue:
+ if ((countitem("MaggotSlime") < @slime_amount1) || (countitem("BugLeg") < @bugleg_amount1) || (countitem("ScorpionStinger") < @stinger_amount1) || (countitem("PileOfAsh") < @ash_amount1))
+ goto L_NoItem;
+ delitem "MaggotSlime", @slime_amount1;
+ delitem "BugLeg", @bugleg_amount1;
+ delitem "ScorpionStinger", @stinger_amount1;
+ delitem "PileOfAsh", @ash_amount1;
+ .@q = 4;
+ mes "Tinris takes the things and starts to mix them together while mumbling some invocations.";
+ misceffect sfx_magic_nature;
+ next;
+ mesn;
+ mes "\"Ok. This should do it. But I'm not sure. I'm still researching this topic.";
+ mes "Here, bring this to Anwar.\"";
+ mes "He gives you a bottle with the magic fertilizer. You put it away in a separate pocket, so it doesn't get mixed with your inventory.";
+ goto L_close;
+
+L_FirstTryDone: // .@q >= 4 but below 6
+ mesn;
+ mes "\"Bring the fertilizer to Anwar and let me know if it worked.\"";
+ if (.@q != 5)
+ goto L_close;
+ menu
+ "I did, the plants went brown and shriveled.",L_More;
+
+L_More:
+ .@q = 6;
+ goto L_SecondTry;
+
+L_SecondTry:
+ // .@q == 6
+ mesn;
+ mes "\"Oh no! All right, we need to do another try.";
+ mes "Bring me " + @slime_amount2 + " Maggot Slimes, " + @bugleg_amount2 + " Bug Legs, " + @stinger_amount2 + " Scorpion Stingers, " + @ash_amount2 + " Piles of Ash and " + @cactusp_amount + " Cactus Potion.\"";
+ menu
+ "Here it is.",L_HereItIs,
+ "Ok, I'll go and get it.",L_close;
+
+L_HereItIs:
+ if ((countitem("MaggotSlime") < @slime_amount2) || (countitem("BugLeg") < @bugleg_amount2) || (countitem("ScorpionStinger") < @stinger_amount2) || (countitem("PileOfAsh") < @ash_amount2) || (countitem("CactusPotion") < @cactusp_amount))
+ goto L_NoItem;
+ delitem "MaggotSlime", @slime_amount2;
+ delitem "BugLeg", @bugleg_amount2;
+ delitem "ScorpionStinger", @stinger_amount2;
+ delitem "PileOfAsh", @ash_amount2;
+ delitem "CactusPotion", @cactusp_amount;
+ .@q = 7;
+ mes "Tinris takes the things and starts to mix and mumble again.";
+ misceffect sfx_magic_nature;
+ next;
+ mes "It takes quite a while.";
+ next;
+ mes "He looks rather stressed while working on the mixture.";
+ next;
+ mes "He sighs.";
+ mesn;
+ mes "\"Mh, I think the mixture itself is good. But I can't get the spells right. Maybe you should ask Professor Eomie to cast it; she's a genius with nature magic.\"";
+ mes "He gives you the bottle with the magic fertilizer.";
+ goto L_close;
+
+L_Eomie:
+ // .@q >= 7 but below 9
+ mesn;
+ mes "\"I did the best I could, but it seems I'm not experienced enough to cast the spells correctly. Better ask Professor Eomie for help.\"";
+ goto L_close;
+
+L_FertilizerDone:
+ // .@q == 9
+ mesn;
+ mes "\"I heard Eomie cast the spell? I really hope it'll work this time. Bring the magic fertilizer to Anwar now.\"";
+ goto L_close;
+
+L_GiveGift:
+ // .@q == 11
+ mesn;
+ mes "\"Ah, did Anwar try the new fertilizer?\"";
+ menu
+ "Yes, it works great and he asked me to give you this Green V-Neck Sweater he made.",L_ItWorksGreat,
+ "Not yet.",L_close;
+
+L_ItWorksGreat:
+ if (countitem("GreenVNeckSweater") < 1)
+ goto L_NoItem;
+ delitem "GreenVNeckSweater", 1;
+ getexp @sweater_exp, 0;
+ .@q = 12;
+ mesn;
+ mes "\"Hey, that's really nice. Tell him my thanks.\"";
+ goto L_close;
+
+L_Done:
+ // .@q >= 12
+ mesn;
+ mes "\"My girlfriend was delighted with the Chocolate Cake and Professor Eomie was happy with my work on the magic fertilizer.\"";
+ mes "He twinkles.";
+ mesn;
+ mes "\"We're a good team.\"";
+ goto L_close;
+
+L_NoItem:
+ mesn;
+ mes "\"You don't have it!\"";
+ goto L_close;
+
+L_close:
+ @slime_amount1 = 0;
+ @slime_amount2 = 0;
+ @bugleg_amount1 = 0;
+ @bugleg_amount2 = 0;
+ @stinger_amount1 = 0;
+ @stinger_amount2 = 0;
+ @ash_amount1 = 0;
+ @ash_amount2 = 0;
+ @cactusp_amount = 0;
+ close;
+}
diff --git a/npc/001-1/tombstones.txt b/npc/001-1/tombstones.txt
new file mode 100644
index 00000000..ce7a9ae8
--- /dev/null
+++ b/npc/001-1/tombstones.txt
@@ -0,0 +1,65 @@
+
+001-1,56,103,0 script RIP#1 NPC400,{
+
+ mes "~ wushin ~";
+ mes "\"Tonori swallowed him whole.\"";
+ close;
+}
+
+001-1,57,103,0 script RIP#2 NPC400,{
+
+ mes "~ Nard ~";
+ mes "\"Crushed by a loom.\"";
+ close;
+}
+
+001-1,58,103,0 script RIP#3 NPC400,{
+
+ mes "~ tux9th ~";
+ mes "\"Eaten by bugs.\"";
+ close;
+}
+
+001-1,59,103,0 script RIP#4 NPC400,{
+
+ mes "~ o11c ~";
+ mes "\"He asked for it, so they gave it to him.\"";
+ close;
+}
+
+001-1,60,103,0 script RIP#5 NPC400,{
+
+ mes "~ " + strcharinfo(0) + " ~";
+ mes "The epitath is blank and the grave freshly dug.";
+ close;
+}
+001-1,56,106,0 script RIP#6 NPC400,{
+
+ mes "~ Cassy ~";
+ mes "\"Eaten by trolls.\"";
+ close;
+}
+
+001-1,57,106,0 script RIP#7 NPC400,{
+ mes "~ George ~";
+ mes "\"Eaten by snakes.\"";
+ close;
+}
+
+001-1,58,106,0 script RIP#8 NPC400,{
+ mes "~ Kieron ~";
+ mes "\"He was right; monsters were in the cave.\"";
+ close;
+}
+
+001-1,59,106,0 script RIP#9 NPC400,{
+ mes "~ William ~";
+ mes "\"Kieron was definitely right.\"";
+ close;
+}
+
+001-1,60,106,0 script RIP#10 NPC400,{
+ mes "~ Tyer ~";
+ mes "\"An experiement went wrong.\"";
+ close;
+}
diff --git a/npc/001-1/weellos.txt b/npc/001-1/weellos.txt
new file mode 100644
index 00000000..b083b889
--- /dev/null
+++ b/npc/001-1/weellos.txt
@@ -0,0 +1,31 @@
+001-1,55,25,0 script Weellos NPC103,{
+ @halloween_npc_id = $@halloween_npc_weellos;
+ callfunc "TrickOrTreat";
+
+ QUEST_NorthTulimshar = QUEST_NorthTulimshar | $@knowWeellosNT;
+
+ if (isin("001-1", 48, 20, 61, 28)) goto L_In;
+
+ mes "[Weellos]";
+ mes "\"This is a very historic building – in fact, it's one of the oldest in the area.\"";
+ next;
+ mes "\"It's also the current seat of both the Council of Wizards and the Magic Institute of Tulimshar.\"";
+ next;
+ mes "\"Due to its historical significance, part of it has been turned into a museum.\"";
+ goto L_BeforeClose;
+
+L_In:
+ mes "[Weellos]";
+ mes "\"What did you think? Isn't the building intriguing?\"";
+ goto L_BeforeClose;
+
+L_BeforeClose:
+ if (QL_KYLIAN != 4)
+ goto L_close;
+ next;
+ mes "You wonder if Kylian would be interested in seeing this historic landmark...";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/001-2/_import.txt b/npc/001-2/_import.txt
new file mode 100644
index 00000000..58464d30
--- /dev/null
+++ b/npc/001-2/_import.txt
@@ -0,0 +1,18 @@
+// Map 001-2: South Tulimshar Indoor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/001-2/_warps.txt",
+"npc/001-2/bank.txt",
+"npc/001-2/david.txt",
+"npc/001-2/fieri.txt",
+"npc/001-2/forge_shops.txt",
+"npc/001-2/government_building.txt",
+"npc/001-2/heathin.txt",
+"npc/001-2/jhedia.txt",
+"npc/001-2/manakins.txt",
+"npc/001-2/mapflags.txt",
+"npc/001-2/pauline.txt",
+"npc/001-2/sandra.txt",
+"npc/001-2/tathin.txt",
+"npc/001-2/tondar.txt",
+"npc/001-2/wizards.txt",
+"npc/001-2/yanis.txt",
diff --git a/npc/001-2/_warps.txt b/npc/001-2/_warps.txt
new file mode 100644
index 00000000..84eb0d69
--- /dev/null
+++ b/npc/001-2/_warps.txt
@@ -0,0 +1,17 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 001-2: South Tulimshar Indoor warps
+001-2,25,65,0 warp #001-2_25_65 0,0,001-1,114,100
+001-2,28,102,0 warp #001-2_28_102 0,0,001-1,27,33
+001-2,28,86,0 warp #001-2_28_86 0,0,001-1,28,22
+001-2,105,102,0 warp #001-2_105_102 1,0,001-1,54,35
+001-2,25,28,0 warp #001-2_25_28 0,0,001-1,49,72
+001-2,28,28,0 warp #001-2_28_28 0,0,001-1,52,72
+001-2,31,28,0 warp #001-2_31_28 0,0,001-1,55,72
+001-2,71,102,0 warp #001-2_71_102 0,0,001-1,37,33
+001-2,105,73,0 warp #001-2_105_73 3,0,001-2,104,42
+001-2,105,43,0 warp #001-2_105_43 3,0,001-2,104,74
+001-2,114,53,0 warp #001-2_114_53 0,0,001-1,57,23
+001-2,95,53,0 warp #001-2_95_53 0,0,001-1,52,23
+001-2,57,90,0 warp #001-2_57_90 0,0,001-2,35,94
+001-2,36,95,0 warp #001-2_36_95 0,1,001-2,58,90
+001-2,65,26,0 warp #001-2_65_26 0,0,001-1,59,99
diff --git a/npc/001-2/bank.txt b/npc/001-2/bank.txt
new file mode 100644
index 00000000..7ab46396
--- /dev/null
+++ b/npc/001-2/bank.txt
@@ -0,0 +1,6 @@
+001-2,63,17,0 script Hydusun NPC149,{
+ @npcname$ = "Hydusun";
+ callfunc "Banker";
+ close;
+}
+
diff --git a/npc/001-2/david.txt b/npc/001-2/david.txt
new file mode 100644
index 00000000..f3ce6b55
--- /dev/null
+++ b/npc/001-2/david.txt
@@ -0,0 +1,52 @@
+001-2,92,88,0 script David NPC120,{
+ @Potion_EXP = 2000;
+
+ if (Rossy_Quest == 17) goto L_FinalEnd;
+ if (Rossy_Quest == 14) goto L_Julia;
+ if (Rossy_Quest >= 8) goto L_Done;
+
+ mes "[David]";
+ mes "\"Learning magic is hard...\"";
+ if (Rossy_Quest == 7) goto L_Help;
+ close;
+
+L_Help:
+ menu
+ "Do you know Rossy?", L_Set,
+ "I can tell, it is hard.", L_No;
+
+L_Set:
+ mes "[David]";
+ mes "\"Yes, I do. I am her teacher. Actually, that reminds me about her final exam... she didn't hand in her potion yet. Time is running out.\"";
+ menu
+ "A potion? Oh, uhm... Strange kind of exam. Bye.", L_No,
+ "Right, I have her potion in my pocket. She asked me to bring it to you. Here it is.", L_Next;
+
+L_Next:
+ mes "[David]";
+ mes "\"Let me see.\"";
+ Rossy_Quest = 8;
+ mes "\"This potion is... perfect! Tell Rossy that she successfully made her potion; it is flawless!\"";
+ getexp @Potion_EXP, 0;
+ close;
+
+L_Done:
+ mes "[David]";
+ mes "\"I am really happy that my best student successfully passed her exam!\"";
+ close;
+
+L_No:
+ close;
+
+L_Julia:
+ mes "[David]";
+ mes "\"I heard Rossy's sister got kidnapped. We're counting on you to find her!\"";
+ next;
+ mes "\"If you do find her, talk to her sister and her mother.\"";
+ close;
+
+L_FinalEnd:
+ mes "[David]";
+ mes "Well done! Thanks for finding Julia!";
+ close;
+}
diff --git a/npc/001-2/fieri.txt b/npc/001-2/fieri.txt
new file mode 100644
index 00000000..5d6a0890
--- /dev/null
+++ b/npc/001-2/fieri.txt
@@ -0,0 +1,117 @@
+001-2,114,89,0 script Fieri NPC117,{
+ if (QL_FIERI >= 4) goto L_Done2;
+ if (QL_FIERI == 3) goto L_Progress2;
+ if (QL_FIERI == 2) goto L_Done1;
+ if (QL_FIERI == 1) goto L_Progress;
+
+ @temp = rand(2);
+ if(@temp == 1) goto L_Opening1;
+ goto L_Opening0;
+
+L_Opening0:
+ mes "[Fieri]";
+ mes "\"The Wizards are always hungry. All the magic all the time, sapping their energy.";
+ mes "Could I ask a favor of you?\"";
+ next;
+ goto L_Ask;
+
+L_Opening1:
+ mes "[Fieri]";
+ mes "\"These Wizards eat like a store house full of maggots.";
+ mes "At this rate I'll have nothing left to cook. Can you help me with a task?\"";
+ next;
+ goto L_Ask;
+
+L_Ask:
+ menu
+ "Yes.", L_Yes,
+ "No.", L_close;
+
+L_Yes:
+ @temp = rand(2);
+ if(@temp == 1) goto L_Req1;
+ goto L_Req0;
+
+L_Req0:
+ mes "[Fieri]";
+ mes "\"Great! I need a Beer for my Tonori Delight.\"";
+ next;
+ goto L_Set;
+
+L_Req1:
+ mes "[Fieri]";
+ mes "\"Bring me a Beer. I'll give you something if you do.\"";
+ next;
+ goto L_Set;
+
+L_Set:
+ QL_FIERI = 1;
+ mes "[Fieri]";
+ mes "\"Please bring it to me!\"";
+ goto L_close;
+
+L_Progress:
+ if (countitem("Beer") < 1) goto L_NotEnough;
+ mes "[Fieri]";
+ mes "\"Oooh, perfect! It's perfect!";
+ mes "You brought me my Beer! Here, have some cake for your troubles.\"";
+ getinventorylist;
+ if (@inventorylist_count - (countitem("Beer") == 1) > 99 - (countitem("CherryCake") == 0) ) goto L_TooMany;
+ delitem "Beer", 1;
+ getexp 100, 0;
+ getitem "CherryCake", 5;
+ QL_FIERI = 2;
+ next;
+ mes "\"Now let's see...\"";
+ goto L_close;
+
+L_Progress2:
+ if (countitem("MaggotSlime") < 3) goto L_NotEnough1;
+ mes "[Fieri]";
+ mes "\"Nice! They're perfect, just perfect!";
+ mes "You brought me the 3 Maggot Slimes! Here, have some Tonori Delight as reward.\"";
+ getinventorylist;
+ if ((@inventorylist_count - (countitem("MaggotSlime") == 3) > 99 - (countitem("TonoriDelight") == 0) )) goto L_TooMany;
+ delitem "MaggotSlime", 3;
+ getexp 100, 0;
+ getitem "TonoriDelight", 3;
+ QL_FIERI = 4;
+ goto L_close;
+
+L_NotEnough:
+ mes "[Fieri]";
+ mes "\"Oh, please hurry and bring me a Beer. The Wizards need their Tonori Delight!\"";
+ goto L_close;
+
+L_NotEnough1:
+ mes "[Fieri]";
+ mes "\"Please do hurry and bring me 3 Maggot Slimes, so I can finish the Tonori Delight!\"";
+ goto L_close;
+
+L_Done1:
+ mes "[Fieri]";
+ mes "\"Thank you so much!\"";
+ mes "\"But... I need some more ingredients.\"";
+ next;
+ mes "\"I need 3 Maggot Slimes for that.\"";
+ mes "\"Bring them to me, and I'll give you something nice.\"";
+ QL_FIERI = 3;
+ goto L_close;
+
+L_Done2:
+ mes "[Fieri]";
+ mes "\"I hope you like Tonori Delight as much as I do, because, you see...\"";
+ next;
+ mes "\"Tonori Delight is life!\"";
+ goto L_close;
+
+L_close:
+ @temp = 0;
+ close;
+
+L_TooMany:
+ next;
+ mes "[Fieri]";
+ mes "\"You don't have room for my reward. I'll wait until you do.\"";
+ goto L_close;
+}
diff --git a/npc/001-2/forge_shops.txt b/npc/001-2/forge_shops.txt
new file mode 100644
index 00000000..cdbece0a
--- /dev/null
+++ b/npc/001-2/forge_shops.txt
@@ -0,0 +1,36 @@
+// The Mana World Script
+// (C) Jesusalva, 2021
+// Licensed under GPLv2 or later
+
+001-2,30,60,0 script Gungnir NPC311,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem SlingShot;
+ sellitem SlingBullet;
+ sellitem ShortBow;
+ sellitem Arrow;
+ sellitem IronArrow;
+ .distance = 5;
+ end;
+}
+
+
+001-2,25,59,0 script Mjolnir NPC377,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Knife;
+ sellitem SharpKnife;
+ sellitem Dagger;
+ sellitem LeatherShield;
+ .distance = 5;
+ end;
+}
+
diff --git a/npc/001-2/government_building.txt b/npc/001-2/government_building.txt
new file mode 100644
index 00000000..d4a73df0
--- /dev/null
+++ b/npc/001-2/government_building.txt
@@ -0,0 +1,154 @@
+
+001-2,25,21,0 script Estard NPC107,{
+ mes "[Estard]";
+ mes "\"Hello. What can I do for you?\"";
+ next;
+ if (getpartnerid())
+ goto L_Main_married;
+
+ menu
+ "I'd like to get married.", L_marry,
+ "Never mind.", L_close;
+
+L_Main_married:
+ menu
+ "I'd like to file for divorce.", L_divorce,
+ "Never mind.", L_close;
+
+L_marry:
+ if (BaseLevel < WEDDING_MIN_LEVEL)
+ goto L_marry_too_young;
+ if (Zeny < WEDDING_FEE)
+ goto L_marry_too_poor;
+
+ mes "";
+ mes "[Estard]";
+ mes "\"Are you sure that you want to get married? It'll cost you ##B" + WEDDING_FEE + " GP##b.\"";
+ menu
+ "Yes!", L_marry_do,
+ "I'm having second thoughts...", L_close;
+
+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).'\"";
+ close;
+
+L_marry_too_young:
+ mes "";
+ mes "[Estard]";
+ mes "\"I'm sorry, but you are too young to get married. You must be at least " + WEDDING_MIN_LEVEL + " levels old.\"";
+ next;
+
+ menu
+ "Can I at least get the wedding rings now?", L_Get_rings,
+ "Thanks anyways.", L_close;
+
+L_marry_too_poor:
+ mes "";
+ mes "[Estard]";
+ mes "\"It costs ##B" + WEDDING_FEE + " GP##b to get married. That covers all the processing fees for the marriage and provides you with two wedding rings.\"";
+ close;
+
+L_Get_rings:
+ mes "";
+ mes "[Estard]";
+ mes "\"Yes! You certainly can. They're ##B" + WEDDING_FEE + " GP##b. That covers all the processing fees for the marriage and provides you with two wedding rings.\"";
+
+ if (Zeny < WEDDING_FEE)
+ menu
+ "Thanks, but I don't have enough with me right now.", L_close;
+ if (Zeny >= WEDDING_FEE)
+ menu
+ "Sounds great!", L_Get_rings_pay,
+ "No thanks.", L_close;
+ goto L_Get_rings_pay;
+
+L_Get_rings_pay:
+ callsub S_give_rings;
+
+ mes "";
+ mes "[Estard]";
+ mes "\"There you go! %%1\"";
+ close;
+
+L_divorce:
+ @divorce_cost = DIVORCE_FEE_PER_LEVEL * BaseLevel;
+
+ if (Zeny < @divorce_cost)
+ goto L_divorce_not_enough;
+
+ mes "[Estard]";
+ mes "\"I'm sorry to hear that. If you're sure you want a divorce, it'll cost you %%B" + @divorce_cost + " GP%%b.\"";
+ next;
+ menu
+ "I'm sure.", L_do_divorce,
+ "I'm having second thoughts...", L_close;
+
+L_do_divorce:
+ if (Zeny < @divorce_cost)
+ goto L_Not_enough_money;
+
+ divorce();
+ if (getpartnerid() < 1) goto L_divorce_done;
+
+ mes "";
+ mes "[Estard]";
+ mes "\"I'm having trouble finding your documents. Please come back later.\"";
+ mes "";
+ mes "[Server]";
+ mes "There was an unexpected error when processing your divorce. Please report this to the developers.";
+ close;
+
+L_divorce_done:
+ Zeny = Zeny - @divorce_cost;
+
+ mes "";
+ mes "[Estard]";
+ mes "\"You have now officially divorced your spouse.\"";
+ close;
+
+L_divorce_not_enough:
+ mes "";
+ mes "[Estard]";
+ mes "\"I'm sorry, but you don't have enough money to get a divorce. You need ##B" + @divorce_cost + " GP##b.\"";
+ close;
+
+L_Not_enough_money:
+ mes "";
+ mes "[Estard]";
+ mes "\"I'm sorry, but it seems as though you don't have enough money.\"";
+ close;
+
+L_No_Room_For_Rings:
+ mes "";
+ mes "[Estard]";
+ mes "\"Hm... it doesn't look like you have enough room to carry these rings.";
+ mes "Free up some space, and then I'd be happy to give them to you.\"";
+ close;
+
+L_close:
+ mes "";
+ mes "[Estard]";
+ mes "\"OK. Just come back whenever you're ready.\"";
+ close;
+
+S_give_rings:
+ if (Zeny < WEDDING_FEE)
+ goto L_Not_enough_money;
+ getinventorylist;
+ if (@inventorylist_count > 98)
+ goto L_No_Room_For_Rings;
+
+ Zeny = Zeny - WEDDING_FEE;
+ getitem "WeddingRing", 1;
+ getitem "WeddingRing", 1;
+ return;
+}
+
+001-2,22,21,0 script Guard#govt_in NPC123,{
+ mes "[Guard]";
+ mes "\"You're not allowed back here.\"";
+ close;
+}
diff --git a/npc/001-2/heathin.txt b/npc/001-2/heathin.txt
new file mode 100644
index 00000000..82f72802
--- /dev/null
+++ b/npc/001-2/heathin.txt
@@ -0,0 +1,338 @@
+001-2,23,55,0 script Heathin NPC147,{
+ @TARROW_REQ_TERRA_ORE = 1;
+ @TARROW_REQ_COAL = 5;
+ @TARROW_REQ_GP = 3000;
+ @heathin_xp_bonus = (100 * BaseLevel);
+
+ if (QL_TERRANITE_ARMOR == 14) && (BaseLevel >= 80) goto L_Arrows_Trade;
+ if (QL_TERRANITE_ARMOR == 13) && (BaseLevel >= 80) goto L_Arrows_Ready;
+ if (QL_TERRANITE_ARMOR == 12) && (BaseLevel >= 80) goto L_Arrows_Forge;
+ if (QL_TERRANITE_ARMOR == 11) && (BaseLevel >= 80) goto L_Arrows;
+ if (QL_TERRANITE_ARMOR == 11) goto L_Forge_Thanks;
+ if (QL_TERRANITE_ARMOR == 10) && (BaseLevel >= 80) goto L_Chest_Armor_Ready;
+ if (QL_TERRANITE_ARMOR == 9) && (BaseLevel >= 80) goto L_Chest_Armor_Forge;
+ if (QL_TERRANITE_ARMOR == 8) && (BaseLevel >= 80) goto L_Chest_Armor;
+ if (QL_TERRANITE_ARMOR == 8) goto L_Forge_Thanks;
+ if (QL_TERRANITE_ARMOR == 7) && (BaseLevel >= 75) goto L_Legs_Ready;
+ if (QL_TERRANITE_ARMOR == 6) && (BaseLevel >= 75) goto L_Legs_Forge;
+ if (QL_TERRANITE_ARMOR == 5) && (BaseLevel >= 75) goto L_Legs;
+ if (QL_TERRANITE_ARMOR == 5) goto L_Forge_Thanks;
+ if (QL_TERRANITE_ARMOR == 4) && (BaseLevel >= 70) goto L_Hood_Ready;
+ if (QL_TERRANITE_ARMOR == 3) && (BaseLevel >= 70) goto L_Hood_Forge;
+ if (QL_TERRANITE_ARMOR == 2) && (BaseLevel >= 70) goto L_Hood;
+ if (QL_TERRANITE_ARMOR == 2) goto L_Forge_Thanks;
+ if (QL_TERRANITE_ARMOR == 1) && (BaseLevel >= 60) goto L_Forge_Award;
+ if (QL_TERRANITE_ARMOR < 1 && BaseLevel >= 60) goto L_Start;
+
+ mes "[Heathin]";
+ mes "\"Hello, friend. I am Heathin, a smith of exotic metals. \"";
+ close;
+
+L_Start:
+ mes "[Heathin]";
+ mes "\"Hello, friend. I am Heathin, a smith of exotic metals. \"";
+ next;
+ mes "\"By the order of the Wizard's Council, I've been commissioned to forge armor for the upcoming expediation. However, I am but a simple smith and cannot complete all this effort by myself. I need individuals that can gather Coal to heat my forge.\"";
+ next;
+ mes "\"Perhaps you would be interested in helping me out? Would you be willing to help me gather Coal and help me fulfill my commission? I am asking any and all willing souls to get me 50 coal, as that would put a significant dint in my goal.\"";
+ menu
+ "Sure, I'll help!", L_Help,
+ "I'd rather keep my Coal for my own purposes, thank you very much.", L_No,
+ "Wait, what kind of award are we talking about?", L_Interested;
+
+L_Help:
+ QL_TERRANITE_ARMOR = 1;
+ mes "[Heathin]";
+ mes "\"Excellent! I am always glad when someone can be of service not just to me, but to all of Tulimshar. Please get me 50 Coal and you will be compensated for your efforts.\"";
+ close;
+
+L_Interested:
+ mes "[Heathin]";
+ mes "\"Well, I can compensate you from the commision I getting from the council.\"";
+ next;
+ mes "\"How does 20,000 GP and I'll offer my smithing services for a discount?\"";
+ next;
+ mes "\"Does this sound like something you might be interested in?\"";
+ menu
+ "Sure, I'll help!", L_Help,
+ "I'd rather keep my Coal.", L_No,
+ "Can you repeat that again?", L_Interested;
+
+L_Forge_Award:
+ if (countitem (Coal) < 50) goto L_Forge_Wait;
+ getinventorylist;
+ QL_TERRANITE_ARMOR = 2;
+ delitem Coal, 50;
+ getexp @heathin_xp_bonus, 0;
+ Zeny = Zeny + 20000;
+ mes "[Heathin]";
+ mes "\"You have brought the Coal. This is most excellent! As promised, I have a reward for you. Hopefully you will find it useful.\"";
+ next;
+ mes "\"Time to make some armor. The Council will be pleased. Thank you for your efforts!\"";
+ close;
+
+L_Forge_Wait:
+ mes "[Heathin]";
+ mes "\"Hello again. Making armor keeps me pretty busy. I certainly hope I can fulfill my commission soon so that I can move on to bigger and better things.\"";
+ next;
+ mes "\"The pay is good, certainly, but I am a far better smith than this. If you can bring me 50 Coal, it would surely get me to my goal faster.\"";
+ next;
+ mes "\"I will be sure to provide an apt award once you are done.\"";
+ close;
+
+L_Forge_Thanks:
+ mes "[Heathin]";
+ mes "\"Thank you again for helping me fulfil my commission. It has made a signficant dint in what the Council requires of me. Perhaps I may be of service to you again one day!\"";
+ close;
+
+L_Hood:
+ mes "[Heathin]";
+ mes "\"Hello again friend, I just found out about this great metal called terranite.\"";
+ next;
+ mes "\"This metal is almost as strong as steel, but is also very ductile.\"";
+ next;
+ mes "\"With some effort, I can make this metal form rings tighter than any chain mail. It isn't the prettiest in hue, but its uses can be many.\"";
+ next;
+ mes "\"Unfortunately, it seems to be difficult to gather. Most that have searched for Terranite Ore either cannot find it or have never returned...\"";
+ next;
+ mes "\"I may be an excellent smith, but I certainly am no combatant. However, I would enjoy turning this ore into something useful, perhaps some type of armor to help those that may be braver.\"";
+ next;
+ mes "\"So, what do you say? Are you interested?\"";
+ menu
+ "No, thank you. Maybe later.", L_No,
+ "Armor, you say? Definitely!", L_Yes;
+
+L_No:
+ mes "[Heathin]";
+ mes "\"Ah, that is too bad. Come back anytime.\"";
+ close;
+
+L_Yes:
+ QL_TERRANITE_ARMOR = 3;
+ mes "[Heathin]";
+ mes "\"Great, this is going to be fun! As I have not had much practice with this armor, I'd like to get started soon.\"";
+ next;
+ mes "Heathin thinks for a moment.";
+ next;
+ mes "\"Ah, I know! I will make a helm... Well, more like a hood, since it will be woven.\"";
+ next;
+ mes "\"It will require a great amount of heat, if the rumors are to be believed. For this, I will need 100 Coal to keep my forge burning hot. I will also need 10 Terranite Ore to make the armor. Of course, such work does not come cheap. While I may enjoy my work, my time and effort is very valuable. Since you have been a great help I will only need 20,000 gold pieces, well below my going rate. Please come back with the gold, Coal and ore and I'll make this hood for you.\"";
+ close;
+
+L_Hood_Forge:
+ if ( (Zeny < 20000)
+ || (countitem(Coal) < 100)
+ || (countitem(TerraniteOre) < 10) )
+ goto L_Hood_Wait;
+ QL_TERRANITE_ARMOR = 4;
+ delitem Coal, 100;
+ delitem TerraniteOre, 10;
+ getexp @heathin_xp_bonus, 0;
+ Zeny = Zeny - 20000;
+ mes "[Heathin]";
+ mes "\"Great, you brought everything! Come back later and I'll have the helm ready for you.\"";
+ close;
+
+L_Hood_Wait:
+ mes "[Heathin]";
+ mes "\"I am very busy right now. If you could bring me 10 Terranite Ore, 100 Coal and 20,000 gold pieces, I will make that terranite hood for you.\"";
+ close;
+
+L_Hood_Ready:
+ getinventorylist;
+ if ((checkweight("TerraniteHelmet", 1) == 0) || (@inventorylist_count == 100))
+ goto L_InventoryNoSpace;
+ QL_TERRANITE_ARMOR = 5;
+ getitem TerraniteHelmet, 1;
+ mes "[Heathin]";
+ mes "\"I am all done with your terranite hood. I hope you enjoy it! I have some work to wrap up for the Council, but come back later and I might be able to assist you again.\"";
+ close;
+
+L_Legs:
+ QL_TERRANITE_ARMOR = 6;
+ mes "[Heathin]";
+ mes "\"I am glad you are back! I've just finished up some more of my commission. Now I can get back to making terranite armor for you. This time I will make some pants, but they need more ore, more Coal to heat my forge and of course, more gold for my efforts.\"";
+ next;
+ mes "\"To make terranite pants, I need 200 Coal, 30 Terranite Ore and 40,000 gold pieces. The faster you bring this to me, the faster I can have your terranite pants ready.\"";
+ close;
+
+L_Legs_Forge:
+ if ( (Zeny < 40000)
+ || (countitem(Coal) < 200)
+ || (countitem(TerraniteOre) < 30) )
+ goto L_Legs_Wait;
+ QL_TERRANITE_ARMOR = 7;
+ delitem Coal, 200;
+ delitem TerraniteOre, 30;
+ getexp @heathin_xp_bonus, 0;
+ Zeny = Zeny - 40000;
+ mes "[Heathin]";
+ mes "\"Great, you have brought everything! Come back later and I will have those terranite pants ready for you.\"";
+ close;
+
+L_Legs_Wait:
+ mes "[Heathin]";
+ mes "\"I am very busy right now. If you could bring me 30 Terranite Ore, 200 Coal and 40,000 gold pieces, I will make those terranite pants for you.\"";
+ close;
+
+L_Legs_Ready:
+ getinventorylist;
+ if ((checkweight("TerraniteLegs", 1) == 0) || (@inventorylist_count == 100))
+ goto L_InventoryNoSpace;
+ QL_TERRANITE_ARMOR = 8;
+ getitem "TerraniteLegs", 1;
+ mes "[Heathin]";
+ mes "\"I am all done with your terranite pants. Hope you enjoy them! I have some more work to complete for the Council. Come back later and I might be able to assist you again.\"";
+ close;
+
+L_Chest_Armor:
+ QL_TERRANITE_ARMOR = 9;
+ mes "[Heathin]";
+ mes "\"Good to see you again. I have just finished up some more of my commission. Now I can get back to making terranite armor for you. This time, I will make some terranite chest armor, but it needs more ore, more Coal for my forge and of course, more gold to compensate for my efforts.\"";
+ next;
+ mes "\"To make terranite chest armor, I need 250 Coal, 40 Terranite Ore and 50,000 gold pieces. The faster you bring this to me, the faster I can have your terranite armor ready.\"";
+ close;
+
+L_Chest_Armor_Forge:
+ if ( (Zeny < 50000)
+ || (countitem(Coal) < 250)
+ || (countitem(TerraniteOre) < 40) )
+ goto L_Chest_Armor_Wait;
+ QL_TERRANITE_ARMOR = 10;
+ delitem Coal, 250;
+ delitem TerraniteOre, 40;
+ getexp @heathin_xp_bonus, 0;
+ Zeny = Zeny - 50000;
+ mes "[Heathin]";
+ mes "\"Splendid, you have brought everything! Come back later and I will have the terranite chest armor ready for you.\"";
+ close;
+
+L_Chest_Armor_Wait:
+ mes "[Heathin]";
+ mes "\"I am very busy right now. If you could bring me 40 Terranite Ore, 250 Coal and 50,000 gold pieces, I will make that chest armor for you.\"";
+ close;
+
+L_Chest_Armor_Ready:
+ getinventorylist;
+ if ((checkweight("TerraniteChestArmor", 1) == 0) || (@inventorylist_count == 100))
+ goto L_InventoryNoSpace;
+ QL_TERRANITE_ARMOR = 11;
+ getitem "TerraniteChestArmor", 1;
+ mes "[Heathin]";
+ mes "\"I have completed your terranite chest armor. I hope you enjoy it! I have some work to wrap up for the Council again, but come back later and I might be able to assist you once more.\"";
+ close;
+
+L_Arrows:
+ mes "[Heathin]";
+ mes "\"How good to see you. I have experimented a little with Terranite Ore to see what else can be done with it. It seems to have some qualities suitable for weapons, but I have only tested it with arrows. If you would like, I can make Terranite Arrows, but as as with the armor, I need Coal, Terranite Ore and payment for my efforts.\"";
+ next;
+ mes "\"Also, it might be a while until I have time to see what else I can make with terranite other than arrows, as right now the Council is keeping me rather busy with my commission. So, would you like some Terranite Arrows?\"";
+ menu
+ "No, thank you.", L_Arrows_No,
+ "Sure, I could use some arrows.", L_Arrows_Yes;
+
+L_Arrows_No:
+ mes "[Heathin]";
+ mes "\"Well, if you change your mind, I'm not going anywhere.\"";
+ close;
+
+L_Arrows_Yes:
+ QL_TERRANITE_ARMOR = 12;
+ mes "[Heathin]";
+ mes "\"Good, good. I shall begin crafting these arrows as soon as you come back. However, I cannot just make small handfuls as it would not be worth my time and effort to have my concentration interrupted for small tasks. I will make 1,000 Terranite Arrows per request, for which I will need "+@TARROW_REQ_TERRA_ORE+" Terranite Ore, "+@TARROW_REQ_COAL+" Coal and "+@TARROW_REQ_GP+" gold pieces.\"";
+ next;
+ mes "\"See you soon!\"";
+ close;
+
+L_Arrows_Forge:
+ if ( (Zeny < @TARROW_REQ_GP)
+ || (countitem(Coal) < @TARROW_REQ_COAL)
+ || (countitem(TerraniteOre) < @TARROW_REQ_TERRA_ORE) )
+ goto L_Arrows_Wait;
+ QL_TERRANITE_ARMOR = 13;
+ delitem Coal, @TARROW_REQ_COAL;
+ delitem TerraniteOre, @TARROW_REQ_TERRA_ORE;
+ getexp @heathin_xp_bonus, 0;
+ Zeny = Zeny - @TARROW_REQ_GP;
+ mes "[Heathin]";
+ mes "\"Wonderful! You have everything I asked for. I will start working on the arrows right away.\"";
+ close;
+
+L_Arrows_Wait:
+ mes "[Heathin]";
+ mes "\"If you want Terranite Arrows, please get me "+@TARROW_REQ_TERRA_ORE+" Terranite Ore, "+@TARROW_REQ_COAL+" Coal and "+@TARROW_REQ_GP+" gold pieces.\"";
+ close;
+
+L_Arrows_Ready:
+ getinventorylist;
+ if ((checkweight(TerraniteArrow, 1000) == 0) || (@inventorylist_count == 100))
+ goto L_InventoryNoSpace;
+ QL_TERRANITE_ARMOR = 14;
+ getitem TerraniteArrow, 1000;
+ mes "[Heathin]";
+ mes "\"All done, here you go! I hope you like them. I am still working on my commission, but if you ever need any more Terranite Arrows, just come on by with "+@TARROW_REQ_COAL+" Coal, "+@TARROW_REQ_TERRA_ORE+" Terranite Ore and "+@TARROW_REQ_GP+" gold pieces and I will make another 1,000 arrows for you. By now I have enough Terranite Ore in reserve that you can just trade me my requirements to keep my resources up. Thank you for all your efforts!\"";
+ close;
+
+L_Arrows_Trade:
+ mes "[Heathin]";
+ mes "\"Hello, there. If you have "+@TARROW_REQ_COAL+" Coal, "+@TARROW_REQ_TERRA_ORE+" Terranite Ore and "+@TARROW_REQ_GP+" gold pieces, I will trade you 1,000 Terranite Arrows. Would you like some Terranite Arrows?\"";
+ menu
+ "No.", L_Arrows_Trade_No,
+ "Yes.", L_Arrows_Trade_Yes;
+
+L_Arrows_Trade_No:
+ mes "[Heathin]";
+ mes "\"Come back again if you would like to get Terranite Arrows.\"";
+ close;
+
+L_Arrows_Trade_Yes:
+ if ( (Zeny < @TARROW_REQ_GP)
+ || (countitem(Coal) < @TARROW_REQ_COAL)
+ || (countitem(TerraniteOre) < @TARROW_REQ_TERRA_ORE) )
+ goto L_Arrows_Trade_Wait;
+ getinventorylist;
+ if ((checkweight(TerraniteArrow, 1500) == 0) || (@inventorylist_count == 100))
+ goto L_InventoryNoSpace;
+ delitem Coal, @TARROW_REQ_COAL;
+ delitem TerraniteOre, @TARROW_REQ_TERRA_ORE;
+ Zeny = Zeny - @TARROW_REQ_GP;
+ @lucky = 5 * rand(Luk);
+ @lucky$ = "";
+ getitem TerraniteArrow, 1000 + @lucky;
+ mes "[Heathin]";
+ if(@lucky>0)
+ @lucky$ = " You are lucky, I could forge "+@lucky+" more arrows than expected.";
+ mes "Here you go!" + @lucky$ + " Come back again if you want more Terranite Arrows.\"";
+ close;
+
+L_Arrows_Trade_Wait:
+ mes "[Heathin]";
+ mes "\"It seems that you do not have the necessary resources for me to trade you. Please come back with "+@TARROW_REQ_COAL+" Coal, "+@TARROW_REQ_TERRA_ORE+" Terranite Ore and "+@TARROW_REQ_GP+" gold pieces if you want another 1,000 Terranite Arrows.\"";
+ close;
+
+L_InventoryNoSpace:
+ mes "[Heathin]";
+ mes "\"Hm no. You can't carry this right now. Make some room and come back.\"";
+ close;
+
+}
+001-2,25,55,0 script HeathinDebug NPC147,{
+ mes "[Heathin Debug]";
+ mes "Debug Action";
+ menu
+ "Reset", L_Reset,
+ "Exit", L_End;
+
+L_Reset:
+ QL_TERRANITE_ARMOR = 0;
+ mes "Reset!";
+ goto L_End;
+
+L_End:
+ end;
+
+OnInit:
+ if (!debug)
+ disablenpc "HeathinDebug";
+ end;
+}
diff --git a/npc/001-2/jhedia.txt b/npc/001-2/jhedia.txt
new file mode 100644
index 00000000..8d5e2e28
--- /dev/null
+++ b/npc/001-2/jhedia.txt
@@ -0,0 +1,60 @@
+
+001-2,23,50,0 script Jhedia NPC160,{
+ @Cost_Per_Ingot = 1000;
+ @iron_Ore_Per = 5;
+ @Coal_Per = 10;
+
+ mes "[Jhedia]";
+ mes "\"I forge Iron Ore into ingots. Ingots are more useful for skilled smiths, like armorers, because the ore is refined and made into useful units which can be worked with. To make ingots, I need " + @iron_Ore_Per + " Iron Ore and " + @Cost_Per_Ingot + " gp per ingot. I also need " + @Coal_Per + " Coal for my forge.\"";
+ next;
+ mes "[Jhedia]";
+ mes "\"How many ingots would you like?\"";
+ input @ingot_count;
+
+ if (@ingot_count == 0)
+ goto L_Jhedia_Bye;
+ @Zeny_cost = @ingot_count * @Cost_Per_Ingot;
+ if (countitem("IronOre") < @iron_Ore_Per * @ingot_count)
+ goto L_Jhedia_NotEnough_Ore;
+ if (countitem("Coal") < @Coal_Per * @ingot_count)
+ goto L_Jhedia_NotEnough_Coal;
+ if (Zeny < @Zeny_cost)
+ goto L_Jhedia_NotEnough_Zeny;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("IronIngot") == 0
+ && countitem("IronOre") > @ingot_count * @iron_Ore_Per
+ | countitem("Coal") > @ingot_count * @Coal_Per)
+ goto L_Jhedia_NotEnoughSlots;
+ Zeny = Zeny - @Zeny_cost;
+ delitem "IronOre", @ingot_count * @iron_Ore_Per;
+ delitem "Coal", @ingot_count * @Coal_Per;
+ getitem "IronIngot", @ingot_count;
+ close;
+
+L_Jhedia_Bye:
+ mes "[Jhedia]";
+ mes "\"Goodbye then.\"";
+ close;
+
+L_Jhedia_NotEnough_Ore:
+ mes "[Jhedia]";
+ mes "\"You do not seem to have enough Iron Ore.\"";
+ close;
+
+L_Jhedia_NotEnough_Coal:
+ mes "[Jhedia]";
+ mes "\"You do not seem to have enough Coal.\"";
+ close;
+
+L_Jhedia_NotEnough_Zeny:
+ mes "[Jhedia]";
+ mes "\"You do not seem to have enough gold pieces.\"";
+ close;
+
+L_Jhedia_NotEnoughSlots:
+ mes "[Jhedia]";
+ mes "\"You do not seem to have enough room to carry this many ingots.\"";
+ close;
+
+}
diff --git a/npc/001-2/manakins.txt b/npc/001-2/manakins.txt
new file mode 100644
index 00000000..db8ea1dd
--- /dev/null
+++ b/npc/001-2/manakins.txt
@@ -0,0 +1,45 @@
+
+001-2,29,57,0 script Terranite Armor#Female NPC401,{
+ mes "A complete set of female Terranite armor stands on display. These appear to be made to order.";
+ next;
+ mes "An inscription on the helmet reads \"Made by Heathin.\"";
+ close;
+}
+
+001-2,34,57,0 script Terranite Armor#Male NPC402,{
+ mes "A complete set of male Terranite armor stands on display. These appear to be made to order.";
+ next;
+ mes "An inscription on the helmet reads \"Made by Heathin.\"";
+ close;
+}
+
+001-2,34,62,0 script Terranite NPC403,{
+ mes "Ahhh! A Terranite!";
+ next;
+ mes "Wait a minute...";
+ next;
+ mes "It appears to just be a display model.";
+ close;
+}
+
+
+001-2,91,39,0 script Talponian#Female NPC404,{
+ mes "A female Talponian manakin stands on display.";
+ close;
+}
+
+001-2,91,44,0 script Talponian#Male NPC405,{
+ mes "A male Talponian manakin stands on display.";
+ close;
+}
+
+001-2,118,39,0 script Gispaan#Female NPC406,{
+ mes "A female Gispaan manakin stands on display.";
+ close;
+}
+
+001-2,118,44,0 script Gispaan#Male NPC407,{
+ mes "A male Gispaan manakin stands on display.";
+ close;
+}
+
diff --git a/npc/001-2/mapflags.txt b/npc/001-2/mapflags.txt
new file mode 100644
index 00000000..e7ed8657
--- /dev/null
+++ b/npc/001-2/mapflags.txt
@@ -0,0 +1,2 @@
+//001-2 mapflag town
+//001-2 mapflag resave 001-1,60,105
diff --git a/npc/001-2/pauline.txt b/npc/001-2/pauline.txt
new file mode 100644
index 00000000..992a371a
--- /dev/null
+++ b/npc/001-2/pauline.txt
@@ -0,0 +1,257 @@
+
+001-2,77,78,0 script Pauline NPC208,{
+
+ @Pauline_MASK = NIBBLE_4_MASK;
+ @Pauline_SHIFT = NIBBLE_4_SHIFT;
+
+ @pauline_state = ((QUEST_MAGIC2 & @Pauline_MASK) >> @Pauline_SHIFT);
+
+
+ @pauline_REWARD = 10000;
+
+ if (@pauline_state == 4) goto L_MoreMagic;
+ if (@pauline_state == 3) goto L_KnowIngredientsPinkie;
+ if (@pauline_state == 2) goto L_Ingredients;
+ if (@pauline_state == 1) goto L_Back;
+
+ if (getskilllv(SKILL_MAGIC_ASTRAL) > 0)
+ goto L_Magic;
+ mesn;
+ mes "\"I've mastered several schools of magic and fought the Yeti in Kaizei.\"";
+ next;
+ mes "\"The path of magic is a long and difficult one.\"";
+ goto L_close;
+
+L_Magic:
+ mesn;
+ mes "\"Ah. I see you are skilled in the Art of Astral Magic.\"";
+ mes "\"Who taught you?\"";
+ menu
+ "I learnt it myself!", L_Next,
+ "Sagatha is my teacher.", L_Sagatha,
+ "You must be mistaken.", L_close;
+
+L_Next:
+ mes "\"You did? Not bad. I guess then there is nothing I can teach you. Or are you interested in sharing knowledge?\"";
+ menu
+ "Yes, please.", L_Spells,
+ "No, thanks.", L_close;
+
+L_Sagatha:
+ mesn;
+ mes "\"Ah, that Witch!\"";
+ mes "\"Very well.\"";
+ next;
+ mes "\"Do you want me to teach you things Sagatha doesn't know yet?\"";
+ next;
+ menu
+ "Yes.", L_Spells,
+ "No.", L_close;
+
+L_Back:
+ mesn;
+ mes "\"So, you're back. Are you ready to share knowledge now?\"";
+ menu
+ "Yes.", L_Spells,
+ "No.", L_close;
+
+L_Spells:
+ @pauline_state = 1;
+ callsub S_Update_Mask;
+ mesn;
+ mes "\"Okay.\"";
+ mes "\"Not long ago I discovered some new caves near Tulimshar. In an abandond chamber I found some paintings on the wall.\"";
+ next;
+ mes "\"They weren't typical for this region, so I examined them closely. I found some invocations I have never heard before.\"";
+ mes "\"I thought that they would fit better into the Woodland area. I could only decipher two invocations so far. Those are two spells used to summon creatures.\"";
+ next;
+ mes "\"One was for summoning Mouboos and the other one was for summoning Pinkies.\"";
+ mes "\"Have you ever heared about those?\"";
+ next;
+ menu
+ "Yes. I thought you had something new to tell. [Walk Away]", L_close,
+ "No, tell me more.", L_Next1;
+
+L_Next1:
+ mesn;
+ mes "\"Well I could only read the invocations. So I don't exactly know what kind of ingredients you are going to need.\"";
+ mesq l("\"The first one for the mouboo was %s and the one for the pinkie was %s.", b("Kalboo"), b("Kalgina"));
+ 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.\"";
+ next;
+ mes "\"When you find the right ingredients, come back and bring them to me to try those spells out.\"";
+ next;
+ mesq l("Goodbye.");
+ @pauline_state = 2;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Ingredients:
+ mesn;
+ mes "\"Hello, have you found out what ingredients to use yet?\"";
+ menu
+ "Yes.", L_KnowIngredientsMouboo,
+ "No.", L_Next2;
+
+L_Next2:
+ mes "\"Okay. Come back as soon as you know.\"";
+ goto L_close;
+
+L_KnowIngredientsMouboo:
+ mes "\"Did you bring them?\"";
+ menu
+ "Yes." , L_Next3,
+ "No.", L_ComeBackLater;
+
+L_Next3:
+ mesq l("Then tell me the ingredients for the mouboo summoning spell and give them to me. Start with the first ingredient and then tell me the second one separately.");
+ mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
+ next;
+ .@it1 = requestitem();
+ mes l("Next ingredient.");
+ mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
+ .@it2 = requestitem();
+
+ if (.@it1 < 1 || .@it2 < 1)
+ goto L_Wrong;
+ if (countitem(.@it1) < 1 || countitem(.@it2) < 1)
+ goto L_NotEnough;
+ mesq l("Do you want to give me these items?");
+ menu
+ l("No."), L_ComeBackLater,
+ l("Yes."), L_Next4;
+
+L_Next4:
+ delitem .@it1, 1;
+ delitem .@it2, 1;
+ mesq l("Okay let me try this.");
+ if ((.@it1 == Root && .@it2 == MoubooFigurine) ||
+ (.@it1 == MoubooFigurine && .@it2 == Root))
+ goto L_TrySpellMouboo;
+
+ mesc l("The Witch takes %s and %s and put them togheter calling %s.", getitemlink(.@it1), getitemlink(.@it2), b("kalboo"));
+ mesc l("Nothing happens.");
+ mesn;
+ mesq l("It seems you did not tell me the correct ingredients. Come back when you find the correct ones.");
+ goto L_close;
+
+L_TrySpellMouboo:
+ mesc l("The Witch takes %s and %s and put them togheter calling %s.", getitemlink(.@it1), getitemlink(.@it2), b("kalboo"));
+ monster "001-1", 55,68, "Good", Mouboo, 1;
+ mesn;
+ mesq l("It worked!");
+ @pauline_state = 3;
+ callsub S_Update_Mask;
+ getexp @pauline_REWARD, 0;
+ goto L_close;
+
+L_KnowIngredientsPinkie:
+ mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
+ next;
+ .@it1 = requestitem();
+ mes l("Next ingredient.");
+ mes "##B" + l("Drag and drop an item from your inventory.") + "##b";
+ .@it2 = requestitem();
+
+ if (.@it1 < 1 || .@it2 < 1)
+ goto L_Wrong;
+ if (countitem(.@it1) < 1 || countitem(.@it2) < 1)
+ goto L_NotEnough;
+ mesq l("Do you want to give me these items?");
+ menu
+ "No.", L_ComeBackLater,
+ "Yes.", L_Next5;
+
+L_Next5:
+ delitem .@it1, 1;
+ delitem .@it2, 1;
+ mesq l("Okay let me try this.");
+ if ((.@it1 == Root && .@it2 == PinkAntenna) ||
+ (.@it1 == PinkAntenna && .@it2 == Root))
+ goto L_TrySpellPinkie;
+
+ mesc l("The Witch takes %s and %s and put them togheter calling %s.", getitemlink(.@it1), getitemlink(.@it2), b("kalgina"));
+ mesc l("Nothing happens.");
+ mesn;
+ mesq l("It seems you did not tell me the correct ingredients. Come back when you find the correct ones.");
+ goto L_close;
+
+
+L_TrySpellPinkie:
+ mesc l("The Witch takes %s and %s and put them togheter calling %s.", getitemlink(.@it1), getitemlink(.@it2), b("kalgina"));
+ monster "001-1", 54,68, "Good", Pinkie, 1;
+ mesn;
+ mesq l("It worked!");
+ @pauline_state = 4;
+ callsub S_Update_Mask;
+ getexp @pauline_REWARD, 0;
+ goto L_close;
+
+L_MoreMagic:
+ mesn;
+ mes "\"Thanks for telling me the ingredients. As soon as I find out more about those wall paintings I will let you know.\"";
+ goto L_close;
+
+L_Wrong:
+ mes "The Witch looks at you and snorts.";
+ mesn;
+ mes "\"You told me the wrong ingredients. Come back as soon as you know the correct ones.\"";
+ goto L_close;
+
+L_NotEnough:
+ mesn;
+ mes "\"Hey, you don't have this with you!\"";
+ mes "\"Come back when you have the right ingredients.\"";
+ goto L_close;
+
+L_ComeBackLater:
+ mesn;
+ mes "\"Then come back later.\"";
+ goto L_close;
+
+L_close:
+ @pauline_ingredient1$ = "";
+ @pauline_ingredient2$ = "";
+ cleararray @items$, "", getarraysize(@items$);
+ cleararray @item_names$, "", getarraysize(@item_names$);
+ @pauline_state = 0;
+ @pauline_REWARD = 0;
+ close;
+
+S_Update_Mask:
+ QUEST_MAGIC2 = (QUEST_MAGIC2 & ~(@Pauline_MASK)) | (@pauline_state << @Pauline_SHIFT);
+ return;
+}
+
+001-2,79,74,0 script PaulineDebug NPC208,{
+ @Pauline_MASK = NIBBLE_4_MASK;
+ @Pauline_SHIFT = NIBBLE_4_SHIFT;
+
+ @pauline_state = ((QUEST_MAGIC2 & @Pauline_MASK) >> @Pauline_SHIFT);
+
+ mes "Reset Quest State";
+ mes @pauline_state;
+ menu
+ "Yes.", L_Next,
+ "No.", L_close;
+
+L_Next:
+ @pauline_state = 0;
+ callsub S_Update_Mask;
+ mes "Done";
+ close;
+
+L_close:
+ @pauline_state = 0;
+ close;
+
+S_Update_Mask:
+ QUEST_MAGIC2 = (QUEST_MAGIC2 & ~(@Pauline_MASK)) | (@pauline_state << @Pauline_SHIFT);
+ return;
+
+OnInit:
+ if (!debug)
+ disablenpc "PaulineDebug";
+ end;
+}
diff --git a/npc/001-2/sandra.txt b/npc/001-2/sandra.txt
new file mode 100644
index 00000000..705a6144
--- /dev/null
+++ b/npc/001-2/sandra.txt
@@ -0,0 +1,103 @@
+001-2,98,88,0 script Sandra NPC114,{
+ if (QL_SANDRA >= 2) goto L_Done;
+ if (QL_SANDRA == 1) goto L_Progress;
+
+ mes "[Sandra]";
+ mes "\"Hunting monsters for potion ingredients can sometimes be a difficult task.\"";
+ next;
+
+ @temp = rand(4);
+ if(@temp == 1) goto L_Opening1;
+ if(@temp == 2) goto L_Opening2;
+ if(@temp == 3) goto L_Opening3;
+ goto L_Opening0;
+
+L_Opening0:
+ mes "\"In the outskirts of Tulimshar, there are some scorpions... I need help! Will you help?\"";
+ next;
+ goto L_Ask;
+
+L_Opening1:
+ mes "\"When you venture to the outskirts of Tulimshar, you can spot scorpions. Will you help me kill some?\"";
+ next;
+ goto L_Ask;
+
+L_Opening2:
+ mes "\"The Scorpion Stinger carries many properties used in potions. Would you get some for me?\"";
+ next;
+ goto L_Ask;
+
+L_Opening3:
+ mes "\"You look sturdy enough, will you help me get something?\"";
+ next;
+ goto L_Ask;
+
+L_Ask:
+ menu
+ "Yes.", L_Yes,
+ "No.", L_close;
+
+L_Yes:
+ @temp = rand(3);
+ if(@temp == 1) goto L_Req1;
+ if(@temp == 2) goto L_Req2;
+ goto L_Req0;
+
+L_Req0:
+ mes "[Sandra]";
+ mes "\"I need 5 Scorpion Stingers.\"";
+ next;
+ goto L_Set;
+
+L_Req1:
+ mes "[Sandra]";
+ mes "\"I heard a while ago that stingers from scorpions can be used for medical purposes. I need you to help me get 5 Scorpion Stingers.\"";
+ next;
+ goto L_Set;
+
+L_Req2:
+ mes "[Sandra]";
+ mes "\"Bring me 5 Scorpion Stingers. I'll give you something if you do!\"";
+ next;
+ goto L_Set;
+
+L_Set:
+ QL_SANDRA = 1;
+ mes "\"Please get them for me!\"";
+ goto L_close;
+
+L_Progress:
+ if (countitem("ScorpionStinger") < 5)
+ goto L_NotEnough;
+ mes "[Sandra]";
+ mes "\"Excellent! You brought me 5 Scorpion Stingers!";
+ mes "Here's something for you.\"";
+ getinventorylist;
+ if (@inventorylist_count + (countitem("ScorpionStinger") == 5) - (countitem("Arrow") == 0) > 99)
+ goto L_TooMany;
+ delitem "ScorpionStinger", 5;
+ getitem "Bow", 1;
+ getitem "Arrow", 100;
+ QL_SANDRA = 2;
+ goto L_close;
+
+L_NotEnough:
+ mes "[Sandra]";
+ mes "\"Please hurry and bring me 5 Scorpion Stingers.\"";
+ goto L_close;
+
+L_Done:
+ mes "[Sandra]";
+ mes "\"Thank you for all your help!\"";
+ goto L_close;
+
+L_close:
+ @temp = 0;
+ close;
+
+L_TooMany:
+ next;
+ mes "[Sandra]";
+ mes "\"You don't have room for my reward. I'll wait until you do.\"";
+ goto L_close;
+}
diff --git a/npc/001-2/tathin.txt b/npc/001-2/tathin.txt
new file mode 100644
index 00000000..e8dc9394
--- /dev/null
+++ b/npc/001-2/tathin.txt
@@ -0,0 +1,28 @@
+001-2,28,21,0 script Tathin NPC107,{
+ mes "[Tathin]";
+ mes "\"Hello what Can I do for you?\"";
+ next;
+
+ menu
+ "I'd like to join a party.", L_Give_Party,
+ "I'd like to create my own party.", L_Give_Make_Party,
+ "Nothing, I guess.", L_close;
+
+L_Give_Party:
+ mes "[Tathin]";
+ mes "\"You'll need to be invited by an existing member of a party to join it. You may also create your own party.\"";
+ next;
+ mes "[Tathin]";
+ mes "\"Remember, parties cannot share experience if any members are more than 10 levels apart.\"";
+ menu
+ "I'd like to create my own party.", L_Give_Make_Party,
+ "Goodbye.", L_close;
+
+L_Give_Make_Party:
+ mes "[Tathin]";
+ mes "\"You can create parties with the 'new' or 'create' commands on the Party tab in the client. Parties need to have unique names.\"";
+ close;
+
+L_close:
+ close;
+}
diff --git a/npc/001-2/tondar.txt b/npc/001-2/tondar.txt
new file mode 100644
index 00000000..8ffd2523
--- /dev/null
+++ b/npc/001-2/tondar.txt
@@ -0,0 +1,55 @@
+
+001-2,95,79,0 script Tondar NPC168,{
+ mes "[Tondar]";
+ mes "\"We're not accepting any new students right now.\"";
+ if (getskilllv(SKILL_MAGIC) > 0)
+ goto L_may_ask;
+ goto L_End;
+
+L_may_ask:
+ next;
+ menu
+ "Can you teach me a spell?", L_Askspell,
+ "Do you have a magic library?", L_library,
+ "Are you sure? I can pay well...", L_Nopay,
+ "That's unfortunate.", L_End,
+ "Goodbye, then.", L_End;
+
+L_library:
+ mes "[Tondar]";
+ mes "\"Of course we do. It is only for graduate students, alumni, and faculty.\"";
+ next;
+ menu
+ "Thank you, and goodbye.", L_End,
+ "Nobody else is allowed inside?", L_Next;
+
+L_Next:
+ mes "[Tondar]";
+ mes "\"Well, it is possible to get a special permit from the headmaster. But he is currently on sabbatical.\"";
+ close;
+
+L_Askspell:
+ mes "[Tondar]";
+ mes "\"We only teach spells to students.\"";
+ next;
+ menu
+ "Oh, come on... just one little spell!", L_Nopay,
+ "Pretty please?", L_spell,
+ "I can pay you, too...", L_Nopay;
+
+L_spell:
+ mes "[Tondar]";
+ mes "\"Well, all right; this one can't do much harm. Press your hands together and say `" + b("abizit") + "'.\"";
+ mes "\"This will release a steady flow of magic within you. Focus and try to control it; it is a good meditative practice.\"";
+ learnskill SKILL_ABIZIT;
+ close;
+
+L_Nopay:
+ mes "[Tondar]";
+ mes "The wizard frowns angrily.";
+ mes "\"Do not tempt me to teach you a different kind of lesson, young one! Begone!\"";
+ goto L_End;
+
+L_End:
+ close;
+}
diff --git a/npc/001-2/wizards.txt b/npc/001-2/wizards.txt
new file mode 100644
index 00000000..9fa5fa84
--- /dev/null
+++ b/npc/001-2/wizards.txt
@@ -0,0 +1,26 @@
+
+- script Magic Council NPC32767,{
+ explode .@n, strnpcinfo(0), "#";
+ if (.@n[1] == 9) mes "The arch wizard seems to be busy.";
+ else if (.@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;
+
+OnInit:
+ .distance = 4;
+ end;
+}
+
+001-2,104,19,0 duplicate(Magic Council) Desert Mana Seed#_M NPC166
+001-2,99,22,0 duplicate(Magic Council) Wizard#1 NPC355
+001-2,92,24,0 duplicate(Magic Council) Wizard#2 NPC356
+001-2,92,30,0 duplicate(Magic Council) Wizard#3 NPC357
+001-2,99,32,0 duplicate(Magic Council) Wizard#4 NPC358
+001-2,110,22,0 duplicate(Magic Council) Wizard#5 NPC359
+001-2,117,24,0 duplicate(Magic Council) Wizard#6 NPC360
+001-2,117,30,0 duplicate(Magic Council) Wizard#7 NPC361
+001-2,110,32,0 duplicate(Magic Council) Wizard#8 NPC362
+001-2,104,27,0 duplicate(Magic Council) Arch-Wizard#9 NPC354
+
diff --git a/npc/001-2/yanis.txt b/npc/001-2/yanis.txt
new file mode 100644
index 00000000..df2d8678
--- /dev/null
+++ b/npc/001-2/yanis.txt
@@ -0,0 +1,39 @@
+
+001-2,31,21,0 script Yanis NPC107,{
+ QUEST_NorthTulimshar = QUEST_NorthTulimshar | $@knowYanisNT;
+ @halloween_npc_id = $@halloween_npc_yanis;
+ callfunc "TrickOrTreat";
+
+ goto L_Base_Menu;
+
+L_Base_Menu:
+
+ mes "[Yanis]";
+ mes "\"Welcome. I'm handling issues with trading licenses for the shop owners in Tulimshar. Can I help you?\"";
+ if (QL_IMEC != 1)
+ menu
+ "Nothing right now.",L_BeforeClose;
+ menu
+ "Imec asked me to bring this petition.",L_Next,
+ "Nothing right now.",L_BeforeClose;
+
+L_Next:
+ mes "[Yanis]";
+ mes "\"Imec? I see. Give it to me.\"";
+ mes "Yanis has a disapproving look on his face. He takes the letter and writes something on another paper.";
+ next;
+ mes "[Yanis]";
+ mes "\"Here you have a letter of acknowledgement. You can bring that back to Imec. We will have a look at his case.\"";
+ QL_IMEC = 2;
+ goto L_BeforeClose;
+
+L_BeforeClose:
+ if (QL_KYLIAN != 3)
+ goto L_close;
+ next;
+ mes "You think that this is the person Kylian needs to talk to. You should tell him.";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/001-3/_import.txt b/npc/001-3/_import.txt
new file mode 100644
index 00000000..4bcf3b3b
--- /dev/null
+++ b/npc/001-3/_import.txt
@@ -0,0 +1,7 @@
+// Map 001-3: Tulimshar Arena
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/001-3/_mobs.txt",
+"npc/001-3/_warps.txt",
+"npc/001-3/guards.txt",
+"npc/001-3/mapflags.txt",
+"npc/001-3/pvpflag.txt",
diff --git a/npc/001-3/_mobs.txt b/npc/001-3/_mobs.txt
new file mode 100644
index 00000000..3fc96876
--- /dev/null
+++ b/npc/001-3/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 001-3: Tulimshar Arena mobs
+001-3,0,0,0,0 monster Maggot 1002,10,0,0
diff --git a/npc/001-3/_warps.txt b/npc/001-3/_warps.txt
new file mode 100644
index 00000000..f0afb857
--- /dev/null
+++ b/npc/001-3/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 001-3: Tulimshar Arena warps
+001-3,73,28,0 warp #001-3_73_28 0,0,002-2,74,59
diff --git a/npc/001-3/guards.txt b/npc/001-3/guards.txt
new file mode 100644
index 00000000..21bebab0
--- /dev/null
+++ b/npc/001-3/guards.txt
@@ -0,0 +1,32 @@
+001-3,77,37,0 script Phaet#arena NPC125,{
+ mes "[Phaet the Royal Guard]";
+ mes "\"Do you want to go back?\"";
+ next;
+ menu
+ "Yes", L_Sure,
+ "No", L_Next;
+
+L_Next:
+ mes "Have fun.";
+ close;
+
+L_Sure:
+ mes "[Phaet the Royal Guard]";
+ mes "\"Ok.\"";
+ next;
+ if(DUELS & $@DuelPvpBit) goto L_FightClub;
+ warp "002-2", 74, 59;
+ close;
+
+L_FightClub:
+ DUELS = DUELS &~ $@DuelPvpBit;
+ warp "009-7", 39, 37;
+ close;
+}
+
+001-3,69,37,0 script Aradin NPC126,{
+ mes "[Aradin the Royal Guard]";
+ mes "\"Don't touch me...";
+ mes "You wouldn't enjoy the consequences.\"";
+ close;
+}
diff --git a/npc/001-3/mapflags.txt b/npc/001-3/mapflags.txt
new file mode 100644
index 00000000..d86f50e1
--- /dev/null
+++ b/npc/001-3/mapflags.txt
@@ -0,0 +1,2 @@
+001-3 mapflag nosave 002-2,74,59
+001-3 mapflag zone MMO
diff --git a/npc/001-3/pvpflag.txt b/npc/001-3/pvpflag.txt
new file mode 100644
index 00000000..50d670bd
--- /dev/null
+++ b/npc/001-3/pvpflag.txt
@@ -0,0 +1 @@
+001-3 mapflag pvp
diff --git a/npc/002-1/_import.txt b/npc/002-1/_import.txt
new file mode 100644
index 00000000..7b375b44
--- /dev/null
+++ b/npc/002-1/_import.txt
@@ -0,0 +1,20 @@
+// Map 002-1: Tulimshar South
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/002-1/_mobs.txt",
+"npc/002-1/_warps.txt",
+"npc/002-1/anwar.txt",
+"npc/002-1/bard.txt",
+"npc/002-1/elanore.txt",
+"npc/002-1/gaurds.txt",
+"npc/002-1/itka.txt",
+"npc/002-1/lieutenant_dausen.txt",
+"npc/002-1/luca.txt",
+"npc/002-1/mapflags.txt",
+"npc/002-1/mine_debug.txt",
+"npc/002-1/nickos.txt",
+"npc/002-1/nomads.txt",
+"npc/002-1/npcs.txt",
+"npc/002-1/sarah.txt",
+"npc/002-1/soul-menhir.txt",
+"npc/002-1/stewen.txt",
+"npc/002-1/traveler.txt",
diff --git a/npc/002-1/_mobs.txt b/npc/002-1/_mobs.txt
new file mode 100644
index 00000000..353552ca
--- /dev/null
+++ b/npc/002-1/_mobs.txt
@@ -0,0 +1,15 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 002-1: Tulimshar South mobs
+002-1,93,62,12,4 monster Maggot 1002,11,100000,30000
+002-1,112,62,5,4 monster Maggot 1002,11,100000,30000
+002-1,108,73,5,4 monster Maggot 1002,11,100000,30000
+002-1,62,28,1,7 monster Maggot 1002,6,100000,30000
+002-1,74,96,12,16 monster Scorpion 1003,12,100000,30000
+002-1,113,114,5,3 monster Maggot 1002,11,100000,30000
+002-1,43,61,5,35 monster Scorpion 1003,6,100000,30000
+002-1,70,92,24,9 monster Scorpion 1003,10,100000,30000
+002-1,40,93,9,10 monster Red Scorpion 1004,10,100000,30000
+002-1,42,40,4,14 monster Sea Slime 1033,8,100000,30000
+002-1,33,75,4,20 monster Sea Slime 1033,8,100000,30000
+002-1,99,62,18,4 monster Scorpion 1003,6,100000,30000
+002-1,73,105,10,10 monster Fire Goblin 1011,6,100000,30000
diff --git a/npc/002-1/_warps.txt b/npc/002-1/_warps.txt
new file mode 100644
index 00000000..6ffc689d
--- /dev/null
+++ b/npc/002-1/_warps.txt
@@ -0,0 +1,18 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 002-1: Tulimshar South warps
+002-1,63,20,0 warp #002-1_63_20 4,0,001-1,63,118
+002-1,103,20,0 warp #002-1_103_20 4,0,001-1,103,118
+002-1,119,95,0 warp #002-1_119_95 0,2,006-1,21,47
+002-1,92,114,0 warp #002-1_92_114 0,0,002-3,85,49
+002-1,33,109,0 warp #002-1_33_109 0,0,002-3,51,35
+002-1,109,45,0 warp #002-1_109_45 0,0,002-2,75,100
+002-1,115,45,0 warp #002-1_115_45 0,0,002-2,83,100
+002-1,99,43,0 warp #002-1_99_43 0,0,002-2,120,66
+002-1,114,35,0 warp #002-1_114_35 0,0,002-2,78,131
+002-1,110,29,0 warp #002-1_110_29 0,0,002-2,68,122
+002-1,73,35,0 warp #002-1_73_35 0,0,002-2,44,33
+002-1,57,35,0 warp #002-1_57_35 0,0,002-2,120,94
+002-1,67,29,0 warp #002-1_67_29 0,0,002-2,23,109
+002-1,113,107,0 warp #002-1_113_107 0,0,005-3,52,37
+002-1,49,20,0 warp #002-1_49_20 0,0,004-3,24,94
+002-1,57,26,0 warp #002-1_57_26 0,0,002-2,119,131
diff --git a/npc/002-1/anwar.txt b/npc/002-1/anwar.txt
new file mode 100644
index 00000000..3797c736
--- /dev/null
+++ b/npc/002-1/anwar.txt
@@ -0,0 +1,172 @@
+002-1,95,67,0 script Anwar NPC156,{
+ @cloth_amount = 3;
+ @silk_amount = 30;
+
+ @firstTry_exp = 400;
+ @secondTry_exp = 700;
+ @material_exp = 1000;
+ @final_exp = 2000;
+
+ if (.@q >= 15) goto L_Done;
+ if (.@q >= 13) goto L_GiveEomie;
+ if (.@q >= 11) goto L_GiveTinris;
+ if (.@q == 10) goto L_GiftMaterial;
+ if (.@q >= 5) goto L_SecondTry;
+ if (.@q >= 1) goto L_FirstTry;
+
+ mesn;
+ mes "\"Hello. You look like one of those young people who come here to go on an adventure.";
+ mes "Would you be interested in doing some small errand for me?\"";
+ menu
+ "Sure!",L_Sure,
+ "I'm busy, sorry.",L_close;
+
+L_Sure:
+ mesn;
+ mes "\"That's the spirit! Ok, I'm tired of spending most of my time working on this field. I heard the magicians at the magic school are researching ways to enhance the growth of plants with magic.\"";
+ next;
+ mes "\"I can't go there myself, since this area of the city is full of sneaky ragtags and they will rob my field if I leave here. Could you go to the magic school and ask for some magic enhancement for my field?\"";
+ next;
+ mes "\"To find the school just follow the street north back into town. The school is the castle at the north end of town.\"";
+ .@q = 1;
+ goto L_close;
+
+L_FirstTry: // .@q >= 1 but below 5
+ mesn;
+ mes "\"I hope the wizards at the magic school can help me with the field. I'd really like to have more free time. I want to make clothing, but I'm not experienced enough to make a living out of that.\"";
+ if (.@q != 4)
+ goto L_close;
+ menu
+ "Tinris gave me a magic fertilizer for your field, but he isn't sure if it works.",L_Next;
+
+L_Next:
+ mesn;
+ mes "\"Really? Well, let's try it out!\"";
+ mes "He takes the fertilizer and starts to bespatter the field.";
+ next;
+ mes "But it doesn't seem to be good for the plants, they start to shrivel and get brown.";
+ mesn;
+ mes "\"Oh no! What is this? It's damaging my plants! Go back to Tinris and tell him it doesn't work!\"";
+ getexp @firstTry_exp, 0;
+ .@q = 5;
+ goto L_close;
+
+L_SecondTry: // .@q >= 5 but below 10
+ mesn;
+ mes "\"I hope Tinris can come up with a better fertilizer. My plants are suffering from the first try.\"";
+ if (.@q != 9)
+ goto L_close;
+ menu
+ "Here is another one. Eomie cast a spell on it.",L_Continue;
+
+L_Continue:
+ mesn;
+ mes "\"Eomie? I heard she's amazingly skilled with nature magic. I'll try if this works better.\"";
+ mes "He takes the fertilizer and puts it on only a few plants, then waits a moment to see the result.";
+ next;
+ mes "The plants recover a bit and become green again.";
+ mesn;
+ mes "\"Ah, this one is better. I'll put it on the entire field.\"";
+ getexp @secondTry_exp, 0;
+ .@q = 10;
+ next;
+ goto L_GiftMaterial;
+
+L_GiftMaterial: // .@q == 10
+ mesn;
+ mes "\"I want to show my gratitude to Tinris and Eomie. Can you help me once again? I would like to make some clothes for them and need " + @cloth_amount + " pieces of Cotton Cloth and " + @silk_amount + " Silk Cocoons.\"";
+ menu
+ "I have it.",L_GiveGiftStuff,
+ "Where can I get that?",L_Hint,
+ "I'll see what I can do.",L_close;
+
+L_GiveGiftStuff:
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+ if ((countitem("CottonCloth") < @cloth_amount) || (countitem("SilkCocoon") < @silk_amount))
+ goto L_NoItem;
+ delitem "CottonCloth", @cloth_amount;
+ delitem "SilkCocoon", @silk_amount;
+ getexp @material_exp, 0;
+
+ getitem "GreenVNeckSweater", 1;
+ .@q = 11;
+ mesn;
+ mes "\"Great! I'll start right away with the present for Tinris. That shouldn't take long.\"";
+ mes "After a short while of cutting and sewing he holds a V-Neck Sweater in his hands. Then he dyes it green.";
+ next;
+ mesn;
+ mes "\"Wonderful! Could you please bring this to Tinris to show him my gratitude?\"";
+ goto L_close;
+
+L_Hint:
+ mesn;
+ mes "\"As far as I know Cotton Cloth is given out as reward for hunting monsters. You should talk to Aidan in Candor.\"";
+ next;
+ mes "\"Otherwise Cotton Cloth can be sheared from Mouboo and silk cocoons come from Silkworms.";
+ mes "They live in the woodland area around Hurnscald. You can get there by taking the ferry.\"";
+ goto L_close;
+
+L_GiveTinris: // .@q >= 11 but below 13
+ mesn;
+ mes "\"Did you already bring the Green V-Neck Sweater to Tinris?\"";
+ if (.@q != 12)
+ menu
+ "Not yet.",L_close;
+ menu
+ "Yes, he was very happy.",L_Happy;
+
+L_Happy:
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+ mesn;
+ mes "\"Wonderful! I also finished the present for Eomie. Can you bring it to her?\"";
+ getitem "SilkHeadband", 1;
+ .@q = 13;
+ goto L_close;
+
+L_GiveEomie: // .@q >= 13 but below 15
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+ mesn;
+ mes "\"Did you give the Silk Headband to Eomie?\"";
+ if (.@q != 14)
+ menu
+ "Not yet.",L_close;
+ menu
+ "Yes. She asked me to thank you.",L_ThankYou;
+
+L_ThankYou:
+ mes "Anwar smiles.";
+ mesn;
+ mes "\"I'm so happy. Thank you so much for your help. I made this for you while you went to see Eomie.\"";
+ getexp @final_exp, 0;
+ getitem "DarkGreenCottonTrousers", 1;
+ .@q = 15;
+ goto L_close;
+
+L_Done: // .@q == 15
+ mesn;
+ mes "\"Thank you so much for your help. The plants are growing much better now. I don't have to spend all my time working in the field any more.";
+ mes "Finally I can do what I'm really interested in and work on getting better at sewing clothes.\"";
+ goto L_close;
+
+L_NoItem:
+ mesn;
+ mes "\"You don't have it!\"";
+ goto L_close;
+
+L_Full_Inv:
+ mesn;
+ mes "\"You carry a lot of stuff. Come back when you have more room.\"";
+ goto L_close;
+
+L_close:
+ @cloth_amount = 0;
+ @silk_amount = 0;
+ @inventorylist_count = 0;
+ close;
+}
diff --git a/npc/002-1/bard.txt b/npc/002-1/bard.txt
new file mode 100644
index 00000000..648cf4c4
--- /dev/null
+++ b/npc/002-1/bard.txt
@@ -0,0 +1,117 @@
+
+002-1,91,33,0 script Bard NPC152,{
+ setarray @songs$, "\"There once was a bard, who had it hard, because a man in dark green, was very mean.\"",
+ "\"At Hurnscald inn, there was a person of fairest skin, declining wedding bands from quite a many hands.\"",
+ "\"As the Sun sets down in the forest's brown, she whom the fragrance holds counts her gold.\"";
+ @name$ = "Bill Ballshaker the Bard";
+ mes "[" + @name$ + "]";
+ mes "\"Greetings, traveler! Have you come to listen to my stories?\"";
+ next;
+ goto L_Main;
+
+L_Main:
+ menu
+ "Sing me a song, lute man!", L_Song,
+ "Have you heard any news?", L_News,
+ "What do you know about...", L_Question,
+ "Farewell!", L_close;
+
+L_News:
+
+ mes "[" + @name$ + "]";
+ mes "\"News I have for you indeed, lest you have already overheard (for then it would no longer be news to you!)\"";
+ next;
+ mes "[" + @name$ + "]";
+ mes "\"Rumor has it that an ancient source of magic, a Mana Seed, has been sighted in the west, beyond the fair town of Hurnscald.\"";
+ next;
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_MANASEED_RUMOUR;
+ mes "[" + @name$ + "]";
+ mes "\"Whence it came, nobody knows... but they say that sometimes such Mana Seeds may choose a powerful individual to impart some of its mystic power to!\"";
+ next;
+ mes "[" + @name$ + "]";
+ mes "\"I wonder who might be qualified?\"";
+ next;
+ goto L_Main;
+
+L_Question:
+ callfunc "MagicTalkOptionsSetup";
+ @ignore = @QQ_ASTRALSOUL;
+ callfunc "MagicTalkMenu";
+
+ if (@c == 0) goto L_Main;
+ if (@c == @QQ_ELANORE) goto L_Q_elanore;
+ if (@c == @QQ_MANASEED) goto L_Q_manaseed;
+ if (@c == @QQ_WYARA) goto L_Q_wyara;
+ if (@c == @QQ_SAGATHA) goto L_Q_sagatha;
+ if (@c == @QQ_AULDSBEL) goto L_Q_auldsbel;
+ if (@c == @QQ_OLDWIZ) goto L_Q_oldwiz;
+
+ mes "[" + @name$ + "]";
+ mes "\"Alas, I know very little about this matter.\"";
+ next;
+ goto L_Main;
+
+L_Q_oldwiz:
+ mes "[" + @name$ + "]";
+ mes "\"The old wizard has been an old man for as long as I remember, living near the mountains in his magic hut – a hut that is bigger on the inside, just like in the old tales of Gyer Filla the Wise....\"";
+ next;
+ mes "[" + @name$ + "]";
+ mes "\"I doubt that they are the same person, though. For one, I have never seen his hut fly. For another, Gyer never took apprentices.\"";
+ next;
+ goto L_Main;
+
+L_Q_elanore:
+ mes "[" + @name$ + "]";
+ mes "\"Elanore is this town's healer. Rumor has it that she traveled far and wide when she was younger, to learn the deepest secrets of healing magic, after her brother caught a mysterious illness.\"";
+ next;
+ goto L_Main;
+
+L_Q_manaseed:
+ mes "[" + @name$ + "]";
+ mes "\"The Mana Seed is said to be a source of great magic. Perhaps some witch or wizard might know more about it?\"";
+ next;
+ goto L_Main;
+
+L_Q_wyara:
+ mes "[" + @name$ + "]";
+ mes "\"Wyara is not actually from Hurnscald. As a young witch, she decided to settle down there to help the people of Hurnscald. She is kind and gentle, except towards the Doctor, who seems to have little respect for her potions.\"";
+ next;
+ goto L_Main;
+
+L_Q_sagatha:
+ mes "[" + @name$ + "]";
+ mes "\"Sagatha! Ah, such a wonderful and mysterious being; the center of many a tale...\"";
+ next;
+ mes "[" + @name$ + "]";
+ mes "\"Some say that she is the most powerful witch in all of Argaes. I don't know whether that is true or not, but I am quite certain that she is the most beautiful witch of all! Alas, she will let no man touch her...\"";
+ mes "He sighs.";
+ next;
+ mes "[" + @name$ + "]";
+ mes "\"I met her only twice, back in my traveling days, but there are two pieces of advice I can give you:\"";
+ next;
+ mes "[" + @name$ + "]";
+ mes "\"First, she will suffer no fool easily, particularly no man.\"";
+ next;
+ mes "[" + @name$ + "]";
+ mes "\"Second, the creatures of the forest mean everything to her. Harm them, and you may find her an enemy – and a powerful one at that...\"";
+ next;
+ goto L_Main;
+
+L_Q_auldsbel:
+ mes "[" + @name$ + "]";
+ mes "\"Auldsbel is a wizard further north. From what I have gathered he bought a hut near Hurnscald some years back and often comes here to experiment on things. This is probably because he is not allowed to do these experiments where he comes from.\"";
+ next;
+ goto L_Main;
+
+L_Song:
+ mes "[" + @name$ + "]";
+ @id = rand(3);
+ mes @songs$[@id];
+ goto L_close;
+
+L_close:
+ @name$ = "";
+ @id = 0;
+ cleararray @songs$[0], "", 2;
+ close;
+}
diff --git a/npc/002-1/elanore.txt b/npc/002-1/elanore.txt
new file mode 100644
index 00000000..cc9ce146
--- /dev/null
+++ b/npc/002-1/elanore.txt
@@ -0,0 +1,506 @@
+
+002-1,75,62,0 script Elanore#_M NPC108,{
+ @has_magic = getskilllv(SKILL_MAGIC);
+
+ @Q_status = getq(MagicQuest_Healing);
+ .@heal_exp = getq2(MagicQuest_Healing);
+
+ // Set up SkillUp function
+ @SUP_id = SKILL_MAGIC_LIFE;
+ @SUP_name$ = "Life Magic";
+
+ if (sc_check(SC_POISON) || sc_check(SC_DPOISON)) goto L_CurePoison;
+ if (BaseLevel > 20) goto L_NoHeal;
+ mesn l("Elanore the Healer");
+ mesq any(
+ l("You don't look too well; let me treat your wounds."),
+ l("I will make quick work of your wounds."),
+ l("Need a healing?"),
+ l("Sometimes you just need to run from battle."));
+ next;
+ mesn l("Elanore the Healer");
+ mesq any(
+ l("Here you go!"),
+ l("Painless, wasn't it?"),
+ l("You should be more careful."),
+ l("Much better, right?!"));
+ percentheal 100, 100;
+ goto L_close;
+
+L_NoHeal:
+ if (MAGIC_FLAGS)
+ goto L_Chat;
+ goto L_NoHealMessage;
+
+L_NoHealMessage:
+ mesn l("Elanore the Healer");
+ mes "\"I'm sorry but unless you are young and in need, I can't help you, and your level is already higher than twenty.";
+ mes "With so many gaurds still injured, I really have no time to help.";
+ mes "You can get some rest in the inn near here.\"";
+ goto L_close;
+
+L_Chat:
+ mesn l("Elanore the Healer");
+ mesq l("Hello! Can I help you?");
+ next;
+ goto L_Main;
+
+L_Main:
+ if (@has_magic && (@Q_status == .ST_INITIAL))
+ menu
+ "Can you heal me?", L_NoHealMessage,
+ "Can you teach me magic?", L_Teach,
+ "What do you know about...", L_Question,
+ "Goodbye!", L_Bye;
+ if (@has_magic && (@Q_status > .ST_INITIAL))
+ menu
+ "Can you heal me?", L_NoHealMessage,
+ "Can you teach me more?", L_Teach,
+ "Where can I get more lifestones?", L_Lifestones,
+ "What do you know about...", L_Question,
+ "Goodbye!", L_Bye;
+ if (!@has_magic)
+ menu
+ "Can you heal me?", L_NoHealMessage,
+ "What do you know about...", L_Question,
+ "Goodbye!", L_Bye;
+ goto L_close;
+
+L_Lifestones:
+ mesn l("Elanore the Healer");
+ mesq l("I always need components for my own healing spells. If you bring me ten gamboge leaves, ten alizarin leaves, ten mauve leaves and ten cobalt leaves, I can make ten lifestones; I will give you half of them.");
+ next;
+ menu
+ "OK, I will get them.", L_close,
+ "No way!", L_close,
+ "Here you are!", L_Trade,
+ "Can I make them myself?", L_MakeSelf;
+
+L_Trade:
+ if (countitem(MauveHerb) < 10) goto L_Trade_Missing;
+ if (countitem(GambogeHerb) < 10) goto L_Trade_Missing;
+ if (countitem(AlizarinHerb) < 10) goto L_Trade_Missing;
+ if (countitem(CobaltHerb) < 10) goto L_Trade_Missing;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem(Lifestone) == 0
+ && countitem(MauveHerb) > 10
+ && countitem(GambogeHerb) > 10
+ && countitem(AlizarinHerb) > 10
+ && countitem(CobaltHerb) > 10) goto L_NoRoom;
+
+ delitem MauveHerb, 10;
+ delitem GambogeHerb, 10;
+ delitem AlizarinHerb, 10;
+ delitem CobaltHerb, 10;
+ getitem Lifestone, 5;
+ getexp 200, 1;
+ mesn l("Elanore the Healer");
+ mesc l("Elanore carefully goes over your leaves, then smiles.");
+ mesq l("These will do just fine.");
+ next;
+ mesc l("She picks up all forty and presses them together in her hands, then whispers something.");
+ next;
+ mesn l("Elanore the Healer");
+ mesc l("As she opens her hands again, the leaves have turned into ten golden crystals.");
+ mesq l("Five for you and five for me.");
+ mesc l("She smiles.");
+ mes "[200 experience points]";
+ goto L_close;
+
+L_NoRoom:
+ mesn l("Elanore the Healer");
+ mesq l("Oh... it seems that you have no room for the lifestones. But please do come back later when you have made a little space.");
+ goto L_close;
+
+L_Trade_Missing:
+ mesn l("Elanore the Healer");
+ mesc l("Elanore counts the leaves you show her.");
+ mesq l("No, I am sorry. Please bring me ten leaves each of gamboge, alizarin, mauve, and cobalt.");
+ goto L_close;
+
+L_MakeSelf:
+ mesn l("Elanore the Healer");
+ if (@has_magic < 2) goto L_MakeSelf_no;
+ goto L_MakeSelf_yes;
+
+L_MakeSelf_yes:
+ mesq l("Oh, but of course! You are powerful enough to make your own lifestones, using the enchantment '%s'. This will consume a bug leg, a maggot slime and one of each of the four healing herbs, though.", b("Manpahil"));
+ learnskill SKILL_MANPAHIL;
+ goto L_close;
+
+L_MakeSelf_no:
+ mesq l("No, you are not powerful enough yet. Please come back and ask me again when you have learned to control more powerful magic, though!");
+ goto L_close;
+
+L_Teach:
+ if (@Q_status == .ST_INITIAL) goto L_T_Initial;
+ if (@Q_status == .ST_LEARNED_LIGHT_HEAL) goto L_T_ChkAdvTo2;
+ if (@Q_status == .ST_MASTERED_LIGHT_HEAL) goto L_T_ChkAdvToLOH;
+ if (@Q_status == .ST_LEARNED_LAYONHANDS) goto L_T_Explain3;
+ if (@Q_status == .ST_WAITING_FOR_KADIYA) goto L_T_ChkAdvTo3;
+ if (@Q_status == .ST_READY_TO_CURE_POISON) goto L_T_CurePosion;
+ if (@Q_status == .ST_LEARNED_CURE_POISON) goto L_T_dunno;
+
+ mesn l("Elanore the Healer");
+ mesq l("You have made good progress, but you lack the magical power to advance further. Also, I would like to observe you some more to be certain that you will make a good healer.");
+ goto L_close;
+
+L_T_Initial:
+ mesn l("Elanore the Healer");
+ mesq l("I will only teach you magic of the school of Life, and that only if you prove yourself to be a good healer – that is, if you use your powers to help others.");
+ mesc l("She hesistates.");
+ next;
+ mesn l("Elanore the Healer");
+ mes "\"I don't know you very well, but I don't think that there is any harm in teaching you a simple spell.\"";
+ mes "She reaches inside her satchel and pulls out a piece of crystal, glittering in the sun.";
+ mes "\"This here is a lifestone, life energy encased in a crystal shell. You will need it for most healing magic.\"";
+ next;
+ mesn l("Elanore the Healer");
+ mesq l("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.");
+ mesq l("Then chant the lesser healing spell, '%s', with whoever you wish to heal targeted.", b("lum"));
+ next;
+ mesn l("Elanore the Healer");
+ mesq l("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!");
+ mesq l("To heal yourself, it's enough to just cast by itself, without a target selected.");
+ next;
+ mesn l("Elanore the Healer");
+ mesq l("Let me give you a lifestone to get started with.");
+ next;
+ getinventorylist;
+ if ((@inventorylist_count == 100) && (countitem(Lifestone) == 0)) goto L_T_Initial_Noroom;
+ getitem Lifestone, 1;
+ learnskill SKILL_LUM;
+ setq1(MagicQuest_Healing, .ST_LEARNED_LIGHT_HEAL);
+
+ mesn l("Elanore the Healer");
+ mes "Elanore hands you the crystal.";
+ mes "\"Here you are. I hope that it will allow you to do good!\"";
+ goto L_close;
+
+L_T_Initial_Noroom:
+ mesn l("Elanore the Healer");
+ mesq l("Oh... you managed to put things into every little nook and pocket, haven't you? Well, come back later, I will give it to you then.");
+ goto L_close;
+
+L_T_ChkAdvTo2:
+ mesn l("Elanore the Healer");
+ if (.@heal_exp < 20) goto L_T_ChkAdvTo2_fail;
+ mesc l("Elanore smiles at you.");
+ mesq l("From what I have been hearing, you seem to be doing well on your way to becoming a healer. I have decided to accept you as a student of the School of Life Magic.");
+ next;
+ if (getskilllv(SKILL_MAGIC) < 2) {
+ mesn l("Elanore the Healer");
+ mesq l("But be warned: you won't be able to use advanced healing magic until you are more capable in your regular magic usage.");
+ next;
+ }
+L_T_AdvTo2_skip:
+ mesn l("Elanore the Healer");
+ mesq l("Please stand still.");
+ mesc l("She walks up to you, holds your shoulders, and smiles at you.");
+ next;
+ mesn l("Elanore the Healer");
+ mesc l("Then, she rises up on her tiptoes and kisses you on your forehead.");
+ next;
+ mesn l("Elanore the Healer");
+ mesc l("You feel a strange, tingling kind of warmth spread through your body.");
+ setq1(MagicQuest_Healing, .ST_MASTERED_LIGHT_HEAL);
+ @SUP_xp = 5000;
+ @SUP_lvl = 2;
+ callfunc "SkillUp";
+ goto L_close;
+
+L_T_ChkAdvTo2_fail:
+ mesq l("I think I would like to observe you for a little longer to see if you would make a good healer.");
+ if (.@heal_exp < 5)
+ mesq l("You are still at the beginning of your path, but do keep practicing.");
+ if ((.@heal_exp >= 5) && (.@heal_exp < 15))
+ mesq l("You are making progress, but you still need more practice.");
+ if (.@heal_exp >= 15)
+ mesq l("You have made good progress, but please do continue in your efforts.");
+ goto L_close;
+
+L_T_ChkAdvToLOH:
+ if (getskilllv(SKILL_MAGIC) < 2) goto L_T_LOH_adv_abort0;
+ if (.@heal_exp < 30) goto L_T_LOH_adv_abort1;
+
+ mesn l("Elanore the Healer");
+ mesq l("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;
+ mesn l("Elanore the Healer");
+ mesq l("\"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 '%s', which is the lay on hands magic.\"", b("inma"));
+ next;
+ mesn l("Elanore the Healer");
+ mesq l("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 and may even injure yourself further.");
+ next;
+ mesn l("Elanore the Healer");
+ mesq l("Unlike lesser heal, it'll heal instantly, however it still cannot help if the person has a serious injury or has been inflicted with an ailment.");
+ mes "[1000 experience points]";
+ getexp 1000, 0;
+ learnskill SKILL_INMA;
+ setq1(MagicQuest_Healing, .ST_LEARNED_LAYONHANDS);
+ goto L_close;
+
+L_T_LOH_adv_abort0:
+ mesn l("Elanore the Healer");
+ mesq l("You don't have enough magical power to learn the next healing spell yet.");
+ goto L_close;
+
+L_T_LOH_adv_abort1:
+ mesn l("Elanore the Healer");
+ mesq l("I'm sorry, but I am not yet convinced that you are a good enough healer. Please continue in your endeavors.");
+ goto L_close;
+
+L_T_Explain3:
+ if (getskilllv(SKILL_MAGIC) < 3) goto L_T_Explain3_abort;
+ if (.@heal_exp < 50) goto L_T_Explain3_fail;
+
+ mesn l("Elanore the Healer");
+ mesc l("Elanore smiles.");
+ mesq l("You seem to be ready to advance as a healer. There is one favor I must ask of you first, though.");
+ set QUEST_MAGIC2, (QUEST_MAGIC2 & ~(NIBBLE_3_MASK)); // Initialise Kadiya quest
+ setq1(MagicQuest_Healing, .ST_WAITING_FOR_KADIYA);
+ @Q_status = getq(MagicQuest_Healing);
+ next;
+
+ mesn l("Elanore the Healer");
+ mes "\"There is a man here in Tulimshar with a beautiful young daughter; his name is Omar, and his daughter's name is Kadiya.\"";
+ mes "\"Once, when I was a young apprentice, I made a mistake treating Omar. Ever since, he no longer trusts me.\"";
+ next;
+
+ mesn l("Elanore the Healer");
+ mes "\"But his daugher has contracted Mopox, so she needs help. He doesn't trust me, but perhaps he will trust you; you have been helping quite a few people, after all.\"";
+ next;
+ goto L_3_menu;
+
+L_3_menu:
+ menu
+ "What should I do?", L_3_what_to_do,
+ "Where can I find the sick girl?", L_3_where,
+ "How did you mess up?", L_3_messup,
+ "I will get started right away.", L_Main,
+ "Maybe later.", L_Main;
+
+L_3_what_to_do:
+ mesn l("Elanore the Healer");
+ mes "\"You will have to brew a Mopox cure potion and give it to her. You should ask Caul to help you, he knows the recipe.\"";
+ next;
+ mesn l("Elanore the Healer");
+ mes "\"First, you will need a concentration potion and an iron potion – together, they will give her her strength back. You also need a lifestone, and a gamboge leaf against the toxins in her body.\"";
+ next;
+ mesn l("Elanore the Healer");
+ mes "\"You then have to add in roots, water, mauve leaves and sulphur powder until the brew is gooey and neither light nor dark. Caul will explain the details to you.\"";
+ next;
+ mesn l("Elanore the Healer");
+ mes "\"There is a transmutation spell to make sulphur powder. If you don't know the magic, perhaps you can ask a transmutation mage to help you with this part.\"";
+ next;
+ goto L_3_menu;
+
+L_3_messup:
+ mesn l("Elanore the Healer");
+ mes "\"Ah... well, Omar is a trader, and a frequent traveler. One day he came back from a journey with fleas in his beard and asked me to get rid of them.\"";
+ next;
+ mesn l("Elanore the Healer");
+ mes "\"Unfortunately I used the wrong lotion on the fleas, so instead of being scared away, they grew to enormous proportions and ate up all of his beard.\"";
+ next;
+ mesn l("Elanore the Healer");
+ mes "Elanore blushes.";
+ mes "\"Ever since then he hasn't been very trusting towards my skills, and I suppose that I can't blame him. But I don't want poor Kadiya to suffer because of that.\"";
+ next;
+ goto L_3_menu;
+
+L_3_where:
+ mesn l("Elanore the Healer");
+ mes "\"Kadiya and Omar live relatively close by. See this corner in the inner city wall east of here? Turn past it, then go north. It's the second house.\"";
+ next;
+ goto L_3_menu;
+
+L_T_Explain3_abort:
+ mesn l("Elanore the Healer");
+ mes "\"I'm sorry, but you lack the magical power to advance.\"";
+ goto L_close;
+
+L_T_Explain3_fail:
+ mesn l("Elanore the Healer");
+ if (.@heal_exp < 30)
+ mes "\"You seem to have regressed as a healer. This is worrisome; please mend your ways or I will not teach you any further.\"";
+ if ((.@heal_exp >= 30) && (.@heal_exp < 40))
+ mes "\"You still need more practice in the art of healing.\"";
+ if ((.@heal_exp >= 40))
+ mes "\"You are doing well, but you need some more practice as a healer first.\"";
+ goto L_close;
+
+L_T_ChkAdvTo3:
+ callfunc "KadiyaSubquestConsts";
+
+ if (@Q_kadiya_status >= @Q_STATUS_COMPLETED) goto L_T_AdvTo3Ready;
+
+ mesn l("Elanore the Healer");
+ mes "\"Please help Kadiya.\"";
+ next;
+ goto L_3_menu;
+
+L_T_AdvTo3Ready:
+ mesn l("Elanore the Healer");
+ mes "\"I have heard of what you did. Hiding the potion in her favorite food – that was clever.\"";
+ mes "She smiles at you.";
+ mes "\"Omar let me have a look at her earlier, and she seems to be recovering. You did very well.";
+ next;
+ mesn l("Elanore the Healer");
+ mes "Elanor turns towards you, rises up on her toes and kisses you on the forehead.";
+ next;
+ @xp = 30000;
+ if (@Q_kadiya_status == @Q_STATUS_COMPLETED_ELANORE)
+ @xp = 50000;
+ mesn l("Elanore the Healer");
+ mes "You feel a strange, tingling kind of warmth spread through your body.";
+ mes "[" + @xp + " experience points]";
+ mes "[Level 3 in Life Magic]";
+
+ setq1(MagicQuest_Healing, .ST_READY_TO_CURE_POISON);
+ @Q_status = getq(MagicQuest_Healing);
+ getexp @xp, 0;
+ if (getskilllv(SKILL_MAGIC_LIFE) < 3)
+ updateskill SKILL_MAGIC_LIFE, 3;
+ next;
+
+ if (@Q_kadiya_status != @Q_STATUS_COMPLETED_ELANORE) goto L_Main;
+
+ mesn l("Elanore the Healer");
+ mes "\"Overall I am impressed by your progress. If you continue as you are doing now, you might become a great healer.\"";
+ mes "She hands you a handful of lifestones.";
+ mes "\"Please come back soon; there is more that I would like to teach you.\"";
+ next;
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_ELANORE_OMAR;
+ getitem Lifestone, 20;
+
+ goto L_Main;
+
+L_T_CurePosion:
+ mesn l("Elanore the Healer");
+ mes "\"Thank you again for your help with Kadiya!\"";
+ mes "\"Curing sicknesses is often quite difficult; most of them require complicated potions to be brewed.\"";
+ next;
+ mesn l("Elanore the Healer");
+ mes "\"Fortunately, things are much easier with most poisons. For those we have a simple spell that only requires a Gamboge leaf.\"";
+ mes "\"This is the next spell that I would like to teach you.\"";
+ next;
+ mesn l("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, `" + 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;
+ mesn l("Elanore the Healer");
+ 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;
+ setq1(MagicQuest_Healing, .ST_LEARNED_CURE_POISON);
+ @Q_status = getq(MagicQuest_Healing);
+ goto L_Main;
+
+L_T_dunno:
+ mesn l("Elanore the Healer");
+ mesq l("Hmm. I wanted to teach you something, but I've forgotten what it was... please come back later.");
+ next;
+ goto L_Main;
+
+L_Question:
+ callfunc "MagicTalkOptionsSetup";
+ @ignore = @QQ_ELANORE;
+ callfunc "MagicTalkMenu";
+
+ if (@c == 0) goto L_Main;
+ if (@c == @QQ_MANASEED) goto L_Q_manaseed;
+ if (@c == @QQ_MANAPOTION) goto L_Q_manapotion;
+ if (@c == @QQ_WYARA) goto L_Q_wyara;
+ if (@c == @QQ_SAGATHA) goto L_Q_sagatha;
+ if (@c == @QQ_AULDSBEL) goto L_Q_auldsbel;
+ if (@c == @QQ_OLDWIZ) goto L_Q_oldwiz;
+ if (@c == @QQ_ASTRALSOUL) goto L_Q_astralsoul;
+
+ mesn l("Elanore the Healer");
+ mesc l("Elanore shakes her head.");
+ mesq l("I am sorry, but I don't think that I know anything that would help you.");
+ next;
+ goto L_Main;
+
+L_Q_astralsoul:
+ mesn l("Elanore the Healer");
+ mes "\"The astral soul skill is one of the most important skills for mages. I learned this focus long time ago. Without that skill your magic is quite useless, isn't it? If the rumors are really true, there is an experienced mage in the Woodlands around Hurnscald.\"";
+ next;
+ goto L_Main;
+
+L_Q_oldwiz:
+ mesn l("Elanore the Healer");
+ mesq l("He is a kind old man. He stays mostly with his books and his apprentice, though we have chatted a few times.");
+ next;
+ goto L_Main;
+
+L_Q_manaseed:
+ mesn l("Elanore the Healer");
+ mesc l("She smiles.");
+ mesq l("If the rumors are true and there really is a Mana Seed, then that would be wonderful news – perhaps we will have a few more healers soon!");
+ next;
+ goto L_Main;
+
+L_Q_manapotion:
+ mesn l("Elanore the Healer");
+ mesq l("I'm sorry, but I can't help you with that.");
+ next;
+ goto L_Main;
+
+L_Q_wyara:
+ mesn l("Elanore the Healer");
+ mesq l("Wyara is the Hurnscald town witch. She was also the town healer before the Doctor moved there.");
+ next;
+ goto L_Main;
+
+L_Q_sagatha:
+ mesn l("Elanore the Healer");
+ mesq l("Oh, I have only met Sagatha once or twice, while collecting herbs. She is a warm and gentle person, but she tries to hide it.");
+ next;
+ goto L_Main;
+
+L_Q_auldsbel:
+ mesn l("Elanore the Healer");
+ mesq l("Oh, sorry – I don't really know him very well.");
+ next;
+ goto L_Main;
+
+L_CurePoison:
+ mesn l("Elanore the Healer");
+ mesq l("Oh dear! That looks like poison; hang on...");
+ mesc l("She performs a complicated gesture.");
+ sc_end(SC_POISON);
+ sc_end(SC_DPOISON);
+ sc_end(SC_SLOWPOISON);
+ misceffect sfx_magic_life, strcharinfo(0);
+ misceffect sfx_magic_life;
+ next;
+ mesn l("Elanore the Healer");
+ mesq l("There you are, right as rain! Now you take care, all right?");
+ goto L_close;
+
+L_Bye:
+ mesn l("Elanore the Healer");
+ mesq l("Goodbye!");
+ goto L_close;
+
+L_close:
+ @has_magic = 0;
+ @Q_status = 0;
+ @SUP_id = 0;
+ @SUP_name$ = "";
+ @ignore = 0;
+ @xp = 0;
+ close;
+
+OnInit:
+ .ST_INITIAL = 0;
+ .ST_LEARNED_LIGHT_HEAL = 1;
+ .ST_MASTERED_LIGHT_HEAL = 2;
+ .ST_LEARNED_LAYONHANDS = 3;
+ .ST_WAITING_FOR_KADIYA = 4;
+ .ST_READY_TO_CURE_POISON = 5;
+ .ST_LEARNED_CURE_POISON = 6;
+ end;
+}
diff --git a/npc/002-1/gaurds.txt b/npc/002-1/gaurds.txt
new file mode 100644
index 00000000..c69a823f
--- /dev/null
+++ b/npc/002-1/gaurds.txt
@@ -0,0 +1,15 @@
+002-1,100,21,0 script Guard#port1 NPC104,{
+ mes "[Guard]";
+ mes "\"Lots of stuff happens in the port district. Those sailors can get quite rowdy.\"";
+ close;
+}
+002-1,61,27,0 script Guard#port2 NPC104,{
+ mes "[Guard]";
+ mes "\"You wouldn't believe the refuse that comes in from the docks.\"";
+ close;
+}
+002-1,83,48,0 script Guard#east1 NPC104,{
+ mes "[Guard]";
+ mes "\"I make sure less desirables don't bother the Nobles.\"";
+ close;
+}
diff --git a/npc/002-1/itka.txt b/npc/002-1/itka.txt
new file mode 100644
index 00000000..42ae91bd
--- /dev/null
+++ b/npc/002-1/itka.txt
@@ -0,0 +1,19 @@
+002-1,66,39,0 script Itka NPC114,{
+ mes "[Itka]";
+ mes "\"This hotel is the best!\"";
+ next;
+ mes "\"It has a Baker, a Barber, a Casino and a Theatre.\"";
+ next;
+ mes "\"Come on inside now!\"";
+ close;
+
+OnTimer300000:
+ npctalk strnpcinfo(0), "Come to The Wizard's Rest!";
+ setnpctimer 0;
+ end;
+
+OnInit:
+ if (debug >= 2) end;
+ initnpctimer;
+ end;
+}
diff --git a/npc/002-1/lieutenant_dausen.txt b/npc/002-1/lieutenant_dausen.txt
new file mode 100644
index 00000000..1144232d
--- /dev/null
+++ b/npc/002-1/lieutenant_dausen.txt
@@ -0,0 +1,110 @@
+002-1,63,67,0 script Lieutenant Dausen NPC122,{
+ if (QL_MINEALL == 21) goto L_LD_Key;
+ if (QL_MINEALL == 7) goto L_LD_Miners;
+ if (QL_MINEALL == 6) goto L_LD_Orders;
+ if (QL_MINEALL == 5) goto L_LD_Nickos_Waits;
+ if (QL_MINEALL == 4) goto L_LD_Nickos;
+ if (QL_MINEALL == 3) goto L_LD_Waits;
+ if (QL_MINEALL == 2) goto L_LD_Woe_Is_Me;
+ if (QL_MINEALL == 1) goto L_LD_Drinks;
+
+ mes "[Lieutenant Dausen]";
+ mes "\"Hello. I am Lieutenant Dausen. I monitor the monster threat around the city to ensure the safety of its citizens.\"";
+ if (QL_MINEALL)
+ goto L_close;
+ goto L_LD_Start;
+
+L_LD_Start:
+ QL_MINEALL = 1;
+ next;
+ mes "\"Out here in the desert, it sure does get hot! My men and I get thirsty rather quickly. Cactus Drinks are our favourite; if you can get some for us, we'd surely appreciate your effort. About 10 would do.\"";
+ goto L_close;
+
+L_LD_Drinks:
+ if (countitem ("CactusDrink") < 10)
+ goto L_LD_NotEnough_Drink;
+ getinventorylist;
+ if (@inventorylist_count - (countitem("CactusDrink") == 10) > 99)
+ goto L_LD_TooMany;
+ QL_MINEALL = 2;
+ delitem "CactusDrink", 10;
+ getitem "Boots", 1;
+ mes "[Lieutenant Dausen]";
+ mes "\"Great! This will help us make it through the hot day. As a gift for your troubles, take these boots to keep your feet from burning on the sand. Have a good day...\"";
+ next;
+ mes "Lieutenant Dausen mumbles to himself and rubs his head.";
+ next;
+ mes "\"I have another problem, though. I mixed up the orders to my men, Nickos and Stewen. Someone needs to let them know they're going to have to hold their post for a while longer instead of taking a break. However, I can't leave my post! Oh, what to do, what to do...\"";
+ menu
+ "I can help you out, since you helped me too.", L_LD_Help,
+ "Thanks for the boots, gotta run now.", L_LD_NoHelp;
+
+L_LD_NotEnough_Drink:
+ mes "[Lieutenant Dausen]";
+ mes "\"Hi again. My men and I sure are thirsty for our favorite drink, the Cactus Drink. If we had about 10, it would help us out a great deal in this sandstorm.\"";
+ goto L_close;
+
+L_LD_TooMany:
+ mes "[Lieutenant Dausen]";
+ mes "\"Oh, it seems you have too many items for me to give you a reward. Come back after you drop or sell some items.\"";
+ goto L_close;
+
+L_LD_Woe_Is_Me:
+ mes "[Lieutenant Dausen]";
+ mes "\"I have a problem. I mixed up the orders to my men! Someone needs to let them know they're going to have to hold their post for a while longer instead of taking a break. However, I can't leave my post. Oh, what to do, what to do...\"";
+ menu
+ "I can help you out, since you helped me out too.", L_LD_Help,
+ "Bye-bye.", L_LD_NoHelp;
+
+L_LD_Help:
+ QL_MINEALL = 3;
+ mes "[Lieutenant Dausen]";
+ mes "\"Oh! Would you? You are ever most helpful! Could you let Stewen know first? I'm the most worried about the monsters from the eastern desert and he should know first to hold his post. Come back to me after you see him. Hope to hear from you soon!\"";
+ goto L_close;
+
+L_LD_NoHelp:
+ mes "[Lieutenant Dausen]";
+ mes "\"See you later then.\"";
+ goto L_close;
+
+L_LD_Waits:
+ mes "[Lieutenant Dausen]";
+ mes "\"I do hope Stewen holds his post. If you could tell them to do so, it would help me out a great deal.\"";
+ goto L_close;
+
+L_LD_Nickos:
+ QL_MINEALL = 5;
+ mes "[Lieutenant Dausen]";
+ mes "\"Thanks for letting Stewen know. Can you now tell Nickos to hold his post too? He guards the mine to the south, monitoring the monster threat and protecting the miners when he can.\"";
+ goto L_close;
+
+L_LD_Nickos_Waits:
+ mes "[Lieutenant Dausen]";
+ mes "\"Could you let Nickos know to hold his post? It would be very helpful. He is guarding the mine south of here.\"";
+ goto L_close;
+
+L_LD_Orders:
+ QL_MINEALL = 7;
+ Zeny = Zeny + 500;
+ mes "[Lieutenant Dausen]";
+ mes "\"Thank you for clearing up the orders to my men! Here's some gold for your efforts.\"";
+ next;
+ mes "\"If you think you can handle the monsters lurking out here, I'm sure Nickos and the miners could use some help. Talk to you later.\"";
+ goto L_close;
+
+L_LD_Miners:
+ mes "[Lieutenant Dausen]";
+ mes "\"I monitor the monster threat around the city to ensure the safety of its citizens.\"";
+ next;
+ mes "\"If you think you can handle the monsters lurking out here, I'm sure Nickos and the miners could use some help. Talk to you later.\"";
+ goto L_close;
+
+L_LD_Key:
+ QL_MINEALL = 22;
+ mes "[Lieutenant Dausen]";
+ mes "\"Oh, Naem lost his key? Here, take this spare. It should help you get into the underground palace.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/002-1/luca.txt b/npc/002-1/luca.txt
new file mode 100644
index 00000000..bbfa1861
--- /dev/null
+++ b/npc/002-1/luca.txt
@@ -0,0 +1,348 @@
+
+002-1,112,26,0 script Luca NPC102,{
+ function minf;
+
+ if (BaseLevel >= 35) goto L_Teach;
+
+ if (BaseLevel >= 25) goto L_Teach_soon;
+
+ mesn l("Luca the Hunter");
+ mesq l("Ouch! It hurts, this wound I got from battle.");
+ next;
+ menu
+ l("Tell me about it"), L_Exp,
+ l("Nevermind"), L_Nev;
+
+L_Exp:
+ mesn l("Luca the Hunter");
+ mesq l("I was just coming back from a long journey. I ran into a group of scorpions and started fighting them for experience.");
+ next;
+ mesn l("Luca the Hunter");
+ mesq l("Then, out of a cave came a BLACK one! I had NEVER seen it before!");
+ next;
+ mesn l("Luca the Hunter");
+ mesq l("Luckily I had a camera with me! Here's a picture of it... Let me find it, I put it in my pocket somewhere...");
+ next;
+ mesn l("Luca the Hunter");
+ mesq l("Oh man! My pockets have been ripped clean off!");
+ close;
+
+L_Nev:
+ mesn l("Luca the Hunter");
+ mesq l("Hmpf!");
+ close;
+
+L_Teach_soon:
+ mesn l("Luca the Hunter");
+ mesq l("You've grown quite a bit stronger since I first saw you, strolling around town like that! You know, if you train a little more, maybe we can help each other out a little?");
+ close;
+
+L_Teach:
+ if (getskilllv(SKILL_POOL)) goto L_Teachmore;
+
+ mesn l("Luca the Hunter");
+ mes "\"Hey there! You've become quite the adventurer, haven't you? I think it's time that someone taught you some basic skills.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"If you want, I can help with that!\"";
+ next;
+ menu
+ "Sure, that sounds fun!", L_Next,
+ "I'm not interested.", L_Nev;
+
+L_Next:
+ mesn l("Luca the Hunter");
+ mes "\"All right! It's not all that easy, though. First you have to learn how to focus. That's because you can learn many skills, but you can't focus on all of them all the time.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"When you can do that, you can learn some real skills, and when you know them, you can come back to me to tell me which ones you want to focus on. Deal?\"";
+ next;
+ menu
+ "Yeah!", L_Teach0_follow,
+ "Certainly!", L_Teach0_follow,
+ "Wait... what do you mean?", L_Explain,
+ "Please explain some more.", L_Explain,
+ "No.", L_Nev;
+
+L_Teach0_follow:
+ if (getskilllv(SKILL_POOL)) goto L_Teachmore;
+
+ mesn l("Luca the Hunter");
+ mes "\"Great! Now, before I can give you that skill, I have to make sure that those stories about you are all true and that you really are experienced enough.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"So I'm going to ask you some easy questions.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"First, who is the man who guards the entrance to the old Tulimshar underground arena?\"";
+ next;
+ input .@answer$;
+ if (.@answer$ != "Phaet" && .@answer$ != "phaet") goto L_wronganswer;
+ mesn l("Luca the Hunter");
+ mes "\"Good. Next, what's the name of the pipe-smoker who lives on top of Lore Mountain and makes leathery goods there?\"";
+ next;
+ input .@answer$;
+ if (.@answer$ != "Pachua" && .@answer$ != "pachua") goto L_wronganswer;
+ mesn l("Luca the Hunter");
+ mes "\"Great! One more: Who was the adventurer who built Dimond's Cove for Dimond?\"";
+ next;
+ input .@answer$;
+ if (.@answer$ != "Merlin" && .@answer$ != "merlin") goto L_wronganswer;
+ mesn l("Luca the Hunter");
+ mes "Luca laughs in excitement.";
+ mes "\"All right! You're the real thing, my friend!\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"Now stand over there. This should only take a second...\"";
+ mes "He takes off a pendant he is wearing and holds it up.";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"See that fang at the end of the chain? Keep staring at it.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "He starts swinging the pendant back and forth.";
+ mes "\"And whatever you do, don't blink. Don't look away, and don't blink.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "The world slows down around you as you focus on the pendant going back...";
+ next;
+ mes "and forth...";
+ next;
+ mes "and back...";
+ next;
+ mes "and forth...";
+ next;
+ mes "and back...";
+ next;
+ mes "and...";
+ next;
+ mes "You feel relaxed.";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"... still there?\"";
+ mes "You hear the sound of fingers snapping. Why would someone do that on such a calm day?";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"Oh, good... I think it worked. Nice job!\"";
+ mes "He grins.";
+ mes "[You gain 10,000 experience points]";
+ mes "[You learned Skill Focus]";
+ learnskill SKILL_POOL, 1;
+ getexp 10000, 0;
+ next;
+ goto L_Teachmore;
+
+L_wronganswer:
+ mesn l("Luca the Hunter");
+ mesq l("No, that was wrong. I suppose you're not as experienced as I thought you'd be.");
+ close;
+
+L_Explain:
+ mesn l("Luca the Hunter");
+ mesq l("Alright, what do you want to know?");
+ next;
+ goto L_Explain_loop;
+
+L_Explain_loop:
+ menu
+ "What's skill focus?", L_explain_focus,
+ "What skills are there?", L_explain_skills,
+ "How do skills work?", L_explain_work,
+ "Thanks, I think I got it!", L_Next;
+
+L_explain_focus:
+ mesn l("Luca the Hunter");
+ mes "\"Well, you can learn many, many skills. But you can't really use all of them at once, not even old Auldsbels' head is big enough for that! So you have to focus.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"But you can change that focus whenever you want. It works like this: You come to me, you tell me what you want to focus on, and we do exercises until it's stuck in your head.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"If there's not enough space in your head, you'll first have to stop thinking about some other thing. There's an exercise I learned to do that, so when you talk to me you can just let me know what you want to forget.\"";
+ next;
+ mesn l("Luca the Hunter");
+ if (getskilllv(SKILL_POOL) == 0)
+ mesq l("Right now you can't focus on anything yet, so I'll first have to teach you a simple skill to keep your focus.");
+ if (getskilllv(SKILL_POOL) == 1)
+ mesq l("Right now you can only focus on one thing at a time. So if you want to change what your focus is, you have to forget whatever else you've focused on");
+ if (getskilllv(SKILL_POOL) > 1)
+ mesq l("You can focus on %d skills right now.", getskilllv(SKILL_POOL));
+ next;
+ mesn l("Luca the Hunter");
+ mesq l("You can come back to me to focus or unfocus a skill whenever you want, I'm here all day.");
+ next;
+ mesq l("For unfocusing you need to bring a potion; a special potion. That potion is not the easiest to get, but I am sure you are able to.");
+ next;
+ goto L_Explain_loop;
+
+L_explain_skills:
+ mesn l("Luca the Hunter");
+ mes "\"Well, I don't really know... lots, I think. I can teach you brawling, which is good when you've run out of arrows or don't have a weapon around.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"But there's other skills around. Some mages need special skills to concentrate, so ask around in that crowd, if that's your thing.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"I've also heard that there is someone in Hurnscald who can help you make your body more resistant against some things. But body and mind belong together, so you probably have to focus for that, too.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"Other than that, just ask around! There have to be some people who can teach you something...\"";
+ next;
+ goto L_Explain_loop;
+
+L_explain_work:
+ mesn l("Luca the Hunter");
+ mes "\"Well, skills allow you to be better in some things, or allow to do what you couldn't do without them. When you've learned a skill and are focusing on it, then it affects what you do.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"Now, when you start out with a skill, you won't be very good at it yet. But if you keep practicing you'll learn how to get better.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"My old teacher always called that getting `skill points' and that you can see them with [F5], whoever that is. And something about a limit on how many points can be acquired.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"She also said that with this [F5] thing you can get better at those skills, and that it costs you as many skill points as the level you want to go to.\"";
+ next;
+ mesn l("Luca the Hunter");
+ mes "\"She always would have one cactus potion too many... but she was an amazing teacher.\"";
+ mes "He nods emphatically.";
+ next;
+ goto L_Explain_loop;
+
+// FIXME Placeholder
+L_Teachmore:
+ mesn l("Luca the Hunter");
+ mes "\"Good to see you again!\"";
+ next;
+ mesn;
+ mesq l("Sorry %%i I am really really REALLY busy right now. Maybe later, when I find my toolset, we can start focusing on something.");
+ if (!getskilllv(SKILL_POOL)) close;
+ .@t=getactivatedpoolskilllist();
+ mes "";
+ mes l("Focus list:");
+ mesc l("%s : %s", l("Mallard's Eye"),
+ (isfocused(SKILL_MALLARDS_EYE) ? l("Yes") : l("No")));
+ mesc l("%s : %s", l("Brawling"),
+ (isfocused(SKILL_BRAWLING) ? l("Yes") : l("No")));
+ mesc l("%s : %s", l("Speed"),
+ (isfocused(SKILL_SPEED) ? l("Yes") : l("No")));
+ mesc l("%s : %s", l("Resist Ailment"),
+ (isfocused(SKILL_RESIST_POISON) ? l("Yes") : l("No")));
+ mesc l("%s : %s", l("Astral Soul"),
+ (isfocused(SKILL_ASTRAL_SOUL) ? l("Yes") : l("No")));
+ mesc l("%s : %s", l("Raging"),
+ (isfocused(SKILL_RAGING) ? l("Yes") : l("No")));
+ menuint
+ l("I'm done for now, thanks!"), -3,
+ l("Can you explain skills again?"), -2,
+ l("Can you teach me a skill?"), -1,
+ rif(getskilllv(SKILL_MALLARDS_EYE),
+ l("%s Mallards Eye", minf(SKILL_MALLARDS_EYE))),
+ SKILL_MALLARDS_EYE,
+ rif(getskilllv(SKILL_BRAWLING),
+ l("%s Brawling", minf(SKILL_BRAWLING))),
+ SKILL_BRAWLING,
+ rif(getskilllv(SKILL_SPEED),
+ l("%s Speed", minf(SKILL_SPEED))),
+ SKILL_SPEED,
+ rif(getskilllv(SKILL_RESIST_POISON),
+ l("%s Resist Ailment", minf(SKILL_RESIST_POISON))),
+ SKILL_RESIST_POISON,
+ rif(getskilllv(SKILL_ASTRAL_SOUL),
+ l("%s Astral Soul", minf(SKILL_ASTRAL_SOUL))),
+ SKILL_ASTRAL_SOUL,
+ rif(getskilllv(SKILL_RAGING),
+ l("%s Raging", minf(SKILL_RAGING))),
+ SKILL_RAGING;
+ mes "";
+ switch (@menuret) {
+ case -3: close;
+ case -2: goto L_Explain;
+ case -1:
+ if (getskilllv(SKILL_BRAWLING))
+ goto L_Teach_nothing;
+ else
+ goto L_Teach_brawling;
+ break;
+ default:
+ if (FOCUSING & getpoolskillFID(@menuret)) {
+ if (!countitem(GrimaceOfDementia)) goto L_Nopotion;
+ unpoolskill(@menuret);
+ delitem GrimaceOfDementia, 1;
+ mesc l("Focus removed"), 1;
+ } else {
+ .@s = poolskill(@menuret);
+ if (.@s)
+ mesc l("Focus added"), 2;
+ else
+ mesc l("Impossible to focus. You can only focus %d skills at a time.", .@t), 1;
+ }
+ }
+ goto L_Teachmore;
+
+
+L_Nopotion:
+ if (MAGIC_FLAGS & MFLAG_KNOWS_UNFOCUS_RECIPE) {
+ mesn l("Luca the Hunter");
+ mesq l("Hey, you really need that dementia potion for unfocusing.");
+ next;
+ mesq l("Come back when you've found a suitable alchemist who can mix such a potion.");
+ } else {
+ mesn l("Luca the Hunter");
+ mesq l("Unfocusing is one of the harder parts though, because it is sunk in. You see?");
+ next;
+ mesq l("So to remove that mental focus we will need a special potion.");
+ next;
+ mesq l("Maybe you should consult some very skilled alchemists.");
+ next;
+ mesq l("Ah yes, of course you will need a recipe. Although the alchemist usually knows it.");
+ next;
+ mesq l("The potion is called Grimace of Dementia. So the alchemist will know for sure.");
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_UNFOCUS_RECIPE;
+ }
+ next;
+ goto L_Teachmore;
+
+L_Teach_brawling:
+ mesn l("Luca the Hunter");
+ mes "\"Well, yes, I can teach you brawling. It's a nice thing, if you have nothing left but your hands to defend yourself.\"";
+ next;
+ mes "He is laughing.";
+ mes "\"And is handy, if some sapling starts getting naughty.\"";
+ next;
+ mes "He raises his hands in front of his face and clenches his fists.";
+ mes "\"Ok, let's go! Hold your hands like this.\"";
+ next;
+ mes ".......";
+ next;
+ mes "Some bruises later.";
+ mes "\"Great! I think, you got it.\"";
+ next;
+ @SUP_id = SKILL_BRAWLING;
+ @SUP_lvl = 1;
+ @SUP_name$ = "Brawling";
+ @SUP_xp = .Exp_BRAWLING;
+ callfunc "SkillUp";
+ @SUP_id = 0;
+ @SUP_lvl = 0;
+ @SUP_name$ = "";
+ @SUP_xp = 0;
+ close;
+
+L_Teach_nothing:
+ mesn l("Luca the Hunter");
+ mes "\"I was able to teach you brawling. For other professions you should visit someone else.\"";
+ next;
+ mes "\"You see, I am an adventurer. Everybody has his tricks. But you really should visit someone who is a teacher, not an adventurer, now.\"";
+ next;
+ goto L_Teachmore;
+
+OnInit:
+ .Exp_BRAWLING = 2000;
+ .distance=5;
+ end;
+
+function minf {
+ return (isfocused(getarg(0)) ? l("Unfocus") : l("Focus"));
+}
+}
diff --git a/npc/002-1/mapflags.txt b/npc/002-1/mapflags.txt
new file mode 100644
index 00000000..8e244b73
--- /dev/null
+++ b/npc/002-1/mapflags.txt
@@ -0,0 +1 @@
+//002-1 mapflag resave 001-1,60,105
diff --git a/npc/002-1/mine_debug.txt b/npc/002-1/mine_debug.txt
new file mode 100644
index 00000000..b7f6ff23
--- /dev/null
+++ b/npc/002-1/mine_debug.txt
@@ -0,0 +1,68 @@
+
+function script DesertMineDebug {
+ mes "[Mine Debug]";
+ mes "What would you like to do?";
+ menu
+ "Reset", L_Reset,
+ "Set", L_Set,
+ "Show", L_Show,
+ "nothing.", L_close;
+
+L_Reset:
+ QL_MINEALL = 0;
+ FLAGS = FLAGS &~ FLAG_GOT_NAEM_GLOVES;
+ FLAGS = FLAGS &~ FLAG_OPENED_UNDERGROUND;
+ goto L_close;
+
+L_Set:
+ mes "Values are between 0 and 28";
+ mes "8 is Mine Start";
+ mes "18 is Angry Scorpions Start";
+ mes "20 is Underground Palace Start";
+ mes "26 is Giant Cave Maggot Start";
+ input QL_MINEALL;
+ goto L_close;
+
+L_Show:
+ mes "Current State: " + QL_MINEALL;
+ goto L_close;
+
+L_close:
+ return;
+}
+002-1,61,69,0 script Mine Debug#1 NPC122,{
+ callfunc "DesertMineDebug";
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "Mine Debug#1";
+ end;
+}
+002-3,45,49,6 script Mine Debug#2 NPC109,{
+ callfunc "DesertMineDebug";
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "Mine Debug#2";
+ end;
+}
+002-4,88,99,6 script Mine Debug#3 NPC109,{
+ callfunc "DesertMineDebug";
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "Mine Debug#3";
+ end;
+}
+002-5,43,96,6 script Mine Debug#4 NPC340,{
+ callfunc "DesertMineDebug";
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "Mine Debug#4";
+ end;
+}
diff --git a/npc/002-1/nickos.txt b/npc/002-1/nickos.txt
new file mode 100644
index 00000000..80c71da0
--- /dev/null
+++ b/npc/002-1/nickos.txt
@@ -0,0 +1,113 @@
+002-1,46,108,0 script Nickos NPC123,{
+ if (QL_MINEALL == 20) goto L_UGQ;
+ if (QL_MINEALL == 19) goto L_AS_Done;
+ if (QL_MINEALL == 18) goto L_AS_Start;
+ if (QL_MINEALL >= 11) && (QL_MINEALL < 18) goto L_Guards;
+ if (QL_MINEALL == 10) goto L_Check_Happy;
+ if (QL_MINEALL > 7) && (QL_MINEALL < 10) goto L_Waits;
+ if (QL_MINEALL == 7) goto L_Mine;
+ if (QL_MINEALL == 6) goto L_Orders_Received;
+ if (QL_MINEALL == 5) goto L_Orders;
+ if (QL_MINEALL < 5) goto L_See_Dausen_First;
+
+ mes "[Nickos]";
+ mes "\"I'm watching this mine to make sure the monsters don't harm the miners.\"";
+ goto L_close;
+
+L_See_Dausen_First:
+ mes "[Nickos]";
+ mes "\"I'm watching this mine to make sure the monsters don't harm the miners.\"";
+ next;
+ mes "[Nickos]";
+ mes "\"The mines are closed from tourists due to the monster threat. If you want to get in you will need to prove yourself first. Talk to Lieutenant Dausen, my superior, if you want to make a formal complaint.\"";
+ goto L_close;
+
+L_Orders:
+ QL_MINEALL = 6;
+ mes "[Nickos]";
+ mes "\"I have to hold my post longer? Argh! I was looking forward to my break. Oh well, thanks for letting me know.\"";
+ goto L_close;
+
+L_Orders_Received:
+ mes "[Nickos]";
+ mes "\"Thanks for letting me know Lieutenant Dausen wants me to stick it out for a while longer. Even though I would've liked my break, I'm sure these miners could use my watchful eye.\"";
+ goto L_close;
+
+L_Mine:
+ mes "[Nickos]";
+ mes "\"I haven't heard from the miners in a while, but I've got to keep to my post unless there is due reason to investigate. Normally the miners take care of themselves without any problem.\"";
+ next;
+ mes "[Nickos]";
+ mes "\"Could you check on them for me, though?\"";
+ menu
+ "Yes.", L_Mine_Open,
+ "No.", L_Disappoint;
+
+L_Disappoint:
+ mes "Nickos looks disappointed.";
+ goto L_close;
+
+L_Mine_Open:
+ QL_MINEALL = 8;
+ mes "[Nickos]";
+ mes "\"Excellent! You now have my permission to enter the mine. Your assistance helps ease my worries.\"";
+ goto L_close;
+
+L_Waits:
+ mes "[Nickos]";
+ mes "\"Please be sure to get word from Nathan and Naem to make sure everthing is okay down there. Your assistance helps ease my worries.\"";
+ goto L_close;
+
+L_Check_Happy:
+ QL_MINEALL = 11;
+ Zeny = Zeny + 500;
+ mes "[Nickos]";
+ mes "\"Oh, everything is okay? That's great! I think they are pretty busy and could use some help. Feel free to give them a hand. Here's some gold for your troubles.\"";
+ goto L_close;
+
+L_Guards:
+ mes "[Nickos]";
+ mes "\"I'm watching this mine to make sure the monsters don't harm the miners.\"";
+ next;
+ mes "\"Talk to Nathan the miner, I'm sure the miners could use some help down there.\"";
+ goto L_close;
+
+L_AS_Start:
+ QL_MINEALL = 19;
+ mes "[Nickos]";
+ mes "\"Oh, the angry scorpions are becoming a problem? We could thin down their numbers a bit. I can make it worth your time, but of course, I'll need something to show your work. Bring me 10 Angry Scorpion Stingers to demonstrate your effectiveness, and you will be rewarded for your efforts.\"";
+ goto L_close;
+
+L_AS_Done:
+ if (countitem ("AngryScorpionStinger") < 10)
+ goto L_AS_NotDone;
+ getinventorylist;
+ if (@inventorylist_count - (countitem("AngryScorpionStinger") == 10) > 99)
+ goto L_TooMany;
+ QL_MINEALL = 20;
+ delitem "AngryScorpionStinger", 10;
+ getitem "LeatherShield", 1;
+ mes "[Nickos]";
+ mes "\"Ah, you are a fine combatant! Take this Leather Shield, it might be useful for your future battles.\"";
+ next;
+ mes "\"You might be ready to take on the underground palace. If you are interested, go talk to Naem about unlocking the barrier, he's got the key and the code to open it.\"";
+ goto L_close;
+
+L_AS_NotDone:
+ mes "[Nickos]";
+ mes "\"Bring me 10 Angry Scorpion Stingers and I'll know their numbers are down. You will be rewarded for your efforts.\"";
+ goto L_close;
+
+L_TooMany:
+ mes "[Nickos]";
+ mes "\"Oh, it seems you have too many items. Please get rid some some and I'll give you a reward.\"";
+ goto L_close;
+
+L_UGQ:
+ mes "[Nickos]";
+ mes "\"You might be ready to take on the underground palace. If you are interested, talk to the miners about unlocking the barrier, they've got the key to open it.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/002-1/nomads.txt b/npc/002-1/nomads.txt
new file mode 100644
index 00000000..78b25708
--- /dev/null
+++ b/npc/002-1/nomads.txt
@@ -0,0 +1,13 @@
+
+002-1,101,114,0 script Samuel NPC132,{
+ mes "[Samuel the Nomad]";
+ mes "\"This is really a nice place.\"";
+ mes "Don't you think so?\"";
+ close;
+}
+
+002-1,105,114,0 script Elijah NPC128,{
+ mes "[Elijah the Nomad]";
+ mes "\"It's nice to find a respite like this...\"";
+ close;
+}
diff --git a/npc/002-1/npcs.txt b/npc/002-1/npcs.txt
new file mode 100644
index 00000000..72340405
--- /dev/null
+++ b/npc/002-1/npcs.txt
@@ -0,0 +1,22 @@
+002-1,96,23,0 script Jeric NPC214,{
+ @npcname$ = "Jeric";
+
+ mes "[" + @npcname$ + "]";
+ mes "\"My father is an adventurer.\"";
+ next;
+ mes "\"After he proved himself around town, the guards let him fight monsters in the Sandstorm mine.\"";
+ @npcname$ = "";
+ close;
+}
+002-1,112,48,0 script Silvia NPC207,{
+ @npcname$ = "Silvia";
+
+ mes "[" + @npcname$ + "]";
+ mes "\"If you follow the road west, then north, you will arrive at the Bazaar in Northern Tulimshar.\"";
+ next;
+ mes "\"If you go west, then north, you'll see the Wizard Academy my parents just sent me to.\"";
+ next;
+ mes "\"The Academy is good, but I wish I had more free time. It takes a lot of intelligence to get what the teachers are talking about.\"";
+ @npcname$ = "";
+ close;
+}
diff --git a/npc/002-1/sarah.txt b/npc/002-1/sarah.txt
new file mode 100644
index 00000000..e703194f
--- /dev/null
+++ b/npc/002-1/sarah.txt
@@ -0,0 +1,75 @@
+002-1,93,43,0 script Sarah NPC106,{
+ if (QL_SARAH >= 2) goto L_Done;
+ if (QL_SARAH == 1) goto L_Progress;
+
+ mes "[Sarah]";
+ mes "\"Boy, am I hungry or what!\"";
+ next;
+
+ @temp = rand(2);
+ if(@temp == 1) goto L_Opening1;
+ goto L_Opening0;
+
+L_Opening0:
+ mes "\"Cherry Cake is the best!\"";
+ next;
+ goto L_Ask;
+
+L_Opening1:
+ mes "\"Mmm, Cherry Cake... I love it!\"";
+ next;
+ goto L_Ask;
+
+L_Ask:
+ mes "\"Can you bring me a piece of Cherry Cake? Pretty please?\"";
+ menu
+ "Yes.", L_Req0,
+ "No.", L_close;
+
+L_Req0:
+ mes "[Sarah]";
+ mes "\"Yippee! Bring me a piece of Cherry Cake, and I'll give you a nice hat!\"";
+ next;
+ QL_SARAH = 1;
+ mes "[Sarah]";
+ mes "\"Please bring it to me!\"";
+ goto L_close;
+
+L_Progress:
+ if (countitem("CherryCake") < 1)
+ goto L_NotEnough;
+ mes "[Sarah]";
+ mes "\"Whee!\"";
+ next;
+ mes "You brought me Cherry Cake! Here is your new hat, as promised.\"";
+ getinventorylist;
+ if ((@inventorylist_count - (countitem("CherryCake") == 1)) > 99) goto L_TooMany;
+ delitem "CherryCake", 1;
+ getitem "SerfHat", 1;
+ QL_SARAH = 2;
+ close2;
+ emotion EMOTE_TONGUE, strcharinfo(0);
+ end;
+
+L_NotEnough:
+ mes "[Sarah]";
+ mes "\"Oh, I'm starving! Please bring me Cherry Cake!\"";
+ goto L_close;
+
+L_Done:
+ mes "[Sarah]";
+ mes "\"It was so tasty, I can't eat anything more... Thank you!\"";
+ close2;
+ emotion EMOTE_TONGUE, strcharinfo(0);
+ end;
+
+L_close:
+ @temp = 0;
+ close;
+
+L_TooMany:
+ next;
+ mes "[Sarah]";
+ mes "\"You don't have room for my reward. I'll wait until you do.\"";
+ goto L_close;
+}
diff --git a/npc/002-1/soul-menhir.txt b/npc/002-1/soul-menhir.txt
new file mode 100644
index 00000000..5506a97f
--- /dev/null
+++ b/npc/002-1/soul-menhir.txt
@@ -0,0 +1,15 @@
+
+002-1,58,60,0 script Soul Menhir#tulimshar NPC345,{
+ @map$ = "001-1";
+ setarray @Xs, 57, 58, 59, 57, 59, 57, 59;
+ setarray @Ys, 59, 59, 59, 60, 60, 61, 61;
+ @x = 0;
+ @y = 0;
+ callfunc "SoulMenhir";
+ @map$ = "";
+ cleararray @Xs[0], 0, 7;
+ cleararray @Ys[0], 0, 7;
+ @x = 0;
+ @y = 0;
+ close;
+}
diff --git a/npc/002-1/stewen.txt b/npc/002-1/stewen.txt
new file mode 100644
index 00000000..b2d216f3
--- /dev/null
+++ b/npc/002-1/stewen.txt
@@ -0,0 +1,22 @@
+002-1,116,93,0 script Stewen NPC123,{
+ if (QL_MINEALL == 4) goto L_TMW_Quest_Received;
+ if (QL_MINEALL == 3) goto L_TMW_Quest;
+
+ mes "[Stewen]";
+ mes "\"I'm keeping a watchful eye on the monsters to the east so they don't threaten Tulimshar's citizens. They are pretty strong.\"";
+ goto L_close;
+
+L_TMW_Quest:
+ QL_MINEALL = 4;
+ mes "[Stewen]";
+ mes "\"I don't get a break?! Lieutenant Dausen needs to ask the Wizard's Council for more help out here. Either that or give me a raise! Oh well. Thanks for letting me know.\"";
+ goto L_close;
+
+L_TMW_Quest_Received:
+ mes "[Stewen]";
+ mes "\"Thanks again for letting me know Lieutenant Dausen isn't letting me take a break. Once I get out of here, I'll let him know I want a raise!\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/002-1/traveler.txt b/npc/002-1/traveler.txt
new file mode 100644
index 00000000..61226caa
--- /dev/null
+++ b/npc/002-1/traveler.txt
@@ -0,0 +1,7 @@
+
+002-1,60,41,0 script Nina the Traveler NPC103,{
+ @npcname$ = "Nina";
+ @NpcTravelBit = $@tulimshar_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/002-2/_import.txt b/npc/002-2/_import.txt
new file mode 100644
index 00000000..b7dc062e
--- /dev/null
+++ b/npc/002-2/_import.txt
@@ -0,0 +1,21 @@
+// Map 002-2: Sandstorm Desert Indoors
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/002-2/_warps.txt",
+"npc/002-2/bakery.txt",
+"npc/002-2/barber.txt",
+"npc/002-2/bleacher.txt",
+"npc/002-2/casino.txt",
+"npc/002-2/dedication.txt",
+"npc/002-2/hetchel.txt",
+"npc/002-2/imec.txt",
+"npc/002-2/inya.txt",
+"npc/002-2/kps.txt",
+"npc/002-2/kylian.txt",
+"npc/002-2/latoy.txt",
+"npc/002-2/mapflags.txt",
+"npc/002-2/omar.txt",
+"npc/002-2/phaet.txt",
+"npc/002-2/rebecca.txt",
+"npc/002-2/shops.txt",
+"npc/002-2/stranger.txt",
+"npc/002-2/troupe_leader.txt",
diff --git a/npc/002-2/_warps.txt b/npc/002-2/_warps.txt
new file mode 100644
index 00000000..984973cf
--- /dev/null
+++ b/npc/002-2/_warps.txt
@@ -0,0 +1,19 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 002-2: Sandstorm Desert Indoors warps
+002-2,44,34,0 warp #002-2_44_34 0,0,002-1,73,36
+002-2,44,20,0 warp #002-2_44_20 1,0,002-2,45,78
+002-2,46,79,0 warp #002-2_46_79 1,0,002-2,43,21
+002-2,46,55,0 warp #002-2_46_55 1,0,002-2,44,109
+002-2,45,110,0 warp #002-2_45_110 1,0,002-2,45,56
+002-2,23,110,0 warp #002-2_23_110 0,0,002-1,67,30
+002-2,34,20,0 warp #002-2_34_20 0,0,002-2,79,69
+002-2,37,20,0 warp #002-2_37_20 0,0,002-2,72,31
+002-2,72,32,0 warp #002-2_72_32 0,0,002-2,37,21
+002-2,79,70,0 warp #002-2_79_70 0,0,002-2,34,21
+002-2,75,101,0 warp #002-2_75_101 0,0,002-1,109,46
+002-2,83,101,0 warp #002-2_83_101 0,0,002-1,115,46
+002-2,78,132,0 warp #002-2_78_132 0,0,002-1,114,36
+002-2,68,121,0 warp #002-2_68_121 0,0,002-1,110,28
+002-2,120,67,0 warp #002-2_120_67 0,0,002-1,99,44
+002-2,120,95,0 warp #002-2_120_95 0,0,002-1,57,36
+002-2,119,132,0 warp #002-2_119_132 0,0,002-1,57,27
diff --git a/npc/002-2/bakery.txt b/npc/002-2/bakery.txt
new file mode 100644
index 00000000..74c5663f
--- /dev/null
+++ b/npc/002-2/bakery.txt
@@ -0,0 +1,166 @@
+
+002-2,21,22,0 script Riskim NPC148,{
+ mes "[Riskim]";
+ mes "";
+ mes "\"Welcome to our bakery!\"";
+
+ callfunc "KadiyaSubquestConsts";
+ if ((@Q_kadiya_status == @Q_STATUS_WANTS_CHOCOCAKE)
+ && (countitem ("MopoxCurePotion") > 0))
+ goto L_lace_chococake;
+
+ if ((@Q_kadiya_status == @Q_STATUS_WANTS_ORANGECUPCAKE)
+ && (countitem ("MopoxCurePotion") > 0))
+ goto L_lace_cupcake;
+
+ mes "\"Would you mind bringing me ##B6 acorns##b please? I need them to make flour so I can bake some chocolate cakes. I will be so delicious!\"";
+ next;
+ mes "\"Uh... I mean... the cakes will be delicious...\" %%;";
+ next;
+
+ @dq_level = 15;
+ @dq_cost = 3;
+ @dq_count = 6;
+ @dq_name$ = "Acorn";
+ @dq_friendly_name$ = "acorns";
+ @dq_money = 250;
+ @dq_exp = 50;
+
+ callfunc "DailyQuest";
+
+ next;
+ mes "\"Don't forget: our bakery is the best!\"";
+ close;
+
+L_lace_chococake:
+ next;
+ menu
+ "Thanks! Let me have a look around...", L_End,
+ "Can you put this potion into a Chocolate Cake?", L_Next,
+ "Goodbye!", L_End;
+
+L_Next:
+ mes "[Riskim]";
+ mes "";
+ mes "You take the potion out and attempt to show it to Riskim, but he takes a step back.";
+ mes "\"Oh! I remember that smell...\"";
+ mes "\"Elanore's Mopox potion, right? She made me drink that too...\"";
+ mes "He chuckles.";
+ mes "\"Yes. Well, you definitely want to hide that somehow.\"";
+ next;
+ mes "[Riskim]";
+ mes "";
+ mes "\"We'll need extra chocolate for that one. If you can give me ten pieces of chocolate, the Mopox potion, and a payment of 400 GP, I'll bake you a special Chocolate Cake that hides the taste.\"";
+ next;
+ menu
+ "I will get them for you.", L_End,
+ "Here you are!", L_Continue,
+ "Maybe later.", L_End;
+
+L_Continue:
+ if (countitem("ChocolateBar") < 10)
+ goto L_lacking_ingredients;
+ if (countitem("MopoxCurePotion") < 1)
+ goto L_lacking_ingredients;
+ if (Zeny < 400)
+ goto L_lacking_Zeny;
+ delitem "MopoxCurePotion", 1;
+ delitem "ChocolateBar", 10;
+ getitem "LacedChocolateCake", 1;
+ Zeny = Zeny - 400;
+
+ mes "[Riskim]";
+ mes "";
+ mes "\"Please have a seat!\"";
+ mes "You watch as Riskim melts the chocolate, stirs in the potion, and then glazes a cake with the mixture.";
+ mes "\"It's a bit more chocolaty than your average chocolate cake, so it should help mask that awful taste.\"";
+ next;
+ mes "[Riskim]";
+ mes "";
+ mes "Riskim hands you the cake.";
+ mes "\"Here you are! I hope this helps.\"";
+ close;
+
+L_lacking_Zeny:
+ mes "[Riskim]";
+ mes "";
+ mes "\"I'm sorry, but I have to charge 400 GP. I've got to make a living somehow.\"";
+ close;
+
+L_lacking_ingredients:
+ mes "[Riskim]";
+ mes "";
+ mes "\"Sorry, but I need both the ten Chocolate Bars and your potion for this. Please come back later when you have everything.\"";
+ close;
+
+L_lace_cupcake:
+ next;
+ menu
+ "Thanks! Let me have a look around...", L_End,
+ "Can mix a potion into an Orange Cupcake?", L_More,
+ "Goodbye!", L_End;
+
+L_More:
+ mes "[Riskim]";
+ mes "";
+ mes "\"Orange Cupcakes? Oh dear... I'm sorry, but I have a very bad allergy to oranges.\"";
+ next;
+ mes "[Riskim]";
+ mes "";
+ mes "\"Perhaps the Chef at Dimond's Cove can help you. We get all of our cupcakes from him.\"";
+ next;
+ goto L_End;
+
+L_End:
+ close;
+}
+
+002-2,28,31,0 script Sara NPC108,{
+ mes "[Sara]";
+ mes "";
+ mes "\"Hello!\"";
+ mes "\"If you'd like to buy something, just ask Drabur.\"";
+ mes "\"If you need something made-to-order, talk to Riskim.\"";
+ close;
+}
+
+002-2,25,22,0 script Drabur NPC112,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem WhiteCake;
+ sellitem ChocolateCake;
+ sellitem OrangeCake;
+ sellitem AppleCake;
+ sellitem Cake;
+ sellitem CherryCake;
+ sellitem OrangeCupcake;
+ sellitem Milk;
+ sellitem XmasCake;
+ .distance = 5;
+ end;
+}
+
+002-2,21,28,0 script Iormo NPC160,{
+ mes "[Iormo]";
+ mes "";
+ mes "\"The cake sure is good, but this room can get messy with all the flour.\"";
+ close;
+}
+
+002-2,24,27,0 script Rynoh NPC159,{
+ mes "[Rynoh]";
+ mes "";
+ mes "\"The cakes may be expensive, but they sure are delicious!\"";
+ close;
+}
+
+002-2,26,27,0 script Ontas NPC154,{
+ mes "[Ontas]";
+ mes "";
+ mes "\"We come here almost every week! This place has some of the best bread I've ever eaten!\"";
+ close;
+}
diff --git a/npc/002-2/barber.txt b/npc/002-2/barber.txt
new file mode 100644
index 00000000..5b880e4b
--- /dev/null
+++ b/npc/002-2/barber.txt
@@ -0,0 +1,10 @@
+002-2,22,77,0 script Issay NPC156,{
+ mes "[Issay the Barber]";
+ mes "\"Want to change your hairstyle?\"";
+ next;
+ callfunc "Barber";
+ mes "[Issay the Barber]";
+ mes "\"Come again!\"";
+ close;
+}
+
diff --git a/npc/002-2/bleacher.txt b/npc/002-2/bleacher.txt
new file mode 100644
index 00000000..daea556d
--- /dev/null
+++ b/npc/002-2/bleacher.txt
@@ -0,0 +1,130 @@
+
+002-2,72,92,0 script Candide NPC156,{
+ mes "[Candide]";
+ mes "\"Greetings! I am Candide the Bleacher.";
+ mes "Tulimshar is my homeland, where I learned the ancient art of bleaching.\"";
+ next;
+ mes "\"Bleaching was originally done by the sun, but now we use ash combined with special ingredients to remove color from fabric.\"";
+ next;
+ menu
+ "What is needed for the bleaching process?", L_Materials,
+ "I'd like to bleach something.", L_bleach_menu,
+ "So long.", L_close;
+
+L_Materials:
+ mes "[Candide]";
+ mes "\"For each item, I will need 3 piles of ash and 5,000 GP for the special ingredients.\"";
+ next;
+ menu
+ "I'd like to bleach something.", L_bleach_menu,
+ "So long.", L_close;
+
+L_bleach_menu:
+ if (countitem("PileOfAsh") < 3) goto L_No_Ash;
+ if (Zeny < 5000) goto L_No_Money;
+ cleararray @CANDIDE_items,0,getarraysize(@CANDIDE_items);
+ cleararray @CANDIDE_color,0,getarraysize(@CANDIDE_color);
+ cleararray @CANDIDE_menu$,"",getarraysize(@CANDIDE_menu$);
+ @w = 0;
+ freeloop 1; // do not check for infinity loop
+ callsub S_LoopArray;
+ freeloop 0; // re-enable infinity loop check
+ @w = 0;
+ @c = 0;
+ @p = 0;
+ if(@CANDIDE_menu$[0] == "") goto L_Nothing;
+ mes "[Candide]";
+ mes "\"Yes?\"";
+ next;
+ menu
+ "Nevermind.", L_close,
+ @CANDIDE_menu$[0], L_MenuItems, // base array was too big for a dynamic menu so we can't use it
+ @CANDIDE_menu$[1], L_MenuItems,
+ @CANDIDE_menu$[2], L_MenuItems,
+ @CANDIDE_menu$[3], L_MenuItems,
+ @CANDIDE_menu$[4], L_MenuItems,
+ @CANDIDE_menu$[5], L_MenuItems,
+ @CANDIDE_menu$[6], L_MenuItems,
+ @CANDIDE_menu$[7], L_MenuItems,
+ @CANDIDE_menu$[8], L_MenuItems,
+ @CANDIDE_menu$[9], L_MenuItems,
+ @CANDIDE_menu$[10], L_MenuItems,
+ @CANDIDE_menu$[11], L_MenuItems,
+ @CANDIDE_menu$[12], L_MenuItems,
+ @CANDIDE_menu$[13], L_MenuItems,
+ @CANDIDE_menu$[14], L_MenuItems,
+ @CANDIDE_menu$[15], L_MenuItems,
+ @CANDIDE_menu$[16], L_MenuItems,
+ @CANDIDE_menu$[17], L_MenuItems;
+
+S_LoopArray:
+ @c = 0;
+ callsub S_LoopColor;
+ @w = @w + 1;
+ if(@w < getarraysize($@DYE_items$)) goto S_LoopArray;
+ return;
+
+S_LoopColor:
+ if(countitem($@DYE_colors$[@c] + $@DYE_items$[@w]) > 0)
+ goto L_AddToMenu;
+ goto L_LoopColor2;
+
+L_AddToMenu:
+ @CANDIDE_items[@p] = @w;
+ @CANDIDE_color[@p] = @c;
+ @CANDIDE_menu$[@p] = $@DYE_color_names$[@c]+" "+$@DYE_item_names$[@w];
+ @p = @p + 1;
+ goto L_LoopColor2;
+
+L_LoopColor2:
+ @c = @c + 1;
+ if(@c < getarraysize($@DYE_colors$)) goto S_LoopColor;
+ return;
+
+L_Nothing:
+ mes "[Candide]";
+ mes "\"Sorry, you have nothing to bleach.\"";
+ next;
+ goto L_close;
+
+L_MenuItems:
+ if (countitem("PileOfAsh") < 3) goto L_No_Ash;
+ if (Zeny < 5000) goto L_No_Money;
+ @m = @menu - 2;
+ @it$ = $@DYE_colors$[@CANDIDE_color[@m]] + $@DYE_items$[@CANDIDE_items[@m]];
+ if(getitemlink(@it$) == "Unknown Item") mapexit;
+ delitem @it$, 1;
+ delitem "PileOfAsh", 3;
+ Zeny = Zeny - 5000;
+ getitem $@DYE_items$[@CANDIDE_items[@m]], 1;
+ goto L_Again;
+
+L_Again:
+ mes "[Candide]";
+ mes "\"Would you like to bleach something else?\"";
+ next;
+ menu
+ "Yes.", L_bleach_menu,
+ "No.", L_close;
+
+L_No_Ash:
+ mes "[Candide]";
+ mes "\"You don't have enough ash for me to bleach anything.";
+ mes "I need three piles.\"";
+ next;
+ goto L_close;
+
+L_No_Money:
+ mes "[Candide]";
+ mes "\"You don't have enough gold for me to bleach anything.";
+ mes "I need 5,000 GP for supplies.\"";
+ next;
+ goto L_close;
+
+L_close:
+ mes "[Candide]";
+ mes "\"Come again.\"";
+ close2;
+ emotion EMOTE_GRIN, strcharinfo(0);
+ end;
+}
diff --git a/npc/002-2/casino.txt b/npc/002-2/casino.txt
new file mode 100644
index 00000000..5f123962
--- /dev/null
+++ b/npc/002-2/casino.txt
@@ -0,0 +1,195 @@
+002-2,79,68,0 script #CasinoEntrance NPC32767,13,0,{
+ QUEST_NorthTulimshar = QUEST_NorthTulimshar | $@knowCasinoNT;
+ if (QL_KYLIAN != 6)
+ goto L_End;
+ message strcharinfo(0), "You wonder if Kylian would be interested in visiting the Casino.";
+ goto L_End;
+
+L_End:
+ end;
+}
+
+002-2,86,29,0 script Valdo NPC117,{
+ mes "[Valdo the Worker]";
+ mes "\"Please let me work. I've got a lot to do and not enough time to do it!\"";
+ close;
+}
+
+002-2,84,62,0 script Slots#1 NPC400,{
+ callfunc "SlotMachine";
+ close;
+}
+
+002-2,86,62,0 script Slots#2 NPC400,{
+ callfunc "SlotMachine";
+ close;
+}
+
+002-2,88,62,0 script Slots#3 NPC400,{
+ callfunc "SlotMachine";
+ close;
+}
+
+002-2,78,56,0 shop MoneyChanger NPC124,503:10
+
+002-2,75,60,0 script BlackJack NPC107,{
+ mes "[Croupier]";
+ mes "\"Would you like to play Black Jack?";
+ mes "You will need 15 casino coins.\"";
+ next;
+ menu
+ "Sure.", L_Begin,
+ "Not now.", L_close;
+
+L_Begin:
+ if(countitem("CasinoCoins") < 15) goto L_NoCoin;
+ delitem "CasinoCoins", 15;
+ @croupier = rand(0, 4);
+ @croupier = @croupier + 17;
+ @player = rand(4, 21);
+ mes "Your cards are worth " + @player + " points.";
+ if(@player == 21) goto L_End;
+ mes "Do you want another card?\"";
+ menu
+ "Yes.", L_Another,
+ "No.", L_End;
+
+L_Another:
+ @tempace = rand(2, 11);
+ if (@tempace == 11) goto L_Ace;
+ @player = @player + @tempace;
+ if (@player > 21) goto L_Lost;
+ if (@player == 21) goto L_End;
+ mes "Your cards are worth " + @player + " points.";
+ mes "Do you want another card?\"";
+ menu
+ "Yes.", L_Another,
+ "No.", L_End;
+
+L_End:
+ if (@player <= @croupier) goto L_Lost;
+ mes "Your cards are worth " + @player + " points.";
+ mes "\"I have " + @croupier + " points.";
+ mes "Congratulations! You won!";
+ mes "You get 45 casino coins!\"";
+ getitem "CasinoCoins", 45;
+ goto L_close;
+
+L_NoCoin:
+ mes "\"Sorry, but you need at least 15 coins to play.\"";
+ goto L_close;
+
+L_Lost:
+ mes "\"I'm sorry, but you lost.";
+ mes "Your cards are worth " + @player + " points.";
+ mes "I have " + @croupier + " points.\"";
+ goto L_close;
+
+L_Ace:
+ @player = @player + 11;
+ if (@player > 21) set @player, @player - 10;
+ if (@player > 21) goto L_Lost;
+ if (@player == 21) goto L_End;
+ mes "Your cards are worth " + @player + " points.";
+ mes "Do you want to take another card?";
+ menu
+ "Yes", L_Another,
+ "No", L_End;
+
+L_close:
+ mes "\"Be sure to come back again.\"";
+ @croupier = 0;
+ @player = 0;
+ @tempace = 0;
+ close;
+}
+
+002-2,69,67,0 script Roulette NPC107,{
+ mes "[Croupier]";
+ mes "\"Good evening monsieur...";
+ mes "How much would you like to bet?\"";
+ next;
+ menu
+ "1 coin", L_b1,
+ "5 coins", L_b5,
+ "10 coins", L_b10,
+ "50 coins", L_b50,
+ "100 coins", L_b100,
+ "Maybe I'll play later.", L_close;
+
+L_b1:
+ @bet = 1;
+ goto L_Check;
+
+L_b5:
+ @bet = 5;
+ goto L_Check;
+
+L_b10:
+ @bet = 10;
+ goto L_Check;
+
+L_b50:
+ @bet = 50;
+ goto L_Check;
+
+L_b100:
+ @bet = 100;
+ goto L_Check;
+
+L_Check:
+ if(countitem("CasinoCoins") < @bet) goto L_NoCoin;
+ menu
+ "Choose a color...", L_PickColor,
+ "Choose a number...", L_Number;
+
+L_PickColor:
+ menu
+ "Black.", L_Color,
+ "Red.", L_Color;
+
+L_Color:
+ delitem "CasinoCoins", @bet;
+ @color = rand(2);
+ if(@color == 1) goto L_Lost;
+ mes "You won!";
+ getitem "CasinoCoins", @bet * 2;
+ goto L_close;
+
+L_Number:
+ menu
+ "0", L_MenuItems, "00", L_MenuItems, "1", L_MenuItems, "2", L_MenuItems, "3", L_MenuItems, "4", L_MenuItems, "5", L_MenuItems, "6", L_MenuItems, "7", L_MenuItems, "8", L_MenuItems,
+ "9", L_MenuItems, "10", L_MenuItems, "11", L_MenuItems, "12", L_MenuItems, "13", L_MenuItems, "14", L_MenuItems, "15", L_MenuItems, "16", L_MenuItems, "17", L_MenuItems, "18", L_MenuItems,
+ "19", L_MenuItems, "20", L_MenuItems, "21", L_MenuItems, "22", L_MenuItems, "23", L_MenuItems, "24", L_MenuItems, "25", L_MenuItems, "26", L_MenuItems, "27", L_MenuItems, "28", L_MenuItems,
+ "29", L_MenuItems, "30", L_MenuItems, "31", L_MenuItems, "32", L_MenuItems, "33", L_MenuItems, "34", L_MenuItems, "35", L_MenuItems, "36", L_MenuItems;
+
+L_MenuItems:
+ delitem "CasinoCoins", @bet;
+ if (@menu == 1) set @number, 0;
+ if (@menu == 2) set @number, 37;
+ if (@menu >= 3) set @number, @menu - 2;
+
+ @roulette = rand(38);
+ if (@roulette == 37) mes "The ball stopped on 00.";
+ if (@roulette < 37) mes "The ball stopped on " + @roulette + ".";
+ if (@number != @roulette) goto L_Lost;
+ mes "\"You won!\"";
+ getitem "CasinoCoins", @bet * 10;
+ goto L_close;
+
+L_NoCoin:
+ mes "\"You don't have enough coins to play.\"";
+ goto L_close;
+
+L_Lost:
+ mes "\"I'm sorry, but you lost.\"";
+ goto L_close;
+
+L_close:
+ mes "Come again!";
+ @number = 0;
+ @roulette = 0;
+ @color = 0;
+ @bet = 50;
+ close;
+}
diff --git a/npc/002-2/dedication.txt b/npc/002-2/dedication.txt
new file mode 100644
index 00000000..31978298
--- /dev/null
+++ b/npc/002-2/dedication.txt
@@ -0,0 +1,8 @@
+
+002-2,116,123,0 script #IreneDedication NPC400,{
+ mes "~ Irene Christina ~";
+ mes "The song in this house is dedicated to Irene.";
+ next;
+ mes "She had seen only twenty hours of this world when she died in her father's arms.";
+ close;
+}
diff --git a/npc/002-2/hetchel.txt b/npc/002-2/hetchel.txt
new file mode 100644
index 00000000..82e8f02d
--- /dev/null
+++ b/npc/002-2/hetchel.txt
@@ -0,0 +1,417 @@
+
+002-2,76,92,0 script Hetchel NPC376,{
+ @wg_state = ((QUEST_WG_state & BYTE_0_MASK) >> BYTE_0_SHIFT);
+ @spants_state = ((QUEST_WG_state & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT);
+ @SHEET_COCOONS_NR = 25;
+ @SHEET_ZENY = 500;
+ @spants_minlvl = 45;
+ setarray @spants_req_hmn$, "Silk Cocoons", "Pieces of Cotton Cloth", "Silk Headbands";
+ setarray @spants_req$, "SilkCocoon", "CottonCloth", "SilkHeadband";
+ setarray @spants_req_amt, 154, 14, 2;
+ @spants_reward = 45000;
+ @spants_job_reward = 10000;
+ @SheetCount = 0;
+
+ if (@wg_state < 11)
+ goto L_WG_quest_not_done;
+ if ( BaseLevel > @spants_minlvl && @spants_state < 1 ) goto L_Spants_Cry;
+ if ( @spants_state == 1 ) goto L_Spants_Cry_2;
+ if ( @spants_state == 2 ) goto L_Spants_Start;
+ if ( @spants_state > 2 && @spants_state < 8 ) goto L_Spants_Steal;
+ if ( @spants_state == 8 ) goto L_Spants_Make;
+
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_Main_menu;
+
+L_WG_quest_not_done:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles.";
+ mes "My best client is Lora Tay, at Dimond's.";
+ mes "What can I do for you?\"";
+ menu
+ "Sorry to bother, I'm new to this country, just visting.", L_close,
+ "What are you selling?", L_Main_menu;
+
+L_Spants_Cry:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_Spants_Cry_Cont_1;
+
+L_Spants_Cry_2:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_Main_menu,
+ "Hey you have been crying so badly, can I help you somehow?", L_Spants_Reply_Cry,
+ "Give Hetchel something to dry her tears", L_Spants_Tears;
+
+L_Spants_Start:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_Main_menu,
+ "So you are looking for new goals in your life?", L_Spants_No_Cry;
+
+L_Spants_Steal:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_Main_menu,
+ "About the Pants...", L_Spants_Steal_Cont;
+
+L_Spants_Make:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\"";
+ menu
+ "Sorry to bother, I'm just visiting.", L_close,
+ "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", L_Main_menu,
+ "Hey what about the Pants you were planning to make?", L_Spants_Make_Cont;
+
+L_Spants_Cry_Cont_1:
+ mes "You notice how the tiny woman blushes, she suddenly bursts into tears.";
+ next;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Hello\"";
+ mes "Hetchel hides her face in her hands";
+ mes "";
+ mes "";
+ menu
+ "\"Hey, what is the problem?\"", L_Spants_Reply_Cry,
+ "Give Hetchel something to dry her tears", L_Spants_Tears,
+ "\"Oh really? Just sell me some Silk Sheets if you have them\"", L_Main_menu;
+
+L_Spants_Tears:
+ mes "Choose the item you want to give her.";
+ next;
+ cleararray @items$, "", getarraysize(@items$);
+ cleararray @item_names$, "", getarraysize(@item_names$);
+ setarray @items$, "RedCottonCloth", "GreenCottonCloth", "DarkBlueCottonCloth", "YellowCottonCloth", "LightBlueCottonCloth", "PinkCottonCloth", "BlackCottonCloth", "OrangeCottonCloth", "PurpleCottonCloth", "DarkGreenCottonCloth", "HitchhikersTowel", "WhiteHitchhikersTowel", "RedHitchhikersTowel", "GreenHitchhikersTowel", "BlueHitchhikersTowel", "YellowHitchhikersTowel", "PurpleHitchhikersTowel", "OrangeHitchhikersTowel", "PinkHitchhikersTowel", "TealHitchhikersTowel", "LimeHitchhikersTowel", "SnakeSkin", "LeatherPatch", "SnakeTongue", "MountainSnakeTongue", "GrassSnakeTongue", "CaveSnakeTongue", "BatWing", "RottenRags", "BrokenDoll", "RedDottedWrap", "BlueDottedWrap", "PurpleStripedWrap", "RedGoldenStripedWrap", "GreenRedStripedWrap", "YellowWrap", "WhiteWrap", "BlueWrap", "PurpleWrap", "GreenWrap", "Doll", "BookPage";
+ setarray @item_names$, "Red Cotton Cloth", "Green Cotton Cloth", "Dark Blue Cotton Cloth", "Yellow Cotton Cloth", "Light Blue Cotton Cloth", "Pink Cotton Cloth", "Black Cotton Cloth", "Orange Cotton Cloth", "Purple Cotton Cloth", "Dark Green Cotton Cloth", "Hitchhiker's Towel", "White Hitchhiker's Towel", "Red Hitchhiker's Towel", "Green Hitchhiker's Towel", "Blue Hitchhiker's Towel", "Yellow Hitchhiker's Towel", "Purple Hitchhiker's Towel", "Orange Hitchhiker's Towel", "Pink Hitchhiker's Towel", "Teal Hitchhiker's Towel", "Lime Hitchhiker's Towel", "Snake Skin", "Leather Patch", "Snake Tongue", "Mountain Snake Tongue", "Grass Snake Tongue", "Cave Snake Tongue", "Bat Wing", "Rotten Rags", "Broken Doll", "Red Dotted Wrap", "Blue Dotted Wrap", "Purple Striped Wrap", "Red Golden Striped Wrap", "Green Red Striped Wrap", "Yellow Wrap", "White Wrap", "Blue Wrap", "Purple Wrap", "Green Wrap", "Doll", "Book Page";
+ callfunc "DynamicItemMenu$";
+ @spants_wipe_thingy$ = @item$;
+ if (@spants_wipe_thingy$ == "") goto L_close;
+ if (countitem(@spants_wipe_thingy$) < 1) goto L_Spants_No_Item;
+ if (@spants_wipe_thingy$ == "RedCottonCloth") goto L_Spants_Tears_Cont;
+ if (@spants_wipe_thingy$ == "RedHitchhikersTowel") goto L_Spants_Tears_Towel;
+ mes "Hetchel looks at you, then looks at the" + @spants_wipe_thingy$ + ".";
+ mes "She hangs her head and weeps more";
+ mes "Red is the only color I have ever loved, bring me something red to dry my tears";
+ goto L_close;
+
+L_Spants_Tears_Towel:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"No, I recognize this towel, it is one of those warping towels, are you trying to mess with me?\"";
+ goto L_close;
+
+L_Spants_No_Item:
+ mes "Oh you do not have it.";
+ goto L_close;
+
+L_Spants_Tears_Cont:
+ mes "Hetchel dries her tears with the Red Piece of Cloth you gave her.";
+ mes "This seems to have consoled her.";
+ delitem "RedCottonCloth", 1;
+ @spants_state = 2;
+ callsub S_Update_Spants;
+ goto L_Spants_No_Cry;
+
+L_Spants_No_Cry:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Oh thank you my dear friend.";
+ mes "Yes, to some extent.";
+ next;
+ mes "I am just so sad because I realized that this is going to be the thing I will be doing for the rest of my life\"";
+ menu
+ "\"You are still young, Hetchel, You can still accomplish things\"", L_Spants_Cry_Cont_2,
+ "\"Yes, you are probably correct.\"", L_close;
+
+L_Spants_Cry_Cont_2:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "Hetchel thinks for a while";
+ mes "";
+ mes "\"Oh my friend, I have been dreaming of making a garment of my own.";
+ mes "It always bothered me to see all those wizards and witches here being naked under their cloaks\"";
+ mes "\"They must be so embarrassed - they are true heroes to give up their dignity to be able to fight the perils of this world\"";
+ mes "Hetchel sobs";
+ menu
+ "\"So you want to make pants for mages?\"", L_Spants_Cry_Cont_3,
+ "\"This sounds ridiculous. Good Bye.\"", L_close;
+
+L_Spants_Cry_Cont_3:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Ok, so I figured I could make some trousers like Lora Tay makes but from the much finer Material the Silk Worms are making for us\"";
+ mes "\"But I really need the base plans for the trousers, otherwise I do not know how to attempt this.";
+ mes "Can you get me those plans from her?\"";
+ menu
+ "\"No, sorry I am too busy for that\"", L_close,
+ "\"Of course!\"", L_Spants_Cry_Cont_4;
+
+L_Spants_Cry_Cont_4:
+ @spants_state = 3;
+ callsub S_Update_Spants;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Oh wait! I am not sure if it is such a good idea to ask her about that, I think she would not give the plans to you anyway.";
+ mes "Maybe you can find a way to get those plans on a different way?";
+ mes "I think there are some people in Hurnscald who have their means of getting you every possible item there is\"";
+ next;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "Please please please - I need those plans";
+ goto L_close;
+
+L_Spants_Reply_Cry:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"...\"";
+ @spants_state = 1;
+ callsub S_Update_Spants;
+ goto L_close;
+
+
+L_Spants_Steal_Cont:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Have you gotten hold of the plans?\"";
+ menu
+ "Yes I have them somewhere here", L_Spants_Steal_Cont2,
+ "No, not yet", L_close;
+
+L_Spants_Steal_Cont2:
+ if(@spants_state < 7) goto L_Spants_No_Item;
+ @spants_state = 8;
+ callsub S_Update_Spants;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Oh this is miraculous\"";
+ mes "";
+ mes "Hetchel sheds some tears of joy";
+ next;
+ mes "You hand her the crumpled plans Crastur the Ugly gave you.";
+ next;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"I need to figure out how to do this now... \"";
+ next;
+ mes "Hetchel adjusts her glasses and reads carefully";
+ next;
+ mes "She seems to be very busy, maybe you should come back later.";
+ goto L_close;
+
+L_Spants_Make_Cont:
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Yes, I already made a prototype but it cost me a lot of time and effort.";
+ mes "I can give it to you if you are willing to pay for my expenses though.\"";
+ menu
+ "What do you want for those silken pants?", L_Spants_Make_Cont_2,
+ "No, I am not particularly interested.", L_close;
+
+L_Spants_Make_Cont_2:
+ if(getarraysize(@spants_req_amt) < 3 || getarraysize(@spants_req$) < 3 || getarraysize(@spants_req_hmn$) < 3)
+ goto L_Spants_Error;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"I need you to bring me " + @spants_req_amt[0] +" "+ @spants_req_hmn$[0] + ", " + @spants_req_amt[1] +" "+ @spants_req_hmn$[1] + " and " + @spants_req_amt[2] +" "+ @spants_req_hmn$[2];
+ next;
+ mes "You will not have to pay for my time, I am so proud to have accomplished this on my own!\"";
+ menu
+ "\"I have those items with me\"", L_Spants_Pay,
+ "\"I am still looking for them\"", L_close,
+ "\"What do you need again?\"", L_Spants_Make_Cont_2;
+
+L_Spants_Pay:
+ if (countitem(@spants_req$[0]) < @spants_req_amt[0] || countitem(@spants_req$[1]) < @spants_req_amt[1] || countitem(@spants_req$[2]) < @spants_req_amt[2])
+ goto L_Spants_No_Item;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_TooMany;
+ mes "Hetchel takes your items.";
+ delitem @spants_req$[0], @spants_req_amt[0];
+ delitem @spants_req$[1], @spants_req_amt[1];
+ delitem @spants_req$[2], @spants_req_amt[2];
+ getitem "SilkPants", 1;
+ @spants_state = 9;
+ callsub S_Update_Spants;
+ next;
+ mes "[Hetchel the weaver]";
+ mes "";
+ mes "\"Here are your pants my dear.";
+ mes "Keep them safe I do not know if I will ever try this again.\"";
+ getexp @spants_reward, @spants_job_reward;
+ goto L_close;
+
+L_Spants_Error:
+ mes "Something went wrong in the script, please inform a developer about that";
+ close;
+
+L_Main_menu:
+ mes "[Hetchel]";
+ mes "\"I have some silk sheets: double-elbow squares.\"";
+ menu
+ "I'm not interested at the moment, maybe later; thanks anyway.", L_close,
+ "Can I buy some?", L_Next;
+
+L_Next:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"Sure but you need to provide raw materials.";
+ mes "I'll need " + @SHEET_COCOONS_NR +" silk cocoons per sheet,";
+ mes "and also " + @SHEET_ZENY +" GP per sheet for my work.\"";
+ next;
+ if (countitem("SilkCocoon") == 0)
+ goto L_sheet_no_cocoon;
+ goto L_sheet_menu;
+
+L_sheet_menu:
+ menu
+ "I have what you asked for.", L_Next1,
+ "Sorry I didn't pay attention enough, what do you need?", L_how_many_cocoons,
+ "Oops! Sorry, I'll come back soon with them.", L_close;
+
+L_Next1:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"How many would you like?\"";
+ input @SheetCount;
+ if (@SheetCount == 0)
+ goto L_zero_sheet;
+ if (countitem("SilkCocoon") < @SheetCount * @SHEET_COCOONS_NR)
+ goto L_sheet_missing_cocoons;
+ if (Zeny < @SheetCount * @SHEET_ZENY)
+ goto L_sheet_missing_Zeny;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("SilkSheet") < 1 && countitem("SilkCocoon") > @SheetCount * @SHEET_COCOONS_NR)
+ goto L_TooMany;
+ Zeny = Zeny - @SheetCount * @SHEET_ZENY;
+ delitem "SilkCocoon", @SheetCount * @SHEET_COCOONS_NR;
+ getitem "SilkSheet", @SheetCount;
+ mes "[Hetchel]";
+ mes "";
+ mes "\"Thank you, I hope the sheets will fit your needs.";
+ mes "Please greet Lora for me when you see her.\"";
+ emotion EMOTE_HAPPY, strcharinfo(0);
+ goto L_close;
+
+L_sheet_missing_cocoons:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"I'm sorry, but I need " + @SheetCount * @SHEET_COCOONS_NR + ", not " + countitem("SilkCocoon") + ".\"";
+ goto L_close;
+
+L_sheet_missing_Zeny:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"No, no no. The way this works is that you give me the GP first and I give you the sheets afterwards.";
+ mes "You're " + (@SheetCount * @SHEET_ZENY - Zeny) + " GP short, so come back when you can afford the sheets you asked for!\"";
+ goto L_close;
+
+L_how_many_cocoons:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"I need an average of " + @SHEET_COCOONS_NR + " cocoons per sheet";
+ mes "and also " + @SHEET_ZENY + " GP per sheet for my work.\"";
+ next;
+ goto L_sheet_menu;
+
+L_sheet_no_cocoon:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"You don't have any cocoon? I'm sorry I can't do anything for you.\"";
+ menu
+ "I'll seek for them.", L_close,
+ "Where can I get cocoons?", L_Next2;
+
+L_Next2:
+ mes "[Hetchel]";
+ mes "\"Silk cocoons come from Silkworms. Silkworms live in the woodland area around Hurnscald.";
+ mes "Silkworms like especially woods and dark areas. You can go there by ferry.\"";
+ goto L_close;
+
+
+L_zero_sheet:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"It's the best way to get quickly served!\"";
+ goto L_close;
+
+L_TooMany:
+ mes "[Hetchel]";
+ mes "";
+ mes "\"Your bag hasn't room enough. Store some things and come back.\"";
+ goto L_close;
+
+S_Update_Spants:
+ QUEST_WG_state = (QUEST_WG_state & ~(NIBBLE_2_MASK) | (@spants_state << NIBBLE_2_SHIFT));
+ return;
+
+L_close:
+ QUEST_WG_state = (QUEST_WG_state & ~(NIBBLE_2_MASK) | (@spants_state << NIBBLE_2_SHIFT));
+ @wg_state = 0;
+ @spants_state = 0;
+ @spants_minlvl = 0;
+ @spants_reward = 0;
+ @spants_job_reward = 0;
+ @spants_wipe_thingy = "";
+ @SHEET_COCOONS_NR = 0;
+ @SHEET_ZENY = 0;
+ @SheetCount = 0;
+ @wg_state = 0;
+ cleararray @items$, "", getarraysize(@items$);
+ cleararray @item_names$, "", getarraysize(@item_names$);
+ close;
+}
+
+002-2,73,95,0 script HetchelDebug NPC376,{
+set @wg_state, ((QUEST_WG_state & BYTE_0_MASK) >> BYTE_0_SHIFT);
+set @spants_state, ((QUEST_WG_state & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT);
+
+mes "Lora Tay Quest State: "+ @wg_state;
+mes "Silk Pants Quest State: "+ @spants_state;
+
+menu
+ "Set Lora Tay Quest State", L_Lora_Tay,
+ "Set Silk Pants Quest State", L_Spants,
+ "Close", L_close;
+
+L_Lora_Tay:
+ mes "Set Lora Tay Visited State (0 - reset , 11 - enough for SilkPants Quest)";
+ input @wg_state;
+ goto L_close;
+
+L_Spants:
+ mes "Set SilkPants Quest State (0 - reset)";
+ input @spants_state;
+ goto L_close;
+
+L_close:
+ QUEST_WG_state = (QUEST_WG_state & ~(BYTE_0_MASK) | (@wg_state << BYTE_0_SHIFT));
+ @wg_state = 0;
+ QUEST_WG_state = (QUEST_WG_state & ~(NIBBLE_2_MASK) | (@spants_state << NIBBLE_2_SHIFT));
+ @spants_state = 0;
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "HetchelDebug";
+ end;
+}
diff --git a/npc/002-2/imec.txt b/npc/002-2/imec.txt
new file mode 100644
index 00000000..dfd7187f
--- /dev/null
+++ b/npc/002-2/imec.txt
@@ -0,0 +1,115 @@
+002-2,36,75,0 script Imec NPC162,{
+ @Exp = 90;
+ @money = 500;
+ @lvl = 10;
+
+ if (QL_IMEC >= 3) goto L_Stingers;
+ if (QL_IMEC == 2) goto L_Return;
+ if (QL_IMEC == 1) goto L_Bring;
+
+ mes "[Imec]";
+ mes "%%9";
+ mes "\"The Wizard's Council shut down my shop!";
+ mes "Why'd they have to make such a fuss over a little poison?\"";
+ next;
+ mes "\"Someday, I'm going to get my permit back from those self-righteous snobs!\"";
+ next;
+ mes "He looks at you.";
+ next;
+ mes "[Imec]";
+ mes "%%D";
+ mes "\"Hey... I've got an idea!";
+ next;
+ mes "I just finished writing an appeal to the Council. If you bring it to the government building near the docks, they might be less... closed-minded.\"";
+ goto L_Offer;
+
+L_Offer:
+ menu
+ "Just tell me how to get there.",L_Explain,
+ "I'll do it.",L_Next,
+ "No way!",L_close;
+
+L_Next:
+ mes "";
+ mes "[Imec]";
+ mes "\"Great! Here's the appeal.\"";
+ mes "Imec gives you a sealed letter, which you store in a safe pocket outside of your inventory.";
+ QL_IMEC = 1;
+ goto L_close;
+
+L_Explain:
+ mes "";
+ mes "[Imec]";
+ mes "\"Head north until you get to the docks – it's just west of the ferry.\"";
+ next;
+ mes "\"There are a couple of other offices inside. You can form a party if you want, but don't take too long.\"";
+ if (BaseLevel < WEDDING_MIN_LEVEL) mes "\"Once you're older, you can even get married there.\"";
+ next;
+ mes "\"So... will you submit my appeal for me?\"";
+ if (QL_IMEC == 0)
+ goto L_Offer;
+ goto L_close;
+
+L_Bring:
+ mes "[Imec]";
+ mes "\"What are you waiting for? I'm not paying you till after the job is done!\"";
+ menu
+ "Where is it again?",L_Explain,
+ "I'm on my way.",L_close;
+
+L_Return:
+ mes "[Imec]";
+ mes "\"Ah! You're back! How'd it go?\"";
+ mes "You hand the letter of acknowledgment over to Imec.";
+ next;
+ mes "[Imec]";
+ mes "\"Great! I'm sure I'll be able to open my shop again soon.\"";
+ next;
+ mes "It seems as though Imec has lost interest in you already.";
+ menu
+ "You mentioned a reward...",L_Next1;
+
+L_Next1:
+ mes "";
+ mes "[Imec]";
+ mes "\"What? Oh, right. Here, have this.\"";
+ getexp @Exp, 0;
+ Zeny = Zeny + @money;
+ QL_IMEC = 3;
+ next;
+ if (BaseLevel >= @lvl)
+ goto L_Transition_Stingers;
+ if (BaseLevel < @lvl)
+ mes "\"Come back to see me once you grow stronger; I might have a job for you later on.\"";
+ goto L_close;
+
+L_Transition_Stingers:
+ mes "\"Actually, you could be of further use to me.\"";
+ next;
+ goto L_Stingers;
+
+L_Stingers:
+ mes "[Imec]";
+ @dq_level = @lvl;
+ @dq_cost = 3;
+ @dq_count = 3;
+ @dq_name$ = "ScorpionStinger";
+ @dq_friendly_name$ = "Scorpion Stingers";
+ @dq_money = 200;
+ @dq_exp = 40;
+
+ callfunc "DailyQuest";
+ goto L_close;
+
+L_close:
+ @money = 0;
+ @dq_level = 0;
+ @dq_cost = 0;
+ @dq_count = 0;
+ @dq_name$ = "";
+ @dq_friendly_name$ = "";
+ @dq_money = 0;
+ @dq_exp = 0;
+ @dq_return = 0;
+ close;
+}
diff --git a/npc/002-2/inya.txt b/npc/002-2/inya.txt
new file mode 100644
index 00000000..aa68fb14
--- /dev/null
+++ b/npc/002-2/inya.txt
@@ -0,0 +1,216 @@
+
+002-2,116,61,0 script #InyaShop NPC32767,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem SimpleRing;
+ .distance = 5;
+ end;
+}
+
+002-2,116,61,0 script Inya NPC106,{
+ mes "[Inya]";
+ mes "\"I am Inya, a jeweler of fine rings. I sell and make rings.\"";
+ next;
+ mes "\"If you have a Simple Ring and a gem, I can set the gem in it for 100,000 gold pieces.\"";
+ next;
+ mes "\"Also, if you have a ring with gems on it, I can remove the gems and return the Simple Ring to you for 50,000 gold pieces.\"";
+ next;
+ mes "\"So, how can I help you?\"";
+ menu
+ "What jewelry do you have for sale?", L_Inya_Shop,
+ "I have a wedding ring, will that do?", L_Inya_Wedding_Ring,
+ "I'd like to remove a gem (50000 GP).", L_Inya_Remove_RingGem,
+ "I'd like to add a gem (100000 GP).", L_Inya_Add_RingGem,
+ "Not interested.", L_Inya_NotInterested;
+
+L_Inya_Shop:
+ close2;
+ shop "#InyaShop";
+
+L_Inya_Wedding_Ring:
+ mes "[Inya]";
+ mes "\"No, sorry. I do not alter wedding rings at this time.\"";
+ close;
+
+L_Inya_Remove_RingGem:
+ mes "[Inya]";
+ mes "\"What kind of gem would you like to have removed?\"";
+ menu
+ "Diamond.", L_Inya_Remove_Diamond,
+ "Ruby.", L_Inya_Remove_Ruby,
+ "Emerald.", L_Inya_Remove_Emerald,
+ "Sapphire.", L_Inya_Remove_Sapphire,
+ "Topaz.", L_Inya_Remove_Topaz,
+ "Amethyst.", L_Inya_Remove_Amethyst,
+ "I've changed my mind.", L_Inya_NotInterested;
+
+L_Inya_Add_RingGem:
+ mes "[Inya]";
+ mes "\"What kind of gem would you like to add?\"";
+ menu
+ "Diamond.", L_Inya_Add_Diamond,
+ "Ruby.", L_Inya_Add_Ruby,
+ "Emerald.", L_Inya_Add_Emerald,
+ "Sapphire.", L_Inya_Add_Sapphire,
+ "Topaz.", L_Inya_Add_Topaz,
+ "Amethyst.", L_Inya_Add_Amethyst,
+ "I've changed my mind.", L_Inya_NotInterested;
+
+L_Inya_Remove_Diamond:
+ if ( (Zeny < 50000)
+ | (countitem ("DiamondRing") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 50000;
+ delitem "DiamondRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Remove_Ruby:
+ if ( (Zeny < 50000)
+ | (countitem ("RubyRing") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 50000;
+ delitem "RubyRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Remove_Emerald:
+ if ( (Zeny < 50000)
+ | (countitem ("EmeraldRing") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 50000;
+ delitem "EmeraldRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Remove_Sapphire:
+ if ( (Zeny < 50000)
+ | (countitem ("SapphireRing") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 50000;
+ delitem "SapphireRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Remove_Topaz:
+ if ( (Zeny < 50000)
+ | (countitem ("TopazRing") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 50000;
+ delitem "TopazRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Remove_Amethyst:
+ if ( (Zeny < 50000)
+ | (countitem ("AmethystRing") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 50000;
+ delitem "AmethystRing", 1;
+ getitem "SimpleRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Diamond:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Diamond") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Diamond", 1;
+ getitem "DiamondRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Ruby:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Ruby") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Ruby", 1;
+ getitem "RubyRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Emerald:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Emerald") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Emerald", 1;
+ getitem "EmeraldRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Sapphire:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Sapphire") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Sapphire", 1;
+ getitem "SapphireRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Topaz:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Topaz") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Topaz", 1;
+ getitem "TopazRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_Add_Amethyst:
+ if ( (Zeny < 100000)
+ | (countitem ("SimpleRing") < 1)
+ | (countitem ("Amethyst") < 1) )
+ goto L_Inya_Not_Enough;
+ Zeny = Zeny - 100000;
+ delitem "SimpleRing", 1;
+ delitem "Amethyst", 1;
+ getitem "AmethystRing", 1;
+ mes "[Inya]";
+ mes "\"Here you go.\"";
+ close;
+
+L_Inya_NotInterested:
+ mes "[Inya]";
+ mes "\"Come back later and I will try to be of assistance.\"";
+ close;
+
+L_Inya_Not_Enough:
+ mes "[Inya]";
+ mes "\"I am sorry, you simply do not seem to have the necessary items for me to help you. Please come back when you do, and I would be more than happy to help you out.\"";
+ close;
+}
diff --git a/npc/002-2/kps.txt b/npc/002-2/kps.txt
new file mode 100644
index 00000000..bcdfb1e7
--- /dev/null
+++ b/npc/002-2/kps.txt
@@ -0,0 +1,152 @@
+002-2,120,89,0 script KPS Manager NPC191,{
+ @run = ((QUEST_NorthTulimshar & TWOBIT_8_MASK) >> TWOBIT_8_SHIFT);
+ @run_cnt = ((QUEST_NorthTulimshar & TWOBIT_9_MASK) >> TWOBIT_9_SHIFT);
+ if (QL_KYLIAN == 15)
+ goto L_SeeKylian;
+ if (QL_KYLIAN == 14)
+ goto L_RunComplete;
+ if (QL_KYLIAN == 13)
+ goto L_RunStarted;
+ if (QL_KYLIAN == 12)
+ goto L_JobSelect;
+ if (QL_KYLIAN == 11)
+ goto L_AcceptJob;
+ if (QL_KYLIAN == 10)
+ goto L_OfferJob;
+ goto L_Default;
+
+L_Default:
+ mes "[KPS Manager]";
+ mes "\"A rich salesman named Kylian bought this shop recently.\"";
+ mes "\"I'm waiting for him to give the go-ahead on opening it up, but I haven't heard from him in a while.\"";
+ next;
+ mes "\"I wonder if he needs any help...\"";
+ next;
+ mes "\"If you could go over and check on him in the inn while I tend to the store, I'd really appreciate it.\"";
+ goto L_close;
+
+L_OfferJob:
+ mes "[KPS Manager]";
+ mes "\"Hello! How can I help you today?\"";
+ menu
+ "My name is " + strcharinfo(0) + ".", L_MyName,
+ "Nothing.", L_close;
+
+L_MyName:
+ QL_KYLIAN = 11;
+ mes "\"Ah. Kylian said you would be dropping by.\"";
+ next;
+ mes "\"I assume you are looking for some work?\"";
+ menu
+ "Yes.", L_StartJob,
+ "No.", L_close;
+
+L_AcceptJob:
+ mes "[KPS Manager]";
+ mes "\"Interested in some work?\"";
+ menu
+ "Yes.", L_StartJob,
+ "No.", L_close;
+
+L_StartJob:
+ @run = 0;
+ callfunc "SetKylianRun";
+ @run_cnt = 0;
+ callfunc "SetKylianRunCnt";
+ QL_KYLIAN = 12;
+ goto L_JobSelect;
+
+L_StartJobAgain:
+ @run = 0;
+ callfunc "SetKylianRun";
+ QL_KYLIAN = 12;
+ goto L_JobSelect;
+
+L_JobSelect:
+ if ((gettimetick(2) - Kylian_Timer) < 86400)
+ goto L_NoPackages;
+ mes "[KPS Manager]";
+ mes "\"We have a number of deliveries that need to go all over the world.\"";
+ next;
+ goto L_RandJob;
+
+L_RandJob:
+ @rand_quest = rand(1,3);
+ goto L_JobInfo;
+
+L_JobInfo:
+ mes "\"We have a delivery for ##B" + $@random_quests$[@rand_quest] + "##b.\"";
+ menu
+ "I'll take it.", L_StartRun,
+ "Anything else?", L_RandJob,
+ "I need a break.", L_close;
+
+L_StartRun:
+ QL_KYLIAN = 13;
+ @run = @rand_quest;
+ callfunc "SetKylianRun";
+ Kylian_Timer = gettimetick(2);
+ goto L_close;
+
+L_RunStarted:
+ mes "Deliver this package to ##B" + $@random_quests$[@run] + "##b.\"";
+ goto L_close;
+
+L_RunComplete:
+ @elapsed_time = (gettimetick(2) - Kylian_Timer);
+ if (@elapsed_time > 600)
+ goto L_Failed;
+ @run_cnt = (@run_cnt + 1);
+ callfunc "SetKylianRunCnt";
+ // Set Kylian wants to see you reward state
+ if (@run_cnt > 3)
+ goto L_KylianReward;
+ goto L_RunAgain;
+
+L_SeeKylian:
+ mes "\"You need to go see Kylian before I can give you any more work.\"";
+ goto L_close;
+
+L_Failed:
+ mes "\"If you're faster next time, you can earn a bonus.\"";
+ next;
+ goto L_RunAgain;
+
+L_KylianReward:
+ Zeny = Zeny + $@delivery_money;
+ getexp ($@delivery_exp_mod * BaseLevel), 0;
+ callfunc "SetKylianRun";
+ QL_KYLIAN = 15;
+ mes "[" + $@delivery_money + " money]";
+ mes "[" + ($@delivery_exp_mod * BaseLevel) + " experience points]";
+ next;
+ mes "\"I've got news for you! Kylian wants me to send you over right away.\"";
+ goto L_close;
+
+L_RunAgain:
+ Zeny = Zeny + $@delivery_money;
+ getexp ($@delivery_exp_mod * BaseLevel), 0;
+ callfunc "SetKylianRun";
+ mes "[" + $@delivery_money + " money]";
+ mes "[" + ($@delivery_exp_mod * BaseLevel) + " experience points]";
+ next;
+ mes "\"Good job! Keep up the nice work, and I'm sure the boss will give you a bonus.\"";
+ next;
+ goto L_StartJobAgain;
+
+L_NoPackages:
+ mes "\"Sorry, but we don't have any more jobs open right now.\"";
+ mes "\"Come back tomorrow; maybe we will have some more work then.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
+function script SetKylianRun {
+ QUEST_NorthTulimshar = (QUEST_NorthTulimshar & ~(TWOBIT_8_MASK)) | (@run << TWOBIT_8_SHIFT);
+ return;
+}
+function script SetKylianRunCnt {
+ QUEST_NorthTulimshar = (QUEST_NorthTulimshar & ~(TWOBIT_9_MASK)) | (@run_cnt << TWOBIT_9_SHIFT);
+ return;
+}
diff --git a/npc/002-2/kylian.txt b/npc/002-2/kylian.txt
new file mode 100644
index 00000000..22263199
--- /dev/null
+++ b/npc/002-2/kylian.txt
@@ -0,0 +1,360 @@
+
+
+
+
+- script #businessmanNTconfig NPC32767,{
+ end;
+
+OnInit:
+ // Nibble 4
+ // Used in Random Quest later as a Nibble
+ $@knowYanisNT = (1 << 16);
+ $@knowLatoyNT = (1 << 17);
+ $@knowWeellosNT = (1 << 18);
+ $@knowCasinoNT = (1 << 19);
+
+ // Random Quests for Later
+ setarray $@random_quests$, "None", "Falkurn", "Old Wizard", "Baktar";
+ $@delivery_money = 100;
+ $@delivery_exp_mod = 10;
+ end;
+}
+002-2,44,107,0 script #KylianOut NPC32767,1,1,{
+ @KylianNTLicense = 0;
+ @KylianNTSightSeeing = 0;
+ @KylianNTCasino = 0;
+ end;
+}
+002-2,43,101,0 script Kylian NPC193,{
+ @acorn_amount = 12;
+ @suitcase_money = 100;
+ @suitcase_exp = 50;
+ @license_money = 50;
+ @license_exp = 20;
+ @sightseeing_money = 50;
+ @sightseeing_exp = 20;
+ @food_money = 50;
+ @food_exp = 20;
+ @clothes_money = 50;
+ @clothes_exp = 20;
+ @fun_money = 50;
+ @fun_exp = 20;
+
+ if (QL_KYLIAN == 15) goto L_Done;
+ if (QL_KYLIAN >= 11) goto L_Helping;
+ if (QL_KYLIAN == 10) goto L_OfferedJob;
+ if (QL_KYLIAN == 9) goto L_Shop;
+ if (@KylianNTCasino) goto L_CasinoDone;
+ if (QL_KYLIAN == 8) goto L_DesertHat;
+ if (QL_KYLIAN == 7) goto L_Clothes;
+ if (@KylianNTSightSeeing) goto L_SightSeeingDone;
+ if (QL_KYLIAN == 6) goto L_Casino;
+ if (QL_KYLIAN == 5) goto L_Food;
+ if (@KylianNTLicense) goto L_LicenseDone;
+ if (QL_KYLIAN == 4) goto L_SightSeeing;
+ if (QL_KYLIAN == 3) goto L_ShopLicense;
+ if (QL_KYLIAN >= 1) goto L_Suitcase;
+
+ mes "[Kylian]";
+ mes "\"Ah! Are you the room service? I've some requests.\"";
+ menu
+ "Sure... What can I do for you?",L_Luggage,
+ "No I'm not!",L_Next;
+
+L_Next:
+ mes "[Kylian]";
+ mes "\"Too bad. Would you be interested in earning some quick money with some errands regardless?\"";
+ menu
+ "I'm a great adventurer! I don't do petty errands.",L_close,
+ "No. I'm busy.",L_close,
+ "Well... OK.",L_Luggage;
+
+L_Luggage:
+ mes "[Kylian]";
+ mes "\"I need you to get my luggage from the docks. Just show this paper to the sailor who's watching the luggage.\"";
+ mes "He gives you his ticket, which you promptly store in a safe pocket outside of your inventory.";
+ QL_KYLIAN = 1;
+ goto L_close;
+
+L_Suitcase: // QL_KYLIAN >= 1, but below 3
+ mes "[Kylian]";
+ mes "\"Did you get my luggage from the docks?\"";
+ if (QL_KYLIAN != 2)
+ goto L_close;
+ menu
+ "Here it is.",L_Continue,
+ "Don't worry; I'm on my way.",L_close;
+
+L_Continue:
+ if (countitem("LeatherSuitcase") < 1)
+ goto L_NoItem;
+ delitem "LeatherSuitcase", 1;
+ Zeny = Zeny + @suitcase_money;
+ getitem "Acorn", @acorn_amount;
+ getexp @suitcase_exp, 0;
+ QL_KYLIAN = 3;
+ next;
+ mes "[Kylian]";
+ mes "\"Ah! Very good. I have some urgent paperwork that I've been needing to attend to.\"";
+ mes "He gives you some money.";
+ next;
+ mes "[Kylian]";
+ mes "\"Before you go, I also happen to have some acorns left over from my trip.\"";
+ mes "\"You can have them if you wish; they're rather tasty.\"";
+ mes "If, however, you don't like them, you could take them to the Tulimshar bakery. I heard they use them to make a special kind of flour.\"";
+ next;
+ goto L_ShopLicense;
+
+L_ShopLicense: // QL_KYLIAN == 3
+ mes "[Kylian]";
+ mes "\"I'm a salesman and came to Tulimshar because I'm thinking about establishing a shop here.\"";
+ mes "\"While I'm going through my papers, could you find out whom I have to talk to about opening up a shop in this city?\"";
+ if (!(QUEST_NorthTulimshar & $@knowYanisNT))
+ goto L_close;
+ menu
+ "You need to go and talk to Yanis in the government building.",L_GovBuild,
+ "I'll see what I can do.",L_close;
+
+L_GovBuild:
+ Zeny = Zeny + @license_money;
+ getexp @license_exp, 0;
+ QL_KYLIAN = 4;
+ @KylianNTLicense = 1;
+ mes "[Kylian]";
+ mes "\"Ah... excellent! That's very helpful. Could you tell me how to get to that building?\"";
+ mes "You give him directions to the building.";
+ next;
+ goto L_LicenseDone;
+
+L_LicenseDone: // the player didn't log out yet after telling about Yanis
+ mes "[Kylian]";
+ mes "\"I need to prepare my papers now. I might have some more questions later on though.\"";
+ goto L_close;
+
+L_SightSeeing: // QL_KYLIAN == 4 and logged out sometime between getting to that state and now
+ mes "[Kylian]";
+ mes "\"You came here at just the right moment! I have finished my business affairs, and I think I should use my time here to learn a bit about the culture in the area. Can you tell me if there are any historical places or landmarks to visit?\"";
+ if (!(QUEST_NorthTulimshar & $@knowWeellosNT))
+ goto L_close;
+ menu
+ "There's a very old building not far from here.",L_HistBuild,
+ "I don't know, but I'll have a look around.",L_close;
+
+L_HistBuild:
+ Zeny = Zeny + @sightseeing_money;
+ getexp @sightseeing_exp, 0;
+ QL_KYLIAN = 5;
+ mes "[Kylian]";
+ mes "\"This sounds interesting. Please tell me the way.\"";
+ mes "You tell him how to get to the historic building.";
+ next;
+ goto L_Food;
+
+L_Food: // QL_KYLIAN == 5
+ mes "[Kylian]";
+ mes "\"While I'm out, I could also get something to eat. Do you have any suggestions for local cuisine?\"";
+ if (QL_FIERI < 4) // didn't yet help Fieri make Tonori Delight
+ goto L_close;
+ menu
+ "A man named Fieri makes a tasty Tonori Delight over at the castle.",L_SoupBer,
+ "No idea. I'll try to find out.",L_close;
+
+L_SoupBer:
+ Zeny = Zeny + @food_money;
+ getexp @food_exp, 0;
+ QL_KYLIAN = 6;
+ @KylianNTSightSeeing = 1;
+ goto L_SightSeeingDone;
+
+L_SightSeeingDone:
+ mes "[Kylian]";
+ mes "\"I'm going to see the historic building you told me about and try the local food at the castle. Thank you for the suggestions.\"";
+ goto L_close;
+
+L_Casino: // QL_KYLIAN == 6 and logged out sometime between getting to that state and now
+ mes "[Kylian]";
+ mes "\"Hello. I just came back from my sight-seeing tour, and this Tonori Delight really was delicious. I wonder what it's made of...\"";
+ next;
+ mes "\"However, I was wondering if you know about some evening attractions. Maybe somewhere to have fun?\"";
+ if (!(QUEST_NorthTulimshar & $@knowCasinoNT))
+ goto L_close;
+ menu
+ "Of course! The casino!",L_CasinoFound,
+ "Not really.",L_close;
+
+L_CasinoFound:
+ Zeny = Zeny + @casino_money;
+ getexp @casino_exp, 0;
+ QL_KYLIAN = 7;
+ mes "[Kylian]";
+ mes "\"Oh! There's a casino in this city? That's wonderful! Where can I find it?\"";
+ mes "You explain how to get to the casino.";
+ next;
+ goto L_Clothes;
+
+L_Clothes: // QL_KYLIAN == 7
+ mes "[Kylian]";
+ mes "\"I should acquire proper clothing before I go to the casino tonight. Do you know a reputable shop where high-quality clothing is sold?\"";
+ if (!(QUEST_NorthTulimshar & $@knowLatoyNT))
+ goto L_close;
+ menu
+ "Latoy's shop. It's on the west side of Tulimshar.",L_HarborDistrict,
+ "Hmmm... I don't know.",L_close;
+
+L_HarborDistrict:
+ Zeny = Zeny + @clothes_money;
+ getexp @clothes_exp, 0;
+ QL_KYLIAN = 8;
+ @KylianNTCasino = 1;
+ mes "You explain about Latoy and the quality of his shop.";
+ next;
+ mes "[Kylian]";
+ mes "\"This seems to be exactly what I need. Thanks a lot.\"";
+ goto L_close;
+
+L_CasinoDone:
+ mes "[Kylian]";
+ mes "\"I'm looking forward to going to the casino tonight. See me tomorrow, and I might have more requests.\"";
+ goto L_close;
+
+L_DesertHat: // QL_KYLIAN == 8
+ mes "Kylian looks a bit tired.";
+ next;
+ mes "[Kylian]";
+ mes "\"That was an interesting night. Thanks for your suggestion to visit the casino.\"";
+ next;
+ getinventorylist;
+ mes "\"You helped me out a lot, so I bought a souvenir for you while I was out shopping.\"";
+ if ((checkweight("DesertHat", 1) == 0) || (@inventorylist_count == 100))
+ goto L_Inventory;
+ getitem "DesertHat", 1;
+ QL_KYLIAN = 9;
+ next;
+ goto L_close;
+
+L_Shop:
+ mes "[Kylian]";
+ mes "\"The Council of Wizards approved my shop license!\"";
+ mes "\"I purchased a store just across the way from the inn.\"";
+ next;
+ mes "\"If you are looking for work, go see the shop keeper I have working for me there.\"";
+ mes "\"Mention your name, and he will know I sent you.\"";
+ QL_KYLIAN = 10;
+ goto L_close;
+
+L_OfferedJob:
+ mes "[Kylian]";
+ mes "\"I spoke with the shopkeeper, and he said you haven't stopped in yet.\"";
+ next;
+ mes "\"I wish you would consider working for me.\"";
+ next;
+ mes "\"KPS needs a determined, experienced adventurer like you.\"";
+ goto L_close;
+
+L_Helping:
+ mes "[Kylian]";
+ mes "\"I've heard you decided to come work for me. That's great news!\"";
+ mes "\"Keep up the good work, and I might have something a little extra for you.\"";
+ goto L_close;
+
+L_Done:
+ mes "[Kylian]";
+ mes "\"Thanks a bunch, business is booming!\"";
+ mes "\"Please, take this for all your hard work.\"";
+ next;
+ Zeny = Zeny + $@delivery_money;
+ getexp ($@delivery_exp_mod * BaseLevel), 0;
+ @run_cnt = 0;
+ callfunc "SetKylianRunCnt";
+ QL_KYLIAN = 12;
+ mes "[" + $@delivery_money + " money]";
+ mes "[" + ($@delivery_exp_mod * BaseLevel) + " experience points]";
+ next;
+ goto L_close;
+
+L_Inventory:
+ mes "[Kylian]";
+ mes "\"Oh my. You're carrying quite a lot. Come back when you have more room.\"";
+ goto L_close;
+
+L_NoItem:
+ mes "[Kylian]";
+ mes "\"I don't see it! Are you trying to tease me? This isn't funny!\"";
+ goto L_close;
+
+L_close:
+ @acorn_amount = 0;
+ @suitcase_money = 0;
+ @suitcase_exp = 0;
+ @license_money = 0;
+ @license_exp = 0;
+ @sightseeing_money = 0;
+ @sightseeing_exp = 0;
+ @food_money = 0;
+ @food_exp = 0;
+ @clothes_money = 0;
+ @clothes_exp = 0;
+ @fun_money = 0;
+ @fun_exp = 0;
+ @inventorylist_count = 0;
+ // NOT set to zero: @KylianNTLicense, @KylianNTSightSeeing and @KylianNTCasino
+ // those are used to check if the player logged out in the meanwhile
+ close;
+}
+function script KylianDebug {
+ @run = ((QUEST_NorthTulimshar & TWOBIT_8_MASK) >> TWOBIT_8_SHIFT);
+ @run_cnt = ((QUEST_NorthTulimshar & TWOBIT_9_MASK) >> TWOBIT_9_SHIFT);
+ goto L_Menu;
+
+L_Menu:
+ mes "[Kylian Debug]";
+ menu
+ "Show Quest State", L_ShowState,
+ "Set Quest State", L_SetState,
+ "Reset Timer to Now", L_WorkTimer,
+ "Reset Timer + 24 Hours", L_MoreWorkTimer,
+ "Close.", L_close;
+
+L_ShowState:
+ mes "State: " + QL_KYLIAN;
+ mes "Timer: " + Kylian_Timer;
+ mes "Time: " + gettimetick(2);
+ mes "Elapsed Time: " + (gettimetick(2) - Kylian_Timer);
+ mes "Reset Timer: 86400 > " + (gettimetick(2) - Kylian_Timer);
+ mes "Run: " + @run;
+ mes "Run NPC: " + $@random_quests$[@run];
+ mes "Run Count: " + @run_cnt;
+ goto L_Menu;
+
+L_SetState:
+ mes "\"Input the quest state desired.\"";
+ input QL_KYLIAN;
+ goto L_Menu;
+
+L_WorkTimer:
+ Kylian_Timer = gettimetick(2);
+ goto L_Menu;
+
+L_MoreWorkTimer:
+ Kylian_Timer = (gettimetick(2) - 86401);
+ goto L_Menu;
+
+L_close:
+ return;
+}
+002-2,40,101,0 script KylianDebug#1 NPC193,{
+ callfunc "KylianDebug";
+ close;
+OnInit:
+ if (!debug)
+ disablenpc "KylianDebug#1";
+ end;
+}
+002-2,118,89,0 script KylianDebug#2 NPC193,{
+ callfunc "KylianDebug";
+ close;
+OnInit:
+ if (!debug)
+ disablenpc "KylianDebug#2";
+ end;
+}
diff --git a/npc/002-2/latoy.txt b/npc/002-2/latoy.txt
new file mode 100644
index 00000000..24b9ed4f
--- /dev/null
+++ b/npc/002-2/latoy.txt
@@ -0,0 +1,26 @@
+002-2,86,93,0 shop #LatoyShop NPC32767,544:8000,868:10000,1172:3000,720:16000
+002-2,86,93,0 script Latoy NPC106,{
+ QUEST_NorthTulimshar = QUEST_NorthTulimshar | $@knowLatoyNT;
+
+ mes "[Latoy]";
+ mes "\"Is there something I can help you with?\"";
+ if (QL_KYLIAN != 7)
+ goto L_Shop;
+ next;
+ mes "Maybe this is the kind of shop Kylian is looking for?";
+ goto L_Shop;
+
+L_Shop:
+ mes "[Latoy]";
+ mes "\"How would you like to browse my wares?\"";
+ menu
+ "Yes.", L_LatoyShop,
+ "No.", L_close;
+
+L_LatoyShop:
+ close2;
+ shop "#LatoyShop";
+
+L_close:
+ close;
+}
diff --git a/npc/002-2/mapflags.txt b/npc/002-2/mapflags.txt
new file mode 100644
index 00000000..ae307dbb
--- /dev/null
+++ b/npc/002-2/mapflags.txt
@@ -0,0 +1,2 @@
+//002-2 mapflag resave 001-1,60,105
+//002-2 mapflag town
diff --git a/npc/002-2/omar.txt b/npc/002-2/omar.txt
new file mode 100644
index 00000000..5c7b7cd9
--- /dev/null
+++ b/npc/002-2/omar.txt
@@ -0,0 +1,329 @@
+function script KadiyaSubquestConsts {
+ @Q_kadiya_status = (QUEST_MAGIC2 & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT;
+
+ @Q_STATUS_NONE = 0;
+ @Q_STATUS_KNOWS_MOPOX = 1;
+ @Q_STATUS_MADE_MOPOX = 2;
+ @Q_STATUS_DIDNT_DRINK = 3;
+ @Q_STATUS_WANTS_CHOCOCAKE = 4;
+ @Q_STATUS_WANTS_ORANGECUPCAKE = 5;
+ @Q_STATUS_COMPLETED = 6;
+ @Q_STATUS_COMPLETED_ELANORE = 7;
+ @Q_STATUS_COMPLETED_NOELANORE = 8;
+ @Q_STATUS_COMPLETED_POST_ELANORE = 9;
+
+ if (((QUEST_MAGIC2 & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT) < 4) set @Q_kadiya_status, @Q_STATUS_NONE;
+
+ if (((QUEST_MAGIC2 & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT) > 4) set @Q_kadiya_status, @Q_STATUS_COMPLETED_POST_ELANORE;
+
+ return;
+}
+
+002-2,117,126,0 script Omar NPC162,{
+ callfunc "KadiyaSubquestConsts";
+
+ @Q_status = @Q_kadiya_status;
+
+ if (@Q_status >= @Q_STATUS_COMPLETED) goto L_cured;
+
+ if (@Q_status == @Q_STATUS_DIDNT_DRINK) goto L_didnt_drink;
+
+ if (@Q_status > @Q_STATUS_DIDNT_DRINK) goto L_make_food;
+
+ mes "[Omar]";
+ mes "\"Welcome to my humble abode.\"";
+ next;
+ menu
+ "Well met! May I ask who you are?", L_omar,
+ "What's wrong with your daughter?", L_kadiya_sick,
+ "Thank you!", L_close;
+
+L_omar:
+ mes "[Omar]";
+ mes "\"My name is Omar; I am a trader of oils and spices.\"";
+ goto L_close;
+
+L_kadiya_sick:
+ mes "[Omar]";
+ mes "\"Kadiya has caught Ponderpox, I fear.\"";
+ mes "He sighs.";
+ mes "\"She's has been feverish for many days now. I wish there were something I could do.\"";
+ next;
+ menu
+ "Have you asked Elanore the healer?", L_sick_elanore,
+ "How about the Hurnscald hospital?", L_sick_hospital,
+ "Can I help?", L_sick_self,
+ "I'm sorry to hear that.", L_Next;
+
+L_Next:
+ mes "[Omar]";
+ mes "\"Well, she is a strong girl. I am sure that she will get over it eventually.\"";
+ mes "He smiles, but you see doubt in his eyes.";
+ goto L_close;
+
+L_sick_elanore:
+ mes "[Omar]";
+ mes "\"Elanore?\"";
+ mes "He frowns.";
+ mes "\"She knows nothing. I see no point in talking to her.\"";
+ goto L_close;
+
+L_sick_hospital:
+ mes "[Omar]";
+ mes "\"Hurnscald is too far away. I don't think that it would be good for her to go on such a long trip.\"";
+ goto L_close;
+
+L_sick_self:
+ mes "[Omar]";
+ mes "\"You are very kind, but I don't think there is anything you can do.\"";
+ goto L_close;
+
+L_didnt_drink:
+ mes "[Omar]";
+ mes "\"So she has Mopox, not Ponderpox, you say? Hmm. That is much harder to cure, I think.\"";
+ mes "\"I am grateful for the effort you put into brewing a potion for her. But it does smell vile...\"";
+ next;
+ mes "[Omar]";
+ mes "\"I promised my dear wife that I would never make Kadiya eat or drink anything she doesn't like. So I won't force her to drink this.\"";
+ next;
+ mes "[Omar]";
+ @Q_status = (@Q_STATUS_WANTS_CHOCOCAKE + rand(2));
+ callsub S_Update_Var;
+ if (@Q_status == @Q_STATUS_WANTS_ORANGECUPCAKE)
+ mes "\"If only we could make it smell and taste like orange cupcakes... she really loves those cupcakes.\"";
+ if (@Q_status == @Q_STATUS_WANTS_CHOCOCAKE)
+ mes "\"If only this were a chocolate cake and not a potion... she really loves chocolate cakes.\"";
+ goto L_close;
+
+L_make_food:
+ mes "[Omar]";
+ mes "\"I should stay here to watch over her. I wish I could think of a way to convince her to drink the potion...\"";
+ if (@Q_status == @Q_STATUS_WANTS_ORANGECUPCAKE)
+ mes "\"Alas, it is not an orange cupcake.\"";
+ if (@Q_status == @Q_STATUS_WANTS_CHOCOCAKE)
+ mes "\"If only it were to smell and taste like her favourite chocolate cake...\"";
+ goto L_close;
+
+L_cured:
+ if (@Q_status == @Q_STATUS_COMPLETED) goto L_cured_choice;
+ mes "[Omar]";
+ mes "\"She is sleeping now, but she seems to be much better. I am sure that she will be up and running around again soon.\"";
+ goto L_close;
+
+L_cured_choice:
+ mes "[Omar]";
+ mes "\"I am very grateful for your help. I really was sure that it was Ponderpox, not Mopox, that she had.\"";
+ next;
+ menu
+ "Oh, it was nothing.", L_cured_nothing,
+ "I didn't do it alone; Elanore helped.", L_cured_elanore,
+ "That will be 5000 GP.", L_Next1;
+
+L_Next1:
+ mes "[Omar]";
+ mes "\"Ah, certainly.\"";
+ mes "He hands you a small bag of money.";
+ next;
+ @Q_status = @Q_STATUS_COMPLETED_NOELANORE;
+ callsub S_Update_Var;
+ Zeny = Zeny + 5000;
+ goto L_close;
+
+L_cured_nothing:
+ mes "[Omar]";
+ mes "\"No, this wasn't nothing. She is everything to me. Here, you deserve a reward.\"";
+ mes "He hands you a bag of money containing 10,000 GP and two pearls.";
+ mes "\"And feel free to drop by again whenever you would like!\"";
+ @Q_status = @Q_STATUS_COMPLETED_NOELANORE;
+ callsub S_Update_Var;
+ getitem "Pearl", 2;
+ Zeny = Zeny + 10000;
+ goto L_close;
+
+L_cured_elanore:
+ mes "[Omar]";
+ mes "Omar frowns.";
+ mes "\"That witch? You worked with her without telling me?\"";
+ mes "He looks over to his daughter, concern suddenly in his eyes.";
+ mes "\"She is looking better, though...\"";
+ next;
+ mes "[Omar]";
+ mes "Omar shakes his head.";
+ mes "\"I will have to think about this. Please leave me alone.\"";
+ next;
+ @Q_status = @Q_STATUS_COMPLETED_ELANORE;
+ callsub S_Update_Var;
+ goto L_close;
+
+L_close:
+ @Q_STATUS_KNOWS_MOPOX = 0;
+ @Q_STATUS_MADE_MOPOX = 0;
+ @Q_STATUS_DIDNT_DRINK = 0;
+ @Q_STATUS_WANTS_CHOCOCAKE = 0;
+ @Q_STATUS_WANTS_ORANGECUPCAKE = 0;
+ @Q_STATUS_COMPLETED = 0;
+ @Q_STATUS_COMPLETED_ELANORE = 0;
+ @Q_STATUS_COMPLETED_NOELANORE = 0;
+ @Q_STATUS_COMPLETED_POST_ELANORE = 0;
+ @Q_status = 0;
+ close;
+
+
+S_Update_Var:
+ QUEST_MAGIC2 = (QUEST_MAGIC2 & ~(NIBBLE_3_MASK) | (@Q_status << NIBBLE_3_SHIFT));
+ return;
+}
+
+002-2,124,124,0 script Kadiya NPC174,{
+ @child_number = 7;
+ callfunc "XmasList";
+
+ @Q_MASK = NIBBLE_3_MASK;
+ @Q_SHIFT = NIBBLE_3_SHIFT;
+ callfunc "KadiyaSubquestConsts";
+ @Q_status = @Q_kadiya_status;
+ if (@Q_status >= @Q_STATUS_COMPLETED) goto L_cured;
+
+ mes "You see a young girl lying in bed. At first she doesn't seem to notice you approaching.";
+ mes "Finally, she turns her head towards you. Judging from the sweat on her forehead and look in her eyes, she is suffering from some kind of fever.";
+ next;
+ mes "[Kadiya]";
+ mes "\"Hello,\" she says in a tiny voice.";
+ next;
+ @M_NAME = 1;
+ @M_CANDY = 2;
+ @M_POTION = 3;
+ @M_CHOCOCAKE = 4;
+ @M_CUPCAKE = 5;
+
+ setarray @choice$, "Hello! What's your name?", "Would you like some candy?", "", "", "", "", "", "";
+ setarray @choice_idx, @M_NAME, @M_CANDY, 0, 0, 0, 0, 0, 0;
+ @choices_nr = 2;
+
+ if (countitem("MopoxCurePotion") == 0) goto L_M_no_cure;
+
+ @choice_idx[@choices_nr] = @M_POTION;
+ @choice$[@choices_nr] = "This potion will cure your illness!";
+ @choices_nr = @choices_nr + 1;
+ goto L_M_no_cure;
+
+L_M_no_cure:
+ if ((countitem("LacedChocolateCake") == 0) || (@Q_status != @Q_STATUS_WANTS_CHOCOCAKE))
+ goto L_M_no_chococake;
+ @choice_idx[@choices_nr] = @M_CHOCOCAKE;
+ @choice$[@choices_nr] = "Would you like special chocolate cake?";
+ @choices_nr = @choices_nr + 1;
+ goto L_M_no_chococake;
+
+L_M_no_chococake:
+ if ((countitem("LacedOrangeCupcake") == 0) || (@Q_status != @Q_STATUS_WANTS_ORANGECUPCAKE))
+ goto L_M_no_cupcake;
+ @choice_idx[@choices_nr] = @M_CUPCAKE;
+ @choice$[@choices_nr] = "Would you like special orange cupcake?";
+ @choices_nr = @choices_nr + 1;
+ goto L_M_no_cupcake;
+
+L_M_no_cupcake:
+ @choice_idx[@choices_nr] = 0;
+ @choice$[@choices_nr] = "Goodbye.";
+ @choices_nr = @choices_nr + 1;
+
+ menu
+ @choice$[0], L_MenuItems,
+ @choice$[1], L_MenuItems,
+ @choice$[2], L_MenuItems,
+ @choice$[3], L_MenuItems,
+ @choice$[4], L_MenuItems,
+ @choice$[5], L_MenuItems;
+
+L_MenuItems:
+ @choice = @choice_idx[@menu - 1];
+
+ if (@choice == @M_NAME) goto L_name;
+ if (@choice == @M_CANDY) goto L_No_candy;
+ if (@choice == @M_POTION) goto L_Potion;
+ if (@choice == @M_CHOCOCAKE) goto L_chococake;
+ if (@choice == @M_CUPCAKE) goto L_cupcake;
+ goto L_close;
+
+L_name:
+ mes "[Kadiya]";
+ mes "She smiles a faint smile.";
+ mes "\"My name is Kadiya.\"";
+ goto L_close;
+
+L_No_candy:
+ mes "[Kadiya]";
+ mes "She hesitates for a moment.";
+ mes "\"No, thank you. I don't think I should.\"";
+ goto L_close;
+
+L_Potion:
+ mes "[Kadiya]";
+ if (@Q_status < @Q_STATUS_DIDNT_DRINK) set @Q_status, @Q_STATUS_DIDNT_DRINK;
+ callsub S_Update_Var;
+
+ mes "Kadiya grimaces and pushes the bottle away.";
+ mes "\"That smells terrible!\"";
+ next;
+ mes "[Kadiya]";
+ mes "She pulls the sheets over her head.";
+ mes "\"I won't drink that!\"";
+ goto L_close;
+
+L_chococake:
+ delitem "LacedChocolateCake", 1;
+ goto L_do_cure;
+
+L_cupcake:
+ delitem "LacedOrangeCupcake", 1;
+ goto L_do_cure;
+
+L_do_cure:
+ if (@Q_status < @Q_STATUS_COMPLETED) set @Q_status, @Q_STATUS_COMPLETED;
+ callsub S_Update_Var;
+
+ mes "[Kadiya]";
+ mes "Kadiya's eyes widen.";
+ mes "\"Oh! Daddy, is it okay if I eat this?\"";
+ mes "Omar nods and smiles. \"You should eat a bit to regain your strength, sweetheart.\"";
+ next;
+ mes "[Kadiya]";
+ mes "Kadiya devours your gift in just a handful of bites.";
+ next;
+ mes "[Kadiya]";
+ mes "She smiles. \"Thank you! I feel better already!\".";
+ next;
+ mes "[Kadiya]";
+ mes "She looks much healthier, too. Omar walks over and touches her forehead.";
+ mes "\"Now that is funny – your fever has gone down quite a bit!\"";
+ mes "He smiles at you. \"Thank you for your help!\"";
+ next;
+ mes "[Kadiya]";
+ mes "\"You should get some sleep now, sweetheart. I'm sure that you will be better soon.\"";
+ goto L_close;
+
+L_cured:
+ mes "[Kadiya]";
+ mes "Kadiya seems to be sleeping calmly. She looks much less sweaty than earlier; unless you are very much mistaken, her fever has disappeared.";
+ goto L_close;
+
+L_close:
+ @Q_status = 0;
+ @Q_MASK = 0;
+ @Q_SHIFT = 0;
+ @M_NAME = 0;
+ @M_CANDY = 0;
+ @M_POTION = 0;
+ @M_CHOCOCAKE = 0;
+ @M_CUPCAKE = 0;
+ @choice = 0;
+ @choices_nr = 0;
+ cleararray @choice_idx[0], 0, 7;
+ cleararray @choice$[0], "", 7;
+ close;
+
+S_Update_Var:
+ QUEST_MAGIC2 = (QUEST_MAGIC2 & ~(@Q_MASK) | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/002-2/phaet.txt b/npc/002-2/phaet.txt
new file mode 100644
index 00000000..e9342bb5
--- /dev/null
+++ b/npc/002-2/phaet.txt
@@ -0,0 +1,28 @@
+
+002-2,75,56,0 script Phaet NPC125,0,0,{
+ mes "[Phaet the Royal Guard]";
+ mes "\"Hey, you seem tough enough! Would you like to prove your skills? I'll let you in the arena if you give me 50 gp. You can fight against other players there.\"";
+ next;
+ menu
+ "Yes", L_Sure,
+ "No", L_Next;
+
+L_Next:
+ mes "[Phaet the Royal Guard]";
+ mes "\"Ha ha, coward.\"";
+ close;
+
+L_Sure:
+ if (Zeny < 50) goto L_NoMoney;
+ Zeny = Zeny - 50;
+
+ mes "[Phaet the Royal Guard]";
+ mes "\"Get ready!\"";
+ next;
+ warp "001-3", 0, 0;
+ close;
+
+L_NoMoney:
+ mes "\"Wait a second, you don't have enough money.\"";
+ close;
+}
diff --git a/npc/002-2/rebecca.txt b/npc/002-2/rebecca.txt
new file mode 100644
index 00000000..8524dfa4
--- /dev/null
+++ b/npc/002-2/rebecca.txt
@@ -0,0 +1,82 @@
+
+002-2,44,27,0 script Rebecca NPC118,{
+ @npcname$ = "Rebecca the Inn Keeper";
+ @Cost = 100;
+ mes "[" + @npcname$ + "]";
+ mes "\"Welcome to 'The Wizard's Rest'\"";
+ goto L_MainMenu;
+
+L_MainMenu:
+ mes "\"How may I help you?\"";
+ menu
+ "Can I get a room?", L_Inn,
+ "Any interesting guests?", L_Guests,
+ "Bakery?", L_Bakery,
+ "Barber?", L_Barber,
+ "Casino?", L_Casino,
+ "Theatre?", L_Theatre,
+ "Pvp?", L_Pvp,
+ "I don't need any help, thanks.", L_close;
+
+L_Guests:
+ mes "\"We had a very rich business man show up the other day.\"";
+ next;
+ mes "\"He caused quite a stir when he paid for the penthouse so far in advance.";
+ mes "I hear he is looking for help.\"";
+ next;
+ mes "\"Other then that feel free to mingle with the guests.\"";
+ next;
+ mes "\"You can find them in the door behind me.\"";
+ goto L_close;
+
+
+L_Bakery:
+ mes "\"Ahh yes, the World Famous Riskim's bakery.\"";
+ next;
+ mes "\"They only use the finest ingredients like Acorn Flour";
+ mes "to make some of the tastest treats in Tonori.\"";
+ next;
+ mes "Second only to the Wizards' private chef, Fieri.\"";
+ goto L_MainMenu;
+
+L_Barber:
+ mes "\"Issay the barber of Tonori can be found through the door behind me\"";
+ next;
+ mes "\"The master stylist can do anything with anyones hair.\"";
+ next;
+ mes "\"He always welcomes walk ins.\"";
+ goto L_MainMenu;
+
+L_Casino:
+ mes "\"Games, Games, Games.\"";
+ next;
+ mes "\"Test your luck or skill in the Casino. From Blackjack to Pvp.\"";
+ next;
+ mes "\"Win or Lose, you'll still have fun!\"";
+ goto L_MainMenu;
+
+L_Theatre:
+ mes "\"A touring troop from Hurnscald just arrived.\"";
+ next;
+ mes "\"The are currently rehearsing for their next show.\"";
+ next;
+ mes "\"Feel free to talk to the troupe leader, they are in the theatre behind me.\"";
+ goto L_MainMenu;
+
+L_Pvp:
+ mes "\"Yes, our Casino has Pvp in the Casino behind me.\"";
+ next;
+ mes "\"Test your self against other players and gamble on the outcome.\"";
+ next;
+ mes "\"Fame and glory awaits you gladiator!\"";
+ goto L_MainMenu;
+
+L_Inn:
+ callfunc "Inn";
+ goto L_close;
+
+L_close:
+ @npcname$ = "";
+ @Cost = 0;
+ close;
+}
diff --git a/npc/002-2/shops.txt b/npc/002-2/shops.txt
new file mode 100644
index 00000000..0054c290
--- /dev/null
+++ b/npc/002-2/shops.txt
@@ -0,0 +1,18 @@
+// The Mana World Script
+// (C) Jesusalva, 2021
+// Licensed under GPLv2 or later
+
+002-2,68,25,0 script Bartender#Casino NPC112,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Beer;
+ sellitem Cake;
+ sellitem CherryCake;
+ .distance = 5;
+ end;
+}
+
diff --git a/npc/002-2/stranger.txt b/npc/002-2/stranger.txt
new file mode 100644
index 00000000..3af0c57a
--- /dev/null
+++ b/npc/002-2/stranger.txt
@@ -0,0 +1,394 @@
+002-2,38,57,0 script Stranger NPC192,{
+ @iRONINGOT = 5;
+ @PINKANTENNA = 21;
+ @Exp = 20000;
+ setarray @towelReq$[0], "HitchhikersTowel";
+
+ if (FLAGS & FLAG_TOWEL_COMPLETED) goto L_Event_Done;
+ if ((gettimetick(2)-TUT_var < 6*7*86400) || (BaseLevel < 42)) //player must be created at least 6 weeks ago and at least level 42
+ goto L_No_Event;
+ if (FLAGS & FLAG_TOWEL_HELPED) goto L_Towel;
+
+ mes "[Stranger]";
+ mes "\"Hello, hello! It's great to see you. Maybe you can help me with a little problem I have.\"";
+ next;
+ mes "\"I need some materials to repair my spacesh- ahm, it's not important why I need it.\"";
+ next;
+ mes "\"Anyway, I'd be really happy if you can give me " + @iRONINGOT + " Iron Ingots and " + @PINKANTENNA + " Pink Antennas.\"";
+ next;
+ mes "\"Do you have that for me?\"";
+ menu
+ "Yeah, sure.",L_Items,
+ "No.",L_close;
+
+L_Items:
+ if (countitem("IronIngot") < @iRONINGOT) goto L_No_Item;
+ if (countitem("PinkAntenna") < @PINKANTENNA) goto L_No_Item;
+ delitem "IronIngot", @iRONINGOT;
+ delitem "PinkAntenna", @PINKANTENNA;
+ getexp @Exp, 0;
+ FLAGS = FLAGS | FLAG_TOWEL_HELPED;
+
+ mes "[Stranger]";
+ mes "\"Great! Thank you!\"";
+ next;
+ mes "\"I have a lot of work to do now. But before you leave...\"";
+ next;
+ goto L_Towel;
+
+L_Towel:
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_Full_Inv;
+ mes "[Stranger]";
+ mes "\"On May 25th it is a very special day - Towel Day.\"";
+ next;
+ mes "\"To celebrate this I'll ask you some questions about my favourite book, The Hitchhiker's Guide to the Galaxy. If you can answer them, I'll give you something very useful.\"";
+ next;
+ mes "";
+ mes "[Server]";
+ mes "The answers might need to have whitespaces.";
+ mes "If you're using a client which confirms your answer when pressing space, change this setting before continuing.";
+ mes "";
+ next;
+ mes "[Stranger]";
+ mes "\"The first one is easy.\"";
+ next;
+
+ 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 @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 @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?\"";
+ mes "";
+ mes "##BDrag & drop the item from your inventory##b.";
+ .@answer=requestitem();
+ if (.@answer != Towel && .@answer != HitchhikersTowel)
+ goto L_Wrong_Answer;
+
+ mes "[Stranger]";
+ mes "\"There you are! A towel is really the most important item for a hitchhiker to have.\"";
+ next;
+ mes "\"Please take this.\""; // no full inventory check, this is done before the game
+ FLAGS = FLAGS | FLAG_TOWEL_COMPLETED;
+ next;
+ goto L_Explain;
+
+L_Explain:
+ mes "[Stranger]";
+ mes "\"This towel is even more useful than usual towels are. If you change its color, it uses a special techno-, ahm, let's say, it can help you to get to other places.\"";
+ next;
+ mes "\"Bring me some powder made from gemstones and a bottle of water, and I can prepare it for you.\"";
+ next;
+ mes "\"Depending on the color it will bring you to different places. It might wear out after a while and it'll loose its color, but I can prepare it for you again.\"";
+ next;
+ mes "\"Since I'm not familar with this plane-, ahm, with this area, I can't tell which places you will end up in.\"";
+ goto L_close;
+
+L_No_Event:
+ mes "[Stranger]";
+ mes "\"Hello. Isn't this a beautiful place?\"";
+ next;
+ mes "\"And it really comes in handy that I have my towel with me. A towel is about the most massively useful thing an inte- ahm, a person can have.\"";
+ next;
+ mes "\"You can read more about that in my favourite book, 'The Hitchhiker's Guide to the Galaxy'.\"";
+ if (FLAGS & FLAG_TOWEL_COMPLETED)
+ menu
+ "Thanks for the advice.",L_close,
+ "I have my towel with me too.",L_Dye;
+ goto L_close;
+
+L_Dye:
+ mes "[Stranger]";
+ mes "\"Wonderful! Let me have a look.\"";
+ mes "He's taking a very interested look at your towel.";
+ next;
+ mes "[Stranger]";
+ mes "\"I'm impressed. This is not an usual towel.\"";
+ next;
+ menu
+ "Oh? Can you explain about it?",L_Explain,
+ "I know. Could you dye it for me?",L_StartDyeTowel,
+ "It's great, isn't it? I have to go now.",L_close;
+
+L_No_Item:
+ mes "[Stranger]";
+ mes "\"Hu? It seems you haven't.\"";
+ goto L_close;
+
+L_Wrong_Answer:
+ mes "[Stranger]";
+ mes "\"Nah, that's wrong. Come back if you want to try again.\"";
+ goto L_close;
+
+L_Event_Done:
+ mes "[Stranger]";
+ mes "\"Ah, welcome back. Thanks again for your help.\"";
+ next;
+ mes "\"Shall I dye your towel?\"";
+ menu
+ "That would be great!", L_StartDyeTowel,
+ "No, thanks.", L_close;
+
+L_StartDyeTowel:
+ mes "[Stranger]";
+ mes "\"Alright, which color do you want?\"";
+ menu
+ "Red",L_Red,
+ "Yellow",L_Yellow,
+ "White",L_White,
+ "Blue",L_Blue,
+ "Green",L_Green,
+ "Purple",L_Purple,
+ "Orange",L_Orange,
+ "Pink",L_Pink,
+ "Lime",L_Lime,
+ "Teal",L_Teal,
+ "I changed my mind.", L_close;
+
+L_White:
+ // Koga
+ @warpTowelName$ = "WhiteHitchhikersTowel";
+ setarray @towelPowder$, "DiamondPowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Red:
+ // Barbarians
+ @warpTowelName$ = "RedHitchhikersTowel";
+ setarray @towelPowder$, "RubyPowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Green:
+ // Candor
+ @warpTowelName$ = "GreenHitchhikersTowel";
+ setarray @towelPowder$, "EmeraldPowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Blue:
+ // Blue Sages
+ @warpTowelName$ = "BlueHitchhikersTowel";
+ setarray @towelPowder$, "SapphirePowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Yellow:
+ // Tulimshar Mines
+ @warpTowelName$ = "YellowHitchhikersTowel";
+ setarray @towelPowder$, "TopazPowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Purple:
+ // Dimonds Inn
+ @warpTowelName$ = "PurpleHitchhikersTowel";
+ setarray @towelPowder$, "AmethystPowder";
+ setarray @towelPowderCnt, 2;
+ goto L_DyeChecks;
+
+L_Orange:
+ // Graveyard
+ @warpTowelName$ = "OrangeHitchhikersTowel";
+ setarray @towelPowder$, "RubyPowder", "TopazPowder";
+ setarray @towelPowderCnt, 1, 1;
+ goto L_DyeChecks;
+
+L_Pink:
+ // Terranite Cave
+ @warpTowelName$ = "PinkHitchhikersTowel";
+ setarray @towelPowder$, "RubyPowder", "DiamondPowder";
+ setarray @towelPowderCnt, 1, 1;
+ goto L_DyeChecks;
+
+L_Teal:
+ // Mana Seed
+ @warpTowelName$ = "TealHitchhikersTowel";
+ setarray @towelPowder$, "EmeraldPowder", "SapphirePowder";
+ setarray @towelPowderCnt, 1, 1;
+ goto L_DyeChecks;
+
+L_Lime:
+ // Panchua
+ @warpTowelName$ = "LimeHitchhikersTowel";
+ setarray @towelPowder$, "EmeraldPowder", "TopazPowder";
+ setarray @towelPowderCnt, 1, 1;
+ goto L_DyeChecks;
+
+L_DyeChecks:
+ mes "[Stranger]";
+ mes "\"Ok, I'll need a bottle of water first.\"";
+ next;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_Full_Inv;
+ if (countitem("BottleOfWater") < 1) goto L_No_Water;
+ @powderCheckCount = 0;
+ goto L_PowderChecks;
+
+L_PowderCheckAgain:
+ mes "[Stranger]";
+ mes "\"Now I need " + @towelPowderCnt[@powderCheckCount] + " " + @towelPowder$[@powderCheckCount] + ".\"";
+ next;
+ if((@powderCheckCount + 1) == getarraysize(@towelPowder$))
+ goto L_TowelChecks;
+ @powderCheckCount = (@powderCheckCount + 1);
+ goto L_PowderChecks;
+
+L_PowderChecks:
+ if (countitem(@towelPowder$[@powderCheckCount]) < @towelPowderCnt[@powderCheckCount])
+ goto L_No_Powder;
+ goto L_PowderCheckAgain;
+
+L_TowelCheckAgain:
+ @towelCheckCount = (@towelCheckCount + 1);
+ if(@towelCheckCount >= getarraysize(@towelReq$))
+ goto L_No_Towel;
+ goto L_TowelChecks;
+
+L_TowelChecks:
+ if (countitem(@towelReq$[@towelCheckCount]) > 0)
+ goto L_DeletePowder;
+ goto L_TowelCheckAgain;
+
+L_DeleteAgain:
+ @powderCheckCount = (@powderCheckCount - 1);
+ goto L_DeletePowder;
+
+L_DeletePowder:
+ delitem @towelPowder$[@powderCheckCount], @towelPowderCnt[@powderCheckCount];
+ if (@powderCheckCount)
+ goto L_DeleteAgain;
+ goto L_DyeTowel;
+
+L_DyeTowel:
+ delitem @towelReq$[@towelCheckCount], 1;
+ delitem "BottleOfWater", 1;
+ getitem @warpTowelName$, 1;
+ mes "He takes your towel, the water and the gem powder, then he turns away and does something you can't see. After a few minutes, he turns to you again.";
+ next;
+ mes "[Stranger]";
+ mes "\"Done! It'll use its color after being used, but just come back and I can dye it again for you.\"";
+ goto L_close;
+
+L_No_Water:
+ mes "[Stranger]";
+ mes "\"You don't have water.\"";
+ goto L_close;
+
+L_No_Powder:
+ mes "[Stranger]";
+ mes "\"You need to bring me enough gem powder in that color. Maybe someone used to mining can help you with that.\"";
+ goto L_close;
+
+L_No_Towel:
+ mes "[Stranger]";
+ mes "\"Where's your towel? It is really useful, you should always keep it with you.\"";
+ goto L_close;
+
+L_Full_Inv:
+ mes "[Stranger]";
+ mes "\"You carry a lot of stuff with you, don't you? Maybe you should get rid of something.\"";
+ goto L_close;
+
+L_close:
+ @iRONINGOT = 0;
+ @PINKANTENNA = 0;
+ @Exp = 0;
+ @random = 0;
+ @quizparam$ = "";
+ @warpTowelName$ = "";
+ @powderCheckCount = 0;
+ @towelCheckCount = 0;
+ cleararray @towelPowder$, "", getarraysize(@towelPowder$);
+ cleararray @towelPowderCnt, "", getarraysize(@towelPowderCnt);
+ close;
+}
diff --git a/npc/002-2/troupe_leader.txt b/npc/002-2/troupe_leader.txt
new file mode 100644
index 00000000..7243be84
--- /dev/null
+++ b/npc/002-2/troupe_leader.txt
@@ -0,0 +1,61 @@
+
+002-2,81,21,0 script Troupe Leader NPC165,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (@inspector == 4) goto L_NohMask_Troupe;
+ if (@inspector == 13) goto L_NohMask_Found;
+
+ mes "[Troupe Leader]";
+ mes "\"Hello. I'm the leader of a traveling theater troupe. We'll be staying here in Tulimshar for a while.\"";
+ goto L_close;
+
+L_NohMask_Troupe:
+ mes "[Troupe Leader]";
+ mes "\"Yes, a mask was stolen from us the last night we were in Hurnscald.\"";
+ next;
+ menu
+ "Any ideas on who might have taken it?", L_NohMask_Idea,
+ "Are you sure one of your troupe members didn't hide it and commit those robberies?", L_NohMask_Accuse,
+ "Hmm...", L_close;
+
+L_NohMask_Idea:
+ @inspector = 5;
+ callsub S_Update_Mask;
+ mes "[Troupe Leader]";
+ mes "\"Hm...I did see an old man hang out near the theater after our last show.\"";
+ goto L_close;
+
+L_NohMask_Accuse:
+ mes "[Troupe Leader]";
+ mes "\"I am absolutely positive. None of my troupe have left the city since we got here. Good day!\"";
+ goto L_close;
+
+L_NohMask_Found:
+ mes "[Troupe Leader]";
+ mes "\"Thank you for finding the mask. You did such a good job, you should keep it.\"";
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_NohMask_TooMany;
+ mes "[1500 experience points]";
+ getexp 1500, 0;
+ @inspector = 14;
+ callsub S_Update_Mask;
+ getitem "NohMask", 1;
+ next;
+ mes "[Troupe Leader]";
+ mes "\"We don't need it anymore. We're doing different shows here.\"";
+ goto L_close;
+
+L_NohMask_TooMany:
+ next;
+ mes "[Troupe Leader]";
+ mes "\"Except, you don't seem to have any room for it. I'll hold onto it for you until you do have room.\"";
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+
+S_Update_Mask:
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_3_MASK)) | (@inspector << NIBBLE_3_SHIFT);
+ return;
+}
diff --git a/npc/002-3/_import.txt b/npc/002-3/_import.txt
new file mode 100644
index 00000000..ce2e20be
--- /dev/null
+++ b/npc/002-3/_import.txt
@@ -0,0 +1,8 @@
+// Map 002-3: Tulimshar Mining Camp
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/002-3/_warps.txt",
+"npc/002-3/mapflags.txt",
+"npc/002-3/merchant.txt",
+"npc/002-3/mining_camp_barrier.txt",
+"npc/002-3/nathan.txt",
+"npc/002-3/traveler.txt",
diff --git a/npc/002-3/_warps.txt b/npc/002-3/_warps.txt
new file mode 100644
index 00000000..916086cb
--- /dev/null
+++ b/npc/002-3/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 002-3: Tulimshar Mining Camp warps
+002-3,22,87,0 warp #002-3_22_87 0,0,043-3,31,27
+002-3,85,51,0 warp #002-3_85_51 0,0,002-1,92,115
+002-3,51,36,0 warp #002-3_51_36 0,0,002-1,33,110
diff --git a/npc/002-3/mapflags.txt b/npc/002-3/mapflags.txt
new file mode 100644
index 00000000..46f04c89
--- /dev/null
+++ b/npc/002-3/mapflags.txt
@@ -0,0 +1 @@
+//002-3 mapflag resave 002-3,72,66
diff --git a/npc/002-3/merchant.txt b/npc/002-3/merchant.txt
new file mode 100644
index 00000000..0b6bebfb
--- /dev/null
+++ b/npc/002-3/merchant.txt
@@ -0,0 +1,19 @@
+// The Mana World Script
+// (C) Jesusalva, 2021
+// Licensed under GPLv2 or later
+
+002-3,60,47,0 script Ishyah NPC109,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem MinersHat;
+ sellitem MinerGloves;
+ sellitem ShortBow;
+ sellitem Arrow, 2;
+ sellitem LeatherShield;
+ .distance = 5;
+ end;
+}
diff --git a/npc/002-3/mining_camp_barrier.txt b/npc/002-3/mining_camp_barrier.txt
new file mode 100644
index 00000000..7a6acb74
--- /dev/null
+++ b/npc/002-3/mining_camp_barrier.txt
@@ -0,0 +1,13 @@
+002-3,82,32,0 script #Sandstorm_Mine_Barrier NPC45,0,0,{
+ if (QL_MINEALL >= 8) goto L_Barrier_Open;
+
+ message strcharinfo(0), "Some force seems to block your entrance.";
+ goto L_End;
+
+L_Barrier_Open:
+ warp "002-4",37,31;
+ goto L_End;
+
+L_End:
+ end;
+}
diff --git a/npc/002-3/nathan.txt b/npc/002-3/nathan.txt
new file mode 100644
index 00000000..0e6a9c26
--- /dev/null
+++ b/npc/002-3/nathan.txt
@@ -0,0 +1,103 @@
+002-3,42,45,6 script Nathan NPC109,{
+ if (QL_MINEALL >= 20) goto L_Nathan_Complete;
+ if (QL_MINEALL == 19) goto L_Nathan_UGQ_Naem;
+ if (QL_MINEALL == 18) goto L_Nathan_Help_Cool;
+ if (QL_MINEALL == 17) goto L_Nathan_Help_Done;
+ if (QL_MINEALL == 16) goto L_Nathan_Waits_3;
+ if (QL_MINEALL == 15) goto L_Nathan_Help_3;
+ if (QL_MINEALL == 14) goto L_Nathan_Waits_2;
+ if (QL_MINEALL == 13) goto L_Nathan_Help_2;
+ if (QL_MINEALL == 12) goto L_Nathan_Waits_1;
+ if (QL_MINEALL == 11) goto L_Nathan_Help_1;
+ if (QL_MINEALL == 9) goto L_Nathan_Cool;
+ if (QL_MINEALL == 8) goto L_Nathan_Okay;
+
+ mes "[Nathan the Miner]";
+ mes "\"It's very dangerous in here. We had a big earthquake here just recently, too... so be careful!\"";
+ goto L_close;
+
+L_Nathan_Okay:
+ QL_MINEALL = 9;
+ mes "[Nathan]";
+ mes "\"Hey there! Just mining away down here. You say Nickos was worried about us? Nothing down here we can't handle, but you should try to be safe down here yourself. The monsters can be rather aggressive. Come to think of it, you might want to check on Naem to make sure he's okay. You can find him in the southeast parts of the mine.\"";
+ goto L_close;
+
+L_Nathan_Cool:
+ mes "[Nathan]";
+ mes "\"Hey, be careful down here, the monsters can be rather aggressive! You might want to check on Naem too. He's at the southeast parts of the mine.\"";
+ goto L_close;
+
+L_Nathan_Help_1:
+ QL_MINEALL = 12;
+ mes "[Nathan]";
+ mes "\"Oh, hey again! Nickos told you we need some help down here too? Yeah, Naem could use a spare pair of hands moving his bags of ore to me. He's got a lot of work built up. Just go talk to him and he'll give you the bags. You might have to make a few trips, but I'll make it worth your troubles.\"";
+ goto L_close;
+
+L_Nathan_Waits_1:
+ mes "[Nathan]";
+ mes "\"Naem could use some help moving his bags of ore to me. He's got a lot of work built up. Just go talk to him and he'll give you the bags. You might have to make a few trips, but I'll make it worth your troubles.\"";
+ goto L_close;
+
+L_Nathan_Help_2:
+ QL_MINEALL = 14;
+ mes "You give the bag of ore to Nathan";
+ next;
+ mes "[Nathan]";
+ mes "\"Ah, thank you. Just a couple more and we'll have caught up!\"";
+ goto L_close;
+
+L_Nathan_Waits_2:
+ mes "[Nathan]";
+ mes "\"Just a couple more and we'll be all caught up!\"";
+ goto L_close;
+
+L_Nathan_Help_3:
+ QL_MINEALL = 16;
+ mes "You hand the bag of ore to Nathan.";
+ next;
+ mes "[Nathan]";
+ mes "\"Just one more bag and you'll be done!\"";
+ goto L_close;
+
+L_Nathan_Waits_3:
+ mes "[Nathan]";
+ mes "\"Just get one more bag of ore from Naem and bring it to me and you'll be done.\"";
+ goto L_close;
+
+L_Nathan_Help_Done:
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Nathan_TooMany;
+ QL_MINEALL = 18;
+ getitem "MinersHat", 1;
+ mes "[Nathan]";
+ mes "You hand the bag of ore to Nathan.";
+ next;
+ mes "\"Ah, that should be it! Thank you for your help. Here, take this Miner's Hat. You're a real miner now!\"";
+ next;
+ mes "\"Oh, and I noticed a problem with these angry scorpions down here, they seem to make things much more difficult. Maybe you could tell Nickos about it on your way out?\"";
+ goto L_close;
+
+L_Nathan_TooMany:
+ mes "[Nathan]";
+ mes "\"You have too many items for me to give you a reward.\"";
+ goto L_close;
+
+L_Nathan_Help_Cool:
+ mes "[Nathan]";
+ mes "\"Be safe down here, it's dangerous for the unexperienced. Mining is a dangerous job, but somebody's got to do it!\"";
+ goto L_close;
+
+L_Nathan_UGQ_Naem:
+ mes "[Nathan]";
+ mes "\"Thanks for thinning down the angry scorpion population. It sure has made mining a little easier down here! Oh, you say Nickos has given you permission to check out the underground palace? Talk to Naem, he's got the key and the code.\"";
+ goto L_close;
+
+L_Nathan_Complete:
+ mes "[Nathan]";
+ mes "\"Mining is a dangerous job, but somebody's got to do it!\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/002-3/traveler.txt b/npc/002-3/traveler.txt
new file mode 100644
index 00000000..5fc218c6
--- /dev/null
+++ b/npc/002-3/traveler.txt
@@ -0,0 +1,7 @@
+
+002-3,25,28,0 script Jena the Traveler NPC103,{
+ @npcname$ = "Jena";
+ @NpcTravelBit = $@tul_mine_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/002-4/_import.txt b/npc/002-4/_import.txt
new file mode 100644
index 00000000..8f131fe5
--- /dev/null
+++ b/npc/002-4/_import.txt
@@ -0,0 +1,10 @@
+// Map 002-4: Desert Mines
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/002-4/_mobs.txt",
+"npc/002-4/_warps.txt",
+"npc/002-4/mapflags.txt",
+"npc/002-4/mine_triggerone.txt",
+"npc/002-4/mine_triggerthree.txt",
+"npc/002-4/mine_triggertwo.txt",
+"npc/002-4/naem.txt",
+"npc/002-4/underground_palace_barrier.txt",
diff --git a/npc/002-4/_mobs.txt b/npc/002-4/_mobs.txt
new file mode 100644
index 00000000..28c543d4
--- /dev/null
+++ b/npc/002-4/_mobs.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 002-4: Desert Mines mobs
+002-4,39,37,7,5 monster Cave Maggot 1056,5,100000,30000
+002-4,91,41,8,10 monster Angry Fire Goblin 1108,3,100000,30000
+002-4,71,35,12,8 monster Cave Maggot 1056,4,100000,30000
+002-4,69,100,4,2 monster Angry Fire Goblin 1108,2,100000,30000
+002-4,68,57,13,12 monster Angry Scorpion 1057,5,100000,30000
+002-4,49,58,2,7 monster Angry Scorpion 1057,5,100000,30000
+002-4,38,76,7,11 monster Angry Scorpion 1057,4,100000,30000
+002-4,58,78,3,8 monster Cave Maggot 1056,4,100000,30000
+002-4,89,68,5,16 monster Angry Scorpion 1057,4,100000,30000
+002-4,84,93,9,8 monster Cave Maggot 1056,4,100000,30000
+002-4,72,77,10,7 monster Angry Fire Goblin 1108,3,100000,30000
+002-4,67,91,5,6 monster Angry Scorpion 1057,4,100000,30000
+002-4,58,95,3,6 monster Cave Maggot 1056,4,100000,30000
+002-4,63,100,1,2 monster Angry Scorpion 1057,3,100000,30000
diff --git a/npc/002-4/_warps.txt b/npc/002-4/_warps.txt
new file mode 100644
index 00000000..2cf2135b
--- /dev/null
+++ b/npc/002-4/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 002-4: Desert Mines warps
+002-4,37,29,0 warp #002-4_37_29 0,0,002-3,82,30
diff --git a/npc/002-4/mapflags.txt b/npc/002-4/mapflags.txt
new file mode 100644
index 00000000..6b70b328
--- /dev/null
+++ b/npc/002-4/mapflags.txt
@@ -0,0 +1 @@
+//002-4 mapflag resave 002-3,72,66
diff --git a/npc/002-4/mine_triggerone.txt b/npc/002-4/mine_triggerone.txt
new file mode 100644
index 00000000..66da2a04
--- /dev/null
+++ b/npc/002-4/mine_triggerone.txt
@@ -0,0 +1,49 @@
+002-4,30,47,0 script Button#mine-1 NPC400,0,0,{
+ if (QL_MINEALL == 24) goto L_Trigger_Wrong_1;
+ if (QL_MINEALL == 23) goto L_Trigger_Wrong_1;
+ if (QL_MINEALL == 22) goto L_Trigger_1;
+
+ mes "There is a large button on the ground. A key hole appears on the button.";
+ goto L_close;
+
+L_Trigger_Wrong_1:
+ mes "There is a large button on the ground. A key hole appears on the button.";
+ menu
+ "Put the key in, turn right.", L_Right_Wrong_1,
+ "Put the key in, turn left.", L_Left_Wrong_1,
+ "Do nothing.", L_Nothing_1;
+
+L_Right_Wrong_1:
+ QL_MINEALL = 22;
+ mes "You turn the key right.";
+ goto L_close;
+
+L_Left_Wrong_1:
+ QL_MINEALL = 22;
+ mes "You turn the key left.";
+ goto L_close;
+
+L_Trigger_1:
+ mes "There is a large button on the ground. A key hole appears on the button.";
+ menu
+ "Put the key in, turn right.", L_Right_1,
+ "Put the key in, turn left.", L_Left_1,
+ "Do nothing.", L_Nothing_1;
+
+L_Right_1:
+ QL_MINEALL = 23;
+ mes "You turn the key right. A clicking sound echoes throughout the mine.";
+ goto L_close;
+
+L_Left_1:
+ QL_MINEALL = 22;
+ mes "You turn the key left.";
+ goto L_close;
+
+L_Nothing_1:
+ mes "You leave the button alone.";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/002-4/mine_triggerthree.txt b/npc/002-4/mine_triggerthree.txt
new file mode 100644
index 00000000..b7f197ed
--- /dev/null
+++ b/npc/002-4/mine_triggerthree.txt
@@ -0,0 +1,49 @@
+002-4,91,99,0 script Button#mine-3 NPC400,0,0,{
+ if (QL_MINEALL == 24) goto L_Trigger_Wrong_3;
+ if (QL_MINEALL == 23) goto L_Trigger_3;
+ if (QL_MINEALL == 22) goto L_Trigger_Wrong_3;
+
+ mes "There is a large button on the ground. A key hole appears on the button.";
+ goto L_close;
+
+L_Trigger_Wrong_3:
+ mes "There is a large button on the ground. A key hole appears on the button.";
+ menu
+ "Put the key in, turn right.", L_Right_Wrong_3,
+ "Put the key in, turn left.", L_Left_Wrong_3,
+ "Do nothing.", L_Nothing_3;
+
+L_Right_Wrong_3:
+ QL_MINEALL = 22;
+ mes "You turn the key right.";
+ goto L_close;
+
+L_Left_Wrong_3:
+ QL_MINEALL = 22;
+ mes "You turn the key left.";
+ goto L_close;
+
+L_Trigger_3:
+ mes "There is a large button on the ground. A key hole appears on the button.";
+ menu
+ "Put the key in, turn right.", L_Right_3,
+ "Put the key in, turn left.", L_Left_3,
+ "Do nothing.", L_Nothing_3;
+
+L_Right_3:
+ QL_MINEALL = 22;
+ mes "You turn the key right.";
+ goto L_close;
+
+L_Left_3:
+ QL_MINEALL = 24;
+ mes "You turn the key left. A clicking sound echoes throughout the mine.";
+ goto L_close;
+
+L_Nothing_3:
+ mes "You leave the button alone.";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/002-4/mine_triggertwo.txt b/npc/002-4/mine_triggertwo.txt
new file mode 100644
index 00000000..b43df27e
--- /dev/null
+++ b/npc/002-4/mine_triggertwo.txt
@@ -0,0 +1,50 @@
+002-4,100,37,0 script Button#mine-2 NPC400,0,0,{
+ if (QL_MINEALL == 24) goto L_Trigger_2;
+ if (QL_MINEALL == 23) goto L_Trigger_Wrong_2;
+ if (QL_MINEALL == 22) goto L_Trigger_Wrong_2;
+
+ mes "There is a large button on the ground. A key hole appears on the button.";
+ goto L_close;
+
+L_Trigger_Wrong_2:
+ mes "There is a large button on the ground. A key hole appears on the button.";
+ menu
+ "Put the key in, turn right.", L_Right_Wrong_2,
+ "Put the key in, turn left.", L_Left_Wrong_2,
+ "Do nothing.", L_Nothing_2;
+
+L_Right_Wrong_2:
+ QL_MINEALL = 22;
+ mes "You turn the key right.";
+ goto L_close;
+
+L_Left_Wrong_2:
+ QL_MINEALL = 22;
+ mes "You turn the key left.";
+ goto L_close;
+
+L_Trigger_2:
+ mes "There is a large button on the ground. A key hole appears on the button.";
+ menu
+ "Put the key in, turn right.", L_Right_2,
+ "Put the key in, turn left.", L_Left_2,
+ "Do nothing.", L_Nothing_2;
+
+L_Right_2:
+ QL_MINEALL = 22;
+ mes "You turn the key right.";
+ goto L_close;
+
+L_Left_2:
+ QL_MINEALL = 25;
+ FLAGS = FLAGS | FLAG_OPENED_UNDERGROUND;
+ mes "You turn the key left. A clicking sound echoes throughout the mine, followed by a loud thump.";
+ goto L_close;
+
+L_Nothing_2:
+ mes "You leave the button alone.";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/002-4/naem.txt b/npc/002-4/naem.txt
new file mode 100644
index 00000000..800fe92f
--- /dev/null
+++ b/npc/002-4/naem.txt
@@ -0,0 +1,132 @@
+002-4,91,96,6 script Naem NPC109,{
+ if (FLAGS & FLAG_GOT_NAEM_GLOVES) goto L_Naem_Complete;
+ if (FLAGS & FLAG_OPENED_UNDERGROUND) goto L_Naem_Gloves;
+ if (QL_MINEALL == 22) goto L_Naem_Code;
+ if (QL_MINEALL == 21) goto L_Naem_Lt;
+ if (QL_MINEALL == 20) goto L_Naem_Memory;
+ if ((QL_MINEALL > 17) && (QL_MINEALL < 19))
+ goto L_Naem_Great;
+ if (QL_MINEALL == 17) goto L_Naem_Waits_3;
+ if (QL_MINEALL == 16) goto L_Naem_Help_3;
+ if (QL_MINEALL == 15) goto L_Naem_Waits_2;
+ if (QL_MINEALL == 14) goto L_Naem_Help_2;
+ if (QL_MINEALL == 13) goto L_Naem_Waits_1;
+ if (QL_MINEALL == 12) goto L_Naem_Help_1;
+ if (QL_MINEALL == 10) goto L_Naem_Cool;
+ if (QL_MINEALL == 9) goto L_Naem_Okay;
+
+ mes "[Naem]";
+ mes "\"I'm just mining away here. Lots of work to do.\"";
+ goto L_close;
+
+L_Naem_Okay:
+ QL_MINEALL = 10;
+ mes "[Naem]";
+ mes "\"Oh, hello there. Nickos wanted you to check on me? Yeah, you can tell him I'm okay.\"";
+ goto L_close;
+
+L_Naem_Cool:
+ mes "[Naem]";
+ mes "\"Yeah, I'm cool. Just mining away here.\"";
+ goto L_close;
+
+L_Naem_Help_1:
+ QL_MINEALL = 13;
+ mes "[Naem]";
+ mes "\"Oh, you are here to help move my bags? Cool, I've got a few ready to go. Go ahead and take this one!\"";
+ next;
+ mes "Naem hands you a bag of ore.";
+ next;
+ mes "[Naem]";
+ mes "\"After you deliver that one to Nathan, come on back, I've got a couple more ready to go.\"";
+ goto L_close;
+
+L_Naem_Waits_1:
+ mes "[Naem]";
+ mes "\"After you deliver that bag of ore to Nathan, come on back, I've got a couple more ready to go.\"";
+ goto L_close;
+
+L_Naem_Help_2:
+ QL_MINEALL = 15;
+ mes "Naem gives you a bag of ore.";
+ next;
+ mes "[Naem]";
+ mes "\"Just one more after this one and we'll be all caught up!\"";
+ goto L_close;
+
+L_Naem_Waits_2:
+ mes "[Naem]";
+ mes "\"Just one more bag of ore after the one you got and we'll be all caught up!\"";
+ goto L_close;
+
+L_Naem_Help_3:
+ QL_MINEALL = 17;
+ mes "[Naem]";
+ mes "Hands a bag of ore to you.";
+ next;
+ mes "\"Last one!\"";
+ goto L_close;
+
+L_Naem_Waits_3:
+ mes "[Naem]";
+ mes "\"You got my last sack already. Just give it to Nathan and we'll have caught up.\"";
+ goto L_close;
+
+L_Naem_Great:
+ mes "[Naem]";
+ mes "\"Hi ho! It's off to work I go! I work every day for meager pay, a miner's life for me...\"";
+ goto L_close;
+
+L_Naem_Memory:
+ mes "You see Naem grimacing in pain as you approach.";
+ next;
+ mes "[Naem]";
+ mes "\"Oh, my head! Some rocks fell on me and bonked me pretty good. I'm still a little sore.\"";
+ menu
+ "Don't you have a key so I can go to the underground palace?", L_Naem_Palace_No,
+ "You should be more careful.", L_Naem_Duh;
+
+L_Naem_Duh:
+ mes "[Naem]";
+ mes "\"I guess I should...\"";
+ goto L_close;
+
+L_Naem_Palace_No:
+ QL_MINEALL = 21;
+ mes "[Naem]";
+ mes "\"Oh no! I lost the key! Don't worry though, talk to Lieutenant Dausen about getting the spare key.\"";
+ goto L_close;
+
+L_Naem_Lt:
+ mes "[Naem]";
+ mes "\"I hurt my head pretty bad. I also lost my key. If you want to get into the underground palace, you'll have to talk to Lieutenant Dausen about getting the spare.\"";
+ goto L_close;
+
+L_Naem_Code:
+ mes "[Naem]";
+ mes "\"Oh, you got the key. That is good! But my head still hurts... All I remember about the code is you have to put the key into the key hole buttons around the mine in a certain order and turn them in a certain order and it will unlock the underground palace. Sorry, that's all I have for you. Good luck!\"";
+ goto L_close;
+
+L_Naem_Gloves:
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Naem_TooMany;
+ FLAGS = FLAGS | FLAG_GOT_NAEM_GLOVES;
+ getitem "MinerGloves", 1;
+ mes "[Naem]";
+ mes "\"Hey, good job on getting that together! Take these gloves, they might prove useful in the underground palace.\"";
+ goto L_close;
+
+L_Naem_Complete:
+ mes "[Naem]";
+ mes "\"Yo-ho-ho, a miner's life for me!\"";
+ goto L_close;
+
+L_Naem_TooMany:
+ mes "[Naem]";
+ mes "\"You have too many items for me to give you a reward.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/002-4/underground_palace_barrier.txt b/npc/002-4/underground_palace_barrier.txt
new file mode 100644
index 00000000..c51d73be
--- /dev/null
+++ b/npc/002-4/underground_palace_barrier.txt
@@ -0,0 +1,13 @@
+002-4,68,98,0 script #UGP_Barrier NPC45,0,0,{
+ if (QL_MINEALL >= 25) goto L_Barrier_Open;
+
+ message strcharinfo(0), "Some force seems to block your entrance.";
+ goto L_End;
+
+L_Barrier_Open:
+ warp "002-5",35,97;
+ goto L_End;
+
+L_End:
+ end;
+}
diff --git a/npc/002-5/_import.txt b/npc/002-5/_import.txt
new file mode 100644
index 00000000..12cfc164
--- /dev/null
+++ b/npc/002-5/_import.txt
@@ -0,0 +1,7 @@
+// Map 002-5: Deep Desert Mines
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/002-5/_mobs.txt",
+"npc/002-5/_warps.txt",
+"npc/002-5/chest.txt",
+"npc/002-5/mapflags.txt",
+"npc/002-5/sema.txt",
diff --git a/npc/002-5/_mobs.txt b/npc/002-5/_mobs.txt
new file mode 100644
index 00000000..8d66439b
--- /dev/null
+++ b/npc/002-5/_mobs.txt
@@ -0,0 +1,19 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 002-5: Deep Desert Mines mobs
+002-5,37,89,6,3 monster Angry Fire Goblin 1108,3,100000,30000
+002-5,33,76,1,5 monster Cave Maggot 1056,3,100000,30000
+002-5,40,68,3,2 monster Angry Scorpion 1057,3,100000,30000
+002-5,40,38,9,2 monster Archant 1060,3,100000,30000
+002-5,56,97,1,2 monster Archant 1060,1,100000,30000
+002-5,68,100,6,1 monster Yellow Slime 1007,4,100000,30000
+002-5,91,80,0,2 monster Archant 1060,1,100000,30000
+002-5,89,94,0,2 monster Archant 1060,1,100000,30000
+002-5,74,78,0,2 monster Archant 1060,2,100000,30000
+002-5,94,72,1,2 monster Archant 1060,1,100000,30000
+002-5,90,61,3,1 monster Yellow Slime 1007,1,100000,30000
+002-5,74,35,0,2 monster Archant 1060,1,100000,30000
+002-5,84,33,0,2 monster Archant 1060,1,100000,30000
+002-5,84,46,0,2 monster Archant 1060,1,100000,30000
+002-5,99,38,0,2 monster Archant 1060,1,100000,30000
+002-5,93,38,4,1 monster Yellow Slime 1007,2,100000,30000
+002-5,62,62,2,21 monster Angry Fire Goblin 1108,3,100000,30000
diff --git a/npc/002-5/_warps.txt b/npc/002-5/_warps.txt
new file mode 100644
index 00000000..5c29f352
--- /dev/null
+++ b/npc/002-5/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 002-5: Deep Desert Mines warps
+002-5,34,98,0 warp #002-5_34_98 0,0,002-4,68,99
diff --git a/npc/002-5/chest.txt b/npc/002-5/chest.txt
new file mode 100644
index 00000000..12508350
--- /dev/null
+++ b/npc/002-5/chest.txt
@@ -0,0 +1,37 @@
+002-5,93,37,0 script Supply Chest NPC378,{
+ if (QL_MINEALL >= 26) goto L_Finished;
+
+ mes "Hrmm... A supply chest.";
+ mes "Do you want to try to open it?";
+ next;
+ menu
+ "Yes.", L_Yes,
+ "No.", L_close;
+
+L_Yes:
+ if (countitem("TreasureKey") < 3)
+ goto L_Not_Enough;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("TreasureKey") > 3)
+ goto L_TooMany;
+ mes "You opened the chest and found a short bow!";
+ delitem "TreasureKey", 3;
+ getitem "ShortBow", 1;
+ QL_MINEALL = 26;
+ goto L_close;
+
+L_Not_Enough:
+ mes "It seems that you do not have the right key for this chest yet...";
+ goto L_close;
+
+L_Finished:
+ mes "You have already opened this chest.";
+ goto L_close;
+
+L_TooMany:
+ mes "You do not have enough room to loot this chest. Maybe you should try again later.";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/002-5/mapflags.txt b/npc/002-5/mapflags.txt
new file mode 100644
index 00000000..dd32ef92
--- /dev/null
+++ b/npc/002-5/mapflags.txt
@@ -0,0 +1 @@
+//002-5 mapflag resave 002-3,72,66
diff --git a/npc/002-5/sema.txt b/npc/002-5/sema.txt
new file mode 100644
index 00000000..689d3ec0
--- /dev/null
+++ b/npc/002-5/sema.txt
@@ -0,0 +1,62 @@
+002-5,43,91,6 script Sema NPC340,{
+ if (QL_MINEALL >= 28) goto L_Sema_Done;
+ if (QL_MINEALL == 27) goto L_Sema_Happy;
+ if (QL_MINEALL == 26) goto L_Sema_GCM;
+
+ mes "[Sema the Miner]";
+ mes "\"Hello adventurer. I do not know exactly where, but somewhere in this cave there is a supply chest. And wouldn't you know it! The archants have eaten all the spare keys for the chest. Go and do what you must do.\"";
+ goto L_close;
+
+L_Sema_GCM:
+ mes "[Sema the Miner]";
+ mes "\"I saw a giant cave maggot eat one of the other miners and it might eat me! Can you kill it?\"";
+ menu
+ "Yes.", L_Sema_Yes,
+ "No.", L_Sema_No;
+
+L_Sema_No:
+ mes "[Sema the Miner]";
+ mes "\"Ahh! I am very scared now!\"";
+ goto L_close;
+
+L_Sema_Yes:
+ QL_MINEALL = 27;
+ monster "002-5", 70, 90, "", 1059, 1;
+ mes "[Sema the Miner]";
+ mes "\"Good luck. To prove you killed it, please bring the Iten it swallowed when it ate the miner. Be careful, there could be more than one.\"";
+ goto L_close;
+
+L_Sema_Happy:
+ if (countitem("Iten") < 1)
+ goto L_Sema_Not_Happy;
+ getinventorylist;
+ if (@inventorylist_count - (countitem("Iten") == 1) > 99)
+ goto L_Sema_TooMany;
+ delitem "Iten", 1;
+ getitem "DesertShirt", 1;
+ QL_MINEALL = 28;
+ BOSS_POINTS = BOSS_POINTS + 10;
+ message strcharinfo(0), "You gain 10 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ mes "[Sema the Miner]";
+ mes "\"You killed it! What a relief! I wish I had more to give, but please accept this Desert Shirt as reward.\"";
+ goto L_close;
+
+L_Sema_TooMany:
+ mes "[Sema the Miner]";
+ mes "\"You have too many items for me to give you a reward. Please drop or sell something so I can give it to you. Oh and yes, you can also store items at the nearest bank.\"";
+ goto L_close;
+
+L_Sema_Not_Happy:
+ QL_MINEALL = 26;
+ heal -Hp, 0;
+ mes "A stone falls on your head.";
+ goto L_close;
+
+L_Sema_Done:
+ mes "[Sema the Miner]";
+ mes "\"You made this cave safer, you are kind beyond belief. Others may need you. Happy adventuring.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/003-1/_import.txt b/npc/003-1/_import.txt
new file mode 100644
index 00000000..81859643
--- /dev/null
+++ b/npc/003-1/_import.txt
@@ -0,0 +1,2 @@
+// Map 003-1: 2006 Tulimshar
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
diff --git a/npc/003-4/_import.txt b/npc/003-4/_import.txt
new file mode 100644
index 00000000..19764510
--- /dev/null
+++ b/npc/003-4/_import.txt
@@ -0,0 +1,5 @@
+// Map 003-4: Beach
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/003-4/_mobs.txt",
+"npc/003-4/_warps.txt",
+"npc/003-4/ashley.txt",
diff --git a/npc/003-4/_mobs.txt b/npc/003-4/_mobs.txt
new file mode 100644
index 00000000..60145412
--- /dev/null
+++ b/npc/003-4/_mobs.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 003-4: Beach mobs
+003-4,158,68,14,48 monster Giant Maggot 1006,10,100000,30000
+003-4,0,0,0,0 monster Sea Slime 1033,15,100000,30000
+003-4,120,31,11,11 monster Sea Slime 1033,5,100000,30000
+003-4,119,68,52,50 monster Green Slime 1005,35,100000,30000
+003-4,134,69,38,35 monster Red Scorpion 1004,20,100000,30000
+003-4,35,25,5,1 monster Mountain Snake 1026,1,700000,600000
diff --git a/npc/003-4/_warps.txt b/npc/003-4/_warps.txt
new file mode 100644
index 00000000..46e27355
--- /dev/null
+++ b/npc/003-4/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 003-4: Beach warps
+003-4,172,77,0 warp #003-4_172_77 0,4,002-1,32,66
+003-4,141,19,0 warp #003-4_141_19 2,0,004-1,37,110
+003-4,114,117,0 warp #003-4_114_117 3,0,043-1,44,20
diff --git a/npc/003-4/ashley.txt b/npc/003-4/ashley.txt
new file mode 100644
index 00000000..9be78493
--- /dev/null
+++ b/npc/003-4/ashley.txt
@@ -0,0 +1,60 @@
+003-4,35,25,0 script Ashley NPC139,{
+ mes "[Ashley]";
+ mes "\"Ah, hello. Your smell is different, you seem to have come from a different time.";
+ mes "Perhaps you have the rare item I'm looking for?\"";
+ menu
+ "Sure!",L_Next,
+ "Sorry, I'm busy.",L_close;
+
+L_Next:
+ mes "She smiles mischievously.";
+ mes "[Ashley]";
+ mes "\"Oho, I need an item which doesn't exists at this time... It is called Mylarin Dust.\"";
+ next;
+ mes "[Ashley]";
+ mes "Grinning intensifies";
+ mes "\"I'll even give you an old weapon as a reward.\"";
+ next;
+ mes "[Ashley]";
+ mes "\"So, do you have it?\"";
+ menu
+ "Yeah, here is it.",L_Next1,
+ "Not yet.",L_close;
+
+L_Next1:
+ if (countitem("MylarinDust") < 1)
+ goto L_NoMylarin;
+
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_FullInv;
+
+ delitem "MylarinDust", 1;
+ getexp 2000, 0;
+ getitem "SandCutter", 1;
+ mes "[Ashley]";
+ mes "Grinning widely";
+ mes "\"Thanks, mortal. This will help me a bit...\"";
+ next;
+ mes "[Ashley]";
+ mes "\"And if you have more Mylarin Dust with you, I will not hesitate to give you another old weapon as a reward.\"";
+ goto L_close;
+
+L_NoMylarin:
+ mes "[Ashley]";
+ mes "She fakes smiles at you";
+ mes "\"Oh, did you said you wanted me to play with you?\"";
+ next;
+ mes "[Ashley]";
+ mes "\"While I would love to play... I still have to put a prank on Cupid, so you'll have to wait your turn.\"";
+ goto L_close;
+
+L_FullInv:
+ mes "[Ashley]";
+ mes "\"You're carrying so many things that I feel the urge of stomping you.\"";
+ goto L_close;
+
+L_close:
+ @inventorylist_count = 0;
+ close;
+}
diff --git a/npc/004-1/_import.txt b/npc/004-1/_import.txt
new file mode 100644
index 00000000..8c47b26c
--- /dev/null
+++ b/npc/004-1/_import.txt
@@ -0,0 +1,4 @@
+// Map 004-1: Beach
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/004-1/_mobs.txt",
+"npc/004-1/_warps.txt",
diff --git a/npc/004-1/_mobs.txt b/npc/004-1/_mobs.txt
new file mode 100644
index 00000000..40b51e2d
--- /dev/null
+++ b/npc/004-1/_mobs.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 004-1: Beach mobs
+004-1,39,57,4,14 monster Sea Slime 1033,5,100000,30000
+004-1,33,83,4,20 monster Sea Slime 1033,11,100000,30000
+004-1,28,103,5,7 monster Sea Slime 1033,7,100000,30000
+004-1,71,104,13,10 monster Giant Maggot 1006,5,100000,30000
+004-1,76,68,10,24 monster Red Scorpion 1004,13,100000,30000
+004-1,68,25,9,5 monster Giant Maggot 1006,2,100000,30000
+004-1,93,27,1,1 monster Black Scorpion 1009,1,120000,60000
diff --git a/npc/004-1/_warps.txt b/npc/004-1/_warps.txt
new file mode 100644
index 00000000..4f8a0830
--- /dev/null
+++ b/npc/004-1/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 004-1: Beach warps
+004-1,68,19,0 warp #004-1_68_19 2,0,041-1,101,112
+004-1,37,111,0 warp #004-1_37_111 2,0,003-4,141,20
diff --git a/npc/004-3/_import.txt b/npc/004-3/_import.txt
new file mode 100644
index 00000000..32700d6e
--- /dev/null
+++ b/npc/004-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 004-3: Pirate Caves First Floor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/004-3/_mobs.txt",
+"npc/004-3/_warps.txt",
+"npc/004-3/mapflags.txt",
diff --git a/npc/004-3/_mobs.txt b/npc/004-3/_mobs.txt
new file mode 100644
index 00000000..0df35e88
--- /dev/null
+++ b/npc/004-3/_mobs.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 004-3: Pirate Caves First Floor mobs
+004-3,43,72,3,4 monster Thug 1119,2,100000,30000
+004-3,43,72,3,4 monster Swashbuckler 1120,1,100000,30000
+004-3,43,72,3,4 monster Grenadier 1121,1,100000,30000
+004-3,28,69,4,1 monster Thug 1119,2,100000,30000
+004-3,71,63,3,4 monster Thug 1119,2,100000,30000
+004-3,39,39,3,1 monster Swashbuckler 1120,2,100000,30000
+004-3,71,63,3,4 monster Grenadier 1121,1,100000,30000
diff --git a/npc/004-3/_warps.txt b/npc/004-3/_warps.txt
new file mode 100644
index 00000000..005feb9f
--- /dev/null
+++ b/npc/004-3/_warps.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 004-3: Pirate Caves First Floor warps
+004-3,24,95,0 warp #004-3_24_95 0,0,002-1,49,21
+004-3,49,80,0 warp #004-3_49_80 0,0,004-4,49,83
+004-3,31,73,0 warp #004-3_31_73 0,0,004-4,31,70
+004-3,49,56,0 warp #004-3_49_56 0,0,004-4,49,51
+004-3,90,64,0 warp #004-3_90_64 0,0,004-4,90,68
+004-3,80,22,0 warp #004-3_80_22 0,0,021-3,44,142
+004-3,77,40,0 warp #004-3_77_40 0,0,004-4,78,34
diff --git a/npc/004-3/mapflags.txt b/npc/004-3/mapflags.txt
new file mode 100644
index 00000000..3c0335e6
--- /dev/null
+++ b/npc/004-3/mapflags.txt
@@ -0,0 +1 @@
+//004-3 mapflag resave 001-1,60,105
diff --git a/npc/004-4/_import.txt b/npc/004-4/_import.txt
new file mode 100644
index 00000000..3cba1761
--- /dev/null
+++ b/npc/004-4/_import.txt
@@ -0,0 +1,5 @@
+// Map 004-4: Pirate Caves Second Floor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/004-4/_mobs.txt",
+"npc/004-4/_warps.txt",
+"npc/004-4/mapflags.txt",
diff --git a/npc/004-4/_mobs.txt b/npc/004-4/_mobs.txt
new file mode 100644
index 00000000..9e4a9e43
--- /dev/null
+++ b/npc/004-4/_mobs.txt
@@ -0,0 +1,11 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 004-4: Pirate Caves Second Floor mobs
+004-4,36,62,2,10 monster Grenadier 1121,1,100000,30000
+004-4,37,61,2,10 monster Swashbuckler 1120,2,100000,30000
+004-4,62,52,6,3 monster Thug 1119,2,100000,30000
+004-4,34,87,6,3 monster Thug 1119,2,100000,30000
+004-4,37,62,3,11 monster Thug 1119,2,100000,30000
+004-4,34,88,5,3 monster Swashbuckler 1120,2,100000,30000
+004-4,63,52,5,3 monster Swashbuckler 1120,2,100000,30000
+004-4,62,52,5,2 monster Grenadier 1121,1,100000,30000
+004-4,34,88,5,2 monster Grenadier 1121,1,100000,30000
diff --git a/npc/004-4/_warps.txt b/npc/004-4/_warps.txt
new file mode 100644
index 00000000..1318bc88
--- /dev/null
+++ b/npc/004-4/_warps.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 004-4: Pirate Caves Second Floor warps
+004-4,49,81,0 warp #004-4_49_81 0,0,004-3,49,76
+004-4,31,72,0 warp #004-4_31_72 0,0,004-3,31,74
+004-4,49,53,0 warp #004-4_49_53 0,0,004-3,49,57
+004-4,90,70,0 warp #004-4_90_70 0,0,004-3,90,66
+004-4,24,64,0 warp #004-4_24_64 0,0,004-5,34,67
+004-4,78,32,0 warp #004-4_78_32 0,0,004-3,77,38
diff --git a/npc/004-4/mapflags.txt b/npc/004-4/mapflags.txt
new file mode 100644
index 00000000..4dffd583
--- /dev/null
+++ b/npc/004-4/mapflags.txt
@@ -0,0 +1 @@
+//004-4 mapflag resave 001-1,60,105
diff --git a/npc/004-5/_import.txt b/npc/004-5/_import.txt
new file mode 100644
index 00000000..1315b3de
--- /dev/null
+++ b/npc/004-5/_import.txt
@@ -0,0 +1,6 @@
+// Map 004-5: Pirate Den
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/004-5/_mobs.txt",
+"npc/004-5/_warps.txt",
+"npc/004-5/chest.txt",
+"npc/004-5/mapflags.txt",
diff --git a/npc/004-5/_mobs.txt b/npc/004-5/_mobs.txt
new file mode 100644
index 00000000..795a791f
--- /dev/null
+++ b/npc/004-5/_mobs.txt
@@ -0,0 +1,14 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 004-5: Pirate Den mobs
+004-5,51,70,3,2 monster Grenadier 1121,1,100000,30000
+004-5,51,70,3,1 monster Swashbuckler 1120,2,100000,30000
+004-5,50,70,4,1 monster Thug 1119,2,100000,30000
+004-5,45,86,3,2 monster Grenadier 1121,1,100000,30000
+004-5,44,86,4,1 monster Thug 1119,2,100000,30000
+004-5,45,86,3,1 monster Swashbuckler 1120,2,100000,30000
+004-5,64,38,3,2 monster Grenadier 1121,1,100000,30000
+004-5,63,38,4,1 monster Thug 1119,2,100000,30000
+004-5,64,38,3,1 monster Swashbuckler 1120,2,100000,30000
+004-5,91,38,3,2 monster Grenadier 1121,1,100000,30000
+004-5,90,38,4,1 monster Thug 1119,2,100000,30000
+004-5,91,38,3,1 monster Swashbuckler 1120,2,100000,30000
diff --git a/npc/004-5/_warps.txt b/npc/004-5/_warps.txt
new file mode 100644
index 00000000..9818677a
--- /dev/null
+++ b/npc/004-5/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 004-5: Pirate Den warps
+004-5,34,65,0 warp #004-5_34_65 0,0,004-4,24,62
diff --git a/npc/004-5/chest.txt b/npc/004-5/chest.txt
new file mode 100644
index 00000000..3a387470
--- /dev/null
+++ b/npc/004-5/chest.txt
@@ -0,0 +1,26 @@
+004-5,99,67,0 script Old Chest#crastur NPC111,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ @spants_state = ((QUEST_WG_state & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT);
+ if(@spants_state > 5) goto L_Looted;
+ if(@spants_state != 5) goto L_Unknown;
+ @spants_state = 6;
+ getitem "Bandana", 1;
+ set Zeny, (Zeny + rand(8000,20000)); // give some random loot
+ mes "This must be the treasure that Crastur was talking about.";
+ mes "You see a pile of gold and a Bandana on top.";
+ QUEST_WG_state = (QUEST_WG_state & ~(NIBBLE_2_MASK) | (@spants_state << NIBBLE_2_SHIFT));
+ goto L_close;
+
+L_Looted:
+ mes "You have already looted this chest.";
+ goto L_close;
+
+L_Unknown:
+ mes "You have no idea how to open this chest.";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/004-5/mapflags.txt b/npc/004-5/mapflags.txt
new file mode 100644
index 00000000..1c67e967
--- /dev/null
+++ b/npc/004-5/mapflags.txt
@@ -0,0 +1 @@
+//004-5 mapflag resave 001-1,60,105
diff --git a/npc/005-3/_import.txt b/npc/005-3/_import.txt
new file mode 100644
index 00000000..5b1d526e
--- /dev/null
+++ b/npc/005-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 005-3: Snake Pit
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/005-3/_mobs.txt",
+"npc/005-3/_warps.txt",
+"npc/005-3/mapflags.txt",
diff --git a/npc/005-3/_mobs.txt b/npc/005-3/_mobs.txt
new file mode 100644
index 00000000..ec889d0c
--- /dev/null
+++ b/npc/005-3/_mobs.txt
@@ -0,0 +1,7 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 005-3: Snake Pit mobs
+005-3,59,63,24,28 monster Snake 1010,50,100000,30000
+005-3,56,64,26,24 monster Black Scorpion 1009,15,100000,30000
+005-3,59,68,29,21 monster Giant Maggot 1006,20,100000,30000
+005-3,95,52,5,30 monster Troll 1054,7,100000,30000
+005-3,53,26,32,6 monster Troll 1054,5,100000,30000
diff --git a/npc/005-3/_warps.txt b/npc/005-3/_warps.txt
new file mode 100644
index 00000000..eccfbefb
--- /dev/null
+++ b/npc/005-3/_warps.txt
@@ -0,0 +1,12 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 005-3: Snake Pit warps
+005-3,52,35,0 warp #005-3_52_35 0,0,002-1,113,109
+005-3,63,48,0 warp #005-3_63_48 0,0,006-3,89,45
+005-3,85,51,0 warp #005-3_85_51 0,0,006-3,125,65
+005-3,86,32,0 warp #005-3_86_32 0,0,006-1,55,47
+005-3,73,62,0 warp #005-3_73_62 0,0,006-1,51,69
+005-3,78,90,0 warp #005-3_78_90 0,0,043-3,116,37
+005-3,33,84,0 warp #005-3_33_84 0,0,043-3,31,35
+005-3,107,102,0 warp #005-3_107_102 0,0,006-1,64,78
+005-3,101,30,0 warp #005-3_101_30 0,0,005-3,101,35
+005-3,110,79,0 warp #005-3_110_79 0,0,005-3,110,75
diff --git a/npc/005-3/mapflags.txt b/npc/005-3/mapflags.txt
new file mode 100644
index 00000000..68b18858
--- /dev/null
+++ b/npc/005-3/mapflags.txt
@@ -0,0 +1 @@
+//005-3 mapflag resave 006-1,36,18
diff --git a/npc/006-1/_import.txt b/npc/006-1/_import.txt
new file mode 100644
index 00000000..e3b85ebe
--- /dev/null
+++ b/npc/006-1/_import.txt
@@ -0,0 +1,11 @@
+// Map 006-1: Desert Mountains
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/006-1/_mobs.txt",
+"npc/006-1/_warps.txt",
+"npc/006-1/mapflags.txt",
+"npc/006-1/mika.txt",
+"npc/006-1/miriam.txt",
+"npc/006-1/pachua.txt",
+"npc/006-1/spirit.txt",
+"npc/006-1/traveler.txt",
+"npc/006-1/tree.txt",
diff --git a/npc/006-1/_mobs.txt b/npc/006-1/_mobs.txt
new file mode 100644
index 00000000..77463890
--- /dev/null
+++ b/npc/006-1/_mobs.txt
@@ -0,0 +1,23 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 006-1: Desert Mountains mobs
+006-1,49,52,3,1 monster Snake 1010,1,100000,30000
+006-1,53,36,8,6 monster Mountain Snake 1026,3,150000,10000
+006-1,89,26,16,6 monster Mountain Snake 1026,5,15000,75000
+006-1,113,41,6,18 monster Mountain Snake 1026,8,15000,75000
+006-1,113,51,3,1 monster Mountain Snake 1026,3,15000,75000
+006-1,86,46,14,2 monster Mountain Snake 1026,3,15000,75000
+006-1,105,73,10,7 monster Mountain Snake 1026,3,15000,75000
+006-1,73,102,4,6 monster Mountain Snake 1026,4,15000,75000
+006-1,104,100,5,7 monster Mountain Snake 1026,8,15000,75000
+006-1,82,72,12,8 monster Mountain Snake 1026,8,15000,75000
+006-1,95,114,8,2 monster Mountain Snake 1026,5,15000,75000
+006-1,57,119,9,1 monster Mountain Snake 1026,4,15000,75000
+006-1,33,97,13,16 monster Scorpion 1003,10,100000,30000
+006-1,58,49,1,1 monster Green Slime 1005,3,100000,30000
+006-1,34,50,2,2 monster Snake 1010,2,40000,50000
+006-1,96,92,10,24 monster Snake 1010,2,40000,50000
+006-1,35,97,14,14 monster Maggot 1002,20,100000,30000
+006-1,28,73,1,1 monster Green Slime 1005,2,100000,30000
+006-1,33,59,1,1 monster Green Slime 1005,2,100000,30000
+006-1,37,73,3,1 monster Snake 1010,1,100000,30000
+006-1,100,36,19,12 monster Snake 1010,2,40000,50000
diff --git a/npc/006-1/_warps.txt b/npc/006-1/_warps.txt
new file mode 100644
index 00000000..9283bc18
--- /dev/null
+++ b/npc/006-1/_warps.txt
@@ -0,0 +1,32 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 006-1: Desert Mountains warps
+006-1,40,26,0 warp #006-1_40_26 0,0,006-3,40,28
+006-1,60,58,0 warp #006-1_60_58 0,0,006-3,60,70
+006-1,62,30,0 warp #006-1_62_30 0,0,006-3,62,32
+006-1,55,27,0 warp #006-1_55_27 0,0,006-3,55,29
+006-1,77,44,0 warp #006-1_77_44 0,0,006-3,77,46
+006-1,86,24,0 warp #006-1_86_24 0,0,006-3,86,26
+006-1,91,24,0 warp #006-1_91_24 0,0,006-3,91,26
+006-1,98,46,0 warp #006-1_98_46 0,0,006-3,104,46
+006-1,114,22,0 warp #006-1_114_22 0,0,006-3,122,26
+006-1,114,49,0 warp #006-1_114_49 0,0,006-3,114,51
+006-1,102,53,0 warp #006-1_102_53 0,0,006-3,110,58
+006-1,117,57,0 warp #006-1_117_57 0,0,006-3,125,61
+006-1,92,63,0 warp #006-1_92_63 0,0,006-3,92,65
+006-1,112,74,0 warp #006-1_112_74 0,0,006-3,112,76
+006-1,111,110,0 warp #006-1_111_110 0,0,032-3,71,70
+006-1,83,117,0 warp #006-1_83_117 0,0,006-3,79,121
+006-1,38,121,0 warp #006-1_38_121 0,0,006-3,38,123
+006-1,74,90,0 warp #006-1_74_90 0,0,006-3,74,92
+006-1,51,90,0 warp #006-1_51_90 0,0,006-3,51,92
+006-1,30,123,0 warp #006-1_30_123 0,0,032-3,143,43
+006-1,33,85,0 warp #006-1_33_85 0,0,006-2,58,43
+006-1,23,85,0 warp #006-1_23_85 0,0,006-2,48,43
+006-1,23,100,0 warp #006-1_23_100 0,0,006-2,67,64
+006-1,21,108,0 warp #006-1_21_108 0,0,006-2,65,72
+006-1,37,26,0 warp #006-1_37_26 0,0,006-1,37,23
+006-1,37,24,0 warp #006-1_37_24 0,0,006-1,37,27
+006-1,55,46,0 warp #006-1_55_46 0,0,005-3,86,33
+006-1,20,48,0 warp #006-1_20_48 0,1,002-1,118,95
+006-1,51,68,0 warp #006-1_51_68 0,0,005-3,73,61
+006-1,64,77,0 warp #006-1_64_77 0,0,005-3,107,101
diff --git a/npc/006-1/mapflags.txt b/npc/006-1/mapflags.txt
new file mode 100644
index 00000000..2747e250
--- /dev/null
+++ b/npc/006-1/mapflags.txt
@@ -0,0 +1 @@
+//006-1 mapflag resave 006-1,36,18
diff --git a/npc/006-1/mika.txt b/npc/006-1/mika.txt
new file mode 100644
index 00000000..c1134b05
--- /dev/null
+++ b/npc/006-1/mika.txt
@@ -0,0 +1,8 @@
+006-1,39,22,0 script Mika NPC114,{
+ mes "[Mika]";
+ mes "\"My father told me about a man living in this desert who makes clothes out of snake skin.\"";
+ next;
+ mes "[Mika]";
+ mes "\"Maybe you can find him, but be careful you don't get lost in the tunnels!\"";
+ close;
+}
diff --git a/npc/006-1/miriam.txt b/npc/006-1/miriam.txt
new file mode 100644
index 00000000..fdbbdf1c
--- /dev/null
+++ b/npc/006-1/miriam.txt
@@ -0,0 +1,323 @@
+
+006-1,115,111,0 script Miriam NPC175,{
+ @npc_distance = 2;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ if (getskilllv(SKILL_SPEED)) goto L_fast;
+ if (getequipid(equip_torso) < 0) goto L_Naked;
+ if (QUEST_MIRIAM == 0) goto L_Intro;
+ if (QUEST_MIRIAM == 1) goto L_Ask1;
+ if (QUEST_MIRIAM == 2) goto L_Ask2;
+ if (QUEST_MIRIAM == 3) goto L_Teach;
+ if (QUEST_MIRIAM == 4) goto L_testoffer;
+ if (QUEST_MIRIAM_run < 0) goto L_checktime;
+ if (QUEST_MIRIAM_run > 0) goto L_wasting;
+ if (QUEST_MIRIAM == 5) goto L_testoffer;
+ goto L_Intro;
+
+L_Intro:
+ mes "You see a woman sitting in the hot sand with eyes wide open... But she does not seem to be looking at something in particular...";
+ next;
+ menu
+ "Ehr... Hi, my name is " +strcharinfo(0)+ ". Are you OK?",L_Next;
+
+L_Next:
+ mes "[Miriam]";
+ mes "\"...";
+ next;
+ menu
+ "Hello?",L_Continue;
+
+L_Continue:
+ mes "[Miriam]";
+ mes "\"Yes, I am. Why? Do you think I am not OK? I am OK. You interrupted my meditation. Now I will need hours to calm down and stay quiet! Yes, yes, I know, I'm a fast talker!\"";
+ next;
+ mes "\"In fact, I am fast in everything I do! I can kill a Mountain Snake before it even starts to think about attacking me! Yes my friend, in a battle, speed is power!";
+ next;
+ menu
+ "Wow! Very impressi...",L_More;
+
+L_More:
+ mes "[Miriam]";
+ mes "\"Yes, yes, I know. But if there is one thing I am NOT good at, it is meditation! My master said I need to meditate, but... Ohh! So difficult to stay quiet! And when you FINALLY do, someone INTERRUPTS you, asking if you are 'OK'...\"";
+ next;
+ menu
+ "Oh, I am sorry! I didn't know you were meditating...",L_WallText;
+
+L_WallText:
+ mes "[Miriam]";
+ mes "\"You are really sorry? Ok, but that is not enough... I need you to do something for me. As you can imagine, I will need a lot of time to concentrate and get back to the state I was when you interrupted me.\"";
+ next;
+ mes "\"But the problem is that I wasn't expecting to be here for so long, so I will need some food and something to drink.\"";
+ next;
+ mes "\"So, if you really want to prove that you are sorry, bring me 5 Concentration Potions and 10 Snake Tongues.\"";
+ next;
+ menu
+ "Ok, but those potions will not help with your mental concent...",L_MoreTalking,
+ "Sorry, but I can't help you right now.",L_canthelp;
+
+L_MoreTalking:
+ mes "[Miriam]";
+ mes "\"ah, ah, ah... I know what I am doing! Now run and get what I asked.\"";
+ QUEST_MIRIAM = 2;
+ close;
+
+L_canthelp:
+ mes "[Miriam]";
+ mes "\"Oh, really? So you better pray to not need my help in the future!\"";
+ QUEST_MIRIAM = 1;
+ close;
+
+L_canthelp2:
+ mes "[Miriam]";
+ mes "\"...\"";
+ next;
+ mes "\"...\"";
+ next;
+ mes "\"Well, if you don't have time to help, at least don't make things difficult for me!\"";
+ close;
+
+L_Ask1:
+ mes "[Miriam]";
+ mes "\"So, you are back... have you changed your mind about my request?\"";
+ next;
+ menu
+ "Yes, I will get what you want!",L_WillGetItems,
+ "No, I have no time right now.",L_canthelp2;
+
+L_WillGetItems:
+ QUEST_MIRIAM = 2;
+ mes "\"Good. So, run and get it!\"";
+ close;
+
+L_Ask2:
+ mes "[Miriam]";
+ mes "\"Did you get what I asked for?\"";
+ next;
+ menu
+ "Yes, here it is!",L_Getitems,
+ "What was that again?", L_Ask3,
+ "No, not yet.",L_Hurry;
+
+L_Hurry:
+ mes "\"So please hurry up!\"";
+ close;
+
+L_Ask3:
+ mes "[Miriam]";
+ mes "\"You have a small mind, haven't you? I am meditating here and I asked you to bring me stuff, so I can concentrate better.\"";
+ next;
+ mes "\"And stop asking such silly questions in the future.\"";
+ next;
+ mes "\"So, if you really want to help me now, bring me 5 Concentration Potions and 10 Snake Tongues.\"";
+ close;
+
+L_Getitems:
+ if (countitem("SnakeTongue") < 10
+ || countitem("ConcentrationPotion") < 5)
+ goto L_NotEnough;
+ delitem "SnakeTongue", 10;
+ delitem "ConcentrationPotion", 5;
+ QUEST_MIRIAM = 3;
+ mes "[Miriam]";
+ mes "\"Good job! Now I have enough food to stay in this desert for days!\"";
+ next;
+ mes "\"Now, since you helped me, maybe I can teach you a basic skill, but only if you prove yourself to be a fast runner! Come back and talk to me when you think you are prepared to learn.\"";
+ close;
+
+L_NotEnough:
+ mes "[Miriam]";
+ mes "\"Hey, you don't have all that I asked. Come back when you have everything.\"";
+ close;
+
+L_Teach:
+ mes "[Miriam]";
+ mes "\"Hmm... do you think you can learn the special Speed skill?\"";
+ next;
+ menu
+ "Yes, I am prepared...", L_Prepared,
+ "I am already fast.", L_Notfast;
+
+L_Prepared:
+ @torso$ = getitemlink(getequipid(equip_torso));
+ @weight = MaxWeight/Weight;
+ if (@weight < 3)
+ goto L_heavyweight;
+ if (readparam(bAgi) < 60)
+ goto L_slow;
+ if (BaseLevel < 60)
+ goto L_LowLevel;
+ if (countitem("SteelShield") > 0
+ || countitem("WarlordHelmet") > 0
+ || countitem("CrusadeHelmet") > 0
+ || countitem("WarlordPlate") > 0
+ || countitem("KnightsHelmet") > 0
+ || countitem("InfantryHelmet") > 0
+ || countitem("ChainmailShirt") > 0
+ || countitem("WarlordBoots") > 0
+ || countitem("LightPlatemail") > 0
+ || countitem("CandleHelmet") > 0)
+ goto L_heavymetal;
+ goto L_Offer;
+
+L_heavyweight:
+ mes "[Miriam]";
+ mes "\"Wow... Why do you bring so many things with you? You must be carrying more than one third of your own weight! I won't teach you unless you get rid of some stuff... \"";
+ close;
+
+L_heavymetal:
+ mes "[Miriam]";
+ mes "\"Hmm... I see... You want to be one of those lazy slow warriors... wasting all their strength carrying kilos of metal clothes... Why does no one see the great advantages of a beautiful, flexible, lightweight armor nowadays?\"";
+ next;
+ mes "\"Come back here when you get rid of this junk...\"";
+ close;
+
+L_slow:
+ mes "[Miriam]";
+ mes "Oh, wait, wait... " +readparam(bAgi)+ " Agility? Are you serious? What do you do with all your Character points? Put them all to 'Strength'? Really... I don't even want to know... Come back here when you have a decent character points distribution!\"";
+ close;
+
+L_LowLevel:
+ mes "[Miriam]";
+ mes "\"Come back here when you are old enough. I even wonder how you could get here so unexperienced as you are.\"";
+ close;
+
+L_Offer:
+ mes "[Miriam]";
+ mes "\"Hmm! You look great in these clothes! They look very comfortable too... And it seems like you are not carrying too much weight.\"";
+ next;
+ if (!(getskilllv(SKILL_POOL)))
+ goto L_Noskill;
+ menu
+ "Yes, I look really good in this.",L_TorsoNext;
+
+L_TorsoNext:
+ mes "[Miriam]";
+ mes "\"I see. I like the way you distributed your Character Points too... " +readparam(bAgi)+ " points to Agility! You really know how to prepare yourself for a good fight!\"";
+ next;
+ mes "\"Well... Even if you have a potential to be a good fighter, moving the way you do will not help. You need to be fast to avoid the monsters. \"";
+ next;
+ mes "\"So, if you pass a small test I can teach you a skill that will increase your walking speed! You will not be as fast as I am, but I am sure it will be useful.\"";
+ next;
+ menu
+ "I'm in! What kind of test is it?",L_test,
+ "I don't think I need more speed right now",L_GiveUp;
+
+L_test:
+ mes "[Miriam]";
+ mes "\"Great! The test is simple. You need to run as fast as you can from the place where I am sitting to the mountains and talk to Pachua, the chief. When you get there and talk to Pachua, he will send a special smoke signal to me, so I can know how much time it took for you to get there.\"";
+ next;
+ mes "\"If you make it in a good time, I will teach you the special speeding skill. If not, you can always try again. So, are you ready?\"";
+ next;
+ menu
+ "Yes, let's do it!",L_LetsDoThis,
+ "No, I need to stretch my muscles first!",L_stretch;
+
+L_LetsDoThis:
+ close2;
+ message strcharinfo(0), "Miriam quickly grabs your arm and pull you to the place where she is sitting.";
+ // Warp the player to the place where the NPC is defined, so he can't cheat.
+ warp "032-1",55,21;
+ npctalk strnpcinfo(0), "Run " +strcharinfo(0)+ ", run!";
+ QUEST_MIRIAM = 5;
+ QUEST_MIRIAM_run = gettimetick(2);
+ end;
+
+L_Naked:
+ mes "[Miriam]";
+ mes "\"Hmmm?! Please put on some clothes before talking to me.\"";
+ close;
+
+L_Notfast:
+ mes "[Miriam]";
+ mes "\"Hah! If you think so...\"";
+ close;
+
+L_Noskill:
+ mes "[Miriam]";
+ mes "\"For a person like you, I could even teach a useful skill! Too bad you don't have the basic abillities to learn it...\"";
+ close;
+
+L_GiveUp:
+ mes "[Miriam]";
+ mes "\"Oh, that is too bad... But if you change your mind, come back!\"";
+ QUEST_MIRIAM = 4;
+ close;
+
+L_testoffer:
+ mes "[Miriam]";
+ mes "\"Are you ready for the test now?\"";
+ next;
+ menu
+ "Yes!",L_test,
+ "Not yet.",L_close;
+
+L_close:
+ close;
+
+L_warning:
+ mes "[Miriam]";
+ mes "\"I know very well what you tried to do. I will not teach you the speed skill if you keep trying this kind of trick!\"";
+ QUEST_MIRIAM_run = 0;
+ close;
+
+L_stretch:
+ mes "[Miriam]";
+ mes "\"Ok. Good idea... Stretching exercises can increase your flexibility and even prevent injuries!\"";
+ QUEST_MIRIAM = 4;
+ close;
+
+L_wasting:
+ mes "[Miriam]";
+ mes "\"Don't waste your time talking to me! RUN and talk to Pachua!\"";
+ close;
+
+L_expired:
+ mes "[Miriam]";
+ mes "\"You could not reach Pachua in time. Try again some other time.\"";
+ QUEST_MIRIAM_run = 0;
+ close;
+
+L_checktime:
+ @miriam_run_secs = 0 - (QUEST_MIRIAM_run);
+ if (@miriam_run_secs == 1)
+ goto L_warning;
+ if (@miriam_run_secs <= 10)
+ goto L_expired;
+ if (@miriam_run_secs <= 210)
+ goto L_Goodjob;
+ goto L_tryagain;
+
+L_tryagain:
+ mes "[Miriam]";
+ mes "\"You needed " + @miriam_run_secs + " seconds to reach Pachua. It is not enough.\"";
+ QUEST_MIRIAM_run = 0;
+ close;
+
+L_Goodjob:
+ mes "[Miriam]";
+ mes "\"Great job! You needed " + @miriam_run_secs + " seconds to reach Pachua. Very impressive for a person like you.\"";
+ next;
+ mes "\"Now I need you to relax. Do NOT move. This teaching process can be painful sometimes.\"";
+ next;
+ mes "Miriam stares into your eyes and starts to scream some strange words very close to your ears.";
+ next;
+ mes "You feel dizzy and as soon as you move your head and look to the ground, Miriam pushes you hard, sending you meters away from her.";
+ close2;
+ warp "032-1",55,22;
+ // free all used player variables. This can be done, since there is a conditional on the speedskill at the beginning.
+ QUEST_MIRIAM_run = 0;
+ QUEST_MIRIAM = 0;
+ message strcharinfo(0), "[You gain 2500 experience points]";
+ message strcharinfo(0), "[You learned Speed Skill]";
+ updateskill SKILL_SPEED, 1;
+ getexp 2500, 0;
+ close;
+
+L_fast:
+ mes "[Miriam]";
+ mes "\"I hope you make a good use of your new skill... Take care!\"";
+ close;
+
+}
diff --git a/npc/006-1/pachua.txt b/npc/006-1/pachua.txt
new file mode 100644
index 00000000..f62d8c04
--- /dev/null
+++ b/npc/006-1/pachua.txt
@@ -0,0 +1,237 @@
+006-1,24,113,0 script Pachua NPC143,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ @halloween_npc_id = $@halloween_npc_pachua;
+ callfunc "TrickOrTreat";
+
+ @LEATHER_PATCH_PRICE = 300;
+ @wants_leather_patch = QUEST_Forestbow_state & NIBBLE_4_MASK;
+
+ if (QUEST_MIRIAM_run == -1) goto L_Warp2_cheat;
+ if (QUEST_MIRIAM_run) goto L_smoke;
+ goto L_Begin;
+
+L_Begin:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"How!\"";
+ next;
+
+ if (getequipid(equip_head) == 643 || getequipid(equip_head) == 644) goto L_WearingCowboy;
+ if (getequipid(equip_legs) == 642) goto L_WearingChaps;
+
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"For generations my tribe has been crafting special clothes out of different items.\"";
+ next;
+ goto L_Check_Shops;
+
+L_Check_Shops:
+ if((countitem("JeansShorts") > 0 && countitem("SnakeSkin") > 9) && (countitem("FancyHat") > 0 && countitem("SnakeSkin") > 1)) goto L_Super_store;
+ if(countitem("JeansShorts") > 0 && countitem("SnakeSkin") > 9) goto L_Chaps_store;
+ if(countitem("FancyHat") > 0 && countitem("SnakeSkin") > 1) goto L_Cowboy_store;
+
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Maybe if you bring me the right materials I can make something for you.\"";
+ next;
+ if (@wants_leather_patch)
+ menu
+ "Wait, can you make a leather patch for me?", L_leather_patch,
+ "OK, bye.", L_close;
+ goto L_close;
+
+S_CheckStuff:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Let me see what you have there.\"";
+ next;
+ return;
+
+L_Super_store:
+ callsub S_CheckStuff;
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Ahh you have lots of good items to work with.\"";
+ mes "";
+ mes "\"With them I can make you either";
+ mes "a Cowboy hat or Snake Skin Chaps\"";
+ next;
+ if (@wants_leather_patch)
+ menu
+ "Cowboy hat, please.", L_BuyCowboy,
+ "Snake Skin Chaps sound good.", L_BuyChaps,
+ "Can you make a leather patch?", L_leather_patch,
+ "Not now, maybe later.", L_NoDeal;
+ menu
+ "Cowboy hat, please.", L_BuyCowboy,
+ "Snake Skin Chaps sound good.", L_BuyChaps,
+ "Not now, maybe later.", L_NoDeal;
+
+L_Cowboy_store:
+ callsub S_CheckStuff;
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"To make you a Cowboy hat I will need:";
+ mes "1 Fancy hat";
+ mes "2 Snake skins";
+ mes "5.000 GP\"";
+ mes "";
+ mes "\"Do we have a deal?\"";
+ next;
+ if (@wants_leather_patch)
+ menu
+ "Yes, that's fine.", L_BuyCowboy,
+ "Can you make a leather patch?", L_leather_patch,
+ "On second thought, maybe later.", L_NoDeal;
+ menu
+ "Yes, that's fine.", L_BuyCowboy,
+ "On second thought, maybe later.", L_NoDeal;
+
+L_Chaps_store:
+ callsub S_CheckStuff;
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"To make you a pair of Snake Skin Chaps I will need:";
+ mes "1 Jeans Shorts";
+ mes "10 Snake skins";
+ mes "10.000 GP\"";
+ mes "";
+ mes "\"Do we have a deal?\"";
+ next;
+ if (!@wants_leather_patch)
+ menu
+ "Yes, that's fine.", L_BuyChaps,
+ "On second thought, maybe later.", L_NoDeal;
+ menu
+ "Yes, that's fine.", L_BuyChaps,
+ "Can you make a leather patch?", L_leather_patch,
+ "On second thought, maybe later.", L_NoDeal;
+
+L_BuyChaps:
+ if (Zeny < 10000) goto L_NoMoney;
+ if (countitem("JeansShorts") < 1) goto L_NoJeans;
+ if (countitem("SnakeSkin") < 10) goto L_NoSkins;
+ Zeny = Zeny - 10000;
+ delitem "SnakeSkin", 10;
+ delitem "JeansShorts", 1;
+ getitem "JeansChaps", 1;
+ goto L_DealDone;
+
+L_BuyCowboy:
+ if (Zeny < 5000) goto L_NoMoney;
+ if (countitem("FancyHat") < 1) goto L_NoFancy;
+ if (countitem("SnakeSkin") < 2) goto L_NoSkins;
+ Zeny = Zeny - 5000;
+ delitem "SnakeSkin", 2;
+ delitem "FancyHat", 1;
+ @temp = rand(2);
+ if(@temp == 0) goto L_Cowboy_white;
+ goto L_Cowboy_black;
+
+L_Cowboy_white:
+ getitem "WhiteCowboyHat", 1;
+ goto L_DealDone;
+
+L_Cowboy_black:
+ getitem "BlackCowboyHat", 1;
+ goto L_DealDone;
+
+L_leather_patch:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"If you just want a piece of leather, then yes, I can make that. Bring me a snake skin and " + @LEATHER_PATCH_PRICE + " GP.\"";
+ next;
+ menu
+ "Here you are.", L_Next,
+ "OK, I'll be back later.", L_close,
+ "That's too expensive!.", L_NoDeal;
+
+L_Next:
+ if (countitem("SnakeSkin") < 1) goto L_NoSkins;
+ if (Zeny < @LEATHER_PATCH_PRICE) goto L_NoMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("SnakeSkin") > 1) goto L_TooMany;
+
+ Zeny = Zeny - @LEATHER_PATCH_PRICE;
+ delitem "SnakeSkin", 1;
+ getitem "LeatherPatch", 1;
+ goto L_DealDone;
+
+L_DealDone:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Here you are!\"";
+ mes "";
+ mes "\"Come back any time.\"";
+ goto L_close;
+
+L_NoDeal:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Alright, but you won't get a better deal anywhere else!\"";
+ goto L_close;
+
+L_NoMoney:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Oh dear, it seems you don't have enough money.\"";
+ goto L_close;
+
+L_NoJeans:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Oh dear, it seems you don't have enough jeans shorts.\"";
+ goto L_close;
+
+L_NoFancy:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Oh dear, it seems you don't have enough fancy hats.\"";
+ goto L_close;
+
+L_NoSkins:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Oh dear, it seems you don't have enough snake skins.\"";
+ goto L_close;
+
+L_WearingCowboy:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Ah, I see that you are wearing a hat made with the ancient methods of my tribe.\"";
+ next;
+ goto L_Check_Shops;
+
+L_WearingChaps:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"Ah, I see that you are wearing pants made by my tribe.\"";
+ next;
+ goto L_Check_Shops;
+
+L_close:
+ @LEATHER_PATCH_PRICE = 0;
+ @wants_leather_patch = 0;
+ @month = 0;
+ @start_day = 0;
+ @end_day = 0;
+ @temp = 0;
+ close;
+
+L_TooMany:
+ mes "[Chief Pachua]";
+ mes "";
+ mes "\"You don't have room for a leather patch. Come back later.\"";
+ goto L_close;
+
+L_smoke:
+ message strcharinfo(0), "Pachua quickly inhales from his pipe and releases a ring of smoke towards the sky!";
+ callfunc "MiriamGoal";
+ end;
+
+L_Warp2_cheat:
+ message strcharinfo(0), "Pachua releases a ring of smoke towards the sky! But, by the look on his face, you can tell he is suspicious about your methods...";
+ end;
+}
diff --git a/npc/006-1/spirit.txt b/npc/006-1/spirit.txt
new file mode 100644
index 00000000..21ea02c6
--- /dev/null
+++ b/npc/006-1/spirit.txt
@@ -0,0 +1,294 @@
+function script EarthImpTouch {
+ if (getskilllv(SKILL_MAGIC)) goto L_message;
+
+ mes "[Well]";
+ mes "You hear noises from within the well.";
+ return;
+
+L_message:
+ @Q_MASK = NIBBLE_0_MASK;
+ @Q_SHIFT = NIBBLE_0_SHIFT;
+ @Q_status = (QUEST_MAGIC2 & @Q_MASK) >> @Q_SHIFT;
+
+ // Set up SkillUp function
+ @SUP_id = SKILL_MAGIC_NATURE;
+ @SUP_name$ = "Nature Magic";
+ @Q_STATUS_INITIAL = 0;
+ @Q_STATUS_ONQUEST = 1;
+ @Q_STATUS_STUDENT0 = 2;
+ @Q_STATUS_STUDENT1 = 3;
+ @Q_STATUS_STUDENT2 = 4;
+ @Q_STATUS_STUDENT3 = 5;
+
+ if (MAGIC_FLAGS & MFLAG_KNOWS_IMP) goto L_wb;
+
+ mes "[Well]";
+ mes "Something is inside that well, and now that you have turned your attention towards it, it seems to be talking to you!";
+ next;
+
+ mes "[Well]";
+ mes "\"Hey! You there! Yes, I'm talking to you!\"";
+ mes "That strange voice seems to be coming from inside your head!";
+ next;
+ menu
+ "Who, me?", L_Next,
+ "Leave me alone!", L_close,
+ "Aaah! I'm hearing voices!", L_silly_close;
+
+L_Next:
+ mes "[Well]";
+ mes "\"I'm in here, in the well, talking to you! If I'm not very mistaken, you are a powerful wizard-to-be, except that nobody has showed you how to properly do magic yet!\"";
+ next;
+ menu
+ "Who are you?", L_Next1,
+ "Aaaah! The voices are after me!", L_silly_close,
+ "Whatever it is, I'm not interested.", L_close;
+
+L_Next1:
+ mesn l("Earth Spirit");
+ mes "\"I'm an earth spirit; my name isn't important... all that matters is that I like you, and that I will help you become a powerful wizard if you help me. Just a fair deal, no more than that...\"";
+ next;
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_IMP;
+ goto L_Main;
+
+L_wb:
+ mesn l("Earth Spirit");
+ mes "\"It's excellent to see you again!\"";
+ next;
+ goto L_Main;
+
+L_Main:
+ menu
+ "How did you get trapped?", L_Q_trapped,
+ "Can you teach me magic and spells?", L_Q_magic,
+ "What do you know about...", L_Q,
+ "Goodbye!", L_close;
+
+L_Q_trapped:
+ mesn l("Earth Spirit");
+ mes "\"Oh, a wicked witch grew jealous of my power and locked me up in this well.\"";
+ next;
+ goto L_Main;
+
+L_Q:
+ mesn l("Earth Spirit");
+ mes "\"Stop bothering me with your questions, will you? I'm trying to make you a powerful wizard, after all!\"";
+ next;
+ goto L_Main;
+
+L_Q_magic:
+ if (@Q_status == @Q_STATUS_ONQUEST) goto L_Q_magic_1;
+ if (@Q_status == @Q_STATUS_STUDENT0) goto L_Q_magic_2;
+ if (@Q_status == @Q_STATUS_STUDENT1) goto L_Q_magic_3;
+ if (@Q_status == @Q_STATUS_STUDENT2) goto L_Q_magic_4;
+
+ mesn l("Earth Spirit");
+ mes "\"Good, good... that's the right attitude! Yes, I can teach you magic, but first you must prove that you are worthy to be my student!\"";
+ next;
+ mesn l("Earth Spirit");
+ mes "\"North-east of here sits and old, dead tree. Well, not completely dead, not yet, but almost. It's nothing special. Well, maybe a little, but not really. I want you to cut off one of its branches.\"";
+ next;
+ menu
+ "No way.", L_silly_close,
+ "Sure.", L_Q_tree_ok,
+ "Why that particular tree?", L_Next2;
+
+L_Next2:
+ mesn l("Earth Spirit");
+ mes "\"Oh, you and your questions! Well, that tree was a druid once, so the branches contain a bit of its lifeforce. And that's useful.\"";
+ next;
+ menu
+ "Yuck.", L_silly_close,
+ "Sure, whatever.", L_Q_tree_ok,
+ "Isn't that like cutting off someone's arm?", L_Next3;
+
+L_Next3:
+ mesn l("Earth Spirit");
+ mes "\"Oooh... now come on! Don't be so sentimental. He turned himself into a tree, he can hardly expect everyone to leave him alone.\"";
+ next;
+ mesn l("Earth Spirit");
+ mes "\"Who knows if he can even feel anything anymore? I'm sure he can't, being wooden and all. Besides, it's only a measly tree. Not like I'm asking you to cut him down!.\"";
+ next;
+ menu
+ "No way.", L_silly_close,
+ "Alright, that makes sense.", L_Q_tree_ok;
+
+L_Q_tree_ok:
+ mesn l("Earth Spirit");
+ mes "\"Good, good, good! Yes, that will be very good! So, come back when you have the branch. Oh, and bring 100,000 GP, too, as an enrollment fee.\"";
+ @Q_status = @Q_STATUS_ONQUEST;
+ callsub S_Update_Var;
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_CUTTREE;
+ next;
+ goto L_Main;
+
+L_Q_magic_1:
+ mesn l("Earth Spirit");
+ mes "\"Yes, yes, if you bring me the branch and the money, then I will!\"";
+ next;
+ menu
+ "Here are the branch and the money.", L_Next4,
+ "How much money did you want again?", L_Q_tree_howmuch,
+ "How can I cut it?", L_Q_tree_how,
+ "Where was the tree again?", L_Q_tree_where,
+ "What is that tree?", L_Q_tree_what;
+
+L_Next4:
+ if (countitem("DruidTreeBranch") < 1) goto L_Q_tree_none;
+ if (!(MAGIC_FLAGS & MFLAG_DID_CUTTREE)) goto L_Q_tree_dry;
+ if (Zeny < 100000) goto L_Q_tree_nomoney;
+
+ Zeny = Zeny - 100000;
+ delitem "DruidTreeBranch", 1;
+ mesn l("Earth Spirit");
+ mes "Following the earth sprite's instructions, you throw branch and GP into the well.";
+ next;
+ mesn l("Earth Spirit");
+ mes "\"Well done, very well done! Consider yourself my student now.\"";
+ @SUP_xp = 5000;
+ @SUP_lvl = 2;
+ callfunc "SkillUp";
+ next;
+ @Q_status = @Q_STATUS_STUDENT0;
+ callsub S_Update_Var;
+ goto L_Main;
+
+L_Q_magic_finish:
+ mes "[1000 experience points]";
+ @Q_status = @Q_status + 1;
+ callsub S_Update_Var;
+ getexp 1000,0;
+ next;
+ goto L_Main;
+
+L_Q_magic_2:
+ mesn l("Earth Spirit");
+ mes "\"Yes, of course! For just 20,000 GP I will teach you your first spell!\"";
+ next;
+ menu
+ "Here you are.", L_Next5,
+ "No.", L_Main;
+
+L_Next5:
+ if (Zeny < 20000) goto L_No20k;
+
+ Zeny = Zeny - 20000;
+ mesn l("Earth Spirit");
+ mesq l("Kekeke... excellent! Yes, here goes your first spell, and it is even a passive: the flying backpack! If you are overloaded, it will take the load off your shoulders.");
+ next;
+ mesn l("Earth Spirit");
+ mesq l("Take a cocoon, living or dead, and suffuse it in magic. Fell the %s, feel its lightness and feel it float! You no longer should be feeling overburned by your stolen goods, kekeke...", b("Plugh"));
+ learnskill ALL_INCCARRY;
+ goto L_Q_magic_finish;
+
+L_Q_magic_3:
+ mesn l("Earth Spirit");
+ mes "\"But yes, yes! Only 20,000 GP, once again, and I will teach you a far more useful spell!\"";
+ next;
+ menu
+ "Here you are.", L_Next6,
+ "No.", L_Main;
+
+L_Next6:
+ if (Zeny < 20000) goto L_No20k;
+ Zeny = Zeny - 20000;
+ mesn l("Earth Spirit");
+ mesq l("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;
+ mesn l("Earth Spirit");
+ mesq l("Next, say '%s', and feel your skin grow rigid! Very useful against stings and stabs and pokes and pricks and that sort of stuff. Lowers attack speed and only works on yourself, party, or guild allies, though.", b("betsanc"));
+ learnskill SKILL_BETSANC;
+ goto L_Q_magic_finish;
+
+L_Q_magic_4:
+ mesn l("Earth Spirit");
+ mesq l("Naah, you're too weak now! Come back later when you have grown!");
+ next;
+ goto L_Main;
+
+L_No20k:
+ mesn l("Earth Spirit");
+ mes "\"You can't pay me 20,000 if you don't have that much!\"";
+ next;
+ goto L_Main;
+
+L_Q_tree_none:
+ mesn l("Earth Spirit");
+ mes "\"Where is your branch?\"";
+ next;
+ goto L_Main;
+
+L_Q_tree_dry:
+ mesn l("Earth Spirit");
+ mes "\"That won't do. This branch is completely dead; you'll have to get another.\"";
+ next;
+ goto L_Main;
+
+L_Q_tree_nomoney:
+ mesn l("Earth Spirit");
+ mes "\"No, you don't have enough money! Come back when you have 100,000.\"";
+ next;
+ goto L_Main;
+
+L_Q_tree_howmuch:
+ mesn l("Earth Spirit");
+ mes "\"It's only 100,000 GP to become my student.\"";
+ next;
+ goto L_Main;
+
+L_Q_tree_how:
+ mesn l("Earth Spirit");
+ mes "\"Oh... right, the tree might be protected. Only a bone knife will cut that. No idea where you can find one, but I'm sure you will manage!\"";
+ next;
+ goto L_Main;
+
+L_Q_tree_where:
+ mesn l("Earth Spirit");
+ mes "\"North-east of here.\"";
+ next;
+ goto L_Main;
+
+L_Q_tree_what:
+ mesn l("Earth Spirit");
+ mes "\"Just some silly druid who turned himself into a tree; nothing important.\"";
+ next;
+ goto L_Main;
+
+L_silly_close:
+ if (MAGIC_FLAGS & MFLAG_KNOWS_IMP)
+ mesn l("Earth Spirit");
+ if (!(MAGIC_FLAGS & MFLAG_KNOWS_IMP))
+ mes "[Well]";
+ mes "\"Fool.\"";
+ goto L_close;
+
+L_close:
+ @Q_MASK = 0;
+ @Q_SHIFT = 0;
+ @Q_status = 0;
+ @SUP_id = 0;
+ @SUP_name$ = "";
+ @SUP_xp = 0;
+ @SUP_lvl = 0;
+ @Q_STATUS_INITIAL = 0;
+ @Q_STATUS_ONQUEST = 0;
+ @Q_STATUS_STUDENT0 = 0;
+ @Q_STATUS_STUDENT1 = 0;
+ @Q_STATUS_STUDENT2 = 0;
+ @Q_STATUS_STUDENT3 = 0;
+ return;
+
+S_Update_Var:
+ QUEST_MAGIC2 = (QUEST_MAGIC2 & ~(@Q_MASK) | (@Q_status << @Q_SHIFT));
+ return;
+}
+
+006-1,67,68,0 script #EarthImp0#_M NPC400,{
+ callfunc "EarthImpTouch";
+ close;
+}
+
+006-1,68,68,0 script #EarthImp1#_M NPC400,{
+ callfunc "EarthImpTouch";
+ close;
+}
diff --git a/npc/006-1/traveler.txt b/npc/006-1/traveler.txt
new file mode 100644
index 00000000..a16b502a
--- /dev/null
+++ b/npc/006-1/traveler.txt
@@ -0,0 +1,7 @@
+
+006-1,25,95,0 script Rhutan the Traveler NPC103,{
+ @npcname$ = "Rhutan";
+ @NpcTravelBit = $@pachua_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/006-1/tree.txt b/npc/006-1/tree.txt
new file mode 100644
index 00000000..df6dd2ef
--- /dev/null
+++ b/npc/006-1/tree.txt
@@ -0,0 +1,159 @@
+function script QuestTreeTrigger {
+ @Q_MASK = NIBBLE_2_MASK;
+ @Q_SHIFT = NIBBLE_2_SHIFT;
+
+ @Q_status = (QUEST_MAGIC & @Q_MASK) >> @Q_SHIFT;
+ @Q_status_lower = @Q_status & 3;
+ @Q_status = (@Q_status & 12) >> 2;
+
+ if (@Q_status & getarg(0, @flag)) goto L_close; // already did that
+
+ if (getarg(0, @flag) == 2) goto L_hug;
+ goto L_Cont;
+
+L_Cont:
+ @Q_status = @Q_status | getarg(0, @flag);
+ callsub S_Update_Var;
+
+ if (@Q_status != 3) goto L_close;
+
+ if (MAGIC_FLAGS & MFLAG_DID_CUTTREE) goto L_close;
+
+ mes "Maybe it is just a trick of the light, but you can't help but think that the tree looks different... healthier, almost younger.";
+ mes "[20000 experience points]";
+ getexp 20000, 0;
+ @value = 15;
+ callfunc "QuestSagathaHappy";
+ goto L_close;
+
+L_hug:
+ mes "You hug the tree.";
+ next;
+ goto L_Cont;
+
+L_close:
+ @Q_MASK = 0;
+ @Q_SHIFT = 0;
+ @Q_status = 0;
+ @Q_status_lower = 0;
+ @Q_wr_status = 0;
+ @value = 0;
+ return;
+
+S_Update_Var:
+ @Q_wr_status = (@Q_status << 2) | @Q_status_lower;
+ QUEST_MAGIC = (QUEST_MAGIC & ~(@Q_MASK) | (@Q_wr_status << @Q_SHIFT));
+ return;
+}
+
+function script QuestTreeTouch {
+ @Q_MASK = NIBBLE_2_MASK;
+ @Q_SHIFT = NIBBLE_2_SHIFT;
+
+ @Q_status = (QUEST_MAGIC & @Q_MASK) >> @Q_SHIFT;
+ @Q_status = (@Q_status & 12) >> 2;
+
+ if (@Q_status == 3) goto L_Happy;
+
+ if ((MAGIC_FLAGS & (MFLAG_KNOWS_DRUIDTREE | MFLAG_KNOWS_CUTTREE)) == MFLAG_KNOWS_CUTTREE) goto L_cut;
+
+ if ((MAGIC_FLAGS & (MFLAG_KNOWS_DRUIDTREE | MFLAG_KNOWS_CUTTREE)) == MFLAG_KNOWS_DRUIDTREE) goto L_Water;
+
+ if ((MAGIC_FLAGS & (MFLAG_KNOWS_DRUIDTREE | MFLAG_KNOWS_CUTTREE)) > 0) //i.e., both are set
+ goto L_both;
+
+ mes "[Dying Tree]";
+ mes "You see a strange tree.";
+ goto L_close;
+
+L_cut:
+ mes "[Dying Tree]";
+ mes "This must be the tree that the earth spirit was referring to.";
+ next;
+ menu
+ "Cut off a branch", L_do_cut,
+ "Leave it alone", L_close;
+
+L_Water:
+ mes "[Dying Tree]";
+ mes "This must be the druid tree.";
+ next;
+ menu
+ "Water the tree", L_Givewater,
+ "Kiss tree", L_kiss,
+ "Leave it alone", L_close;
+
+L_both:
+ mes "[Dying Tree]";
+ mes "This must be the druid tree that Wyara and the earth spirit were talking about.";
+ next;
+ menu
+ "Water the tree", L_Givewater,
+ "Kiss tree", L_kiss,
+ "Cut off a branch", L_do_cut,
+ "Leave it alone", L_close;
+
+L_Givewater:
+ if (countitem("BottleOfWater") < 1) goto L_No_Water;
+ delitem "BottleOfWater", 1;
+ getitem "EmptyBottle", 1;
+
+ mes "[Dying Tree]";
+ mes "You pour a bottle of water into the sand. The water dissipates quickly, without any effect.";
+ goto L_close;
+
+L_No_Water:
+ mes "[Dying Tree]";
+ mes "You don't have any water.";
+ goto L_close;
+
+L_kiss:
+ mes "[Dying Tree]";
+ mes "You pluck out a splinter from your lip.";
+ mes "Somehow, you don't think that this helped.";
+ goto L_close;
+
+L_do_cut:
+ if (countitem("BoneKnife") < 1) goto L_No_boneknife;
+
+ if (MAGIC_FLAGS & MFLAG_DID_CUTTREE) goto L_really_cut;
+
+ mes "[Dying Tree]";
+ mes "You find a suitable branch and put your bone knife in position.";
+ mes "Holding the branch, you have an uneasy feeling – as if something inside the tree were trying to resist you...";
+ mes "Do you want to continue cutting?";
+ next;
+ menu
+ "Nah... better not.", L_close,
+ "Yes, let's cut!", L_really_cut;
+
+L_really_cut:
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_DID_CUTTREE;
+ getitem "DruidTreeBranch", 1;
+ mes "[Dying Tree]";
+ mes "You cut off a branch from the tree.";
+ mes "For an instant, you have an uneasy feeling, as if the branch were writhing in your hand...";
+ goto L_close;
+
+L_No_boneknife:
+ mes "[Dying Tree]";
+ mes "Try as you might, you can't seem to find a way to cut off a branch. Perhaps you need a different tool for cutting?";
+ goto L_close;
+
+L_Happy:
+ mes "[Druid Tree]";
+ mes "The tree looks younger and healthier now.";
+ goto L_close;
+
+L_close:
+ @Q_MASK = 0;
+ @Q_SHIFT = 0;
+ @Q_status = 0;
+ return;
+
+}
+
+006-1,82,59,0 script #DruidTree0#_M NPC400,{
+ callfunc "QuestTreeTouch";
+ close;
+}
diff --git a/npc/006-2/_import.txt b/npc/006-2/_import.txt
new file mode 100644
index 00000000..24095263
--- /dev/null
+++ b/npc/006-2/_import.txt
@@ -0,0 +1,6 @@
+// Map 006-2: Pachua's Village
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/006-2/_warps.txt",
+"npc/006-2/mapflags.txt",
+"npc/006-2/npcs.txt",
+"npc/006-2/shops.txt",
diff --git a/npc/006-2/_warps.txt b/npc/006-2/_warps.txt
new file mode 100644
index 00000000..b5ddad73
--- /dev/null
+++ b/npc/006-2/_warps.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 006-2: Pachua's Village warps
+006-2,67,65,0 warp #006-2_67_65 0,0,006-1,23,101
+006-2,65,73,0 warp #006-2_65_73 0,0,006-1,21,109
+006-2,48,44,0 warp #006-2_48_44 0,0,006-1,23,86
+006-2,58,44,0 warp #006-2_58_44 0,0,006-1,33,86
diff --git a/npc/006-2/mapflags.txt b/npc/006-2/mapflags.txt
new file mode 100644
index 00000000..b5d8a508
--- /dev/null
+++ b/npc/006-2/mapflags.txt
@@ -0,0 +1 @@
+//006-2 mapflag resave 006-1,36,18
diff --git a/npc/006-2/npcs.txt b/npc/006-2/npcs.txt
new file mode 100644
index 00000000..14d6d6e2
--- /dev/null
+++ b/npc/006-2/npcs.txt
@@ -0,0 +1,99 @@
+
+006-2,49,25,0 script Falkurn NPC178,{
+ @run = ((QUEST_NorthTulimshar & TWOBIT_8_MASK) >> TWOBIT_8_SHIFT);
+ if ((@run == 1) && (QL_KYLIAN == 13))
+ goto L_Deliver;
+ goto L_Start;
+
+L_Deliver:
+ menu
+ "I have a delivery for you", L_Delivery;
+
+L_Delivery:
+ mes "[Falkurn]";
+ mes "\"Good now we can get to work on making some more leather goods.\"";
+ QL_KYLIAN = 14;
+ goto L_close;
+
+L_Start:
+ mes "[Falkurn]";
+ mes "\"Greetings traveler, what wind brings you to our door?\"";
+ menu
+ "I'm looking for exotic goods.", L_Shops,
+ "I need some leatherwork done.", L_Pachua,
+ "Just Looking Around.", L_close;
+
+L_Shops:
+ mes "\"My Wife, Ardra, tends the Kitchen see her for food and drink.\"";
+ mes "\"She can be found in the West Cave.\"";
+ next;
+ mes "\"Reathe trades many of our leather goods to exotic lands.\"";
+ mes "\"She always has the most interesting finds.\"";
+ mes "\"She can be found in the East Cave.\"";
+ goto L_close;
+
+L_Pachua:
+ mes "\"Our Chief can be found by going through the southern most cave.\"";
+ mes "\"He can help you with any leatherwork you may need done.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
+
+006-2,80,25,0 script Darug NPC178,{
+ mes "[Darug]";
+ mes "\"We are the all thats left of the natives that used to wander the plains.\"";
+ mes "\"Years of war between the various 'Civilized' nations drained the natural resources.\"";
+ next;
+ mes "\"The waters have begun to run dry.\"";
+ mes "\"All manner of beasts are getting more agressive.\"";
+ mes "\"The Mana has been poison by Dark Magic.\"";
+ next;
+ mes "\"Even now, I sense a evil presense nearby.\"";
+ mes "\"I can feel it lying deep underground.\"";
+ mes "\"Gnawing at the underbelly of Tonori.\"";
+ next;
+ mes "\"We believe it's one of the evils Nu'rem let loose to destroy The Mana\"";
+ mes "\"We have been searching, but have not been able to locate the source.\"";
+ mes "\"Maybe our scouts will return soon with the answers.\"";
+ close;
+}
+
+006-2,34,64,0 script Meluna NPC179,{
+ mes "[Meluna]";
+ mes "\"Greetings traveler, how blows the wind?\"";
+ goto L_Main;
+
+L_Main:
+ menu
+ "Um... What?", L_Explain,
+ "Gentle.", L_Heal,
+ "Strong.", L_close;
+
+L_Explain:
+ mes "\"Ahh sorry, you are not familiar with our customs.\"";
+ mes "\"The Mana was made into the 4 main elements by The Gods; Jande made Fire, Nu'rem made Earth, Tal made Air, and, Di'tal made Water.\"";
+ mes "\"It was Tal that gives us our first and last breathe.\"";
+ next;
+ mes "\"When we ask you how 'blows the wind?'\"";
+ mes "\"We mean how are your feeling?\"";
+ next;
+ mes "\"We typically respond with a strength of wind; normally Gentle or Strong\"";
+ goto L_Main;
+
+L_Heal:
+ if (BaseLevel > 70)
+ goto L_NoHeal;
+ heal 1000,100;
+ goto L_close;
+
+L_NoHeal:
+ mes "\"I already sense the power of the Gods carrying you.\"";
+ mes "\"Any wounds you have are beyond my power to fix.\"";
+ goto L_close;
+
+L_close:
+ mes "\"May Tal carry you on their back.\"";
+ close;
+}
diff --git a/npc/006-2/shops.txt b/npc/006-2/shops.txt
new file mode 100644
index 00000000..9322272b
--- /dev/null
+++ b/npc/006-2/shops.txt
@@ -0,0 +1,34 @@
+// The Mana World Script
+// (C) Jesusalva, 2021
+// Licensed under GPLv2 or later
+
+006-2,81,36,0 script Reathe NPC179,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem ToySabre;
+ sellitem Cap;
+ sellitem HighPriestCrown;
+ sellitem MonsterSkullHelmet;
+ .distance = 5;
+ end;
+}
+
+006-2,30,35,0 script Ardra NPC179,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem CactusDrink;
+ sellitem CactusPotion;
+ sellitem BottleOfWater;
+ sellitem RoastedMaggot;
+ .distance = 5;
+ end;
+}
+
diff --git a/npc/006-3/_import.txt b/npc/006-3/_import.txt
new file mode 100644
index 00000000..1e626359
--- /dev/null
+++ b/npc/006-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 006-3: Desert Mountain Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/006-3/_mobs.txt",
+"npc/006-3/_warps.txt",
+"npc/006-3/mapflags.txt",
diff --git a/npc/006-3/_mobs.txt b/npc/006-3/_mobs.txt
new file mode 100644
index 00000000..66280c42
--- /dev/null
+++ b/npc/006-3/_mobs.txt
@@ -0,0 +1,28 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 006-3: Desert Mountain Cave mobs
+006-3,108,25,18,4 monster Mountain Snake 1026,3,15000,90000
+006-3,99,50,7,6 monster Mountain Snake 1026,1,15000,90000
+006-3,89,63,7,5 monster Mountain Snake 1026,2,15000,90000
+006-3,86,90,14,4 monster Mountain Snake 1026,3,15000,90000
+006-3,109,78,6,4 monster Mountain Snake 1026,1,15000,90000
+006-3,119,117,7,7 monster Mountain Snake 1026,4,15000,90000
+006-3,106,64,7,8 monster Mountain Snake 1026,3,15000,90000
+006-3,65,71,15,17 monster Mountain Snake 1026,10,15000,90000
+006-3,57,105,13,15 monster Mountain Snake 1026,8,15000,90000
+006-3,73,120,8,2 monster Mountain Snake 1026,3,15000,90000
+006-3,117,54,5,4 monster Mountain Snake 1026,4,15000,90000
+006-3,123,62,5,2 monster Mountain Snake 1026,3,15000,90000
+006-3,72,36,12,12 monster Mountain Snake 1026,10,15000,90000
+006-3,84,27,2,3 monster Mountain Snake 1026,1,15000,90000
+006-3,40,40,18,14 monster Mountain Snake 1026,8,15000,90000
+006-3,34,60,13,5 monster Mountain Snake 1026,3,15000,90000
+006-3,87,74,13,4 monster Red Slime 1008,3,15000,10000
+006-3,120,76,4,10 monster Red Slime 1008,3,15000,10000
+006-3,101,85,7,4 monster Red Slime 1008,4,15000,10000
+006-3,44,124,14,3 monster Mountain Snake 1026,5,15000,90000
+006-3,90,125,8,3 monster Mountain Snake 1026,5,15000,90000
+006-3,30,88,6,10 monster Red Slime 1008,3,90000,30000
+006-3,122,98,5,8 monster Spider 1012,3,90000,30000
+006-3,112,104,3,6 monster Spider 1012,1,90000,30000
+006-3,103,108,4,4 monster Spider 1012,1,90000,30000
+006-3,83,107,6,7 monster Yellow Slime 1007,6,90000,30000
diff --git a/npc/006-3/_warps.txt b/npc/006-3/_warps.txt
new file mode 100644
index 00000000..addd9a57
--- /dev/null
+++ b/npc/006-3/_warps.txt
@@ -0,0 +1,22 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 006-3: Desert Mountain Cave warps
+006-3,40,26,0 warp #006-3_40_26 0,0,006-1,40,28
+006-3,55,27,0 warp #006-3_55_27 0,0,006-1,55,29
+006-3,62,30,0 warp #006-3_62_30 0,0,006-1,62,32
+006-3,86,24,0 warp #006-3_86_24 0,0,006-1,86,26
+006-3,91,24,0 warp #006-3_91_24 0,0,006-1,91,26
+006-3,122,24,0 warp #006-3_122_24 0,0,006-1,114,24
+006-3,114,49,0 warp #006-3_114_49 0,0,006-1,114,51
+006-3,104,44,0 warp #006-3_104_44 0,0,006-1,98,48
+006-3,77,44,0 warp #006-3_77_44 0,0,006-1,77,46
+006-3,60,68,0 warp #006-3_60_68 0,0,006-1,60,60
+006-3,92,63,0 warp #006-3_92_63 0,0,006-1,92,65
+006-3,112,74,0 warp #006-3_112_74 0,0,006-1,112,76
+006-3,110,56,0 warp #006-3_110_56 0,0,006-1,102,55
+006-3,125,59,0 warp #006-3_125_59 0,0,006-1,117,59
+006-3,74,90,0 warp #006-3_74_90 0,0,006-1,74,92
+006-3,51,90,0 warp #006-3_51_90 0,0,006-1,51,92
+006-3,38,121,0 warp #006-3_38_121 0,0,006-1,38,123
+006-3,79,120,0 warp #006-3_79_120 0,0,006-1,83,119
+006-3,125,66,0 warp #006-3_125_66 0,0,005-3,85,52
+006-3,89,46,0 warp #006-3_89_46 0,0,005-3,63,49
diff --git a/npc/006-3/mapflags.txt b/npc/006-3/mapflags.txt
new file mode 100644
index 00000000..3aeee40c
--- /dev/null
+++ b/npc/006-3/mapflags.txt
@@ -0,0 +1 @@
+//006-3 mapflag resave 006-1,36,18
diff --git a/npc/007-1/_import.txt b/npc/007-1/_import.txt
new file mode 100644
index 00000000..67c56716
--- /dev/null
+++ b/npc/007-1/_import.txt
@@ -0,0 +1,6 @@
+// Map 007-1: Woodland
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/007-1/_mobs.txt",
+"npc/007-1/_warps.txt",
+"npc/007-1/mapflags.txt",
+"npc/007-1/voltain.txt",
diff --git a/npc/007-1/_mobs.txt b/npc/007-1/_mobs.txt
new file mode 100644
index 00000000..b7b12d7a
--- /dev/null
+++ b/npc/007-1/_mobs.txt
@@ -0,0 +1,11 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 007-1: Woodland mobs
+007-1,0,0,0,0 monster Pink Flower 1014,17,100000,30000
+007-1,0,0,0,0 monster Spiky Mushroom 1019,15,100000,30000
+007-1,0,0,0,0 monster Snail 1041,25,100000,30000
+007-1,0,0,0,0 monster Mauve Plant 1029,3,270000,180000
+007-1,0,0,0,0 monster Gamboge Plant 1031,1,2700000,1800000
+007-1,0,0,0,0 monster Silkworm 1035,2,60000,30000
+007-1,0,0,0,0 monster Clover Patch 1037,2,0,1000
+007-1,0,0,0,0 monster Squirrel 1038,25,30,20
+007-1,0,0,0,0 monster Butterfly 1055,10,30,20
diff --git a/npc/007-1/_warps.txt b/npc/007-1/_warps.txt
new file mode 100644
index 00000000..c26e980a
--- /dev/null
+++ b/npc/007-1/_warps.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 007-1: Woodland warps
+007-1,20,54,0 warp #007-1_20_54 0,1,010-1,130,53
+007-1,69,21,0 warp #007-1_69_21 3,0,008-1,78,101
+007-1,122,20,0 warp #007-1_122_20 2,0,008-1,132,98
+007-1,73,76,0 warp #007-1_73_76 0,0,007-2,34,34
diff --git a/npc/007-1/mapflags.txt b/npc/007-1/mapflags.txt
new file mode 100644
index 00000000..666d518b
--- /dev/null
+++ b/npc/007-1/mapflags.txt
@@ -0,0 +1 @@
+//007-1 mapflag resave 009-2,149,43
diff --git a/npc/007-1/voltain.txt b/npc/007-1/voltain.txt
new file mode 100644
index 00000000..6cedb1d6
--- /dev/null
+++ b/npc/007-1/voltain.txt
@@ -0,0 +1,377 @@
+
+007-1,37,21,0 script Voltain NPC103,{
+ @BOTTLE_NEEDED = 3;
+ @BOTTLE_REWARD_XP = 100;
+ @BOTTLE_REWARD_GOLD = 450;
+
+ @BLACK_SC_ST_NEEDED = 5;
+ @BLACK_SC_ST_REWARD_XP = 500;
+ @BLACK_SC_ST_REWARD_GOLD = 250;
+
+ @BUGLEG_NEEDED = 10;
+ @BUGLEG_REWARD_XP = 200;
+ @BUGLEG_REWARD_GOLD = 150;
+
+ @HERBS_NEEDED = 7;
+ @HERBS_REWARD_XP = 200;
+ @HERBS_REWARD_GOLD = 250;
+
+ @RAWLOG_NEEDED = 5;
+ @RAWLOG_REWARD_XP = 330;
+ @RAWLOG_REWARD_GOLD = 300;
+
+ @REDAPPLE_NEEDED = 7;
+ @REDAPPLE_REWARD_XP = 330;
+ @REDAPPLE_REWARD_GOLD = 300;
+
+ @STEAK_NEEDED = 2;
+ @STEAK_REWARD_XP = 330;
+ @STEAK_REWARD_GOLD = 280;
+
+ @ARROW_NEEDED = 25;
+ @ARROW_REWARD_XP = 330;
+ @ARROW_REWARD_GOLD = 100;
+
+ @SNAKETONGUE_NEEDED = 3;
+ @SNAKETONGUE_REWARD_XP = 330;
+ @SNAKETONGUE_REWARD_GOLD = 100;
+
+ @CHOCOLATECAKE_NEEDED = 3;
+ @CHOCOLATECAKE_REWARD_XP = 330;
+ @CHOCOLATECAKE_REWARD_GOLD = 180;
+
+ if ($@VOLTAIN_state == 1) goto L_state1;
+ if ($@VOLTAIN_state == 2) goto L_state2;
+ if ($@VOLTAIN_state == 3) goto L_state3;
+ if ($@VOLTAIN_state == 4) goto L_state4;
+ if ($@VOLTAIN_state == 5) goto L_state5;
+ if ($@VOLTAIN_state == 6) goto L_state6;
+ if ($@VOLTAIN_state == 7) goto L_state7;
+ if ($@VOLTAIN_state == 8) goto L_state8;
+ if ($@VOLTAIN_state == 9) goto L_state9;
+ if ($@VOLTAIN_state == 10) goto L_state10;
+ if ($@VOLTAIN_state == 11) goto L_state11;
+ if ($@VOLTAIN_state == 12) goto L_state12;
+ if ($@VOLTAIN_state == 13) goto L_state13;
+ goto L_state0;
+
+L_state0:
+ mes "[Voltain]";
+ mes "\"What are you doing bothering me? Can't you see I'm busy! Oh, I'm sorry, I thought you were my assistant. Never mind that... would you care to help me?\"";
+ next;
+ menu
+ "Sure I do!", L_Next,
+ "No, you creep me out.", L_NoHelp;
+
+L_Next:
+ mes "[Voltain]";
+ mes "\"I'm working on a very special potion. I need some empty bottles to keep the ingredients in. Care to go find me " + @BOTTLE_NEEDED + " empty bottles?!\"";
+ next;
+ menu
+ "I've got the bottles.", L_Next1,
+ "I don't feel like helping you get garbage...", L_close;
+
+L_Next1:
+ if (countitem("EmptyBottle") < @BOTTLE_NEEDED)
+ goto L_No_Water;
+ delitem "EmptyBottle", @BOTTLE_NEEDED;
+ Zeny = Zeny + @BOTTLE_REWARD_GOLD;
+ getexp @BOTTLE_REWARD_XP, 0;
+ $@VOLTAIN_state = 1;
+ mes "\"Thanks for the bottles. Much easier to carry liquid in them.\"";
+ goto L_close;
+
+L_state1:
+ mes "[Voltain]";
+ mes "\"I'm making a potion that requires lots of venom. I'm in need of " + @BLACK_SC_ST_NEEDED + " black scorpion stingers.\"";
+ next;
+
+ menu
+ "I've got the stingers!", L_Next2,
+ "I'll go search for them.", L_close;
+
+L_Next2:
+ mes "[Voltain]";
+ if (countitem("BlackScorpionStinger") < @BLACK_SC_ST_NEEDED)
+ goto L_No_Water;
+ delitem "BlackScorpionStinger", @BLACK_SC_ST_NEEDED;
+ Zeny = Zeny + @BLACK_SC_ST_REWARD_GOLD;
+ getexp @BLACK_SC_ST_REWARD_XP, 0;
+ $@VOLTAIN_state = 2;
+ mes "\"Well, since you went to the trouble of getting me these here's a little something for your time...\"";
+ goto L_close;
+
+L_state2:
+ mes "[Voltain]";
+ mes "\"Care to to help me with my potion? I need " + @BUGLEG_NEEDED + " bug legs so that I can thicken the potion.\"";
+ next;
+ menu
+ "I've got the bug legs.", L_Next3,
+ "I'd rather not carry around dead bugs for you.", L_NoHelp ;
+
+L_Next3:
+ mes "[Voltain]";
+ if (countitem("BugLeg") < @BUGLEG_NEEDED)
+ goto L_No_Water;
+ delitem "BugLeg", @BUGLEG_NEEDED;
+ Zeny = Zeny + @BUGLEG_REWARD_GOLD;
+ getexp @BUGLEG_REWARD_XP, 0;
+ $@VOLTAIN_state = 3;
+ mes "\"Great! My potion is ready to poison the moub...I mean cure scorpion stings. \"";
+ goto L_close;
+
+L_state3:
+ mes "[Voltain]";
+ mes "\"I find myself in need of a black scorpion stinger... Damn mouboo are hard to kill...forget you heard that.\"";
+ next;
+ menu
+ "Here's the stinger.", L_Next4,
+ "I DID HEAR THAT! I will not help you KILL mouboo!", L_close;
+
+L_Next4:
+ mes "[Voltain]";
+ if (countitem("BlackScorpionStinger") < 1)
+ goto L_No_Water;
+ delitem "BlackScorpionStinger", 1;
+ getexp @BLACK_SC_ST_REWARD_XP, 0;
+ $@VOLTAIN_state = 4;
+ mes "\"Great! Now I can really kill that monster!\"";
+ goto L_close;
+
+L_state4:
+ mes "[Voltain]";
+ mes "\"I need to thicken a veno.. Oh, a potion actually. I want to try mauve herbs for that, so can you bring me " + @HERBS_NEEDED + ", please?\"";
+ next;
+ menu
+ "Here are the herbs.", L_Next5,
+ "So you want to do a venom? I will not help you!", L_close;
+
+L_Next5:
+ mes "[Voltain]";
+ if (countitem("MauveHerb") < @HERBS_NEEDED)
+ goto L_No_Water;
+ delitem "MauveHerb", @HERBS_NEEDED;
+ getexp @HERBS_REWARD_XP, 0;
+ Zeny = Zeny + @HERBS_REWARD_GOLD;
+ $@VOLTAIN_state = 5;
+ mes "\"Great! Now I can thicken the potion! I will try directly.\"";
+ goto L_close;
+
+L_state5:
+ mes "[Voltain]";
+ mes "\"Hello I am looking for " + @RAWLOG_NEEDED + " raw logs, maybe you could help me getting some? I want to try to build a mouboo trap.. Uhm actually no! I want to build a device to destroy these traps. So can you help me?\"";
+ next;
+ menu
+ "Here are the raw logs.", L_Next6,
+ "So you want build traps for mouboos? NO WAY!", L_close;
+
+L_Next6:
+ mes "[Voltain]";
+ if (countitem("RawLog") < @RAWLOG_NEEDED)
+ goto L_No_Water;
+ delitem "RawLog", @RAWLOG_NEEDED;
+ getexp @RAWLOG_REWARD_XP, 0;
+ Zeny = Zeny + @RAWLOG_REWARD_GOLD;
+ $@VOLTAIN_state = 6;
+ mes "\"Great! Now I can thicken the potion! I will try directly.\"";
+ goto L_close;
+
+L_state6:
+ mes "[Voltain]";
+ mes "\"Hello I am looking for " + @REDAPPLE_NEEDED + " red apples, maybe I can inject some venoms.. DOH not this again! Of course I meant a strength potion. Did you hear about the new potions from Caul? He is a pretty good alchimist. He can do strength potions, can't he?\"";
+ next;
+ menu
+ "Here are the red apples.", L_Next7,
+ "I am not sure...", L_close;
+
+L_Next7:
+ mes "[Voltain]";
+ if (countitem("RedApple") < @REDAPPLE_NEEDED)
+ goto L_No_Water;
+ delitem "RedApple", @REDAPPLE_NEEDED;
+ getexp @REDAPPLE_REWARD_XP, 0;
+ Zeny = Zeny + @REDAPPLE_REWARD_GOLD;
+ $@VOLTAIN_state = 7;
+ mes "\"Very well, this will be useful.\"";
+ goto L_close;
+
+L_state7:
+ mes "[Voltain]";
+ mes "\"I need to thicken a veno.. Oh, a potion actually. Cobalt herbs might be good for that, so can you bring me " + @HERBS_NEEDED + ", please?\"";
+ next;
+ menu
+ "Here are the herbs.", L_Next8,
+ "So you want to do a venom? I will not help you!", L_close;
+
+L_Next8:
+ mes "[Voltain]";
+ if (countitem("CobaltHerb") < @HERBS_NEEDED)
+ goto L_No_Water;
+ delitem "CobaltHerb", @HERBS_NEEDED;
+ getexp @HERBS_REWARD_XP, 0;
+ Zeny = Zeny + @HERBS_REWARD_GOLD;
+ $@VOLTAIN_state = 8;
+ mes "\"Great! Now I can go on with the ven- the experiments for the welfare of humanity, I mean.\"";
+ goto L_close;
+
+L_state8:
+ mes "[Voltain]";
+ mes "\"I am in need of snake tongues. They can help me getting very strong venom extracts. So I would like you to bring me " + @SNAKETONGUE_NEEDED + " snake tongues.\"";
+ next;
+ menu
+ "Sure, here you go!", L_Next9,
+ "Maybe you will find someone else, I got stuff to do on my own!", L_close;
+
+L_Next9:
+ mes "[Voltain]";
+ if (countitem("SnakeTongue") < @SNAKETONGUE_NEEDED)
+ goto L_No_Water;
+ delitem "SnakeTongue", @SNAKETONGUE_NEEDED;
+ getexp @SNAKETONGUE_REWARD_XP, 0;
+ Zeny = Zeny + @SNAKETONGUE_REWARD_GOLD;
+ $@VOLTAIN_state = 9;
+ mes "\"Excellent, now I can extract the venom to- uhm, nevermind. Thanks for your help.\"";
+ goto L_close;
+
+L_state9:
+ mes "[Voltain]";
+ mes "\"I need to thicken a veno.. Oh, a potion actually. I want to try alizarin herbs for that, so can you bring me " + @HERBS_NEEDED + ", please?\"";
+ next;
+ menu
+ "Here are the herbs.", L_Next10,
+ "So you want to do a venom? I will not help you!", L_close;
+
+L_Next10:
+ mes "[Voltain]";
+ if (countitem("AlizarinHerb") < @HERBS_NEEDED)
+ goto L_No_Water;
+ delitem "AlizarinHerb", @HERBS_NEEDED;
+ getexp @HERBS_REWARD_XP, 0;
+ Zeny = Zeny + @HERBS_REWARD_GOLD;
+ $@VOLTAIN_state = 10;
+ mes "\"Great! Now I can thicken the potion! I will try directly.\"";
+ goto L_close;
+
+L_state10:
+ mes "[Voltain]";
+ mes "\"Oh I am hungry. Maybe I can eat some steaks. Could you bring me a steak, please?\"";
+ next;
+ mes "\"Oh, I just wonder if I can inject some ven... Forget about that! Bring me " + @STEAK_NEEDED + " steaks!\"";
+ next;
+ menu
+ "Here you go.", L_Next11,
+ "Help yourself! In the Hurnscald Inn you can get some meals for sure!", L_close;
+
+L_Next11:
+ mes "[Voltain]";
+ if (countitem("Steak") < @STEAK_NEEDED)
+ goto L_No_Water;
+ delitem "Steak", @STEAK_NEEDED;
+ getexp @STEAK_REWARD_XP, 0;
+ Zeny = Zeny + @STEAK_REWARD_GOLD;
+ $@VOLTAIN_state = 11;
+ mes "\"Thanks a lot. I will really enjoy my meal.\"";
+ goto L_close;
+
+L_state11:
+ mes "[Voltain]";
+ mes "\"Could I have some arrows please? I have lost my hunting equipment when I was in the caves. Some dark creatures were chasing me!\"";
+ next;
+ mes "\"Acually I wonder if I can use these arrows for building a mouboo trap.... Oh wait! I need some " + @ARROW_NEEDED + " arrows for my self defence right? So do not talk about it!\"";
+ menu
+ "Here you go.", L_Next12,
+ "Sorry I don't have arrows here!", L_close;
+
+L_Next12:
+ mes "[Voltain]";
+ if (countitem("Arrow") < @ARROW_NEEDED)
+ goto L_No_Water;
+ delitem "Arrow", @ARROW_NEEDED;
+ getexp @ARROW_REWARD_XP, 0;
+ Zeny = Zeny + @ARROW_REWARD_GOLD;
+ $@VOLTAIN_state = 12;
+ mes "\"Thanks a lot. Now I feel more secure here in the outdoors.\"";
+ goto L_close;
+
+L_state12:
+ mes "[Voltain]";
+ mes "\"I need to thicken a veno.. Oh, a potion actually. I want to try gamboge herbs for that, so can you bring me " + @HERBS_NEEDED + ", please?\"";
+ next;
+ menu
+ "Here are the herbs.", L_Next13,
+ "So you want to do a venom? I will not help you!", L_close;
+
+L_Next13:
+ mes "[Voltain]";
+ if (countitem("GambogeHerb") < @HERBS_NEEDED)
+ goto L_No_Water;
+ delitem "GambogeHerb", @HERBS_NEEDED;
+ getexp @HERBS_REWARD_XP, 0;
+ Zeny = Zeny + @HERBS_REWARD_GOLD;
+ $@VOLTAIN_state = 13;
+ mes "\"Great! Now I can thicken the potion! I will try directly.\"";
+ goto L_close;
+
+L_state13:
+ mes "[Voltain]";
+ mes "\"Doing so many ev- good things makes me hungry. I feel in the mood for a Chocolate Cake. Can you bring me " + @CHOCOLATECAKE_NEEDED + ", please? \"";
+ next;
+ menu
+ "Here it is.", L_Next14,
+ "I don't feel in the mood to bring you a cake.", L_close;
+
+L_Next14:
+ mes "[Voltain]";
+ if (countitem("ChocolateCake") < @CHOCOLATECAKE_NEEDED)
+ goto L_No_Water;
+ delitem "ChocolateCake", @CHOCOLATECAKE_NEEDED;
+ getexp @CHOCOLATECAKE_REWARD_XP, 0;
+ Zeny = Zeny + @CHOCOLATECAKE_REWARD_GOLD;
+ $@VOLTAIN_state = 0;
+ mes "\"I love chocolate cakes. I wonder, if I can use my ven- \"";
+ emotion EMOTE_EVIL, strcharinfo(0);
+ goto L_close;
+
+L_NoHelp:
+ mes "\"If you don't want to help me, then away with you. Bothering me won't help me get my work done.\"";
+ mes "Voltain then mumbles something under his breath that you cannot quite make out";
+ mes "\"... These damn kids. \"";
+ goto L_close;
+
+L_close:
+ @BOTTLE_NEEDED = 0;
+ @BOTTLE_REWARD_XP = 0;
+ @BOTTLE_REWARD_GOLD = 0;
+ @BLACK_SC_ST_NEEDED = 0;
+ @BLACK_SC_ST_REWARD_XP = 0;
+ @BLACK_SC_ST_REWARD_GOLD = 0;
+ @BUGLEG_NEEDED = 0;
+ @BUGLEG_REWARD_XP = 0;
+ @BUGLEG_REWARD_GOLD = 0;
+ @HERBS_NEEDED = 0;
+ @HERBS_REWARD_XP = 0;
+ @HERBS_REWARD_GOLD = 0;
+ @RAWLOG_NEEDED = 0;
+ @RAWLOG_REWARD_XP = 0;
+ @RAWLOG_REWARD_GOLD = 0;
+ @REDAPPLE_NEEDED = 0;
+ @REDAPPLE_REWARD_XP = 0;
+ @REDAPPLE_REWARD_GOLD = 0;
+ @STEAK_NEEDED = 0;
+ @STEAK_REWARD_XP = 0;
+ @STEAK_REWARD_GOLD = 0;
+ @ARROW_NEEDED = 0;
+ @ARROW_REWARD_XP = 0;
+ @ARROW_REWARD_GOLD = 0;
+ @SNAKETONGUE_NEEDED = 0;
+ @SNAKETONGUE_REWARD_XP = 0;
+ @SNAKETONGUE_REWARD_GOLD = 0;
+ @CHOCOLATECAKE_NEEDED = 0;
+ @CHOCOLATECAKE_REWARD_XP = 0;
+ @CHOCOLATECAKE_REWARD_GOLD = 0;
+ close;
+
+L_No_Water:
+ mes "\"Can't you count!? I need more. \"";
+ goto L_close;
+}
diff --git a/npc/007-2/_import.txt b/npc/007-2/_import.txt
new file mode 100644
index 00000000..ec867053
--- /dev/null
+++ b/npc/007-2/_import.txt
@@ -0,0 +1,4 @@
+// Map 007-2: Illia forsaken inn
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/007-2/_warps.txt",
+"npc/007-2/witch.txt",
diff --git a/npc/007-2/_warps.txt b/npc/007-2/_warps.txt
new file mode 100644
index 00000000..8cb4a09c
--- /dev/null
+++ b/npc/007-2/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 007-2: Illia forsaken inn warps
+007-2,34,35,0 warp #007-2_34_35 0,0,007-1,73,77
diff --git a/npc/007-2/witch.txt b/npc/007-2/witch.txt
new file mode 100644
index 00000000..6dcd7d5c
--- /dev/null
+++ b/npc/007-2/witch.txt
@@ -0,0 +1,996 @@
+
+
+007-2,36,23,0 script Valia NPC370,{
+ @illia_sapphire_powder = 3;
+ @illia_amethyst_powder = 1;
+ @illia_iron_powder = 13;
+ @illia_yeti_tear = 1;
+ @illia_iced_water = 4;
+
+ if ((GM >= DBG_VALIA || debug) && getequipid(equip_head) == DevelopersCap)
+ goto L_DeveloperBoard;
+
+ if (BaseLevel < $@illia_min_level) goto L_Unexperienced;
+ if ($@iLLIA_STATUS == 0) goto L_Introduce;
+ if ($@iLLIA_STATUS == 1) goto L_PreparingSpell;
+ if ($@iLLIA_STATUS == 2) goto L_ReadyToTeleport;
+ if ($@iLLIA_STATUS == 3) end;
+ if ($@iLLIA_STATUS >= 4) goto L_AlreadyBegun;
+ end;
+
+L_DeveloperBoard:
+ callfunc "IlliaDebug";
+ close;
+
+L_Introduce:
+ if (@illia_go_find_items)
+ goto L_AskItems;
+ if (@illia_know_witch == 1)
+ goto L_QuickIntroduce;
+ mes "[Valia]";
+ mes "\"I'm Valia Illia. Is it needed to say I am a witch?\"";
+ next;
+ mes "\"No I don't think so.\"";
+ next;
+ mes "\"And you, you seem to be quite an adventurer.\"";
+ menu
+ "Well... No.", L_Disappointed,
+ "No doubt!", L_Next;
+
+L_Next:
+ mes "[Valia]";
+ mes "\"Maybe you can help then.";
+ mes "You see, I have a sister. Yes, a witch too. Very talented.";
+ mes "But unfortunately not enough to avoid being captured.\"";
+ menu
+ "That's unfortunate...", L_Exit,
+ "What informations do you have about all this?", L_Next1;
+
+L_Next1:
+ @illia_know_witch = 1;
+ mes "[Valia]";
+ mes "\"Ismuth, some dark mage we both hate. He is the one holding her jailed for sure.";
+ mes "She has knowledge about specific magic sides that no other sorcerer knows about.\"";
+ next;
+ mes "\"He has been looking for her for a long time because of that...";
+ mes "I am worried about her.";
+ mes "And I am unable to go help her.\"";
+
+ menu
+ "Why not? You seem to be quite talented as well.", L_Next2;
+
+L_Next2:
+ mes "[Valia]";
+ mes "\"Sure. But I know the enemy. My chances are thin. And if I fail, no one will ever find us.";
+ mes "And my magic skills aren't suited for this...\"";
+ menu
+ "That makes sense...", L_AskHelp,
+ "For what are they suited then?", L_HideSkills;
+
+L_HideSkills:
+ mes "[Valia]";
+ mes "\"Please, never ask a witch what she is skilled in.\"";
+ next;
+ goto L_AskHelp;
+
+L_QuickIntroduce:
+ mes "[Valia]";
+ mes "\"My sister is in great danger, and time is running out.\"";
+ next;
+ goto L_AskHelp;
+
+L_AskHelp:
+ mes "[Valia]";
+ mes "\"Will you help me?\"";
+ menu
+ "That sounds quite dangerous... I don't feel it.", L_Disappointed,
+ "Ok, I can do that for you.", L_Next3;
+
+L_Next3:
+ mes "[Valia]";
+ mes "\"Good. Now listen carefully. Ismuth owns an island where he makes his researchs.";
+ mes "An island where no boat goes, and where no magic could teleport you to...";
+ mes "Strong enchantments are protecting the area, however, I know about a mysterious waterfall, which can send you wherever you want, provided you pay the price.\"";
+ next;
+ mes "\"Of course, it would be a straight way to death if you go alone.";
+ mes "You will need three experienced comrades that you would trust enough to leave your life in their care.\"";
+ next;
+
+ if (getusers(1) < 4)
+ goto L_NotPeepAv;
+
+ mes "[Valia]";
+ mes "\"Do you know such people?\"";
+ menu
+ "I'm afraid not. I should better look around.", L_Exit,
+ "Yes I know such people!", L_Next4;
+
+L_Next4:
+ mes "[Valia]";
+ mes "\"Good.";
+ mes "I can teleport all of you close to that waterfall, but for that, I will need " + @illia_sapphire_powder + " bags of Sapphire Powder, " + @illia_amethyst_powder + " of Amethyst Powder, " + @illia_iron_powder + " Iron Powders," + @illia_yeti_tear + " Frozen Yeti Tear and " + @illia_iced_water + " bottles of Iced Water.\"";
+ menu
+ "I have them here.", L_CheckItems,
+ "I don't have them, but I'll try to find.", L_NoItems;
+
+L_NotPeepAv:
+ mes "[Valia]";
+ mes "\"But it seems there are not enough people around.";
+ mes "Come back later.\"";
+ close;
+
+L_AskItems:
+ mes "[Valia]";
+ mes "\"So, did you bring me what I need?\"";
+ menu
+ "Hum, I forgot what you asked...", L_RepeatItems,
+ "Here they are!", L_CheckItems;
+
+L_RepeatItems:
+ mes "[Valia]";
+ mes "\"I need " + @illia_sapphire_powder + " bags of Sapphire Powder, " + @illia_amethyst_powder + " of Amethyst Powder, " + @illia_iron_powder + " Iron Powders," + @illia_yeti_tear + " Frozen Yeti Tear and " + @illia_iced_water + " bottles of Iced Water.\"";
+ next;
+ mes "\"Hurry up.\"";
+ close;
+
+L_NoItems:
+ @illia_go_find_items = 1;
+ close;
+
+L_MissingItems:
+ mes "[Valia]";
+ mes "\"Obviously you are missing some of the components.";
+ mes "Go find the missing ones, fast. We lack time!\"";
+ @illia_go_find_items = 1;
+ close;
+
+L_CheckItems:
+ if (
+ (countitem ("SapphirePowder") < @illia_sapphire_powder) ||
+ (countitem ("AmethystPowder") < @illia_amethyst_powder) ||
+ (countitem ("IronPowder") < @illia_iron_powder) ||
+ (countitem ("FrozenYetiTear") < @illia_yeti_tear) ||
+ (countitem ("IcedWater") < @illia_iced_water)
+ ) goto L_MissingItems;
+ // someone started the quest in the meantime, so we cancel this one.
+ if ($@iLLIA_STATUS > 0)
+ goto L_Interrupt;
+ // Block other players to start the quest, and start a timer to limit
+ // the time a player will take to gather his team.
+ // Considering the previous npc dialogs, we assume the player already designated his team mates,
+ // hence 5 mins should be enough.
+ $@iLLIA_STATUS = 1;
+ initnpctimer;
+ @illia_go_find_items = 0;
+
+ mes "[Valia]";
+ mes "\"Very well! I can prepare the spell now!\"";
+ next;
+ goto L_PrepareTeam;
+
+L_Interrupt:
+ mes "[Valia]";
+ mes "\"Unfortunately, someone else is already helping me.\"";
+ close;
+
+L_PrepareTeam:
+ // We clear early this variable.
+ @illia_know_witch = 0;
+ mes "[Valia]";
+ mes "\"While I focus on preparing the spell, call your three comrades, and make sure they come here within five minutes. We don't have time.\"";
+ next;
+ $@iLLIA_HERO$ = strcharinfo(0);
+ $@iLLIA_HERO_ID = getcharid(3, $@iLLIA_HERO$);
+ goto L_ChooseHelper1;
+
+L_Disappointed:
+ mes "[Valia]";
+ mes "\"What a shame... You have no idea what you are missing, really.\"";
+ close;
+
+L_Unexperienced:
+ mes "You see a charismatic witch.";
+ next;
+ mes "But she seems to completely ignore your presence.";
+ close;
+
+L_ChooseHelperConfirm1:
+ mes "[Team Selector]";
+ mes "If it happens you cannot elect three players to help you, you can give up now.";
+ menu
+ "Continue.", L_ChooseHelper1,
+ "I give up.", L_PlayerGaveUp;
+
+L_ChooseHelper1:
+ mes "[Team Selector]";
+ mes "Name the first player to help you:";
+ input $@iLLIA_HELPER1$;
+
+ if ($@iLLIA_HELPER1$ == "")
+ goto L_ChooseHelperConfirm1;
+ if (getcharid(3, $@iLLIA_HELPER1$) == $@iLLIA_HERO_ID)
+ goto L_WrongHelper1;
+ if (isloggedin(getcharid(3, $@iLLIA_HELPER1$)) == 0)
+ goto L_HelperDoesNotExist1;
+ if (!(attachrid(getcharid(3, $@iLLIA_HELPER1$))))
+ goto L_Exit;
+ if (BaseLevel < $@illia_min_level)
+ goto L_HelperTooWeak1;
+ $@iLLIA_HELPER1$ = strcharinfo(0);
+ detachrid;
+ if (attachrid($@iLLIA_HERO_ID))
+ goto L_ChooseHelper2;
+ goto L_Exit;
+
+L_HelperTooWeak1:
+ detachrid;
+ if (!(attachrid($@iLLIA_HERO_ID)))
+ goto L_Exit;
+ mes "[Team Selector]";
+ mes "The player " + $@iLLIA_HELPER1$ + " is too weak to help you.";
+ $@iLLIA_HELPER1$ = "";
+ next;
+ goto L_ChooseHelperConfirm1;
+
+L_HelperDoesNotExist1:
+ mes "[Team Selector]";
+ mes "This player " + $@iLLIA_HELPER1$ + " seems offline or does not exist.";
+ $@iLLIA_HELPER1$ = "";
+ next;
+ goto L_ChooseHelperConfirm1;
+
+L_WrongHelper1:
+ mes "[Team Selector]";
+ mes "You can't name yourself.";
+ next;
+ goto L_ChooseHelperConfirm1;
+
+L_ChooseHelperConfirm2:
+ mes "[Team Selector]";
+ mes "If it happens you cannot elect three players to help you, you can give up now.";
+ menu
+ "Continue.", L_ChooseHelper2,
+ "I give up.", L_PlayerGaveUp;
+
+L_ChooseHelper2:
+ mes "[Team Selector]";
+ mes "Name the second player to help you:";
+ input $@iLLIA_HELPER2$;
+ if ($@iLLIA_HELPER2$ == "")
+ goto L_ChooseHelperConfirm2;
+ if (getcharid(3, $@iLLIA_HELPER2$) == getcharid(3, $@iLLIA_HELPER1$) ||
+ getcharid(3, $@iLLIA_HELPER2$) == $@iLLIA_HERO_ID)
+ goto L_WrongHelper2;
+ if (isloggedin(getcharid(3, $@iLLIA_HELPER2$)) == 0)
+ goto L_HelperDoesNotExist2;
+ if (!(attachrid(getcharid(3, $@iLLIA_HELPER2$))))
+ goto L_Exit;
+ if (BaseLevel < $@illia_min_level)
+ goto L_HelperTooWeak2;
+ $@iLLIA_HELPER2$ = strcharinfo(0);
+ detachrid;
+ if (attachrid($@iLLIA_HERO_ID))
+ goto L_ChooseHelper3;
+ goto L_Exit;
+
+L_HelperTooWeak2:
+ detachrid;
+ if (!(attachrid($@iLLIA_HERO_ID)))
+ goto L_Exit;
+ mes "[Team Selector]";
+ mes "The player " + $@iLLIA_HELPER2$ + " is too weak to help you.";
+ $@iLLIA_HELPER2$ = "";
+ next;
+ goto L_ChooseHelperConfirm2;
+
+L_HelperDoesNotExist2:
+ mes "[Team Selector]";
+ mes "This player " + $@iLLIA_HELPER2$ + " seems offline or does not exist.";
+ $@iLLIA_HELPER2$ = "";
+ next;
+ goto L_ChooseHelperConfirm2;
+
+L_WrongHelper2:
+ mes "[Team Selector]";
+ mes "You can't name yourself or someone already chosen.";
+ next;
+ goto L_ChooseHelperConfirm2;
+
+L_ChooseHelperConfirm3:
+ mes "[Team Selector]";
+ mes "If it happens you cannot elect three players to help you, you can give up now.";
+ menu
+ "Continue.", L_ChooseHelper3,
+ "I give up.", L_PlayerGaveUp;
+
+L_ChooseHelper3:
+ mes "[Team Selector]";
+ mes "Name the third player to help you:";
+ input $@iLLIA_HELPER3$;
+ if ($@iLLIA_HELPER3$ == "")
+ goto L_ChooseHelperConfirm3;
+ if (getcharid(3, $@iLLIA_HELPER3$) == getcharid(3, $@iLLIA_HELPER2$) ||
+ getcharid(3, $@iLLIA_HELPER3$) == getcharid(3, $@iLLIA_HELPER1$) ||
+ getcharid(3, $@iLLIA_HELPER3$) == $@iLLIA_HERO_ID)
+ goto L_WrongHelper3;
+ if (isloggedin(getcharid(3, $@iLLIA_HELPER3$)) == 0)
+ goto L_HelperDoesNotExist3;
+ if (!(attachrid(getcharid(3, $@iLLIA_HELPER3$))))
+ goto L_Exit;
+ if (BaseLevel < $@illia_min_level)
+ goto L_HelperTooWeak3;
+ $@iLLIA_HELPER3$ = strcharinfo(0);
+ detachrid;
+ if (!(attachrid($@iLLIA_HERO_ID)))
+ goto L_Exit;
+ mes $@iLLIA_HELPER1$ + ", " + $@iLLIA_HELPER2$ + " and " + $@iLLIA_HELPER3$ + " will be your three comrades.";
+ close;
+
+L_HelperTooWeak3:
+ detachrid;
+ if (!(attachrid($@iLLIA_HERO_ID)))
+ goto L_Exit;
+ mes "[Team Selector]";
+ mes "The player " + $@iLLIA_HELPER3$ + " is too weak to help you.";
+ $@iLLIA_HELPER3$ = "";
+ next;
+ goto L_ChooseHelperConfirm3;
+
+
+L_HelperDoesNotExist3:
+ mes "[Team Selector]";
+ mes "This player " + $@iLLIA_HELPER3$ + " seems offline or does not exist.";
+ $@iLLIA_HELPER3$ = "";
+ next;
+ goto L_ChooseHelperConfirm3;
+
+L_WrongHelper3:
+ mes "[Team Selector]";
+ mes "You can't name yourself or someone already chosen.";
+ next;
+ goto L_ChooseHelperConfirm3;
+
+L_PreparingSpell:
+ mes "The witch looks busy with a spell, giving shape to strange rings,";
+ mes "and is not paying any attention to you.";
+ close;
+
+L_ReadyToTeleport:
+ if ($@iLLIA_HELPER1$ == "" || $@iLLIA_HELPER2$ == "" || $@iLLIA_HELPER3$ == "")
+ goto L_PlayerGaveUp;
+ if (strcharinfo(0) == $@iLLIA_HERO$)
+ goto L_AskToTeleport;
+ if (strcharinfo(0) == $@iLLIA_HELPER1$ || strcharinfo(0) == $@iLLIA_HELPER2$ || strcharinfo(0) == $@iLLIA_HELPER3$)
+ goto L_TalkHelper;
+ mes "[Valia]";
+ mes "\"I do not have time for you.\"";
+ close;
+
+L_AskToTeleport:
+ // Check area users just to give a hint if there are players around
+ // $@iLLIA_HERO$ $@iLLIA_HELPER1$ $@iLLIA_HELPER2$ $@iLLIA_HELPER3$
+ if (!(attachrid(getcharid(3,$@iLLIA_HELPER1$))))
+ goto L_NotEveryoneHere;
+ if (!(isin("007-2", 0, 0, 57, 55)))
+ goto L_NotEveryoneHere;
+ detachrid;
+ if (!(attachrid(getcharid(3,$@iLLIA_HELPER2$))))
+ goto L_NotEveryoneHere;
+ if (!(isin("007-2", 0, 0, 57, 55)))
+ goto L_NotEveryoneHere;
+ detachrid;
+ if (!(attachrid(getcharid(3,$@iLLIA_HELPER3$))))
+ goto L_NotEveryoneHere;
+ if (!(isin("007-2", 0, 0, 57, 55)))
+ goto L_NotEveryoneHere;
+ detachrid;
+ if (!(attachrid(getcharid(3,$@iLLIA_HERO$))))
+ goto L_NotEveryoneHere;
+ if (!(isin("007-2", 0, 0, 57, 55)))
+ goto L_NotEveryoneHere;
+ mes "[Valia]";
+ mes "\"Everyone seems to be here. Make sure to stay close to me.\"";
+ menu
+ "I'm ready.", L_Next5,
+ "Wait a minute.", L_Exit;
+
+L_Next5:
+ if (
+ (countitem ("SapphirePowder") < @illia_sapphire_powder) ||
+ (countitem ("AmethystPowder") < @illia_amethyst_powder) ||
+ (countitem ("IronPowder") < @illia_iron_powder) ||
+ (countitem ("FrozenYetiTear") < @illia_yeti_tear) ||
+ (countitem ("IcedWater") < @illia_iced_water)
+ ) goto L_MissingItems;
+ delitem "SapphirePowder", @illia_sapphire_powder;
+ delitem "AmethystPowder", @illia_amethyst_powder;
+ delitem "IronPowder", @illia_iron_powder;
+ delitem "FrozenYetiTear", @illia_yeti_tear;
+ delitem "IcedWater", @illia_iced_water;
+
+ // Stop the 5mins timer and start it again.
+ $@iLLIA_STATUS = 3;
+ initnpctimer;
+ close;
+
+L_NotEveryoneHere:
+ mes "[Valia]";
+ mes "\"I don't see your comrades around.";
+ mes "Let's wait a little more.\"";
+ close;
+
+L_TalkHelper:
+ mes "[Valia]";
+ mes "\"" + strcharinfo(0) + ", do your best to assist " + $@iLLIA_HERO$ + ".\"";
+ menu
+ "What is " + $@iLLIA_HERO$ + " going to do?", L_Next6,
+ "I will, no problem.", L_Exit;
+
+L_Next6:
+ mes "[Valia]";
+ mes "\"You weren't told about it? This is about saving my captive sister.\"";
+ next;
+ mes "\"For the details, you'll have to ask " + $@iLLIA_HERO$ + "...";
+ mes "I am not going to repeat myself...\"";
+ close;
+
+OnWarpHero:
+ if (strcharinfo(0) == $@iLLIA_HERO$)
+ goto L_Warp;
+ end;
+
+OnWarpHelper1:
+ if (strcharinfo(0) == $@iLLIA_HELPER1$)
+ goto L_Warp;
+ end;
+
+OnWarpHelper2:
+ if (strcharinfo(0) == $@iLLIA_HELPER2$)
+ goto L_Warp;
+ end;
+
+OnWarpHelper3:
+ if (strcharinfo(0) == $@iLLIA_HELPER3$)
+ goto L_Warp;
+ end;
+
+L_Warp:
+ misceffect FX_MAGIC_BLUE_TELEPORT, strcharinfo(0);
+ @illia_got_rewards = 0;
+ @illia_current_num_rewards = 0;
+ addtimer 2000, "Valia::OnRealWarp";
+ end;
+
+OnRealWarp:
+ warp "051-1", 23 + rand(2), 24 + rand(3);
+ if (strcharinfo(0) == $@iLLIA_HERO$)
+ goto L_InitVars;
+ end;
+
+L_InitVars:
+ $@iLLIA_STATUS = 4;
+ donpcevent "#IlliaDaemon::OnCommandToggle";
+ // init various variables
+ $@illia_progress = 1;
+ callfunc "UpdateIlliaProgress";
+ $@illia_level_1_progress = 0;
+ $@illia_level_2_progress = 0;
+ $@illia_level_3_progress = 0;
+ $@illia_level_4_progress = 0;
+ $@illia_level_5_progress = 0;
+ $@illia_level_6_progress = 0;
+ $@illia_level_7_progress = 0;
+ $@illia_players_in_luvia_territory = 0;
+
+ // Save the time at which the quest started
+ $@illia_begin_time = gettimetick(2);
+
+ // Clean all levels
+ donpcevent "#IlliaJanitor1::OnCommandClean";
+ donpcevent "#IlliaJanitor2::OnCommandClean";
+ donpcevent "#IlliaJanitor3::OnCommandClean";
+ donpcevent "#IlliaJanitor4::OnCommandClean";
+ donpcevent "#IlliaJanitor5::OnCommandClean";
+ donpcevent "#IlliaJanitor6::OnCommandClean";
+ donpcevent "#IlliaJanitor7::OnCommandClean";
+
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+L_AlreadyBegun:
+ mes "At the moment you are about to talk to her, she briefly shows a malicious smile and looks away.";
+ next;
+ mes "Probably it is best to not annoy her.";
+ close;
+
+L_Exit:
+ close;
+
+L_ReactToPlayersReturn:
+ // If players did not enter the Inn's lobby, they arent aware of the trap.
+ // Otherwise, they are aware of the trap. Whether they died or not,
+ // the rings will have deleted their memories.
+ // So the same dialog can apply.
+ if ($@illia_progress < 8)
+ goto L_Disappoint;
+ if ($@illia_progress == 8)
+ goto L_SurprisedByHeroWin;
+ end;
+
+L_SurprisedByHeroWin:
+ npctalk strnpcinfo(0), "(How is it possible... " + $@iLLIA_HERO$ + " survived...)";
+ emotion EMOTE_SURPRISE;
+ goto L_EndQuest;
+
+L_Disappoint:
+ npctalk strnpcinfo(0), "Oh no... It seems " + $@iLLIA_HERO$ + " did not make it... Who will save my sister now?";
+ emotion EMOTE_SAD;
+ goto L_EndQuest;
+
+L_PlayerGaveUp:
+ close2;
+ npctalk strnpcinfo(0), "Well... It seems you can't do it " + $@iLLIA_HERO$ + ". I knew it as soon as I saw you!";
+ emotion EMOTE_UPSET;
+ goto L_EndQuest;
+
+L_EndQuest:
+ $@iLLIA_STATUS = 0;
+ $@iLLIA_HERO$ = "";
+ $@iLLIA_HERO_ID = 0;
+ $@iLLIA_HELPER1$ = "";
+ $@iLLIA_HELPER2$ = "";
+ $@iLLIA_HELPER3$ = "";
+ $@illia_progress = 0;
+ callfunc "UpdateIlliaProgress";
+ $@illia_level_1_progress = 0;
+ $@illia_level_2_progress = 0;
+ $@illia_level_3_progress = 0;
+ $@illia_level_4_progress = 0;
+ $@illia_level_5_progress = 0;
+ $@illia_level_6_progress = 0;
+ $@illia_level_7_progress = 0;
+ $@illia_players_in_luvia_territory = 0;
+ $@illia_bp = 0;
+
+ // Clean all levels
+ donpcevent "#IlliaJanitor1::OnCommandClean";
+ donpcevent "#IlliaJanitor2::OnCommandClean";
+ donpcevent "#IlliaJanitor3::OnCommandClean";
+ donpcevent "#IlliaJanitor4::OnCommandClean";
+ donpcevent "#IlliaJanitor5::OnCommandClean";
+ donpcevent "#IlliaJanitor6::OnCommandClean";
+ donpcevent "#IlliaJanitor7::OnCommandClean";
+
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnTimer3000:
+ if ($@iLLIA_STATUS >= 253)
+ goto L_ReactToPlayersReturn;
+ end;
+
+OnTimer2500:
+ if ($@iLLIA_STATUS != 3)
+ end;
+ npctalk strnpcinfo(0), $@iLLIA_HERO$ + ", " + $@iLLIA_HELPER1$ + ", " + $@iLLIA_HELPER2$ + ", " + $@iLLIA_HELPER3$ + ", listen!";
+ end;
+
+OnTimer7500:
+ if ($@iLLIA_STATUS != 3)
+ end;
+ npctalk strnpcinfo(0), "I will teleport the 4 of you in a forest that isn't far from the waterfall.";
+ end;
+
+OnTimer14000:
+ if ($@iLLIA_STATUS != 3)
+ end;
+ npctalk strnpcinfo(0), "Each of you takes one of these rings. They will allow you to come back here when needed.";
+ end;
+
+OnTimer24000:
+ if ($@iLLIA_STATUS != 3)
+ end;
+ if ($Illia_Luvia_Harvest < 10)
+ npctalk strnpcinfo(0), "Do your best and save my sister!";
+ if ($Illia_Luvia_Harvest >= 10 && $Illia_Luvia_Harvest < 35)
+ npctalk strnpcinfo(0), "This will be quite dangerous, but do your best and save my sister!";
+ if ($Illia_Luvia_Harvest >= 35)
+ npctalk strnpcinfo(0), "This will be awfully dangerous, but do your best and save my sister!";
+ end;
+
+OnTimer34000:
+ if ($@iLLIA_STATUS != 3)
+ end;
+ // Trigger 4 areatimers to show the teleport spell
+ // This is better looking than a basic areawarp
+ 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;
+
+OnTimer50000:
+ // Add a check that the quest started.
+ // This timer on status 3 should be reached since L_Init_Vars will have
+ // stopped it before.
+ // It may happen it didn't if the hero logged off during the warp sequence
+ // Hence we'll just init what's necessary to trigger the end sequence
+ if ($@iLLIA_STATUS != 3)
+ end;
+ goto L_InitVars;
+
+OnTimer150000:
+ if ($@iLLIA_STATUS != 1)
+ end;
+ $@iLLIA_STATUS = 2;
+ npctalk strnpcinfo(0), $@iLLIA_HERO$ + ", I am ready to cast the teleport spell. You and your comrades should not wait any longer!";
+ end;
+
+OnTimer280000:
+ if ($@iLLIA_STATUS != 2)
+ end;
+ npctalk strnpcinfo(0), "Hurry up " + $@iLLIA_HERO$ + ", I am losing patience.";
+ end;
+
+OnTimer300000:
+ if ($@iLLIA_STATUS != 2)
+ end;
+ npctalk strnpcinfo(0), $@iLLIA_HERO$ + ", you and your missing comrades made me lose a precious time! Out of my sight!";
+ emotion EMOTE_UPSET;
+ if (attachrid($@iLLIA_HERO_ID))
+ goto L_KillHero;
+ goto L_EndQuest;
+
+L_KillHero:
+ heal -Hp, 0;
+ goto L_EndQuest;
+
+}
+
+007-2,57,55,0 script #IlliaDaemon NPC32767,{
+end;
+
+OnInit:
+ disablenpc "#IlliaTorch1";
+ disablenpc "#IlliaTorch2";
+ disablenpc "#IlliaTorch3";
+ disablenpc "#IlliaTorch4";
+ disablenpc "#IlliaTorch5";
+ disablenpc "#IlliaTorch6";
+ disablenpc "#IlliaTorch7";
+ disablenpc "#IlliaTorch8";
+ $@illia_max_time = 300;
+ $@illia_min_level = 90;
+ end;
+
+OnCommandToggle:
+ $@illia_max_time = 300;
+ if ($@iLLIA_STATUS >= 253)
+ goto L_Stop;
+ if ($@iLLIA_STATUS >= 4)
+ goto L_Start;
+ end;
+
+OnTimer1000:
+ if ($@iLLIA_STATUS < 4 || $@iLLIA_STATUS >= 254)
+ end;
+ goto L_Check;
+
+OnTimer2000:
+ if ($@iLLIA_STATUS < 4 || $@iLLIA_STATUS >= 254)
+ end;
+ // This is executed only when making a double check when we detected
+ // the hero offline/not in the good map previously.
+ goto L_Check;
+
+OnTimer4000:
+ // Check if we need to force-warp the hero
+ if (isloggedin($@iLLIA_HERO_ID) == 0)
+ end;
+ if ($@iLLIA_STATUS == 255 && attachrid($@iLLIA_HERO_ID) && (
+ isin("051-1",1,1,190,80) ||
+ isin("051-3",1,1,115,130) ||
+ isin("052-1",1,1,100,80) ||
+ isin("052-2",1,1,150,100)
+ )
+ ) goto L_WarpHero;
+ detachrid;
+ end;
+
+OnTimer4500:
+ if ($@iLLIA_STATUS < 254)
+ end;
+ // send a message to all the helpers
+ setarray $@illia_helpers$, $@iLLIA_HELPER1$,$@iLLIA_HELPER2$,$@iLLIA_HELPER3$;
+ $@illia_helper_index = 0;
+ goto L_HelperNotification;
+
+OnTimer6500:
+ if ($@iLLIA_STATUS < 254)
+ end;
+ // Make the first witch to say something happened, when she will see people back
+ // If no helpers will be warped, it still makes sense: she felt the hero died.
+ startnpctimer "Valia";
+ // $@illia_players_in_luvia_territory is set when players enter the island
+ $Illia_Luvia_Harvest = $Illia_Luvia_Harvest + $@illia_players_in_luvia_territory;
+ // Cap the difficulty to 50. We do not want the quest to really be impossible to finish.
+ if ($Illia_Luvia_Harvest > 50)
+ $Illia_Luvia_Harvest = 50;
+ $@illia_players_in_luvia_territory = 0;
+ end;
+
+L_HelperNotification:
+ if ($@illia_helper_index >= 4)
+ goto L_CleanHelpers;
+ $@illia_helper$ = $@illia_helpers$[$@illia_helper_index];
+ if (isloggedin(getcharid(3, $@illia_helper$)) == 0)
+ goto L_NextHelperToNotify;
+ if (
+ $@illia_helper$ != "" &&
+ attachrid(getcharid(3, $@illia_helper$)) && (
+ isin("051-1",1,1,190,80) ||
+ isin("051-3",1,1,115,130) ||
+ isin("052-1",1,1,100,80) ||
+ isin("052-2",1,1,150,100)
+ )
+ ) goto L_NotifyHelperFail;
+ detachrid;
+ goto L_NextHelperToNotify;
+
+L_NextHelperToNotify:
+ $@illia_helper_index = $@illia_helper_index + 1;
+ goto L_HelperNotification;
+
+L_CleanHelpers:
+ cleararray $@illia_helpers$, "", 3;
+ $@illia_helper$ = "";
+ $@illia_helper_index = 0;
+ end;
+
+L_NotifyHelperFail:
+ message strcharinfo(0), $@iLLIA_HERO$ + " disappeared. There is no way I continue like this... Let's use the ring Valia gave!";
+ // display the warp spell already if needed
+ misceffect FX_MAGIC_BLUE_TELEPORT, strcharinfo(0);
+ detachrid;
+ goto L_NextHelperToNotify;
+
+OnTimer8000:
+ if ($@iLLIA_STATUS < 254)
+ end;
+ // Warp remaining helpers back to the origin if needed
+ setarray $@illia_helpers$, $@iLLIA_HELPER1$,$@iLLIA_HELPER2$,$@iLLIA_HELPER3$;
+ $@illia_helper_index = 0;
+ goto L_CheckHelperNeedWarp;
+
+L_CheckHelperNeedWarp:
+ if ($@illia_helper_index >= 4)
+ goto L_CleanHelpersWarps;
+ $@illia_helper$ = $@illia_helpers$[$@illia_helper_index];
+ if (isloggedin(getcharid(3, $@illia_helper$)) == 0)
+ goto L_NextHelperToWarp;
+ if ($@illia_helper$ != "" && attachrid(getcharid(3, $@illia_helper$)))
+ goto L_WarpHelper;
+ detachrid;
+ goto L_NextHelperToWarp;
+
+L_NextHelperToWarp:
+ $@illia_helper_index = $@illia_helper_index + 1;
+ goto L_CheckHelperNeedWarp;
+
+L_CleanHelpersWarps:
+ cleararray $@illia_helpers$, "", 3;
+ $@illia_helper$ = "";
+ $@illia_helper_index = 0;
+ end;
+
+L_WarpHelper:
+ // Proceed only if the helper is still on one of the quest's maps
+ if (
+ isin("051-1",1,1,190,80 ) ||
+ isin("051-3",1,1,115,130) ||
+ isin("052-1",1,1,100,80 ) ||
+ isin("052-2",1,1,150,100)
+ ) goto L_DoWarpHelper;
+ detachrid;
+ goto L_NextHelperToWarp;
+
+L_DoWarpHelper:
+ // At this point, the player has been attached
+ if ($@illia_progress >= 5)
+ message strcharinfo(0), "You feel dizzy, and that your memory is being rewritten... Who is Luvia? Something isn't right.";
+ warp "007-2",31 + rand(0,2),23 + rand(0,2);
+ detachrid;
+ goto L_NextHelperToWarp;
+
+L_Check:
+ // We check for the hero to be logged in, alive, and in one of the quest's maps
+ if (isloggedin($@iLLIA_HERO_ID) == 0)
+ goto L_HeroLogOff;
+ if (attachrid($@iLLIA_HERO_ID) &&
+ (isin("051-1",1,1,190,80 ) == 0) &&
+ (isin("051-3",1,1,115,130) == 0) &&
+ (isin("052-1",1,1,100,80 ) == 0) &&
+ (isin("052-2",1,1,150,100) == 0)
+ ) goto L_HeroEscape;
+ if (ispcdead())
+ goto L_HeroDead;
+ // If the quest lasts more than $@illia_max_time seconds, abort it
+ if (gettimetick(2) - $@illia_begin_time > $@illia_max_time)
+ goto L_HeroRingActivated;
+ // Conditions are all met. schedule another check 1s later
+ setnpctimer 0;
+ detachrid;
+ end;
+
+L_HeroRingActivated:
+ misceffect FX_MAGIC_BLUE_TELEPORT, strcharinfo(0);
+ message strcharinfo(0), "The ring Valia gave you seems to activate itself!";
+ detachrid;
+ $@iLLIA_STATUS = 255;
+ setnpctimer 0;
+ end;
+
+L_HeroLogOff:
+ if (getnpctimer(0) < 1900)
+ end;
+ $@iLLIA_STATUS = 254;
+ setnpctimer 0;
+ end;
+
+L_HeroEscape:
+ detachrid;
+ // because of lags, warps between maps, etc
+ // let's assume a check can detect the player to not be in any of the map,
+ // while he is supposed to be in one.
+ // it does not hurt to make a double check 1sec later
+ if (getnpctimer(0) < 1900)
+ end;
+ $@iLLIA_STATUS = 254;
+ setnpctimer 0;
+ end;
+
+L_WarpHero:
+ // At this point, the player has been attached
+ if ($@illia_progress >= 5)
+ message strcharinfo(0), "You feel dizzy, and that your memory is being rewritten... Who is Luvia? Something isn't right.";
+ warp "007-2",31 + rand(0,2),23 + rand(0,2);
+ detachrid;
+ end;
+
+L_HeroDead:
+ // we notify the player that his death will add luvia's power.
+ // her power is increasing once players reach her island,
+ // but they didn't find out about her yet on the island,
+ // so we notify the hero only once they met her in the Inn
+ if ($@illia_progress >= 5 && $@illia_progress < 8)
+ message strcharinfo(0), "You are in Luvia's hands, and your soul is now meant to serve her dark purposes.";
+ detachrid;
+ $@iLLIA_STATUS = 255;
+ setnpctimer 0;
+ end;
+
+L_Stop:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+L_Start:
+ initnpctimer;
+ end;
+
+}
+
+function script UpdateIlliaProgress {
+ if ($@illia_progress == 1)
+ goto L_Torch1;
+ if ($@illia_progress == 2)
+ goto L_Torch2;
+ if ($@illia_progress == 3)
+ goto L_Torch3;
+ if ($@illia_progress == 4)
+ goto L_Torch4;
+ if ($@illia_progress == 5)
+ goto L_Torch5;
+ if ($@illia_progress == 6)
+ goto L_Torch6;
+ if ($@illia_progress == 7)
+ goto L_Torch7;
+ if ($@illia_progress == 8)
+ goto L_Torch8;
+ // Else, we disable everything
+ disablenpc "#IlliaTorch1";
+ disablenpc "#IlliaTorch2";
+ disablenpc "#IlliaTorch3";
+ disablenpc "#IlliaTorch4";
+ disablenpc "#IlliaTorch5";
+ disablenpc "#IlliaTorch6";
+ disablenpc "#IlliaTorch7";
+ disablenpc "#IlliaTorch8";
+ return;
+
+L_Torch8:
+ enablenpc "#IlliaTorch8";
+ goto L_Torch7;
+
+L_Torch7:
+ enablenpc "#IlliaTorch7";
+ goto L_Torch6;
+
+L_Torch6:
+ enablenpc "#IlliaTorch6";
+ goto L_Torch5;
+
+L_Torch5:
+ enablenpc "#IlliaTorch5";
+ goto L_Torch4;
+
+L_Torch4:
+ enablenpc "#IlliaTorch4";
+ goto L_Torch3;
+
+L_Torch3:
+ enablenpc "#IlliaTorch3";
+ goto L_Torch2;
+
+L_Torch2:
+ enablenpc "#IlliaTorch2";
+ goto L_Torch1;
+
+L_Torch1:
+ enablenpc "#IlliaTorch1";
+ return;
+}
+
+007-2,29,22,0 script #IlliaTorch1 NPC374,{
+end;
+}
+
+007-2,30,21,0 script #IlliaTorch2 NPC374,{
+end;
+}
+
+007-2,33,24,0 script #IlliaTorch3 NPC374,{
+end;
+}
+
+007-2,32,25,0 script #IlliaTorch4 NPC374,{
+end;
+}
+
+007-2,32,21,0 script #IlliaTorch5 NPC374,{
+end;
+}
+
+007-2,33,22,0 script #IlliaTorch6 NPC374,{
+end;
+}
+
+007-2,29,24,0 script #IlliaTorch7 NPC374,{
+end;
+}
+
+007-2,30,25,0 script #IlliaTorch8 NPC374,{
+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/npc/008-1/_import.txt b/npc/008-1/_import.txt
new file mode 100644
index 00000000..d0aa1c6d
--- /dev/null
+++ b/npc/008-1/_import.txt
@@ -0,0 +1,13 @@
+// Map 008-1: Hurnscald Outskirts
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/008-1/_mobs.txt",
+"npc/008-1/_warps.txt",
+"npc/008-1/andra.txt",
+"npc/008-1/annualeaster.txt",
+"npc/008-1/banu.txt",
+"npc/008-1/diryn.txt",
+"npc/008-1/dock.txt",
+"npc/008-1/george.txt",
+"npc/008-1/hinnak.txt",
+"npc/008-1/mapflags.txt",
+"npc/008-1/mikhail.txt",
diff --git a/npc/008-1/_mobs.txt b/npc/008-1/_mobs.txt
new file mode 100644
index 00000000..bfa8f636
--- /dev/null
+++ b/npc/008-1/_mobs.txt
@@ -0,0 +1,11 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 008-1: Hurnscald Outskirts mobs
+008-1,0,0,0,0 monster Pink Flower 1014,10,20,0
+008-1,0,0,0,0 monster Pinkie 1018,18,20,0
+008-1,0,0,0,0 monster Mana Bug 1131,18,30,0
+008-1,0,0,0,0 monster Maggot 1002,30,30,0
+008-1,0,0,0,0 monster Mauve Plant 1029,2,270000,180000
+008-1,0,0,0,0 monster Silkworm 1035,2,60000,30000
+008-1,0,0,0,0 monster Clover Patch 1037,2,0,1000
+008-1,0,0,0,0 monster Squirrel 1038,10,30,20
+008-1,0,0,0,0 monster Butterfly 1055,10,30,20
diff --git a/npc/008-1/_warps.txt b/npc/008-1/_warps.txt
new file mode 100644
index 00000000..e262d290
--- /dev/null
+++ b/npc/008-1/_warps.txt
@@ -0,0 +1,10 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 008-1: Hurnscald Outskirts warps
+008-1,54,61,0 warp #008-1_54_61 0,2,009-1,25,36
+008-1,79,80,0 warp #008-1_79_80 3,0,009-1,48,54
+008-1,127,61,0 warp #008-1_127_61 0,1,009-1,96,36
+008-1,79,49,0 warp #008-1_79_49 3,0,009-1,48,25
+008-1,24,62,0 warp #008-1_24_62 0,3,011-1,123,61
+008-1,79,17,0 warp #008-1_79_17 3,0,018-1,78,97
+008-1,79,102,0 warp #008-1_79_102 3,0,007-1,68,22
+008-1,132,101,0 warp #008-1_132_101 2,0,007-1,122,23
diff --git a/npc/008-1/andra.txt b/npc/008-1/andra.txt
new file mode 100644
index 00000000..bf9b5abe
--- /dev/null
+++ b/npc/008-1/andra.txt
@@ -0,0 +1,170 @@
+
+008-1,36,26,0 script Andra NPC201,{
+ @water_amount = 1;
+ @seeds_amount = 4;
+ if ($@andra_status == 1) goto L_Planting;
+ if (BaseLevel < 30) goto L_TooYoung;
+ if (FLAGS & FLAG_ANDRA_HELPED) goto L_Return;
+ mes "[Andra]";
+ mes "\"Hello, my name is Andra. You see those nice trees? I planted every single one of them! I'm very proud of my work!\"";
+ next;
+ menu
+ "Nice! I imagine you planted them a long time ago, right?", L_Next,
+ "Sorry, but I'm not interested in plants and trees.", L_DislikePlants;
+
+L_Next:
+ mes "[Andra]";
+ mes "\"That is the fun part... It took only some months... and look how healthy and beautiful they are!\"";
+ next;
+ menu
+ "How is that possible?", L_Next1;
+
+L_Next1:
+ mes "[Andra]";
+ mes "\"A few years ago, a nice woman from Tulimshar did something amazing to the land around here... I guess her name was Eomie. I have no idea what she did, but since she worked on this land, everything you plant here will grow really fast!\"";
+ next;
+ mes "\"But I am very worried about something she told me when she left... She warned me that this place needs constant care. If one small spot is not cultivated for a long time, it will become less and less fertile.\"";
+ next;
+ mes "And she also told me that this soil is so fertile because it has a lot of nutrients not only on this side, but everywhere. So it is certain that all soil in this place will become weaker if we let a lot of unfertilized spots...\"";
+ next;
+ menu
+ "That sounds bad! But you just need to keep planting, right?", L_Next2;
+
+L_Next2:
+ mes "[Andra]";
+ mes "\"Exactly! But it is a big place. And I don't have too much money to buy seeds. If only I could find someone who could help me... ah... I know you are probably busy, but since you are here, would you like to help me in this noble task?\"";
+ menu
+ "Of course! What can I do to help you?", L_Next3,
+ "Not right now, I'm really busy.", L_Busy;
+
+L_Next3:
+ mes "[Andra]";
+ mes "\"Yay! I knew you would help me! I just need seeds and water... I think " + @seeds_amount + " Grass Seeds and " + @water_amount + " Bottle(s) of Water should be enough to grow some plants on the place. If you give the items, you can let the rest with me.\"";
+ next;
+ menu
+ "I don't have it right now, but I will come back later.", L_close,
+ "Here are the seeds and the water.", L_Next4;
+
+L_Next4:
+ if (countitem("BottleOfWater") < @water_amount || countitem("GrassSeed") < @seeds_amount) goto L_NotEnough;
+ if ($@spawned_plants >= $@MAX_GLOBAL_PLANTS) goto L_Gather;
+ mes "[Andra]";
+ mes "\"Great! Thank you for you help. If you have more items and want to help again, feel free to talk to me. We just have to be careful to not oversoak the soil with water.. but you don't need to worry, I will know when it is the right time to stop planting.";
+ next;
+ delitem "BottleOfWater", @water_amount;
+ delitem "GrassSeed", @seeds_amount;
+ FLAGS = FLAGS | FLAG_ANDRA_HELPED;
+ mes "Andra pours some water in a lot of different places and then throws some seeds to the sky. The wind carries some of them really far from her.";
+ close2;
+ goto L_PreSummon;
+
+L_PreSummon:
+ $@andra_status = 1;
+ $@farmer$ = strcharinfo(0);
+ startnpctimer;
+ end;
+
+OnTimer1000:
+ $@plant_id = rand(1029,1032);
+ areamonster "008-1",44,18,135,46,"plant",$@plant_id,$@PLANTS_PER_SEED, "Andra::OnPlantDeath";
+ if (attachrid(getcharid(3,$@farmer$)) == 0)
+ goto L_Spawn1000;
+ message strcharinfo(0), "Andra: I think some plants will grow almost instantly! Just Watch...";
+ goto L_Spawn1000;
+
+L_Spawn1000:
+ $@spawned_plants = $@spawned_plants + $@PLANTS_PER_SEED;
+ end;
+
+OnTimer3000:
+ $@plant_id = rand(1029,1032);
+ areamonster "008-1",44,18,135,46,"plant",$@plant_id,$@PLANTS_PER_SEED, "Andra::OnPlantDeath";
+ $@spawned_plants = $@spawned_plants + $@PLANTS_PER_SEED;
+ end;
+
+OnTimer5000:
+ $@plant_id = rand(1029,1032);
+ areamonster "008-1",44,18,135,46,"plant",$@plant_id,$@PLANTS_PER_SEED, "Andra::OnPlantDeath";
+ $@spawned_plants = $@spawned_plants + $@PLANTS_PER_SEED;
+ end;
+
+OnTimer7000:
+ $@plant_id = rand(1029,1032);
+ areamonster "008-1",44,18,135,46,"plant",$@plant_id,$@PLANTS_PER_SEED, "Andra::OnPlantDeath";
+ if (attachrid(getcharid(3,$@farmer$)) == 0)
+ goto L_Spawn7000;
+ message strcharinfo(0), "Andra: Good... Just take a walk and you will be able to see how your seeds turned into some nice looking plants.";
+ goto L_Spawn7000;
+
+L_Spawn7000:
+ $@spawned_plants = $@spawned_plants + $@PLANTS_PER_SEED;
+ $@andra_status = 0;
+ $@farmer$ = "";
+ setnpctimer 0;
+ stopnpctimer;
+ end;
+
+L_Return:
+ mes "[Andra]";
+ mes "\"Hi " + strcharinfo(0) + ", good to see you! You came back to help me again?\"";
+ next;
+ menu
+ "Yes, and I already have the seeds and the water.", L_Next5,
+ "No, I just wanted to say hello.", L_Bye;
+
+L_Next5:
+ if ($@spawned_plants >= $@MAX_GLOBAL_PLANTS) goto L_Gather;
+ if (countitem("BottleOfWater") < @water_amount || countitem("GrassSeed") < @seeds_amount) goto L_NotEnough;
+ delitem "BottleOfWater", @water_amount;
+ delitem "GrassSeed", @seeds_amount;
+ mes "Andra pours some water in a lot of different places and then throws the seeds to the sky. The wind carries some of them really far from her.";
+ close2;
+ goto L_PreSummon;
+
+OnPlantDeath:
+ $@spawned_plants = $@spawned_plants - 1;
+ end;
+
+L_NotEnough:
+ mes "[Andra]";
+ mes "\"Sorry, but you don't have the items I need... Please, come back when you have them.\"";
+ close;
+
+L_Gather:
+ mes "[Andra]";
+ mes "\"Look at all those plants! I think we shoudn't plant more seeds until someone gather those herbs...\"";
+ close;
+
+L_Bye:
+ mes "[Andra]";
+ mes "\"Oh, you are a nice person... Thanks!\"";
+ close;
+
+L_Busy:
+ mes "[Andra]";
+ mes "\"Ok, I understand. Come back if have some free time!\"";
+ close;
+
+L_DislikePlants:
+ mes "[Andra]";
+ mes "\"Really? How can someone dislike plants and trees? What a strange thing...\"";
+ close;
+
+L_Planting:
+ mes "[Andra]";
+ mes "\"Sorry, I can't talk right now. I am planting some seeds " + $@farmer$ + " gave me.\"";
+ close;
+
+L_close:
+ close;
+
+L_TooYoung:
+ mes "[Andra]";
+ mes "\"I'm sorry, I can't talk right now. I am really busy with those trees! If you feel like talking, maybe you should come back later.\"";
+ close;
+
+OnInit:
+ $@PLANTS_PER_SEED = 3;
+ set $@MAX_GLOBAL_PLANTS, 100; // You can plant only if the amount of plants currently in the map is < than this value.
+ end;
+}
diff --git a/npc/008-1/annualeaster.txt b/npc/008-1/annualeaster.txt
new file mode 100644
index 00000000..29aa9ff8
--- /dev/null
+++ b/npc/008-1/annualeaster.txt
@@ -0,0 +1,214 @@
+
+
+
+
+008-1,0,0,0 script Easter Eggs NPC32767,{
+
+
+ if (strnpcinfo(2) == "") end;
+ if (get(.disabled, "Easter Eggs") || $@isEaster < 1) goto L_Destroy;
+ @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;
+
+ @easter_year = (Annual_Quest & BYTE_1_MASK) >> BYTE_1_SHIFT;
+
+ if (#EASTERTIMEPENALTY == 0)
+ goto L_WarmUp;
+ // prevent clicking multiple times:
+ if (gettimetick(2) < #EASTERTIMEPENALTY + get(.wait_time, "Easter Eggs"))
+ goto L_End2;
+ if (@easter_year > gettime(7) - 2000)
+ goto L_End3;
+ #EASTERTIMEPENALTY = gettimetick(2);
+
+ set .found, .found + 1; // this egg has been found X times
+ set @AnnualEasterTries, @AnnualEasterTries + 1; // you tried X times since login
+
+ message strcharinfo(0), "Eggs : You found something!";
+ .@size = get(.small_rewards, "Easter Eggs");
+ .@random = rand(.@size+2);
+ if (.@random < .@size)
+ getitem get(.small_rewards$[.@random], "Easter Eggs"), rand(1, 2);
+ else if (.@random == .@size)
+ getexp rand(200), 0;
+ else
+ Zeny = Zeny + rand(50);
+
+ if (rand(get(.chance, "Easter Eggs")))
+ goto L_NoEasterEgg;
+
+
+ .@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:
+ .@fchance = get(.final_rew_chance, "Easter Eggs");
+ if (@AnnualEasterTries > .@fchance)
+ @AnnualEasterTries = .@fchance;
+ .@random = rand(.@fchance - @AnnualEasterTries + 1);
+ if (.@random || @easter_year > gettime(7) - 2000)
+ goto L_Reward_End;
+
+ // block for further items this year:
+ @easter_year = gettime(7) - 2000 + 1;
+ 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.
+ .@rewardindex = gettime(7) - 2012;
+ if (rand(100) < 5)
+ .@rewardindex = .@rewardindex + 1;
+
+ // now hand out the specific item:
+ .@rewardindex = .@rewardindex % get(.big_rewards, "Easter Eggs");
+ getitem get(.big_rewards$[.@rewardindex], "Easter Eggs"), 1;
+ misceffect FX_GETITEM, strcharinfo(0);
+ message strcharinfo(0), "Eggs : This is really special. You won't find anything like this again.";
+ goto L_Reward_End;
+
+L_Reward_End:
+ if (.found >= get(.mapcount, "Easter Eggs"))
+ goto L_Destroy;
+ end;
+
+L_Destroy:
+ set(getvariableofnpc(.eggs, "Easter Eggs"), get(.eggs, "Easter Eggs") - 1); // tell the puppeteer we lost an egg
+ destroy;
+
+L_EndTooYoung:
+ message strcharinfo(0), "Eggs : The nest is empty.";
+ end;
+
+L_WarmUp:
+ #EASTERTIMEPENALTY = gettimetick(2);
+ getitem "MoubooFigurine", 1;
+ misceffect FX_GETITEM, strcharinfo(0);
+ message strcharinfo(0), "Eggs : Hmmm eggs! Maybe you can find something nice there!";
+ end;
+
+L_End3:
+ message strcharinfo(0), "Eggs : Don't be greedy! You already found something nice.";
+ end;
+
+L_End2:
+ message strcharinfo(0), "Eggs : Don't be greedy! You just found something a moment ago.";
+ #EASTERTIMEPENALTY = #EASTERTIMEPENALTY + 5;
+ if (#EASTERTIMEPENALTY > gettimetick(2))
+ #EASTERTIMEPENALTY = gettimetick(2);
+ end;
+
+OnTimer5000:
+ if (get(.disabled, "Easter Eggs") || $@isEaster < 1)
+ goto L_Destroy;
+ initnpctimer;
+ end;
+
+
+/*
+OnSpawn:
+ .@e = rand(2,.loc[1]);
+ .@x = .loc[.@e];
+ .@y = .loc[(.@e-1)+.loc[1]];
+ set .eID, .eID + 1; // give the egg an id
+ .@name$ = "#--Ee"+chr(3)+.eID;
+ if (.eID == 2147483647)
+ set .eID, 0; // start over if id = 0x7FFFFFFF
+ if (puppet(strnpcinfo(3), .@x, .@y, .@name$, 375) < 1) goto L_RetrySpawn; // spawn the egg
+ initnpctimer .@name$; // init puppeteer check timer
+ end;
+
+L_RetrySpawn:
+ addnpctimer 0, strnpcinfo(0) + "::OnSpawn"; // schedule a spawn
+ end;
+
+S_Spawn:
+ if (.eggs >= .max_eggs)
+ goto S_Return;
+ .eggs = .eggs + 1;
+ addnpctimer 125 + rand(250), strnpcinfo(0) + "::OnSpawn"; // schedule a spawn
+ if (.eggs < .min_eggs)
+ goto S_Spawn;
+ return;
+
+S_Return:
+ return;
+
+OnHeartbeat:
+ if (.max_eggs < 1 || .disabled || $@isEaster < 1) end;
+ .mapcount = 1 + getmapusers(strnpcinfo(3)) / 3;
+ callsub S_Spawn;
+ addnpctimer 1000, strnpcinfo(0) + "::OnHeartbeat"; // heartbeat
+ end;
+*/
+
+OnCheckEaster:
+ if ((gettime(6) == 3 && gettime(5) >= 22) || (gettime(6) == 4 && gettime(5) <= 25))
+ $@isEaster = 1;
+ else
+ $@isEaster = 0;
+ if ($@isEaster && .eggs < 1)
+ donpcevent "Easter Eggs::OnStart";
+ end;
+
+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
+ .wait_time = 15;
+ .final_rew_chance = 70;
+ .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)
+ .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";
+ .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";
+ .big_rewards = getarraysize(.big_rewards$);
+ //donpcevent strnpcinfo(0) + "::OnHeartbeat"; // first heartbeat
+ end;
+}
+
+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(getvariableofnpc(.disabled, "Easter Eggs"), 0);
+ clear;
+ mes "Easter Eggs enabled.";
+ next;
+ goto L_Menu;
+
+L_Disable:
+ set(getvariableofnpc(.disabled, "Easter Eggs"), 1);
+ // TODO: Destroy puppets/timers/etc
+ clear;
+ mes "Easter Eggs disabled.";
+ next;
+ goto L_Menu;
+
+L_Return:
+ return;
+}
diff --git a/npc/008-1/banu.txt b/npc/008-1/banu.txt
new file mode 100644
index 00000000..886bfe06
--- /dev/null
+++ b/npc/008-1/banu.txt
@@ -0,0 +1,97 @@
+008-1,70,42,0 script Banu NPC154,{
+ @Exp = 100;
+ @money_water = 250;
+ @money_knife = 100;
+
+ if (QL_BANU >= 3) goto L_Done;
+ if (QL_BANU == 2) goto L_Knife;
+ if (QL_BANU == 1) goto L_Water;
+
+ mes "[Banu]";
+ mes "\"Ah, hello. You've come at just the right moment. The field work is hard and the sun is burning.";
+ mes "Would you mind refilling an old woman's Empty Bottle with water?\"";
+ menu
+ "Sure!",L_Next,
+ "Sorry, I'm busy.",L_close;
+
+L_Next:
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_FullInv;
+
+ mes "She smiles.";
+ mes "[Banu]";
+ mes "\"Here is my Empty Bottle. There is a well right over there at Hurnscald.\"";
+ getitem "EmptyBottle", 1;
+ QL_BANU = 1;
+ goto L_close;
+
+L_Water:
+ mes "[Banu]";
+ mes "\"Ah, you're back. I'm so thirsty.\"";
+ next;
+ if (countitem("BottleOfWater") < 1)
+ goto L_NoWater;
+ delitem "BottleOfWater", 1;
+ mes "She grabs the Bottle of Water and drinks.";
+ getexp @Exp, 0;
+ Zeny = Zeny + @money_water;
+ QL_BANU = 2;
+ mes "[Banu]";
+ mes "\"Ah, that's refreshing. Thank you. You're a good kid. Have this for your expenses.";
+ mes "Maybe you can do me another favor?\"";
+ next;
+ mes "\"I need a new Knife. Peter in the Hurnscald forge to the South of here is selling some. But it's such a long way for my old legs.";
+ mes "Would you go to get me a Knife?\"";
+ goto L_close;
+
+L_Knife:
+ mes "[Banu]";
+ mes "\"Hello dear. Did you get the knife for me?\"";
+ menu
+ "Yeah, here is it.",L_Next1,
+ "Not yet.",L_close;
+
+L_Next1:
+ if (countitem("Knife") < 1)
+ goto L_NoKnife;
+ delitem "Knife", 1;
+ getexp @Exp, 0;
+ Zeny = Zeny + @money_knife;
+ QL_BANU = 3;
+ mes "[Banu]";
+ mes "\"Thank you! You're a darling. Please take this for your effort.\"";
+ goto L_close;
+
+L_Done:
+ mes "[Banu]";
+ @rand = rand(3);
+ if (@rand == 0)
+ mes "\"I spent all my life here in Hurnscald. It's a good place to live.\"";
+ if (@rand == 1)
+ mes "\"Did you see the kids playing hide and seek? Ah, when I was young I used to play with my good friend Sorfina. She lives in Candor now, East of Hurnscald by boat.\"";
+ if (@rand == 2)
+ mes "\"Tonori is ruled by a council of wise wizards.\"";
+ goto L_close;
+
+L_NoWater:
+ mes "[Banu]";
+ mes "\"You didn't get it yet? Shame on you, an old woman is depending on you.\"";
+ goto L_close;
+
+L_NoKnife:
+ mes "[Banu]";
+ mes "\"Where is it? Don't play tricks on an old woman! That's not nice.\"";
+ goto L_close;
+
+L_FullInv:
+ mes "[Banu]";
+ mes "\"Oh my dear! You're carrying so many things that you can't take my Empty Bottle.\"";
+ goto L_close;
+
+L_close:
+ @inventorylist_count = 0;
+ @Exp = 0;
+ @rand = 0;
+ close;
+}
diff --git a/npc/008-1/diryn.txt b/npc/008-1/diryn.txt
new file mode 100644
index 00000000..e8bd5aa8
--- /dev/null
+++ b/npc/008-1/diryn.txt
@@ -0,0 +1,7 @@
+
+008-1,81,82,0 script Diryn the Traveler NPC103,{
+ @npcname$ = "Diryn";
+ @NpcTravelBit = $@hurnscald_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/008-1/dock.txt b/npc/008-1/dock.txt
new file mode 100644
index 00000000..a9f2c94b
--- /dev/null
+++ b/npc/008-1/dock.txt
@@ -0,0 +1,84 @@
+
+008-1,147,64,0 script Hurnscald North Koga NPC395,10,3,{
+ @npc_distance = 11;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "BoardFerry";
+ end;
+
+OnTouch:
+ addtimer get(.warp_delay, "#FerryConfig"), strnpcinfo(0)+"::OnBoard";
+ end;
+
+OnBoard:
+ callfunc "BoardFerry";
+ end;
+}
+
+008-1,139,65,0 script Hurnscald North Dock NPC400,2,1,{
+ @npc_distance = 3;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "BoardFerry";
+ end;
+}
+
+008-1,120,44,0 script #Hurnscald NorthDock NPC32767,{
+ end;
+OnCommandArrive:
+ disablenpc "Hurnscald North Dock";
+ enablenpc "Hurnscald North Koga";
+ areatimer 0, "008-1", 137, 64, 141, 65, get(.warp_delay, "#FerryConfig"), strnpcinfo(0)+"::OnAreaWarp"; // warp players on dock
+ end;
+
+OnAreaWarp:
+ callfunc "BoardFerry";
+ end;
+
+OnCommandWarp:
+ disablenpc "Hurnscald North Koga";
+ enablenpc "Hurnscald North Dock";
+ end;
+}
+
+008-1,147,75,0 script Hurnscald South Koga NPC395,10,3,{
+ @npc_distance = 10;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "BoardCandorFerry";
+ end;
+
+OnTouch:
+ addtimer get(.warp_delay, "#FerryConfig"), strnpcinfo(0)+"::OnBoard";
+ end;
+
+OnBoard:
+ callfunc "BoardCandorFerry";
+ end;
+}
+
+008-1,139,76,0 script Hurnscald South Dock NPC400,2,1,{
+ @npc_distance = 3;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "BoardCandorFerry";
+ end;
+}
+
+008-1,65,25,0 script #Hurnscald SouthDock NPC32767,{
+ end;
+OnCommandArrive:
+ disablenpc "Hurnscald South Dock";
+ enablenpc "Hurnscald South Koga";
+ areatimer "008-1", 137, 75, 141, 76, get(.warp_delay, "#FerryConfig"), strnpcinfo(0)+"::OnAreaWarp"; // warp players on dock
+ end;
+
+OnAreaWarp:
+ callfunc "BoardCandorFerry";
+ end;
+
+OnCommandWarp:
+ disablenpc "Hurnscald South Koga";
+ enablenpc "Hurnscald South Dock";
+ end;
+}
diff --git a/npc/008-1/george.txt b/npc/008-1/george.txt
new file mode 100644
index 00000000..89c3bc9e
--- /dev/null
+++ b/npc/008-1/george.txt
@@ -0,0 +1,42 @@
+
+008-1,135,62,0 script George#pirate NPC138,{
+ @halloween_npc_id = $@halloween_npc_george;
+ callfunc "TrickOrTreat";
+
+ if (getequipid(equip_head) == 617) goto L_Pirate;
+ if (getequipid(equip_head) == 622) goto L_Bandana;
+ if (getequipid(equip_head) == 621) goto L_EyePatch;
+ mes "[George the Pirate]";
+ mes "\"Yar! Do you need something, matey?\"";
+ goto L_Main;
+
+L_Main:
+ menu
+ "Can you explain the Ferry?", L_Explain,
+ "Nothing I guess", L_close;
+
+L_Pirate:
+ mes "[George the Pirate]";
+ mes "\"Arrrrh! Ye be wearing a pirate's hat!\"";
+ goto L_Main;
+
+L_Bandana:
+ mes "[George the Pirate]";
+ mes "\"Arrrrh! Ye remind me of my old first mate!\"";
+ goto L_Main;
+
+L_EyePatch:
+ mes "[George the Pirate]";
+ mes "\"Arrrrh! Looks like ye lost an eye there!\"";
+ goto L_Main;
+
+L_Explain:
+ mes "[George the Pirate]";
+ mes "\"Arrr matey! I helped pioneer the trade routes between Hurnscald and the rest of the World, so now merchants and adventurers can travel to and fro without any hassle of dodging wolvern, yarr.\"";
+ next;
+ callfunc "FerryHelp";
+ goto L_Main;
+
+L_close:
+ close;
+}
diff --git a/npc/008-1/hinnak.txt b/npc/008-1/hinnak.txt
new file mode 100644
index 00000000..e4426c7e
--- /dev/null
+++ b/npc/008-1/hinnak.txt
@@ -0,0 +1,256 @@
+
+008-1,101,30,0 script Hinnak NPC142,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (@inspector == 10) goto L_NohMask;
+ goto L_No_NohMask;
+
+L_No_NohMask:
+ @state = ((QUEST_Hurnscald & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT);
+
+ if (@state == 1) goto L_Exchange;
+ if (@state == 2) goto L_ThanksAgain;
+ if (getequipid(equip_head) == 751) goto L_Intro_Hat;
+
+ mesn l("Farmer Hinnak");
+ mes "\"Argh! I hate them! I @#$% hate them! I @#$% hate these @#$% pinkies!\"";
+ next;
+ menu
+ "You need some anger control therapy.", L_close,
+ "Why do you hate them?", L_Reason;
+
+L_Intro_Hat:
+ mes "The farmer lunges at you with a farming implement.";
+ next;
+ heal -50, 0;
+ menu
+ "I'm out of here.", L_close,
+ "Whoa, what are you doing?", L_Intro_Hat_Explain;
+
+L_Intro_Hat_Explain:
+ mesn l("Farmer Hinnak");
+ mes "\"Sorry, you look like a pinkie. They've been destroying my fields, and I guess I got a bit worked up.\"";
+ next;
+ goto L_Help;
+
+L_Reason:
+ mesn l("Farmer Hinnak");
+ mes "\"These @#$% beasts are jumping around in my fields destroying all my harvest.";
+ mes "But they are too fast. I can't catch them.\"";
+ next;
+ menu
+ "Want me to help you?", L_Help,
+ "Well, life ain't fair.", L_close;
+
+L_Help:
+ mesn l("Farmer Hinnak");
+ mes "\"Yes, you look quite fast. Maybe you can catch some of them. That will pay them a lesson.";
+ mes "Slay some of them and bring me 10 of their antennae.\"";
+ @state = 1;
+ callsub S_Update_Mask;
+ next;
+ menu
+ "Sure, I'm on my way", L_close,
+ "How much is this worth to you?", L_Reward;
+
+L_Reward:
+ mesn l("Farmer Hinnak");
+ mes "\"Well, I can't offer you much. But I got an old scythe laying around. Maybe you can use it as a weapon.\"";
+ goto L_close;
+
+L_Exchange:
+ if (getequipid(equip_head) != 751)
+ goto L_Exchange_Start;
+ mes "The farmer glares at your hat.";
+ next;
+ goto L_Exchange_Start;
+
+L_Exchange_Start:
+ mesn l("Farmer Hinnak");
+ mes "\"Have you got the 10 antennae?\"";
+ next;
+ menu
+ "Not yet, but I am working on it.", L_close,
+ "Sure, here they are!", L_Exchange_Exchange;
+
+L_Exchange_Exchange:
+ if (countitem("PinkAntenna") < 10)
+ goto L_Exchange_Notenough;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("PinkAntenna") > 10)
+ goto L_Exchange_TooMany;
+ delitem "PinkAntenna", 10;
+ getitem "Scythe", 1;
+ @state = 2;
+ callsub S_Update_Mask;
+ mesn l("Farmer Hinnak");
+ mes "\"Thank you very much. I've got something for you. My old scythe. Maybe you can use it as a weapon. It is a bit cumbersome but its strikes are deadly.\"";
+ goto L_close;
+
+L_Exchange_Notenough:
+ mesn l("Farmer Hinnak");
+ mes "\"It doesn't look like you do.\"";
+ goto L_close;
+
+L_Exchange_TooMany:
+ mesn l("Farmer Hinnak");
+ mes "\"Looks like you don't have room for this. Come back later to receive your reward. Hold on to the antennea until then.\"";
+ goto L_close;
+
+L_ThanksAgain:
+ if (getequipid(equip_head) == 751)
+ goto L_ThanksHat;
+ mesn l("Farmer Hinnak");
+ mes "\"Good to see you again, and thanks again for helping me with the pinkies!\"";
+ next;
+ goto L_ThanksMenu;
+
+L_ThanksHat:
+ mesn l("Farmer Hinnak");
+ mes "\"That better be a trophy on your head.\"";
+ menu
+ "It is.", L_Next;
+
+L_Next:
+ mesn l("Farmer Hinnak");
+ mes "\"Good then. Thanks for your help with the pinkies.\"";
+ goto L_ThanksMenu;
+
+L_ThanksMenu:
+ menu
+ "Sure, any time!", L_Next1,
+ "Anything else you want me to do?", L_Next1,
+ "You're welcome. Bye!", L_Bye;
+
+L_Next1:
+ mesn l("Farmer Hinnak");
+ mes "\"Actually, it's been a long day. If it's no trouble, could you get me a beer?\"";
+ next;
+ menu
+ "Here you are.", L_GiveBeer,
+ "Sure, I'll go get one. Bye!", L_Bye,
+ "You shouldn't drink while working!", L_Next2;
+
+L_Next2:
+ mesn l("Farmer Hinnak");
+ mes "\"Well, I'm done for the day, and I'm quite old enough to decide when I can have a beer, thank you!\"";
+ next;
+ menu
+ "Sorry... here you are.", L_GiveBeer,
+ "I don't have any.", L_NoBeer;
+
+L_GiveBeer:
+ if (countitem("Beer") < 1)
+ goto L_NoBeer;
+ delitem "Beer", 1;
+ mesn l("Farmer Hinnak");
+ mes "Hinnak takes a sip.";
+ mes "\"Aaah! Nothing like a well-deserved beer after a long day of tending the crops!\"";
+ mes "\"Thanks, that was very kind of you!\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "He takes another sip.";
+ mes "\"Thanks! You know, I had the strangest thing happen to me. I had this patch of ground that was really clumpy; lots of clay, you see.\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"Right over there.\"";
+ mes "He points to a stretch of soft, raked ground.";
+ mes "\"Looks much better now, doesn't it? But how I got there is kind-a scary...\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"I'd been trying to break it up for a while, but that kind of work is a pain. So my wife said that I should go and see the witch, just in case she knows something.\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"And sure enough I ask the witch, and she has a look at it. 'Nothing I can do', she says, 'but I can ask a friend'.\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"So the next day another witch shows up. Gorgeous woman, but when she looked at me, the scares went scuttling down my spine....\"";
+ mes "\"First thing she asked was if I'm a farmer. Said her friend had told her that I needed help.\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"I show her what the problem is, and she tells me to go inside and wait.\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"Hinnak drains his beer in one long sip, then hesitates.";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"So I go inside. I'm barely in when it starts raining outside, pouring cats and mouboos!\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"Not so weird, perhaps, except that it was been bright and sunny just a second before! So I rush out, my wife telling me to leave the witch alone, and I see her standing there in the middle of the rain...\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"None of the raindrops touched her, as if they was afraid!\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"Then she yells out some gobbledygook word, and out of the ground there comes a swarm of maggots, crawling and digging and climbing over each other's backs...\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"And then she turns to me! Seeing her stare, for a moment there I think that she'll turn me into a pinkie, for sure...\"";
+ next;
+ mesn l("Farmer Hinnak");
+ mes "\"But all she says is, 'if you'd stayed inside, you wouldn't be wet now'.\"";
+ next;
+ menu
+ "Hahaha!", L_Sagatha_hahaha,
+ "Whoah, scary...", L_Sagatha_scary,
+ "What was that gobbledygook word?", L_Sagatha_word,
+ "I better go now.", L_Bye;
+
+L_Sagatha_hahaha:
+ mesn l("Farmer Hinnak");
+ mes "\"Yeah, funny now... But you should've seen that stare! Ah, well, never mind.\"";
+ goto L_close;
+
+L_Sagatha_scary:
+ mesn l("Farmer Hinnak");
+ mes "\"Yeah, you could say that...\"";
+ mes "He stares into his empty beer jug, as if wishing it weren't empty yet.";
+ goto L_close;
+
+L_Sagatha_word:
+ mesn l("Farmer Hinnak");
+ mesq l("Oh, I can't be sure... but something like '%s', I think.", b("kalmurk"));
+ if (getskilllv(SKILL_MAGIC)) {
+ learnskill SKILL_KALMURK;
+ } else {
+ mesc l("You wonder if you could do the same, had you more magic power.");
+ mesc l("Actually... Didn't you heard rumors about a Mana Seed somewhere nearby?");
+ }
+ goto L_close;
+
+L_NoBeer:
+ mesn l("Farmer Hinnak");
+ mesq l("Ah... no beer? Oh well.");
+ goto L_close;
+
+L_Bye:
+ mesn l("Farmer Hinnak");
+ mesq l("Bye!");
+ goto L_close;
+
+L_NohMask:
+ menu
+ "Did you see anyone in a mask come by here at night?", L_NohMask_Mask,
+ "Did you see anyone with a large satchel come by here at night?", L_NohMask_Satchel,
+ "Hello.", L_No_NohMask;
+
+L_NohMask_Mask:
+ mesn l("Farmer Hinnak");
+ mes "\"No. It tends to be too dark to see a mask.\"";
+ goto L_close;
+
+L_NohMask_Satchel:
+ mesn l("Farmer Hinnak");
+ mes "\"Yes, I saw someone with a large sack on their back go to the mining camp.\"";
+ goto L_close;
+
+L_close:
+ @state = 0;
+ @inspector = 0;
+ close;
+
+S_Update_Mask:
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_1_MASK)) | (@state << NIBBLE_1_SHIFT);
+ return;
+}
diff --git a/npc/008-1/mapflags.txt b/npc/008-1/mapflags.txt
new file mode 100644
index 00000000..71786e90
--- /dev/null
+++ b/npc/008-1/mapflags.txt
@@ -0,0 +1 @@
+//008-1 mapflag resave 009-2,149,43
diff --git a/npc/008-1/mikhail.txt b/npc/008-1/mikhail.txt
new file mode 100644
index 00000000..6cbc4881
--- /dev/null
+++ b/npc/008-1/mikhail.txt
@@ -0,0 +1,61 @@
+008-1,135,25,0 script Mikhail NPC120,{
+ if (QL_SOUP >= 6) goto L_Done;
+ if (QL_SOUP == 5) goto L_Progress;
+ if (QL_SOUP == 4) goto L_Start;
+ goto L_Con_Mik_First;
+
+L_Con_Mik_First:
+ mes "[Mikhail]";
+ mes "\"Hello... I'm supposed to be helping Bernard from the Inn but...\"";
+ mes "His eyes grow wide";
+ mes "\"Eeekkk another one.\"";
+ mes "";
+ mes "It seems that the boy would like to say more, but seems too terrified at the moment. Maybe you should help someone else first, so that he sees your intentions are good.";
+ goto L_close;
+
+L_Start:
+ mes "[Mikhail]";
+ mes "\"Bernard sent me to get five Maggot Slimes from the maggots in the fields, but they scare me so bad!\"";
+ next;
+ mes "\"You look like a nice person. Would you go get them for me?\"";
+ menu
+ "Of course, I'll go get them for you.", L_Accept,
+ "I've got other things to do right now.", L_close;
+
+L_Accept:
+ mes "[Mikhail]";
+ mes "\"Thank you so much! I'll wait for you here.\"";
+ QL_SOUP = 5;
+ close;
+
+L_Progress:
+ mes "[Mikhail]";
+ mes "\"Did you bring me the five Maggot Slimes I need?\"";
+ next;
+ menu
+ "Yes, here they are, kiddo!", L_try,
+ "Not yet, but I'll be back soon.", L_close;
+
+L_try:
+ if (countitem("MaggotSlime") >= 5)
+ goto L_Get;
+ mes "[Mikhail]";
+ mes "\"It doesn't look like you have them all...\"";
+ goto L_close;
+
+L_Get:
+ delitem "MaggotSlime", 5;
+ getexp 100, 0;
+ QL_SOUP = 6;
+ mes "[Mikhail]";
+ mes "\"Ooh! Thank you so much! I can get back to Bernard now!\"";
+ goto L_close;
+
+L_Done:
+ mes "[Mikhail]";
+ mes "\"Thanks again for helping me get those Maggot Slimes!\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/009-1/_import.txt b/npc/009-1/_import.txt
new file mode 100644
index 00000000..a414e690
--- /dev/null
+++ b/npc/009-1/_import.txt
@@ -0,0 +1,15 @@
+// Map 009-1: Hurnscald
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/009-1/_mobs.txt",
+"npc/009-1/_warps.txt",
+"npc/009-1/constable.txt",
+"npc/009-1/event.txt",
+"npc/009-1/guide.txt",
+"npc/009-1/jack.txt",
+"npc/009-1/mapflags.txt",
+"npc/009-1/milly.txt",
+"npc/009-1/old_man.txt",
+"npc/009-1/old_woman.txt",
+"npc/009-1/sabine.txt",
+"npc/009-1/soul-menhir.txt",
+"npc/009-1/water_pump.txt",
diff --git a/npc/009-1/_mobs.txt b/npc/009-1/_mobs.txt
new file mode 100644
index 00000000..7c53d786
--- /dev/null
+++ b/npc/009-1/_mobs.txt
@@ -0,0 +1,7 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-1: Hurnscald mobs
+009-1,74,32,1,0 monster Clover Patch 1037,1,100000,120000
+009-1,29,44,4,6 monster Pink Flower 1014,2,0,250
+009-1,88,51,7,2 monster Squirrel 1038,2,0,5000
+009-1,80,38,2,2 monster Squirrel 1038,1,0,5000
+009-1,0,0,0,0 monster Butterfly 1055,5,30,20
diff --git a/npc/009-1/_warps.txt b/npc/009-1/_warps.txt
new file mode 100644
index 00000000..0dad32b9
--- /dev/null
+++ b/npc/009-1/_warps.txt
@@ -0,0 +1,14 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-1: Hurnscald warps
+009-1,49,55,0 warp #009-1_49_55 3,0,008-1,78,81
+009-1,97,36,0 warp #009-1_97_36 0,1,008-1,128,61
+009-1,35,30,0 warp #009-1_35_30 0,0,009-2,50,54
+009-1,58,46,0 warp #009-1_58_46 0,0,009-2,27,106
+009-1,59,33,0 warp #009-1_59_33 0,0,009-2,95,29
+009-1,71,30,0 warp #009-1_71_30 0,0,009-2,130,25
+009-1,80,31,0 warp #009-1_80_31 0,0,009-2,149,66
+009-1,72,44,0 warp #009-1_72_44 0,0,009-2,114,77
+009-1,91,46,0 warp #009-1_91_46 1,0,009-2,182,66
+009-1,24,36,0 warp #009-1_24_36 0,2,008-1,53,61
+009-1,49,24,0 warp #009-1_49_24 3,0,008-1,78,48
+009-1,60,41,0 warp #009-1_60_41 0,0,009-2,32,91
diff --git a/npc/009-1/constable.txt b/npc/009-1/constable.txt
new file mode 100644
index 00000000..6f415e02
--- /dev/null
+++ b/npc/009-1/constable.txt
@@ -0,0 +1,9 @@
+
+009-1,55,34,0 script Constable Bob NPC419,{
+ mes "[Constable Bob]";
+ mes "\"Hello.\"";
+ mes "\"I've been getting complaints of lawlessness in Hurnscald recently, so I thought I'd come down here myself and explain the rules.\"";
+ mes "\"Please make sure that you follow them!\"";
+ callfunc "GameRules";
+ close;
+}
diff --git a/npc/009-1/event.txt b/npc/009-1/event.txt
new file mode 100644
index 00000000..edd39f34
--- /dev/null
+++ b/npc/009-1/event.txt
@@ -0,0 +1,160 @@
+
+009-1,30,34,0 script Kytty NPC430,{
+ // Core Variable Switcher
+ if (gettime(5) >= 13 && gettime(5) <= 15) goto L_Quest;
+ if (gettime(5) > 15 && strcharinfo(0) == "kytty" && $VALENTINE) goto L_StopEvent;
+ if (gettime(5) > 15 && #VALENTINE) goto L_ClaimRewards;
+ if (gettime(5) > 15 && GM >= GM_DEV && $VALENTINE) goto L_ReadOnly;
+ mes "[Kytty]";
+ mes "\"Uh? Hello there. I am looking for my husband to stare at him, don't mind me.\"";
+ close;
+
+L_Quest:
+ if (#VALENTINE) goto L_Running;
+ // Core dialog
+ mes "[Kytty]";
+ mes "\"Hey, "+strcharinfo(0)+"! I have a problem and perhaps you can help me!\"";
+ next;
+ menu
+ "Sure, m'am... What should I do?", L_Continue,
+ "Who, me? Sorry, wrong person.", L_close;
+
+L_Continue:
+ mes "";
+ mes "[Kytty]";
+ mes "\"I feel like my husband is staring at other people, and that is ABSURD! He should only stare at kytty!\" %%e";
+ next;
+ mes "[Kytty]";
+ mes "\"So kytty came up with a great plan - kytty will brew some [@@5263|Love Potions@@] so hubby only stares at me!\"";
+ next;
+ mes "[Kytty]";
+ mes "\"I have most ingredients, but a few are still missing and I was hoping you could help me out:\"";
+ mes "- 20x Cherry";
+ mes "- 20x Chocolate Bar";
+ mes "- 1x Diamond";
+ mes "- 1x Chocolate Cake";
+ next;
+ mes "[Kytty]";
+ mes "\"Uh? Of course I won't put everything in the potion! Wyara will sell me some other ingredients for the diamond, and... Hey, stop making questions!\"";
+ next;
+ mes "[Kytty]";
+ mes "\"Do you have everything I've asked for?\"";
+ menu
+ "I do.", L_Check,
+ "I don't.", L_close;
+
+L_Check:
+ mes "";
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_Full;
+
+ if (countitem("ChocolateBar") < 20) goto L_NotEnough;
+ if (countitem("Cherry") < 20) goto L_NotEnough;
+ if (countitem("Diamond") < 1) goto L_NotEnough;
+ if (countitem("ChocolateCake") < 1) goto L_NotEnough;
+
+ delitem "ChocolateBar", 20;
+ delitem "Cherry", 20;
+ delitem "Diamond", 1;
+ delitem "ChocolateCake", 1;
+ getitem "LovePotion", 1;
+ getexp 50000, 0;
+ #VALENTINE = 1;
+ mes "[Kytty]";
+ mes "\"With this, he will totally stare only at me now! Thanks for the help. Here, you can have an extra, but you are not cute like him so don't blame me if it don't work or present... side effects.\"";
+ next;
+ mes "[Kytty]";
+ mes "\"Also, I love chocolate. I'll give you a spare potion every fifty [@@509|@@] you bring me.\"";
+ close;
+
+L_NotEnough:
+ mes "";
+ mes "[Kytty]";
+ mes "\"Don't try to troll me, I know you don't have everything.\"";
+ close;
+
+L_Full:
+ mes "[Kytty]";
+ mes "\"Free up some space in your inventory, please.\"";
+ close;
+
+L_Running:
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_Full;
+ mes "[Kytty]";
+ mes "\"Have you brought me more chocolate? I am starving with only "+$VALENTINE+" [@@509|@@]. You ##Bonly##b gave me "+(#VALENTINE-1)+" bar(s), after all!\"";
+ next;
+ menu
+ "Not yet, but I'll be back.", L_close,
+ "Sure thing miss, take all you want!", L_Collect;
+
+L_Collect:
+ mes "";
+ @choco = countitem("ChocolateBar");
+ @bonus = (#VALENTINE%50)+@choco;
+ @potio = @bonus/50;
+ //debugmes "Choco "+@choco+" Potio "+@potio+" Bonus "+@bonus+".";
+ @bonus = 0;
+ delitem "ChocolateBar", @choco;
+ #VALENTINE = #VALENTINE+@choco;
+ $VALENTINE = $VALENTINE+@choco;
+ getexp @choco*15, @choco*7;
+ if (@potio) goto L_BonusPots;
+ mes "[Kytty]";
+ mes "\"Yummy! Thanks for your support. Tell me if you have more chocolate!\"";
+ close;
+
+L_BonusPots:
+ getitem "LovePotion", @potio;
+ mes "[Kytty]";
+ mes "\"Here are some love potions for you. But as I said - I'm not sure if you are cute enough for them.\"";
+ close;
+
+L_StopEvent:
+ mes "[Kytty]";
+ mes "\"Hey other me! I still have "+$VALENTINE+" chocolate bars, but I'm a NPC and cannot eat them, so here they are!\"";
+ next;
+ @choco = min($VALENTINE, 30000);
+ getitem "ChocolateBar", @choco;
+ $VALENTINE = $VALENTINE-@choco;
+ mes "[Kytty]";
+ mes "\"Also: Jesusalva asked me to wish you a happy Valentine Day.\"";
+ close;
+
+L_ReadOnly:
+ mes "[Kytty]";
+ mes "\"I'm still holding on "+$VALENTINE+" chocolate bars, but I'll eat them soon!\"";
+ close;
+
+L_ClaimRewards:
+ if(!#VALENTINE) goto L_close;
+ getinventorylist;
+ if (@inventorylist_count > 95) goto L_Full;
+ setarray @oldstock$, "GrassFedTofu", "Honey", "VeganWater", "FairTradeSoil", "LactoseFreeAcorn", "RawAir", "FreeRangeMoss";
+ getitem @oldstock$[rand(getarraysize(@oldstock$))], 1;
+ cleararray @oldstock$, "", getarraysize(@oldstock$);
+ //getitem "BlueWolfHelmet", 1; // FIXME?
+ getitem "ShockSweet", rand(4, 7);
+ getitem "DarkConcentrationPotion", rand(2, 5);
+ getexp 1+(#VALENTINE*BaseLevel)/2, 0;
+ #VALENTINE = 0;
+ close;
+
+L_close:
+ close;
+
+L_Off:
+ disablenpc "Kytty";
+ end;
+
+L_On:
+ enablenpc "Kytty";
+ end;
+
+OnInit:
+ if (gettime(6) == 2) goto L_On; // NPC shows only in February
+ goto L_Off;
+
+OnClock0000:
+ goto OnInit;
+}
diff --git a/npc/009-1/guide.txt b/npc/009-1/guide.txt
new file mode 100644
index 00000000..78c2c315
--- /dev/null
+++ b/npc/009-1/guide.txt
@@ -0,0 +1,184 @@
+
+009-1,92,29,0 script Ian NPC102,{
+ // This line is only relevant for players, who started before the timestamp was introduced.
+ // Set the graduation cap flag at the right position.
+ // It is a bugfix
+ if ((TUT_var < 4) && (TUT_var & 2))
+ FLAGS = FLAGS|FLAG_GOT_GRADUATIONCAP;
+
+ if ((TUT_var != 0) && !(FLAGS & FLAG_GOT_GRADUATIONCAP) && BaseLevel >= 10)
+ goto L_Grad;
+ goto L_DoneGrad;
+
+L_DoneGrad:
+ mesn l("Ian the Guide");
+ mes "\"Would you like to know about something?\"";
+ next;
+ goto L_Menu_A;
+
+L_Menu_A:
+ menu
+ "Fighting", L_Fight,
+ "Items", L_Items,
+ "Monsters", L_Monster,
+ "Stylist", L_Style,
+ "Quests", L_Quests,
+ "NPCs", L_NPC,
+ "Commands", L_Comm,
+ "Attributes", L_Stats,
+ "Magic", L_Magic,
+ "Quick Keys", L_Key,
+ "Laws", L_Laws,
+ "I know everything!", L_Know;
+
+L_Fight:
+ mesn l("Ian the Guide");
+ mes "\"People live in this world by living off of monsters.";
+ mes "You can fight monsters and even players by hitting the [CTRL] key, or left mouse click.\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"If you get tired of pressing the key too much, you can also type [SHIFT]+[CTRL].";
+ mes "This will make your character attack continuously for the time you are inactive.\"";
+ next;
+ goto L_Menu_A;
+
+L_Items:
+ mesn l("Ian the Guide");
+ mes "\"There are three types of items.";
+ mes "They can be Consumables, Equipment or Miscellaneous\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"Consumable items such as Potions, can be used only once.";
+ mes "After use, they will disappear from your inventory.\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"Equipment items like Armors, Weapons, Accessories";
+ mes "can be equipped for fashionable purposes or to raise your status.\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"Miscellaneous items such as maggot slime, are used";
+ mes "in creating other items, or just to trade and sell.\"";
+ next;
+ goto L_Menu_A;
+
+L_Monster:
+ mesn l("Ian the Guide");
+ mes "\"In every world, there are beasts. Monsters can be found almost anywhere!~";
+ mes "To fight them, please read [Fighting] if you do not know how.\"";
+ next;
+ mes "\"There a several types of monsters, Aggressive, Neutral, and Assistants.\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"Aggressive monsters know that they are always in danger";
+ mes "so therefore they always keep their guard up,";
+ mes "making them attack anybody in sight.\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"Neutral monsters tend to just lounge around until attacked.";
+ mes "They will leave everything alone unless they are threatened.\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"Assistants are monsters who help each other.";
+ mes "You should always check how many are around you before attacking a single one!\"";
+ next;
+ goto L_Menu_A;
+
+L_Style:
+ mesn l("Ian the Guide");
+ mes "\"The stylist NPCs will cut and perm your hair!";
+ mes "They are known for their hair growth formula\"";
+ next;
+ goto L_Menu_A;
+
+L_Quests:
+ mesn l("Ian the Guide");
+ mes "\"There are people in the world in need of help!";
+ mes "Most of these people aren't afraid to give rewards to those who help them.";
+ mes "So be nice and help people along the way!\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"If you are looking for a place to get started, I heard that the farmers just outside the gates are looking for help.\"";
+ next;
+ goto L_Menu_A;
+
+L_NPC:
+ mesn l("Ian the Guide");
+ mes "\"NPCs [Non Playable Characters] are people who are always in the game,";
+ mes "tending to many varieties of services from just chatting to helping others.\"";
+ next;
+ goto L_Menu_A;
+
+L_Comm:
+ mesn l("Ian the Guide");
+ mes "\"/clear clears the text box.\"";
+ mes "\"/help displays the client commands (ones starting with a /) in the chat box.\"";
+ mes "\"/whisper [name] allows you to message someone privately.\"";
+ mes "\"/who displays the current number of online users.\"";
+ mes "\"/where displays the current map's name.\"";
+ next;
+ goto L_Menu_A;
+
+L_Stats:
+ mesn l("Ian the Guide");
+ mes "\"People vary greatly by how much strength, agility, dexterity, intelligence, vitality, and luck they have.\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"Strength helps you carry items, and it also allows you to hit harder – but it is not too helpful if you focus on missile weapons.";
+ mes "More agility allows you to attack faster, and to dodge attacks more easily.";
+ mes "Your dexterity determines how likely you are to hit a monster, and how effective you are with missile weapons.\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"Vitality determines how resistant to injuries you are, and how much damage you can take before you die.";
+ mes "Intelligence is useful for alchemy and magic, but there are few opportunities for either at the moment.";
+ mes "Luck determines many small things, including the likelihood of both recieving and dealing critical hits\"";
+ next;
+ mesn l("Ian the Guide");
+ mes "\"I recommend that you practice your dexterity, since some of the more dangerous monsters are very hard to hit otherwise.";
+ mes "Don't bother trying to work on your luck, and your intelligence is probably not something anyone cares about either.\"";
+ next;
+ goto L_Menu_A;
+
+L_Magic:
+ mesn l("Ian the Guide");
+ mes "\"The only active Mana Seed remaining is West of here somewhere, Ask Wyara, they may know more about it.\"";
+ next;
+ mes "\"In decades past, there was a Mana Seed in Tulimshar, from which people could draw magical energies. Unfortunately, the seed went dorment.";
+ mes "However, I've overheard the bard mentioning something about this recently... if you are interested in magic, try talking to him!\"";
+ next;
+ goto L_Menu_A;
+
+L_Key:
+ mesn l("Ian the Guide");
+ mes "\"There are many key combinations, press F1 for a short list of them!\"";
+ next;
+ goto L_Menu_A;
+
+L_Laws:
+ mesn l("Ian the Guide");
+ callfunc "GameRules";
+ next;
+ goto L_Menu_A;
+
+L_Know:
+ mesn l("Ian the Guide");
+ mesq l("Lost? Confused? Want to know why you can't get past a quest, overcome an NPC or find an item? Check %s for player hints, walkthroughs, item lists and more!", "@@https://wiki.themanaworld.org/index.php/Legacy:Main|the wiki@@");
+ next;
+ mesq l("But remember, the game isn't fun when you already know what to do. Use it well or you will lose interest in playing The Mana World! Please help by reporting anything that is unclear, outdated or that needs to be seen on our forums at %s.", "@@https://forums.themanaworld.org|@@");
+ close;
+
+L_Grad:
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_TooMany;
+ mesn l("Ian the Guide");
+ mes "\"Hey, you've been doing good, let me give you this.\"";
+ getitem "GraduationCap", 1;
+ FLAGS = FLAGS | FLAG_GOT_GRADUATIONCAP;
+ next;
+ goto L_DoneGrad;
+
+L_TooMany:
+ mesn l("Ian the Guide");
+ mes "\"I wanted to give you something, but you don't have room for it.\"";
+ next;
+ goto L_DoneGrad;
+}
diff --git a/npc/009-1/jack.txt b/npc/009-1/jack.txt
new file mode 100644
index 00000000..5558c69b
--- /dev/null
+++ b/npc/009-1/jack.txt
@@ -0,0 +1,272 @@
+
+009-1,40,45,0 script Jack NPC141,{
+ @RAWLOGS_AMOUNT = 40;
+ @SHIELD_COST = 5000;
+ @QUEST_SHIELD_EXP = 2500;
+
+ @Q_Forestbow_MASK = NIBBLE_0_MASK;
+ @Q_Forestbow_SHIFT = NIBBLE_0_SHIFT;
+
+ @Q_Woodenshield_MASK = NIBBLE_1_MASK;
+ @Q_Woodenshield_SHIFT = NIBBLE_1_SHIFT;
+
+ @Q_Forestbow = ((QUEST_Forestbow_state & @Q_Forestbow_MASK) >> @Q_Forestbow_SHIFT);
+ @Q_Woodenshield = ((QUEST_Forestbow_state & @Q_Woodenshield_MASK) >> @Q_Woodenshield_SHIFT);
+
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (@Q_Woodenshield >= 3) goto L_Shield_state_3;
+ if (@Q_Woodenshield == 2) goto L_Shield_state_2;
+ if (@Q_Woodenshield == 1) goto L_Shield_state_1;
+ if (@Q_Forestbow > 1) goto L_Bow_state_2;
+
+ mes "[Jack Lumber]";
+ mes "\"Hello there! My name is Jack Lumber, the enemy of all trees. If you need some firewood, just let me know.\"";
+ if (@inspector == 1)
+ goto L_NohMask_Ask;
+ goto L_NotInspector;
+
+L_NotInspector:
+ next;
+ if (@Q_Forestbow < 1)
+ goto L_close;
+ select
+ l("I heard you aren't delivering any more living wood. Why not?");
+ mes "";
+ goto L_Next;
+
+L_Next:
+ mes "[Jack Lumber]";
+ mes "\"Why not?! I value my life, that's why!.\"";
+ next;
+ menu
+ "What do you mean?", L_Next1;
+
+L_Next1:
+ mes "[Jack Lumber]";
+ mes "\"A week ago, I was going to chop down one of those twigleaf trees in the forest to the southwest – these twigleafs are the trees that give me the living wood you speak of. I was just chopping away with my axe, and guess what happened? One of its branches hit me! At first, I thought it fell down or the wind blew it, but it hurt! After I shook it off and struck the tree again with my axe, another branch hit me! I got angry and started to chop off all the low-hanging branches so this couldn't happen anymore. Even after all that though, I still can't believe what happened next.\"";
+ next;
+ menu
+ "What happened? ", L_Next2;
+
+L_Next2:
+ mes "[Jack Lumber]";
+ mes "\"You'll think I'm insane if I tell you...\"";
+ next;
+ menu
+ "I won't. I promise.", L_Next3;
+
+L_Next3:
+ mes "[Jack Lumber]";
+ mes "\"Alright, well... After I chopped off a few branches, the whole tree started to move! Its roots tore out of the earth, all the branches started to wave around, and a face appeared on the trunk. The whole tree CAME TO LIFE! It was mad!\"";
+ next;
+ menu
+ "Did you run away?", L_Next4,
+ "Did you fight it?", L_Next4;
+
+L_Next4:
+ mes "[Jack Lumber]";
+ mes "\"I fought it, of course! I took my axe and attacked the beast! It hit me here *points at a bruise on his shoulder,* here *lifts his trouser leg to show another bruise,* and here *lifts his shirt and reveals even worse bruises.* But I didn't give up! I chopped away at it, branch after branch, and in the end I chopped off its roots, and it fell to the ground – motionless.\"";
+ next;
+ menu
+ "So you beat the monster? Then why are you so scared?", L_Next5;
+
+L_Next5:
+ mes "[Jack Lumber]";
+ mes "\"Well, I was exhausted and had to rest. A few minutes passed, and suddenly I was practically surrounded by a dozen or more of these living trees!\"";
+ next;
+ menu
+ "Did you fight them too? ", L_Next6;
+
+L_Next6:
+ mes "[Jack Lumber]";
+ mes "\"Are you crazy? I barely destroyed one of those beasts; I was in no shape to fight again! I ran away as fast as I could, and lucky for me the monsters aren't that fast on their tiny root legs. Ha!\"";
+ next;
+ menu
+ "So, I guess you aren't chopping down trees anymore?", L_Next7;
+
+L_Next7:
+ mes "[Jack Lumber]";
+ mes "\"I still do; it's my job. But I'll no longer chop those twigleafs – I'll tell you that. I know the bow master wants some twigleaf wood, but I don't care. I won't risk MY life for a few gold pieces! If you really want to, just go to the southwest, but I can't help you. I won't go there ever again.\"";
+ next;
+ menu
+ "Southwest you say? OK, thank you.", L_Next8;
+
+L_Next8:
+ @Q_Forestbow = 2;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Bow_state_2:
+ // Bow state 4: The player has found a perfect piece of wood.
+ if (@Q_Forestbow > 3) goto L_Bow_state_4;
+
+ mes "\"Good luck hunting those tree monsters – you'll need it.\"";
+ if (@inspector != 1)
+ goto L_close;
+ goto L_NohMask_Ask;
+
+L_Bow_state_4:
+ mes "[Jack Lumber]";
+ mes "\"You've finally found that perfect piece of living wood that Alan needs to make a Forest Bow, haven't you?\"";
+ next;
+ menu
+ "I couldn't afford the bow, though...", L_Shield_state_0,
+ "No, I'm still looking.", L_Bow_state_4_reaffirm,
+ "Yes, I've got the Forest bow now.", L_Next9,
+ "I'm a melee warrior, I don't need bows.", L_Shield_state_0;
+
+L_Next9:
+ // Check if the player tells the truth (continue on in any case)
+ if (@Q_Forestbow > 4) goto L_Shield_state_0;
+
+ mes "[Jack Lumber]";
+ mes "\"Hrmph. I'm someone who respects those speaking the truth.\"";
+ next;
+ goto L_Shield_state_0;
+
+L_Bow_state_4_reaffirm:
+ mes "[Jack Lumber]";
+ mes "\"You should go talk to Alan again.\"";
+ goto L_close;
+
+L_Shield_state_0:
+ @Q_Woodenshield = 1;
+ callsub S_Update_Mask;
+
+ mes "[Jack Lumber]";
+ mes "\"You no doubt remember how I struggled with those beasts, fighting for my life. Scared me, those seven-branched little stumps did! Never since that day have I strayed near them, and yet there you are, cutting them down one by one. I'm proud of you – to dare to fight those trunks is admirable indeed. You're as strong as if you were my own child!\"";
+ next;
+ goto L_Shield_state_1;
+
+L_Shield_state_1:
+ mes "[Jack Lumber]";
+ mes "\"I have an idea. What would you say about a new shield?\"";
+ next;
+ if (@inspector == 1)
+ menu
+ "No thanks.", L_close,
+ "Yes, please!", L_Yes,
+ "Actually, I'd like to know if you've seen any strange happenings in town.", L_NohMask_Answer;
+ menu
+ "No thanks.", L_close,
+ "Yes, please!", L_Yes;
+
+L_Yes:
+ mes "[Jack Lumber]";
+ mes "\"All I need is " + @RAWLOGS_AMOUNT + " raw logs. This needn't be high quality wood; pretty much any log you can find should work. Oh, and I'll also need " + @SHIELD_COST + " GP for other materials.\"";
+ next;
+ @Q_Woodenshield = 2;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Shield_state_2:
+ mes "[Jack Lumber]";
+ mes "\"Do you have the " + @RAWLOGS_AMOUNT + " raw logs and " + @SHIELD_COST + " GP for the shield?\"";
+ menu
+ "Here it is.", L_Next10,
+ "I'll come back later.", L_close;
+
+L_Next10:
+ if (countitem("RawLog") < @RAWLOGS_AMOUNT)
+ goto L_Not_enough_logs;
+ if (Zeny < @SHIELD_COST)
+ goto L_Not_enough_money;
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_TooMany;
+ delitem "RawLog", @RAWLOGS_AMOUNT;
+ Zeny = Zeny - @SHIELD_COST;
+ getexp @QUEST_SHIELD_EXP, 0;
+ getitem "WoodenShield", 1;
+ @Q_Woodenshield = 3;
+ callsub S_Update_Mask;
+ mes "[Jack Lumber]";
+ mes "\"Have a seat.\"";
+ mes "Jack saws the logs into pieces and then sands them until they are smooth to the touch.";
+ mes "Applying some strong-smelling liquid, he tans them to a darker hue.";
+ next;
+ mes "[Jack Lumber]";
+ mes "Grabbing one of two leftover pieces, he begins to carve it into a round shape, then repeats this with the second piece – shield handles from what you can tell.";
+ next;
+ mes "[Jack Lumber]";
+ mes "Meanwhile, the sun has dried the other pieces. Jack places them next to each other, adds a frame, and nails everything together.";
+ mes "The resulting shield looks usable already, but Jack applies another liquid to it and leaves it to dry for a few moments.";
+ next;
+ mes "[Jack Lumber]";
+ mes "Finally, he hands the shield to you.";
+ mes "\"Enjoy your new shield!\"";
+ mes "[" + @QUEST_SHIELD_EXP + " experience points]";
+ next;
+ goto L_close;
+
+L_Not_enough_logs:
+ mes "[Jack Lumber]";
+ mes "\"You don't have enough wood for me to craft this shield; I need a total of " + @RAWLOGS_AMOUNT + " raw logs.\"";
+ goto L_close;
+
+L_Not_enough_money:
+ mes "[Jack Lumber]";
+ mes "\"I'm afraid that you don't have enough gold. I need " + @SHIELD_COST + " GP to finish your shield.\"";
+ goto L_close;
+
+L_TooMany:
+ mes "[Jack Lumber]";
+ mes "\"You don't have enough room to carry the shield. Come back when you do.\"";
+ goto L_close;
+
+L_Shield_state_3:
+ mes "[Jack Lumber]";
+ mes "\"I hope that my shield will serve you well!\"";
+ next;
+ if (@inspector != 1)
+ goto L_Made_Shield;
+ menu
+ "Me too.", L_Made_Shield,
+ "Have you seen anything that might be connected to the recent robberies in town?", L_NohMask_Answer;
+
+L_NohMask_Ask:
+ menu
+ "I'll keep that in mind.", L_close,
+ "I heard you aren't delivering any more living wood. Why not?", L_Next,
+ "Have you seen anything that might be connected to the recent robberies in town?", L_NohMask_Answer;
+
+L_NohMask_Answer:
+ mes "[Jack Lumber]";
+ mes "\"Sorry, no.\"";
+ goto L_close;
+
+L_Made_Shield:
+ mes "[Jack Lumber]";
+ mes "\"Speaking of that shield...\"";
+ mes "\"It has put me behind on all these new Nivalis orders, now that the ship is running there.\"";
+ next;
+ mes "\"Care to help out? I'll pay you for your time.\"";
+ goto L_Daily;
+
+L_Daily:
+ @dq_level = 30;
+ @dq_cost = 25;
+ @dq_count = 30;
+ @dq_name$ = "RawLog";
+ @dq_friendly_name$ = "raw logs";
+ @dq_money = 4000;
+ @dq_exp = 4000;
+
+ callfunc "DailyQuest";
+
+ next;
+
+ mes "[Jack Lumber]";
+ mes "\"Check back with me tomorrow, and I'll let you know if I need any help with that shipment.\"";
+
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+
+S_Update_Mask:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(@Q_Forestbow_MASK | @Q_Woodenshield_MASK)) | (@Q_Forestbow << @Q_Forestbow_SHIFT) | (@Q_Woodenshield << @Q_Woodenshield_SHIFT);
+ return;
+}
diff --git a/npc/009-1/mapflags.txt b/npc/009-1/mapflags.txt
new file mode 100644
index 00000000..6fd55565
--- /dev/null
+++ b/npc/009-1/mapflags.txt
@@ -0,0 +1,2 @@
+//009-1 mapflag town
+//009-1 mapflag resave 009-2,149,43
diff --git a/npc/009-1/milly.txt b/npc/009-1/milly.txt
new file mode 100644
index 00000000..38bf8b36
--- /dev/null
+++ b/npc/009-1/milly.txt
@@ -0,0 +1,452 @@
+
+009-1,81,41,0 script Milly NPC114,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ @got_boneknife = ((QUEST_Forestbow_state & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT) >= 4;
+ @got_setzer = ((QUEST_Forestbow_state & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT) >= 8;
+ @saved_rossy = (FLAGS & FLAG_ROSSI_COMPLETED);
+ @saved_cindy = (getq(KaizeiQuest_Cindy) > 4);
+
+ if (FLAGS & FLAG_GOT_BEANIEHAT) goto L_FinishedGood;
+ if (FLAGS & FLAG_DECLINED_BEANIEHAT) goto L_FinishedBad;
+
+ if (@saved_rossy && @saved_cindy && @got_setzer && (BOSS_POINTS >= 5000)) goto L_OfferCap;
+ if (@got_setzer) goto L_GotSetzer;
+ if (@saved_cindy) goto L_SavedCindy;
+ if (@saved_rossy) goto L_SavedRossy;
+ if (@got_boneknife) goto L_GotBoneKnife;
+ if (BaseLevel > 40) goto L_NoKnifeYet;
+
+ mes "[Milly]";
+ mes "\"Hello traveler, welcome to Hurnscald.\"";
+ next;
+ callsub S_InspectorMaybe;
+
+ mes "\"Have you met Kfahr yet? He is the greatest hero that ever walked the land of Hurnscald!\"";
+ menu
+ "Hi! No, I haven't seen him yet.", L_Where,
+ "Where can I find him?", L_Where,
+ "Mh, I don't care for heroes.", L_Care,
+ "Hello, yes I have met him.", L_MetKfahr;
+
+L_Where:
+ mes "[Milly]";
+ mes "\"I highly recommend you seek him out! He is a regular at the inn, located in the north-west part of town. If you are lucky he might tell you a story about his adventures.\"";
+ goto L_close;
+
+L_Care:
+ mes "[Milly]";
+ mes "\"What? Surely you do not appreciate what a hero he is! Mh, or perhaps honor is dead in you; for you to be so slow to comprehend the good that his exploits have wrought for us. Put on your thinking cap and be propelled into high adventure! Go to Kfahr, and listen to his stories.\"";
+ next;
+ mes "\"You can't have met him. No one who has met him would say such silly things.\"";
+ next;
+ goto L_Where;
+
+L_MetKfahr:
+ mes "[Milly]";
+ mes "\"Oh, I hope you stayed and listened to his stories about his adventures.\"";
+ goto L_close;
+
+L_NoKnifeYet:
+ mes "[Milly]";
+ mes "\"Hi again.\"";
+ next;
+ callsub S_InspectorMaybe;
+
+ mes "\"Have you talked to Kfahr lately?\"";
+ menu
+ "Yes.", L_TalkKfahr,
+ "No.", L_HintKnife;
+
+L_TalkKfahr:
+ mes "[Milly]";
+ mes "\"Is it true as the rumors say? ...\"";
+ next;
+ goto L_HintKnife;
+
+L_HintKnife:
+ mes "[Milly]";
+ mes "\"You really should go meet him.\"";
+ next;
+ mes "\"I've heard that he is helping adventurers such as yourself with some exotic gear.\"";
+ menu
+ "I am not sure, I'd better go talk to him again.", L_Unsure,
+ "Yes, it is true.", L_True;
+
+L_Unsure:
+ mes "[Milly]";
+ mes "\"You better hurry up before he changes his mind!\"";
+ goto L_close;
+
+L_True:
+ mes "[Milly]";
+ mes "\"So, why haven't you accepted his generous offer?\"";
+ menu
+ "I was just about to...", L_Unsure,
+ "I don't need any help.", L_NoHelp;
+
+L_NoHelp:
+ mes "[Milly]";
+ mes "\"You must be kidding me.\"";
+ next;
+ mes "\"I am just a kid but not as silly as you. My pigtails possess more wisdom than you. You fooled me, you are no adventurer!\"";
+ next;
+ mes "\"You better learn from the wise and accept help from those who offer it.\"";
+ goto L_Unsure;
+
+L_GotBoneKnife:
+ mes "[Milly]";
+ mes "\"Hi there.\"";
+ next;
+ callsub S_InspectorMaybe;
+
+ mes "\"I heard that you got an exotic knife from Kfahr.";
+ mes "Would you kindly show it to me?\"";
+ menu
+ "Sure.", L_ShowKnife,
+ "Haven't I already?", L_ShowKnifeAgain;
+
+L_ShowKnife:
+ if (countitem("BoneKnife") < 1)
+ goto L_ShowKnifeNo;
+ mes "[Milly]";
+ mes "\"Wow! That is a knife fitting a real adventurer!\"";
+ next;
+ mes "\"Kfahr ain't just a hero, he is also a stand up guy.\"";
+ next;
+ mes "\"You should be proud that he is honoring you with his knife like this.\"";
+ next;
+ mes "\"What a hero...\"";
+ goto L_close;
+
+L_ShowKnifeAgain:
+ mes "[Milly]";
+ mes "\"What possible objection could you have? It's so exiting to see such a fine knife.\"";
+ next;
+ mes "\"It is like cake, sure I might have had it before...\"";
+ next;
+ mes "\"... but does that stop me from wanting it once more?\"";
+ next;
+ mes "\"NO!\"";
+ next;
+ mes "\"Please let me see it!\"";
+ menu
+ "Okay.", L_ShowKnife,
+ "Enough is enough.", L_ShowKnifeNo;
+
+L_ShowKnifeNo:
+ mes "[Milly]";
+ mes "\"I hope that the reason that you don't show it to me is because you have it tucked away somewhere safe.\"";
+ next;
+ mes "\"Otherwise you are just a bore...\"";
+ next;
+ mes "\"Don't be boring!\"";
+ goto L_close;
+
+L_SavedRossy:
+ mes "[Milly]";
+ mes "\"Hi friend!\"";
+ next;
+ callsub S_InspectorMaybe;
+
+ mes "\"Word of your fame has spread throughout all Hurnscald of your great heroism by helping my friends Rossy and Julia!\"";
+ next;
+ mes "\"Not only did you help Rossy, you saved her sister Julia from that nefarious Fey Element. That was a real act of valor!\"";
+ next;
+ mes "\"You are shaping up to be something of a hero yourself.\"";
+ next;
+ mes "\"I am so happy that you came to Hurnscald, without you I'm not so sure that Julia would have been saved.\"";
+ menu
+ "You're right, I am a hero!", L_Loudmouth,
+ "I'm doing my best!", L_Modesty;
+
+L_Loudmouth:
+ mes "[Milly]";
+ mes "\"You surely are not...\"";
+ next;
+ mes "\"First and foremost you are a loudmouth. You need to learn actions speak better for themselves without your boasting.\"";
+ next;
+ mes "\"A little modesty would be a distinguishing trait for you to cultivate. You are talking as if you think that you are equal with Kfahr.\"";
+ next;
+ mes "\"I think you should show a little more respect when you are this close to legendary heroes.\"";
+ goto L_close;
+
+L_Modesty:
+ mes "[Milly]";
+ mes "\"Wow, you have been very helpful and unselfish risking your own safety for the sake of others! Thanks to that Julia is back and Olana is able to sleep at night.\"";
+ next;
+ mes "\"If you continue with these valiant deeds you might earn your place in the history books of Hurnscald!\"";
+ goto L_close;
+
+L_SavedCindy:
+ mes "[Milly]";
+ mes "\"Hi!\"";
+ next;
+ callsub S_InspectorMaybe;
+
+ mes "\"Are the rumors true?\"";
+ next;
+ mes "\"Word is going around that you saved a girl called Cindy who was captured by Yetis in Nivalis, and that you arranged a rescue party getting her back from a deep Yeti inhibited cave.\"";
+ menu
+ "Thanks to the party, yes.", L_Party,
+ "Yes, it is true!", L_Cindy;
+
+L_Party:
+ mes "[Milly]";
+ mes "\"Wow! Not only are you brave, you also have the wisdom to seek help when needed!\"";
+ next;
+ mes "\"Being a skilled fighter is good. But being a skilled fighter coupled with your wits and organizational skill, now that is something special!\"";
+ goto L_HeroGrowing;
+
+L_Cindy:
+ mes "[Milly]";
+ mes "\"Once again you have done good!\"";
+ goto L_HeroGrowing;
+
+L_HeroGrowing:
+ mes "[Milly]";
+ mes "\"You have saved two kids about my own age from horrible situations, it is just like the stories I heard growing up.\"";
+ next;
+ mes "\"Things certainly are shaping up for you. My schoolmates play a game with you as the hero. And poets admire you in verse and song...\"";
+ next;
+ mes "\"Since you have proven yourself with your great acts, I will let you in on an exciting rumor I have heard.\"";
+ next;
+ mes "\"I have heard that Nicholas has learned new techniques in forging and weapon smithing. He is now able to improve a small sword into what is called a Setzer.\"";
+ next;
+ mes "\"Go talk to him and hear if he can help you get hold of one of these weapons.\"";
+ goto L_close;
+
+L_GotSetzer:
+ mes "[Milly]";
+ mes "\"Hello!\"";
+ next;
+ callsub S_InspectorMaybe;
+
+ mes "\"I heard that you got hold of a Setzer!\"";
+ next;
+ mes "\"And the fact that Kfahr helped you means he really rates you as a fellow adventurer!\"";
+ next;
+ mes "\"Praise does not get much better than that around here. He knows a good adventurer when he see one, you must have impressed him!\"";
+ if (!@saved_cindy || !@saved_rossy)
+ goto L_close;
+ next;
+ mes "\"To be honest you are fast becoming my favored hero, even... dare I say it? Even more so than Kfahr.\"";
+ next;
+ mes "\"Your skill and good deeds are indisputable! However...\"";
+ next;
+ mes "\"Somehow I feel that you still need to establish your courage. The elders say that although they find you an admirable person, a hero of renown; that you can't be considered as great as Kfahr till you have proven yourself fearless.\"";
+ next;
+ mes "\"You could prove yourself as the greatest hero who has walked the land by accepting Paruas challenge at Candor. Stare death in the eyes, show no fear and conquer! Show everyone that you are worthy of the title: The Greatest Hero Ever!\"";
+ next;
+ mes "\"I myself already consider you my favorite hero, sure Kfahr has done great things, but...\"";
+ next;
+ mes "\"Nowadays he mostly sits around with that sad bunch of drunkards in the Inn, drinking beer and talking about past glory.\"";
+ next;
+ mes "\"For my generation you are the true hero, please prove the stony hearted elders wrong by showing them that you are fearless!\"";
+ next;
+ mes "\"Good luck and good bye! Health, mana, and wealth be yours! \"";
+ goto L_close;
+
+L_OfferCap:
+ mes "[Milly]";
+ mes "\"Hi there, hero of Hurnscald!\"";
+ next;
+ callsub S_InspectorMaybe;
+
+ mes "\"You really have proven yourself over and over. There is no way anyone could possibly say, you are not the equal of Kfahr!\"";
+ next;
+ mes "\"Now, even the stones of Hurnscald praise you as a hero as great as Kfahr!\"";
+ next;
+ mes "\"I have something I want to give you...\"";
+ next;
+ mes "\"I was given two of those helicopter beanie caps at my birthday. I told everyone that it was what I really wanted so I got two of them...\"";
+ next;
+ mes "\"And some other kids are picking on me for wearing it, they say it is for nerds... I would be happy to give you one of them.\"";
+ next;
+ mes "\"It would be great if you wore a cap just like mine, that would sure shut them up! Also, please accept this rare hat as a token of my gratitude for everything you have done.\"";
+ next;
+ mes "\"It would be an honor to have the same cap as my hero!\"";
+ menu
+ "Thank you!", L_Cap,
+ "No, thanks.", L_Idiot;
+
+L_Cap:
+ mes "[Milly]";
+ mes "\"Wow, thanks for accepting my gift, it is so pleasing to know that you have the exact same cap as me! Friends forever!\"";
+ getinventorylist;
+ if (@inventorylist_count == 100 || (checkweight("BeanieCopter", 1) == 0))
+ goto L_TooMany;
+ getitem "BeanieCopter", 1;
+ FLAGS = FLAGS | FLAG_GOT_BEANIEHAT;
+ next;
+ mes "She is giggling with excitement.";
+ next;
+ mes "[Milly]";
+ mes "\"Come see me anytime! Goodbye!\"";
+ goto L_close;
+
+L_Idiot:
+ mes "[Milly]";
+ mes "\"Are you really sure? It is such a neat cap.\"";
+ menu
+ "Yes, no nerd hat for me!", L_BadBye,
+ "Just kidding, I want one!", L_Cap;
+
+L_BadBye:
+ mes "Tears are forming in her eyes.";
+ mes "[Milly]";
+ mes "\"I guess they were right, you're not any great hero! I'll give it to Kfahr instead!\"";
+ next;
+ mes "\"Please keep on traveling so I don't have to see you around here. It makes me sad to see you, every time I do I'll remember how wrong I was about you.\"";
+ FLAGS = FLAGS | FLAG_DECLINED_BEANIEHAT;
+ goto L_close;
+
+L_TooMany:
+ mes "[Milly]";
+ mes "\"You don't have any space left to carry it, go put some stuff in the storage and come back!\"";
+ goto L_close;
+
+L_FinishedGood:
+ mes "[Milly]";
+ mes "\"Hi there friend, my hero!\"";
+ next;
+ callsub S_InspectorMaybe;
+
+ mes "\"Wear the copter beany cap in good health, mana and wealth! See you around!\"";
+ goto L_close;
+
+L_FinishedBad:
+ mes "[Milly]";
+ mes "\"Oh, it's you. I suppose you're here to make fun of my hat again.\"";
+ next;
+ callsub S_InspectorMaybe;
+ mes "\"Won't you continue your travels soon?\"";
+ menu
+ "That's what I'm going to do.", L_Next,
+ "I'm really sorry. Of course I want your hat!", L_Apologize;
+
+L_Next:
+ mes "Milly looks away sadly.";
+ goto L_close;
+
+L_Apologize:
+ getinventorylist;
+ if (@inventorylist_count == 100 || (checkweight("BeanieCopter", 1) == 0))
+ goto L_TooMany;
+ getitem "BeanieCopter", 1;
+ FLAGS = FLAGS | FLAG_GOT_BEANIEHAT;
+ FLAGS = FLAGS & ~FLAG_DECLINED_BEANIEHAT;
+
+ mes "Milly looks surprised.";
+ next;
+ mes "[Milly]";
+ mes "\"Oh, I... uh, thank you! I knew it! I knew such a heroic person as you can't be that mean.\"";
+ goto L_close;
+
+L_close:
+ @got_boneknife = 0;
+ @got_setzer = 0;
+ @saved_rossy = 0;
+ @saved_cindy = 0;
+ @inspector = 0;
+ close;
+
+S_InspectorMaybe:
+ if (@inspector != 1)
+ goto L_Return;
+ menu
+ "Have you seen anything strange lately?", L_NohMask_Strange,
+ "Do you know anything about the recent robberies?", L_NohMask_Robbery,
+ "Hello.", L_Return;
+
+L_NohMask_Strange:
+ mes "[Milly]";
+ mes "\"I haven't seen anything strange.\"";
+ next;
+ goto L_Return;
+
+L_NohMask_Robbery:
+ mes "[Milly]";
+ mes "\"No, sorry.\"";
+ next;
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+009-1,82,41,0 script MillyDebugHelper NPC114,{
+ mes "You can set certain quests as finished or not finished. What would you like to do?";
+ menu
+ "Bone Knife Quest done.", L_DBoneKnife,
+ "Rossy Quest done.", L_DRossy,
+ "Cindy Quest done.", L_DCindy,
+ "Setzer Quest done.", L_DSetzer,
+ "Gain 5000 Boss Points.", L_DBossPoints,
+ "Bone Knife and Setzer Quest not done.", L_NBoneKnife,
+ "Rossy Quest not done.", L_NRossy,
+ "Cindy Quest not done.", L_NCindy,
+ "Setzer Quest not done.", L_NSetzer,
+ "Remove all Boss Points.", L_NBossPoints,
+ "Nothing.", L_close;
+
+L_DBoneKnife:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(NIBBLE_2_MASK)) | (4 << NIBBLE_2_SHIFT);
+ mes "Bone Knife quest set to completed.";
+ close;
+
+L_DSetzer:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(NIBBLE_2_MASK)) | (4 << NIBBLE_2_SHIFT);
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(NIBBLE_3_MASK)) | (8 << NIBBLE_3_SHIFT);
+ mes "Setzer quest set to completed. This includes the Bone Knife quest.";
+ close;
+
+L_DRossy:
+ FLAGS = FLAGS | FLAG_ROSSI_COMPLETED;
+ mes "Rossy quest set to completed.";
+ close;
+
+L_DCindy:
+ setq(KaizeiQuest_Cindy, 5);
+ mes "Cindy quest set to completed.";
+ close;
+
+L_DBossPoints:
+ BOSS_POINTS = 5000;
+ mes "Boss Points set to 5000.";
+ close;
+
+L_NBoneKnife:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(NIBBLE_2_MASK)) | (0 << NIBBLE_2_SHIFT);
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(NIBBLE_3_MASK)) | (0 << NIBBLE_3_SHIFT);
+ mes "Bone Knife and Setzer quest set to not completed.";
+ close;
+
+L_NSetzer:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(NIBBLE_3_MASK)) | (0 << NIBBLE_3_SHIFT);
+ mes "Bone Knife and Setzer quest set to not completed.";
+ close;
+
+L_NRossy:
+ FLAGS = FLAGS & ~FLAG_ROSSI_COMPLETED;
+ mes "Rossy quest set to not completed.";
+ close;
+
+L_NCindy:
+ setq(KaizeiQuest_Cindy, 0);
+ mes "Cindy quest set to not completed.";
+ close;
+
+L_NBossPoints:
+ BOSS_POINTS = 0;
+ mes "Boss Points set to 0.";
+ close;
+
+L_close:
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "MillyDebugHelper";
+ end;
+}
diff --git a/npc/009-1/old_man.txt b/npc/009-1/old_man.txt
new file mode 100644
index 00000000..96b19a39
--- /dev/null
+++ b/npc/009-1/old_man.txt
@@ -0,0 +1,38 @@
+
+009-1,85,51,0 script Old Man NPC159,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ mes "[Old Man]";
+ mes "\"Don't let those monsters get to you.\"";
+ next;
+ if (@inspector == 1) goto L_Ask;
+ if (@inspector == 6) goto L_Accuse;
+ goto L_close;
+
+L_Ask:
+ menu
+ "Have you seen anything strange lately?", L_Ask_Nothing,
+ "Do you know anything about the recent robberies?", L_Ask_Nothing,
+ "I won't, thank you.", L_close;
+
+L_Ask_Nothing:
+ mes "[Old Man]";
+ mes "\"I'm sorry, but I didn't see anything. You should ask my old woman.\"";
+ goto L_close;
+
+L_Accuse:
+ menu
+ "The leader of the troupe said you hung around them a lot while they were in town.", L_Accuse_Respond,
+ "I won't, thank you.", L_close;
+
+L_Accuse_Respond:
+ mes "[Old Man]";
+ mes "\"Yes, I hung around the theater a lot. I was an actor when I was younger. But I wasn't there that night. Me and the wife were at home all night.\"";
+ @inspector = 7;
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_3_MASK)) | (@inspector << NIBBLE_3_SHIFT);
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+}
diff --git a/npc/009-1/old_woman.txt b/npc/009-1/old_woman.txt
new file mode 100644
index 00000000..441b425a
--- /dev/null
+++ b/npc/009-1/old_woman.txt
@@ -0,0 +1,83 @@
+
+009-1,29,43,0 script Old Woman NPC154,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (BaseLevel < 40) goto L_Lower;
+
+ mes "[Old Woman]";
+ mes "\"Hello deary.\"";
+ if ((@inspector >= 1 && @inspector <= 7) || @inspector == 9)
+ goto L_NohMask;
+ close;
+
+L_Lower:
+ mes "[Old Woman]";
+ mes "\"Watch out for these flowers. They don't like to be messed with.\"";
+ if ((@inspector >= 1 && @inspector <= 7) || @inspector == 9)
+ goto L_NohMask;
+ close;
+
+L_NohMask:
+ next;
+ if (@inspector == 7)
+ goto L_NohMask_Alibi;
+ callfunc "ProcessEquip";
+ if (@torsoC == cDarkBlue && @legsC == cDarkBlue)
+ goto L_NohMask_Fake;
+ if (@inspector >= 3 && @inspector <= 6)
+ goto L_close;
+ menu
+ "Have you seen anything strange lately?", L_NohMask_FirstAsk,
+ "Do you know anything about the recent robberies?", L_NohMask_FirstAsk,
+ "Hello", L_close;
+
+L_NohMask_FirstAsk:
+ mes "[Old Woman]";
+ mes "\"Yes, but I'm only talking to the inspector himself!\"";
+ if (@inspector != 1)
+ goto L_close;
+ @inspector = 2;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_NohMask_Alibi:
+ menu
+ "Was your husband with you at home all night the last night that the troupe was in town?", L_Next;
+
+L_Next:
+ mes "[Old Woman]";
+ mes "\"Yes, we were both at home all night.\"";
+ @inspector = 8;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_NohMask_Fake:
+ if (@inspector == 9) goto L_NohMask_Fake_Satchel;
+ if (@inspector >= 3 && @inspector <= 6) goto L_NohMask_Filler;
+
+ mes "[Old Woman]";
+ mes "\"I saw someone sneaking around town wearing a theater mask. It looked like one of the masks used by the troupe that was in town recently.\"";
+ @inspector = 3;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_NohMask_Filler:
+ mes "[Old Woman]";
+ mes "\"I hope you catch that naughty person!\"";
+ goto L_close;
+
+L_NohMask_Fake_Satchel:
+ mes "[Old Woman]";
+ mes "\"I've remembered something else. The night the troupe left, I saw someone with a theater mask take a large satchel out of town. He was heading north.\"";
+ @inspector = 10;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+
+S_Update_Mask:
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_3_MASK)) | (@inspector << NIBBLE_3_SHIFT);
+ return;
+}
diff --git a/npc/009-1/sabine.txt b/npc/009-1/sabine.txt
new file mode 100644
index 00000000..335d75e6
--- /dev/null
+++ b/npc/009-1/sabine.txt
@@ -0,0 +1,29 @@
+
+009-1,88,27,0 script Sabine NPC106,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ mes "[Sabine]";
+ mes "\"Isn't this place pretty? I love hanging out here!\"";
+ next;
+ if (@inspector != 1)
+ goto L_close;
+
+ menu
+ "Have you seen anything strange lately?", L_NohMask_Strange,
+ "Do you know anything about the recent robberies?", L_NohMask_Robbery,
+ "Yes, it is.", L_close;
+
+L_NohMask_Strange:
+ mes "[Sabine]";
+ mes "\"I haven't seen anything strange.\"";
+ goto L_close;
+
+L_NohMask_Robbery:
+ mes "[Sabine]";
+ mes "\"No, sorry.\"";
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+}
diff --git a/npc/009-1/soul-menhir.txt b/npc/009-1/soul-menhir.txt
new file mode 100644
index 00000000..d197a5f0
--- /dev/null
+++ b/npc/009-1/soul-menhir.txt
@@ -0,0 +1,15 @@
+
+009-1,53,40,0 script Soul Menhir#hurnscald NPC344,{
+ @map$ = "009-1";
+ setarray @Xs, 52, 53, 54, 52, 54, 52, 54;
+ setarray @Ys, 39, 39, 39, 40, 40, 41, 41;
+ @x = 0;
+ @y = 0;
+ callfunc "SoulMenhir";
+ @map$ = "";
+ cleararray @Xs[0], 0, 7;
+ cleararray @Ys[0], 0, 7;
+ @x = 0;
+ @y = 0;
+ close;
+}
diff --git a/npc/009-1/water_pump.txt b/npc/009-1/water_pump.txt
new file mode 100644
index 00000000..eca2e8be
--- /dev/null
+++ b/npc/009-1/water_pump.txt
@@ -0,0 +1,5 @@
+
+009-1,76,33,0 script Water Pump NPC400,{
+ callfunc "WaterBottle";
+ end;
+}
diff --git a/npc/009-2/_import.txt b/npc/009-2/_import.txt
new file mode 100644
index 00000000..668474fa
--- /dev/null
+++ b/npc/009-2/_import.txt
@@ -0,0 +1,25 @@
+// Map 009-2: Hurnscald Indoor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/009-2/_warps.txt",
+"npc/009-2/airlia.txt",
+"npc/009-2/alan.txt",
+"npc/009-2/bernard.txt",
+"npc/009-2/doctor.txt",
+"npc/009-2/drunks.txt",
+"npc/009-2/entertainer.txt",
+"npc/009-2/inspector.txt",
+"npc/009-2/kfahr.txt",
+"npc/009-2/lena.txt",
+"npc/009-2/mapflags.txt",
+"npc/009-2/misc.txt",
+"npc/009-2/nicholas.txt",
+"npc/009-2/nurse.txt",
+"npc/009-2/olana.txt",
+"npc/009-2/peter.txt",
+"npc/009-2/richard.txt",
+"npc/009-2/selim.txt",
+"npc/009-2/shops.txt",
+"npc/009-2/trader.txt",
+"npc/009-2/waitress.txt",
+"npc/009-2/wyara.txt",
+"npc/009-2/yalina.txt",
diff --git a/npc/009-2/_warps.txt b/npc/009-2/_warps.txt
new file mode 100644
index 00000000..ec9660d9
--- /dev/null
+++ b/npc/009-2/_warps.txt
@@ -0,0 +1,24 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-2: Hurnscald Indoor warps
+009-2,75,23,0 warp #009-2_75_23 1,0,009-2,74,47
+009-2,95,30,0 warp #009-2_95_30 0,0,009-1,59,34
+009-2,130,26,0 warp #009-2_130_26 0,0,009-1,71,31
+009-2,144,26,0 warp #009-2_144_26 1,0,009-2,144,43
+009-2,144,42,0 warp #009-2_144_42 1,0,009-2,144,25
+009-2,155,48,0 warp #009-2_155_48 1,0,009-2,155,63
+009-2,114,46,0 warp #009-2_114_46 1,0,009-2,114,70
+009-2,50,55,0 warp #009-2_50_55 0,0,009-1,35,31
+009-2,74,53,0 warp #009-2_74_53 0,0,009-2,143,78
+009-2,74,46,0 warp #009-2_74_46 1,0,009-2,75,22
+009-2,114,78,0 warp #009-2_114_78 0,0,009-1,72,45
+009-2,114,69,0 warp #009-2_114_69 1,0,009-2,114,45
+009-2,149,67,0 warp #009-2_149_67 0,0,009-1,80,32
+009-2,143,77,0 warp #009-2_143_77 0,0,009-2,74,52
+009-2,155,62,0 warp #009-2_155_62 1,0,009-2,155,46
+009-2,182,67,0 warp #009-2_182_67 1,0,009-1,91,47
+009-2,147,90,0 warp #009-2_147_90 0,0,009-3,173,21
+009-2,27,107,0 warp #009-2_27_107 0,0,009-1,58,47
+009-2,46,50,0 warp #009-2_46_50 0,0,009-2,76,78
+009-2,77,78,0 warp #009-2_77_78 0,0,009-2,47,50
+009-2,31,91,0 warp #009-2_31_91 0,0,009-1,59,41
+009-2,38,105,0 warp #009-2_38_105 0,0,009-7,21,20
diff --git a/npc/009-2/airlia.txt b/npc/009-2/airlia.txt
new file mode 100644
index 00000000..7996181f
--- /dev/null
+++ b/npc/009-2/airlia.txt
@@ -0,0 +1,242 @@
+
+
+
+009-2,123,71,0 script Airlia NPC108,{
+ // Subquest 1a: Caretaker's daughter (initial, once)
+ @LETTER_REWARD_GOLD_INITIAL = 1000;
+ @LETTER_REWARD_EXP_INITIAL = 2000;
+
+ @Q_STATUS_RECIEVED_FIRST_LETTER = 2;
+ @Q_STATUS_DELIVERED_FIRST_LETTER = 3;
+
+ // Subquest 1b: Continued delivery of letters (unlimited)
+ @LETTER_REWARD_GOLD = 42;
+ @LETTER_REWARD_EXP = 500;
+
+ @Q_STATUS_HAS_NO_NEW_LETTER = 4;
+ @Q_STATUS_HAS_NEW_LETTER = 5;
+
+ // Subquest 2a: Fetch those undead drops (initial, once)
+ // TODO: Set sane values below
+ @FETCH_AMOUNT_INITIAL = 50;
+ @FETCH_LABEL_INITIAL$ = "Bone";
+ @FETCH_REWARD_GOLD_INITIAL = 5000;
+ @FETCH_REWARD_EXP_INITIAL = 50000;
+
+ @Q_STATUS_HELP_AIRLIA = 1;
+ @Q_STATUS_INITIAL_FETCH_REWARDED = 2;
+
+ // Subquest 2b: Fetch those undead drops (unlimited)
+ // TODO: Set sane values below
+ @FETCH_AMOUNT = 10;
+ @FETCH_LABEL$ = "DiseasedHeart";
+ @FETCH_REWARD_GOLD = 6000;
+ @FETCH_REWARD_EXP = 40000;
+
+
+ if (QUEST_Airlia == @Q_STATUS_INITIAL_FETCH_REWARDED) goto L_Rewarded;
+ if (QUEST_Airlia == @Q_STATUS_HELP_AIRLIA) goto L_Fetch;
+ if (QUEST_Graveyard_Caretaker > @Q_STATUS_RECIEVED_FIRST_LETTER) goto L_Intro;
+ goto L_Caretaker;
+
+L_Caretaker:
+ mes "[Airlia]";
+ mes "\"Greetings. Do you need a housing permit, or to license your mount?\"";
+ next;
+ if (QUEST_Graveyard_Caretaker < @Q_STATUS_RECIEVED_FIRST_LETTER)
+ menu
+ "Sorry, no.", L_Next,
+ "My what?", L_mount;
+ if (QUEST_Graveyard_Caretaker == @Q_STATUS_RECIEVED_FIRST_LETTER)
+ menu
+ "Sorry, no.", L_Next,
+ "I have a letter from your father.", L_first_reward,
+ "My what?", L_mount;
+ goto L_Next;
+
+L_Next:
+ mes "[Airlia]";
+ mes "\"Nobody ever does...\"";
+ close;
+
+L_mount:
+ // The mention of mounts will certainly gather some interest from players,
+ // this section may be extended.
+ close;
+
+L_first_reward:
+ mes "[Airlia]";
+ mes "\"Oh! Thank you very, very much! Please take this for your trouble.\"";
+ if (@LETTER_REWARD_GOLD_INITIAL > 0)
+ mes "[" + @LETTER_REWARD_GOLD_INITIAL + " GP]";
+ if (@LETTER_REWARD_EXP_INITIAL > 0)
+ mes "[" + @LETTER_REWARD_EXP_INITIAL + " experience points]";
+ Zeny = Zeny + @LETTER_REWARD_GOLD_INITIAL;
+ getexp @LETTER_REWARD_EXP_INITIAL, 0;
+ QUEST_Graveyard_Caretaker = @Q_STATUS_DELIVERED_FIRST_LETTER;
+ close;
+
+L_later_rewards:
+ mes "[Airlia]";
+ mes "\"Oh! Thank you very, very much! Please take this for your trouble.\"";
+ if (@LETTER_REWARD_GOLD > 0)
+ mes "[" + @LETTER_REWARD_GOLD + " GP]";
+ if (@LETTER_REWARD_EXP > 0)
+ mes "[" + @LETTER_REWARD_EXP + " experience points]";
+ Zeny = Zeny + @LETTER_REWARD_GOLD;
+ getexp @LETTER_REWARD_EXP, 0;
+ QUEST_Graveyard_Caretaker = @Q_STATUS_HAS_NO_NEW_LETTER;
+ close;
+
+L_Intro:
+ mes "[Airlia]";
+ mes "\"My poor father, doomed to that awful cemetery.\"";
+ next;
+
+ // CASE REMOVED:
+ // This step is pointless and just forces the player to make a selection that doesn't effect anything.
+ // ALSO it misses the case where QUEST_Graveyard_Caretaker == 3, in this case it proceeds to the message without wasting player clicks
+ // Removing this check will make execution the same for QUEST_Graveyard_Caretaker == 3 and QUEST_Graveyard_Caretaker == 4
+ // If for some reason this is desireable, uncomment it and make sure to catch the extra case mentioned
+ //
+ //if (QUEST_Graveyard_Caretaker == @Q_STATUS_HAS_NO_NEW_LETTER)
+ // menu
+ // "...", -;
+
+ if (QUEST_Graveyard_Caretaker == @Q_STATUS_HAS_NEW_LETTER)
+ menu
+ "...", L_Next3,
+ "Oh, I have a letter from him.", L_later_rewards;
+ goto L_Next3;
+
+L_Next3:
+ mes "[Airlia]";
+ mes "\"You know, there are many who believe that each time the undead rise after being killed, they lose mana.";
+ mes "Eventually, there will not be enough mana for them to rise again and they can be at rest. Do you believe this is true?\"";
+ next;
+ menu
+ "I believe so, yes.", L_Intro_mana_loss,
+ "Maybe...", L_Intro_mana_loss,
+ "No, that is not proven.", L_Next1;
+
+L_Next1:
+ mes "[Airlia]";
+ mes "\"Oh...\"";
+ close;
+
+L_Intro_mana_loss:
+ mes "[Airlia]";
+ mes "\"When I am not working, I recruit help for the esteemed Fighters of the Undead, or FoU.";
+ mes "They are an official group effort of the Warriors' Guild and Magicians, you know, a very prestigious group.\"";
+ next;
+ menu
+ "...", L_Intro_fou,
+ "I have heard of them.", L_Intro_fou,
+ "Keep up the good work. I have to go now, bye.", L_close;
+
+L_Intro_fou:
+ mes "[Airlia]";
+ mes "\"If we drain those evil creatures of their mana, I can get my father back. He is getting very old. Will you help us?\"";
+ next;
+ menu
+ "Of course I will.", L_Intro_fight,
+ "Sure, I guess.", L_Intro_fight,
+ "Thanks, but no thanks. I have other business to attend to.", L_close;
+
+L_Intro_fight:
+ mes "[Airlia]";
+ mes "\"Great, just kill any of the undead creatures you can and bring me proof of your work, and I will put in a word for you with the guild.\"";
+ next;
+ menu
+ "I'm on it.", L_Next2,
+ "What sort of proof?", L_Intro_proof;
+
+L_Next2:
+ QUEST_Airlia = @Q_STATUS_HELP_AIRLIA;
+ goto L_close;
+
+L_Intro_proof:
+ mes "[Airlia]";
+ mes "\"Let's say " + @FETCH_AMOUNT_INITIAL + " " + getitemlink(@FETCH_LABEL_INITIAL$) + "s. You don't know how much this means to me, thank you.\"";
+ QUEST_Airlia = @Q_STATUS_HELP_AIRLIA;
+ close;
+
+L_Fetch:
+ mes "[Airlia]";
+ mes "\"Thank you for helping my father.\"";
+ next;
+ mes "\"Have you collected the " + @FETCH_AMOUNT_INITIAL + " " + getitemlink(@FETCH_LABEL_INITIAL$) + "?\"";
+
+ // Make sure to check if the player has a letter to deliver.
+ // If the check is not made then there is a bug, where the player
+ // has a letter but has not completed the initial fetch
+ // and is prevented from turing in the letter until the fetch is completed.
+
+ if (QUEST_Graveyard_Caretaker < @Q_STATUS_HAS_NEW_LETTER)
+ menu
+ "Yes.", L_Fetch_initial_reward,
+ "No.", L_close;
+ if (QUEST_Graveyard_Caretaker == @Q_STATUS_HAS_NEW_LETTER)
+ menu
+ "I have another letter from your father.", L_later_rewards,
+ "Yes.", L_Fetch_initial_reward,
+ "No.", L_close;
+ goto L_close;
+
+L_Fetch_initial_reward:
+ if (countitem(@FETCH_LABEL_INITIAL$) < @FETCH_AMOUNT_INITIAL) goto L_Fetch_not_enough;
+ mes "[Airlia]";
+ mes "\"Excellent work. You are definitely a great warrior. I will tell the guild of your deeds.\"";
+ if (@FETCH_REWARD_GOLD_INITIAL > 0)
+ mes "[" + @FETCH_REWARD_GOLD_INITIAL + " GP]";
+ if (@FETCH_REWARD_EXP_INITIAL > 0)
+ mes "[" + @FETCH_REWARD_EXP_INITIAL + " experience points]";
+ delitem @FETCH_LABEL_INITIAL$, @FETCH_AMOUNT_INITIAL;
+ Zeny = Zeny + @FETCH_REWARD_GOLD_INITIAL;
+ getexp @FETCH_REWARD_EXP_INITIAL, 0;
+ QUEST_Airlia = @Q_STATUS_INITIAL_FETCH_REWARDED;
+ next;
+ mes "[Airlia]";
+ // TODO: Write the dialogue when I'm not tired...
+ mes "\"Oh, before you leave. We all must do what we can to stop this tragedy.";
+ mes "If you are willing to keep draining the undead of mana, I will give you what gold I can afford as a token of my gratitude.\"";
+ close;
+
+L_Fetch_later_rewards:
+ if (countitem(@FETCH_LABEL$) < @FETCH_AMOUNT)
+ goto L_Fetch_not_enough;
+ mes "[Airlia]";
+ mes "\"Excellent work. You are definitely a great warrior.\"";
+ if (@FETCH_REWARD_GOLD > 0)
+ mes "[" + @FETCH_REWARD_GOLD + " GP]";
+ if (@FETCH_REWARD_EXP > 0)
+ mes "[" + @FETCH_REWARD_EXP + " experience points]";
+ delitem @FETCH_LABEL$, @FETCH_AMOUNT;
+ Zeny = Zeny + @FETCH_REWARD_GOLD;
+ getexp @FETCH_REWARD_EXP, 0;
+ close;
+
+L_Fetch_not_enough:
+ mes "[Airlia]";
+ mes "\"I'm sorry, I didn't realize you couldn't count. Perhaps when I have some free time, I can help you learn if you'd like.\"";
+ close;
+
+L_Rewarded:
+ mes "[Airlia]";
+ mes "\"Thank you for your help.\"";
+ next;
+ mes "\"Have you collected the " + @FETCH_AMOUNT + " " + getitemlink(@FETCH_LABEL$) + "s?\"";
+ if (QUEST_Graveyard_Caretaker < @Q_STATUS_HAS_NEW_LETTER)
+ menu
+ "Yes.", L_Fetch_later_rewards,
+ "No.", L_close;
+ if (QUEST_Graveyard_Caretaker == @Q_STATUS_HAS_NEW_LETTER)
+ menu
+ "I have another letter from your father.", L_later_rewards,
+ "Yes.", L_Fetch_later_rewards,
+ "No.", L_close;
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/009-2/alan.txt b/npc/009-2/alan.txt
new file mode 100644
index 00000000..5d3279da
--- /dev/null
+++ b/npc/009-2/alan.txt
@@ -0,0 +1,216 @@
+
+009-2,99,23,0 script Alan NPC125,{
+ @Q_MASK = NIBBLE_0_MASK;
+ @Q_SHIFT = NIBBLE_0_SHIFT;
+
+ @Q_status = ((QUEST_Forestbow_state) & @Q_MASK) >> @Q_SHIFT;
+
+ @BROKENLOG_EXP = 15;
+
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (@Q_status == 1) goto L_State_1;
+ if (@Q_status == 2) goto L_State_2;
+ if (@Q_status == 3) goto L_State_3;
+ if (@Q_status == 4) goto L_State_4;
+ if (@Q_status == 5) goto L_State_5;
+
+ mes "[Alan]";
+ mes "\"When you want to buy something then please speak to my apprentice. I am only doing special requests.\"";
+ next;
+ if (@inspector == 1)
+ menu
+ "OK, thanks.", L_close,
+ "Can you make me a really good bow?", L_State_0_1,
+ "Have you seen anything strange recently that might be connected to the robberies?", L_NohMask_Answer;
+ menu
+ "OK, thanks.", L_close,
+ "Can you make me a really good bow?", L_State_0_1;
+
+L_State_0_1:
+ mes "[Alan]";
+ mes "\"You mean like one of my legendary forest bows?\"";
+ next;
+ menu
+ "Yes, that would be nice.", L_Next;
+
+L_Next:
+ mes "[Alan]";
+ mes "\"Sorry, I am not making these anymore.\"";
+ next;
+ menu
+ "Oh, too bad.", L_close,
+ "What? Why not?", L_State_0_2;
+
+L_State_0_2:
+ mes "[Alan]";
+ mes "\"The problem is that I am short of material. My forestbows are not made of regular wood, you know.";
+ mes "They are made of special living wood. And only the best logs of living wood are good enough for them.";
+ mes "I used to get these logs from Jack, the lumberjack. But the last time I asked him for a new delivery he said that he would never again get any for me.\"";
+ @Q_status = 1;
+ callsub S_Update_Var;
+ next;
+ menu
+ "Too bad.", L_close,
+ "Did you ask him why?", L_State_0_3;
+
+L_State_0_3:
+ mes "[Alan]";
+ mes "\"Sure I did. But he just told me to leave him alone. Maybe you could ask him what's wrong?\"";
+ next;
+ menu
+ "OK, I'll ask him.", L_close,
+ "I am sure he got his reasons.", L_State_1;
+
+L_State_1:
+ mes "[Alan]";
+ mes "\"Did you already ask Jack why he won't deliver me any more living wood?\"";
+ next;
+ if (@inspector == 1)
+ menu
+ "No, I haven't had the time yet.", L_close,
+ "No, I didn't find him yet.", L_State_1_1,
+ "Have you seen anything strange recently that might be connected to the robberies?", L_NohMask_Answer;
+ menu
+ "No, I haven't had the time yet.", L_close,
+ "No, I didn't find him yet.", L_State_1_1;
+
+L_State_1_1:
+ mes "[Alan]";
+ mes "\"When you leave my shop just go southwest over the village plaza. You can't miss it.\"";
+ goto L_close;
+
+L_State_2:
+ mes "[Alan]";
+ mes "\"Did you already ask Jack why he won't deliver me any more living wood?\"";
+ next;
+ if (@inspector == 1)
+ menu
+ "Yes, I did. He said that the trees turned into dangerous monsters.", L_Next1,
+ "Have you seen anything strange recently that might be connected to the robberies?", L_NohMask_Answer;
+ if (@inspector != 1)
+ menu
+ "Yes, I did. He said that the trees turned into dangerous monsters.", L_Next1;
+ goto L_Next1;
+
+L_Next1:
+ mes "[Alan]";
+ mes "\"Oh, that's really bad news. Maybe you can do his job?";
+ mes "When you kill some of these tree monsters and bring me their wood I can take a look at them.";
+ mes "Maybe you will find a piece of wood that is strong enough to become one of my forest bows.\"";
+ @Q_status = 3;
+ callsub S_Update_Var;
+ goto L_close;
+
+L_State_3:
+ mes "[Alan]";
+ mes "\"How is the hunt going? Did you bring me any wood?\"";
+ if (countitem("RawLog") < 1)
+ goto L_close;
+ next;
+ if (@inspector == 1)
+ menu
+ "Here, take a look!", L_State_3_try,
+ "Yes, but I need it for something else.", L_close,
+ "Have you seen anything strange recently that might be connected to the robberies?", L_NohMask_Answer;
+ menu
+ "Here, take a look!", L_State_3_try,
+ "Yes, but I need it for something else.", L_close;
+
+L_State_3_try:
+ if (countitem("RawLog") < 1)
+ goto L_No_Log;
+ delitem "RawLog", 1;
+ mes "[Alan]";
+ mes "\"Hmmm... looks ok, but is it strong enough?\"";
+ mes "Alan bends the log over his knee.";
+ next;
+ @Temp1 = rand(20);
+ if (@Temp1 == 0) goto L_State_3_success;
+ mes "The log breaks with a loud crack.";
+ getexp @BROKENLOG_EXP, 0;
+ next;
+ mes "[Alan]";
+ mes "\"Sorry, this log was too weak for one of my forest bows. Now it is junk. Give me another.\"";
+ if (countitem("RawLog") < 1)
+ goto L_close;
+ next;
+ menu
+ "Sure, here you go.", L_State_3_try,
+ "Hey! Stop breaking my stuff!", L_close;
+
+L_State_3_success:
+ mes "Alan tries as hard as he can but the log won't bend.";
+ next;
+ mes "[Alan]";
+ mes "\"Aaah! Yes! That is a really fine piece of wood you brought me. It will make an excellent bow!\"";
+ next;
+ @Q_status = 4;
+ callsub S_Update_Var;
+ goto L_State_4;
+
+L_State_4:
+ mes "[Alan]";
+ mes "\"I can make you a really nice forest bow out of this. I just need 10,000 GP for material and work time.\"";
+ next;
+ if (@inspector == 1)
+ menu
+ "10,000??? What a ripoff!", L_close,
+ "Sure, here you go!", L_State_4_pay,
+ "Have you seen anything strange recently that might be connected to the robberies?", L_NohMask_Answer;
+ menu
+ "10,000??? What a ripoff!", L_close,
+ "Sure, here you go!", L_State_4_pay;
+
+L_State_4_pay:
+ if (Zeny < 10000)
+ goto L_State_4_nocash;
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_State_4_TooMany;
+ Zeny = Zeny - 10000;
+ getitem "ForestBow", 1;
+ @Q_status = 5;
+ callsub S_Update_Var;
+ mes "[Alan]";
+ mes "\"Here you go - have fun with it.\"";
+ goto L_close;
+
+L_State_4_nocash:
+ mes "[Alan]";
+ mes "\"Seems like you are out of cash.\"";
+ goto L_close;
+
+L_State_4_TooMany:
+ mes "[Alan]";
+ mes "\"Seems like you don't have room for this bow. Come back later.\"";
+ goto L_close;
+
+L_State_5:
+ mes "[Alan]";
+ mes "\"I hope you are satisfied with your forest bow. It is one of my best works.\"";
+ if (@inspector != 1)
+ goto L_close;
+ next;
+ menu
+ "I am!", L_close,
+ "Have you seen anything strange recently that might be connected to the robberies?", L_NohMask_Answer;
+
+L_NohMask_Answer:
+ mes "[Alan]";
+ mes "\"No.\"";
+ goto L_close;
+
+L_No_Log:
+ mes "[Alan]";
+ mes "\"Where should I look at? You don't have a raw log.\"";
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+
+S_Update_Var:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(@Q_MASK) | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/009-2/bernard.txt b/npc/009-2/bernard.txt
new file mode 100644
index 00000000..f9eac878
--- /dev/null
+++ b/npc/009-2/bernard.txt
@@ -0,0 +1,124 @@
+009-2,67,79,0 script Bernard NPC117,{
+ if (QL_SOUP >= 6) goto L_Done3;
+ if (QL_SOUP >= 4) goto L_Done2;
+ if (QL_SOUP == 3) goto L_Progress2;
+ if (QL_SOUP == 2) goto L_Done1;
+ if (QL_SOUP == 1) goto L_Progress;
+
+ @temp = rand(2);
+ if(@temp == 1) goto L_Opening1;
+ goto L_Opening0;
+
+L_Opening0:
+ mes "[Bernard]";
+ mes "\"The fields are crawling with maggots. Where is Mikhail? What is taking them so long?";
+ mes "Could I ask a favor of you?\"";
+ next;
+ goto L_Ask;
+
+L_Opening1:
+ mes "[Bernard]";
+ mes "\"The taste of maggots in soup is... unforgettable, they taste simply divine!";
+ mes "I sent someone to kill me some maggots and they have yet to return. Would you help me kill some?\"";
+ next;
+ goto L_Ask;
+
+L_Ask:
+ menu
+ "Yes.", L_Yes,
+ "No.", L_close;
+
+L_Yes:
+ @temp = rand(2);
+ if(@temp == 1) goto L_Req1;
+ goto L_Req0;
+
+L_Req0:
+ mes "[Bernard]";
+ mes "\"Great! I need a Roasted Maggot for my soup.\"";
+ next;
+ goto L_Set;
+
+L_Req1:
+ mes "[Bernard]";
+ mes "\"Bring me a Roasted Maggot. I'll give you something if you do.\"";
+ next;
+ goto L_Set;
+
+L_Set:
+ QL_SOUP = 1;
+ mes "[Bernard]";
+ mes "\"Please bring it to me!\"";
+ goto L_close;
+
+L_Progress:
+ if (countitem("RoastedMaggot") < 1) goto L_NotEnough;
+ mes "[Bernard]";
+ mes "\"Oooh, perfect! It's perfect!";
+ mes "You brought me my Roasted Maggot! Here, have some cake for your troubles.\"";
+ getinventorylist;
+ if (@inventorylist_count - (countitem("RoastedMaggot") == 1) > 99 - (countitem("CherryCake") == 0) ) goto L_TooMany;
+ delitem "RoastedMaggot", 1;
+ getexp 100, 0;
+ getitem "CherryCake", 5;
+ QL_SOUP = 2;
+ next;
+ mes "\"Now let's see...\"";
+ goto L_close;
+
+L_Progress2:
+ if (countitem("MaggotSlime") < 3) goto L_NotEnough1;
+ mes "[Bernard]";
+ mes "\"Nice! They're perfect, just perfect!";
+ mes "You brought me the 3 Maggot Slimes! Here, have some beer as reward.\"";
+ getinventorylist;
+ if ((@inventorylist_count - (countitem("MaggotSlime") == 3) > 99 - (countitem("Beer") == 0) )) goto L_TooMany;
+ delitem "MaggotSlime", 3;
+ getexp 100, 0;
+ getitem "Beer", 3;
+ QL_SOUP = 4;
+ goto L_close;
+
+L_NotEnough:
+ mes "[Bernard]";
+ mes "\"Oh, please hurry and bring me a Roasted Maggot. I'm yearning for maggot soup!\"";
+ goto L_close;
+
+L_NotEnough1:
+ mes "[Bernard]";
+ mes "\"Please do hurry and bring me 3 Maggot Slimes, so I can finish my soup!\"";
+ goto L_close;
+
+L_Done1:
+ mes "[Bernard]";
+ mes "\"Thank you so much!\"";
+ mes "\"But... something is missing to make the soup creamy.\"";
+ next;
+ mes "\"I need 3 Maggot Slimes for that.\"";
+ mes "\"Bring them to me, and I'll give you something nice.\"";
+ QL_SOUP = 3;
+ goto L_close;
+
+L_Done2:
+ mes "[Bernard]";
+ mes "\"I didn't mention it before, but I also put beer in my soup. I hope you like beer as much as I do, because, you see...\"";
+ next;
+ mes "\"Beer is life!\"";
+ goto L_close;
+
+L_Done3:
+ mes "[Bernard]";
+ mes "\"My help, Mikhail, finally returned with the slimes I needed.";
+ mes "I wonder what took him so long?\"";
+ goto L_close;
+
+L_close:
+ @temp = 0;
+ close;
+
+L_TooMany:
+ next;
+ mes "[Bernard]";
+ mes "\"You don't have room for my reward. I'll wait until you do.\"";
+ goto L_close;
+}
diff --git a/npc/009-2/doctor.txt b/npc/009-2/doctor.txt
new file mode 100644
index 00000000..e829a4ae
--- /dev/null
+++ b/npc/009-2/doctor.txt
@@ -0,0 +1,87 @@
+
+009-2,148,25,0 script Doctor NPC107,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (isequipped(AxeHat)) goto L_Axe;
+ if (isequipped(Eyepatch)) goto L_EyePatch;
+
+ mesn;
+ mes "\"Hello, can I help you?\"";
+ next;
+
+ if (@inspector == 1)
+ menu
+ "I think I am sick!", L_Cure,
+ "No, I feel fine.", L_Next,
+ "Have you seen anything strange in town? Anything that might have to do with the robberies?", L_NohMask;
+ menu
+ "I think I am sick!", L_Cure,
+ "No, I feel fine.", L_Next;
+
+L_Next:
+ mesn;
+ mesq l("Then please stop wasting my precious time.");
+ goto L_close;
+
+L_Cure:
+ mesn;
+ if (sc_check(SC_POISON) || sc_check(SC_DPOISON))
+ goto L_CurePoison;
+ mesc l("The doctor examines you briefly.");
+ mesq l("Nonsense! You look fine and dandy to me. All you need is a bit more exercise and fresh fruit in your diet!");
+ goto L_close;
+
+L_CurePoison:
+ mesq l("Well, well, well! Look at all those green bubbles coming out of your head; that looks like poisoning to me! Did you eat something rotten?");
+ next;
+ mesn;
+ mesc l("The doctor pulls out a syringe and fills it with a white liquid from a jar on his desk.");
+ mesq l("Now hold still, this won't hurt a bit...");
+ next;
+ mesn;
+ sc_end(SC_POISON);
+ sc_end(SC_DPOISON);
+ sc_end(SC_SLOWPOISON);
+ mes "*Ouch!*";
+ mes "\"Next time, be more careful! Make sure to cook any meats before you eat them, and don't eat fish once it starts to smell.\"";
+ goto L_close;
+
+L_Axe:
+ mesn;
+ mes "\"Oh my, what happened to you?\"";
+ next;
+ mesn;
+ mes "\"Wait. Thats just a fake. Shame on you!\"";
+ goto L_close;
+
+L_EyePatch:
+ mesn;
+ mes "\"Would you like a glass eye to replace that eye patch you have? We just got a whole load of them in today. I'll even let you keep the patch as a souvenir.\"";
+ next;
+ menu
+ "Yes, please.", L_EyePatch_GlassEye,
+ "No thank you", L_Next1;
+
+L_Next1:
+ mesn;
+ mes "\"If you change your mind, please come back and see me.\"";
+ goto L_close;
+
+L_EyePatch_GlassEye:
+ mesn;
+ mes "\"Now, where did I put that box of eyes...\"";
+ mes "He goes off to look for them and comes back empty handed.";
+ next;
+ mesn;
+ mes "\"I can't seem to find where I put that box. You should come back later, I may have found them by then.\"";
+ goto L_close;
+
+L_NohMask:
+ mesn;
+ mes "\"No, I haven't seen anything.\"";
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+}
diff --git a/npc/009-2/drunks.txt b/npc/009-2/drunks.txt
new file mode 100644
index 00000000..79794140
--- /dev/null
+++ b/npc/009-2/drunks.txt
@@ -0,0 +1,14 @@
+
+009-2,65,55,0 script Drinker#1 NPC121,{
+ mes "[Binge Drinker]";
+ mes "\"Ha! I'll drink muuuch mo.. more than you! Im not ooone biiit dr...dr..unk!\"";
+ close;
+}
+
+
+009-2,68,55,0 script Drinker#2 NPC121,{
+ mes "[Binge Drinker]";
+ mes "\"I can still drink more! Better give up you... you... teelotaler! MORE BEER MELINDA!\"";
+ //I know it's called "teetotaler". That error is on purpose.
+ close;
+}
diff --git a/npc/009-2/entertainer.txt b/npc/009-2/entertainer.txt
new file mode 100644
index 00000000..13664ffb
--- /dev/null
+++ b/npc/009-2/entertainer.txt
@@ -0,0 +1,40 @@
+
+009-2,61,49,0 script Entertainer NPC165,{
+ mes "[Entertainer]";
+ mes "\"Yes how can I help you?\"";
+ menu
+ "How are you showing emotions above your head?", L_Learn,
+ "Never mind", L_close;
+
+L_Learn:
+ mes "[Entertainer]";
+ mes "\"They are called emotes, I use them to express how I am feeling.";
+ mes "I can teach you if you'd like?\"";
+ menu
+ "Yes please.", L_Learn2,
+ "I don't see the point right now.", L_close;
+
+L_Learn2:
+ mes "[Entertainer]";
+ mes "\"All you have to do is press alt and a number.";
+ mes "The number determines what emotion will be shown.";
+ mes "Some clients will also show an emote shortcut-bar with the F12 button\"";
+ goto L_close;
+
+L_close:
+ close;
+
+OnTimer3000:
+ if(rand(0,1) == 1) goto L_manaplus;
+ emotion rand(EMOTE_DISGUST, EMOTE_BLAH);
+ goto OnInit;
+
+L_manaplus:
+ emotion rand(EMOTE_MEOW, EMOTE_TEARS);
+ goto OnInit;
+
+OnInit:
+ if (debug >= 2) end;
+ initnpctimer;
+ end;
+}
diff --git a/npc/009-2/inspector.txt b/npc/009-2/inspector.txt
new file mode 100644
index 00000000..9310d4ea
--- /dev/null
+++ b/npc/009-2/inspector.txt
@@ -0,0 +1,139 @@
+
+009-2,24,99,0 script Inspector#Hurnscald NPC150,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (@inspector == 0 && BaseLevel >= 30) goto L_Start;
+ if (@inspector == 1) goto L_AskVillage;
+ if (@inspector == 2) goto L_OldWoman;
+ if (@inspector == 3) goto L_TheaterMask;
+ if (@inspector == 4) goto L_TravelingTroupe;
+ if (@inspector == 5) goto L_OldMan;
+ if (@inspector == 6) goto L_OldMan_2;
+ if (@inspector == 7) goto L_Alibi;
+ if (@inspector == 8) goto L_Alibi_2;
+ if (@inspector == 9) goto L_Alibi_3;
+ if (@inspector == 10) goto L_Satchel;
+ if (@inspector == 11) goto L_Basement;
+ if (@inspector == 12) goto L_Note;
+ if (@inspector == 13) goto L_TravelingTroupe_2;
+ if (@inspector == 14) goto L_Over;
+ if (@inspector == 15) goto L_End;
+ mes "[Inspector]";
+ mes "\"I'm sorry, but I'm busy looking into this string of robberies.\"";
+ goto L_close;
+
+L_Start:
+ mes "\"Hmm...what to do.\"";
+ mes "He looks up and into your face.";
+ next;
+ mes "[Inspector]";
+ mes "\"You look capable, will you help me solve these robberies?\"";
+ next;
+ menu
+ "Yes.", L_Accept,
+ "No.", L_close;
+
+L_Accept:
+ @inspector = 1;
+ callsub S_Update_Mask;
+ mes "[Inspector]";
+ mes "\"Ok then. I'd like you to ask the villagers about the recent string of robberies.\"";
+ goto L_close;
+
+L_AskVillage:
+ mes "[Inspector]";
+ mes "\"Please continue talking to the villagers.\"";
+ goto L_close;
+
+L_OldWoman:
+ mes "[Inspector]";
+ mes "\"Hm...I don't know if I trust her eyesight or memory. See if someone else knows anything.\"";
+ goto L_close;
+
+L_TheaterMask:
+ @inspector = 4;
+ callsub S_Update_Mask;
+ mes "[Inspector]";
+ mes "\"Someone in a theater mask, eh? There was a traveling theater troupe in town recently, but they've moved on to Tulimshar. Please go talk to their leader about this.\"";
+ goto L_close;
+
+L_TravelingTroupe:
+ mes "[Inspector]";
+ mes "\"Please go talk to the leader of the traveling troupe about the theater mask.\"";
+ goto L_close;
+
+L_OldMan:
+ @inspector = 6;
+ callsub S_Update_Mask;
+ mes "[Inspector]";
+ mes "\"Hm...an old man? Could you interrogate him for me?\"";
+ goto L_close;
+
+L_OldMan_2:
+ mes "[Inspector]";
+ mes "\"Have you talked with the old man yet?\"";
+ goto L_close;
+
+L_Alibi:
+ mes "[Inspector]";
+ mes "\"Can you verify that with his wife?\"";
+ goto L_close;
+
+L_Alibi_2:
+ @inspector = 9;
+ callsub S_Update_Mask;
+ mes "[Inspector]";
+ mes "\"Hm...then it couldn't be him. I'm not sure where to go from here, maybe you can find something else. Try talking to everyone again.\"";
+ goto L_close;
+
+L_Alibi_3:
+ mes "[Inspector]";
+ mes "\"Made any progress yet?\"";
+ goto L_close;
+
+L_Satchel:
+ mes "[Inspector]";
+ mes "\"Then go north and investigate!\"";
+ goto L_close;
+
+L_Basement:
+ mes "[Inspector]";
+ mes "\"Did you look over the basement?\"";
+ goto L_close;
+
+L_Note:
+ @inspector = 13;
+ callsub S_Update_Mask;
+ mes "[Inspector]";
+ mes "\"What a strange note. I'll keep track of this, while you return the mask to the troupe.\"";
+ mes "";
+ mes "\"By the way, stay sharp! I may call upon you again.\"";
+ goto L_close;
+
+L_TravelingTroupe_2:
+ mes "[Inspector]";
+ mes "\"Please return the mask to the traveling troupe.\"";
+ goto L_close;
+
+L_Over:
+ @inspector = 15;
+ callsub S_Update_Mask;
+ mes "[Inspector]";
+ mes "\"My men have found all of the stolen items. They were all in the mining camp. We still don't know who did it.\"";
+ mes "[2500 experience points]";
+ getexp 2500, 0;
+ goto L_close;
+
+L_End:
+ mes "[Inspector]";
+ mes "\"Remember to stay sharp. I might need your help on another case.\"";
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+
+S_Update_Mask:
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_3_MASK)) | (@inspector << NIBBLE_3_SHIFT);
+ return;
+}
diff --git a/npc/009-2/kfahr.txt b/npc/009-2/kfahr.txt
new file mode 100644
index 00000000..2d1b47cf
--- /dev/null
+++ b/npc/009-2/kfahr.txt
@@ -0,0 +1,1071 @@
+
+009-2,67,57,0 script Kfahr NPC125,{
+ @halloween_npc_id = $@halloween_npc_kfahr;
+ callfunc "TrickOrTreat";
+
+ @QS_NEWBIE = 0;
+ @QS_MET_KFAHR = 1;
+ @QS_KNOWS_KFAHR = 2;
+ @QS_KNIFE_QUEST = 3;
+ @QS_KNIFE_QUEST_DONE = 4;
+ @QS_LOST_WRESTLING = 5;
+ @QS_STINGER_QUEST = 6;
+ @QS_STINGER_QUEST_DONE = 7;
+
+ @BLACK_STINGERS_NR = 10;
+ @MUSHROOMS_NR = 10;
+ @SNAKE_SKINS_NR = 10;
+
+ @KNIFE_QUEST_XP = 50000;
+ @STINGER_QUEST_XP = 80000;
+
+ @Q_MASK = NIBBLE_2_MASK;
+ @Q_SHIFT = NIBBLE_2_SHIFT;
+
+ @Q_status = (QUEST_Forestbow_state & @Q_MASK) >> @Q_SHIFT;
+
+ @Q_needs_stinger = ((QUEST_Forestbow_state & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT) > 1;
+
+ if (@Q_status == @QS_KNIFE_QUEST) goto L_Check;
+
+ if (@Q_status == @QS_STINGER_QUEST) goto L_stinger_check;
+
+ if (@Q_status > @QS_NEWBIE) goto L_meet_again;
+
+ mes "[Warrior]";
+ mes "You stand before a battle-scarred, darkly tanned warrior, brimming with muscles.";
+ mes "Just looking at him you smell danger, adventure, excitement...";
+ next;
+ mes "[Warrior]";
+ mes "On second thought, he really could use a bath.";
+ mes "";
+ mes "The warrior turns towards you, grinning broadly.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Why, hello there! Come to visit Kfahr the Warrior to hear of my exploits, have you?\"";
+ mes "He laughs heartily and gives you a slap on the back.";
+ mes "\"Can't blame you, can't blame you at all! Here, take a seat!\"";
+ next;
+ @has_beer = 0;
+ @beer_count = 0;
+ @last_story = 0;
+ @Q_status = @QS_MET_KFAHR;
+ callsub L_Update_Var;
+ goto L_Main_menu;
+
+L_meet_again:
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr nods and grins as you greet him.";
+ mes "\"Came back for more stories? Have a seat!\"";
+ next;
+ goto L_Main_menu;
+
+L_Main_menu:
+ if (@Q_status >= @QS_KNOWS_KFAHR)
+ goto L_real_main_menu;
+ menu
+ "Who are you?", L_Next,
+ "Goodbye.", L_End;
+
+L_Next:
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr laughs again.";
+ mes "\"Surely you jest! You must have heard of Kfahr, Slayer of Toby Rick the Desert Worm, Raider of the Lost Temple, Hero of Tulimshar?\"";
+ next;
+ menu
+ "Uhm...", L_Next1,
+ "Well...", L_Next1,
+ "To be quite honest...", L_Next1,
+ "Excuse me, someone is, er, whispering me...", L_End;
+
+L_Next1:
+ mes "[Kfahr the Warrior]";
+ mes "\"Ah, I knew it! So you have come to hear some tales about the dangers of the desert? You've come to the right man!\"";
+ next;
+ @Q_status = @QS_KNOWS_KFAHR;
+ callsub L_Update_Var;
+ goto L_real_main_menu;
+
+L_tale_sub:
+ if (@current_story == @last_story)
+ goto L_same_story_abort;
+ if (@has_beer == 0)
+ goto L_out_of_beer_abort;
+ @last_story = @current_story;
+ @has_beer = 0;
+ @story_abort = 0;
+ return;
+
+L_same_story_abort:
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr frowns.";
+ mes "\"I only just told you that story. Trust me, the others are worth hearing, too!\"";
+ next;
+ @story_abort = 1;
+ return;
+
+L_out_of_beer_abort:
+ mes "[Kfahr the Warrior]";
+ if (@beer_count > 4)
+ mes "\"I think I've talked 'nuff for now... but thanks for lis'ning!\"";
+ if (@beer_count <= 4)
+ mes "\"Now that's one of my favorite tales, but my throat is just a little too dry to talk about something like that... could you help me out a little here?\"";
+ next;
+ @story_abort = 1;
+ return;
+
+L_real_main_menu:
+ if (@Q_needs_stinger)
+ goto L_long_main_menu;
+
+ menu
+ "What's a Desert Worm?", L_tale_desert_worm,
+ "Desert Temple?", L_tale_desert_temple,
+ "Hero of Tulimshar?", L_tale_hero_tulimshar,
+ "Tell me about the desert!", L_tale_desert,
+ "I want to become as powerful as you!", L_gain_power,
+ "Here, have a beer!", L_Give_beer,
+ "Goodbye!", L_End;
+
+L_long_main_menu:
+ menu
+ "What's a Desert Worm?", L_tale_desert_worm,
+ "Desert Temple?", L_tale_desert_temple,
+ "Hero of Tulimshar?", L_tale_hero_tulimshar,
+ "Tell me about the desert!", L_tale_desert,
+ "I want to become as powerful as you!", L_gain_power,
+ "Have you fought any Golden Scorpions?", L_golden_scorpion,
+ "Here, have a beer!", L_Give_beer,
+ "Goodbye!", L_End;
+
+L_tale_desert_worm:
+ @current_story = 1;
+ callsub L_tale_sub;
+ if (@story_abort) goto L_Main_menu;
+
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr smiles and leans back.";
+ mes "\"A desert worm is probably the largest creature you will ever see, larger even than most dragons. It spans a good twenty chains (or six box tosses if you're used to the Imperial system) in length, has a thick, rubbery skin, and teeth as long as my legs.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Most are a darkish gray, except for the young ones; those are more purplish, I've been told. Well, anyway, you hardly ever see one of them in their entirety, you only see the head, if they decide to come out and fight – they tend to burrow under the ground.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"They are terrifying beasts, but lack any intelligent thought whatsoever. They just eat whatever gets in their way. There's nothing out there that can kill one, I think, and they can grow hundreds of years old.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Fortunately, they're kind of rare these days, and mostly roam in the empty deserts far, far south of Tulimshar. They don't like the area too close to the mountains, I think; probably too rocky underground.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr takes a sip from his beer.";
+ mes "\"Anyway. Desert worms are dangerous, as I said, but there was one particularly terrifying one, called Toby Rick. You must've heard of it – the greatest and most dangerous worm, scourge of the trade routes. It could smell humans from miles away.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Most desert worms don't smell or see or feel much, you see. They just notice when something's walking nearby, then jump up and swallow it. But Toby Rick was different. He was a terrifying beast, three times as long as a regular worm.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"So to feed itself, it had learned to smell. That's right, the beast had grown nostrils and learned how to use 'em!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"One day I was hired to protect a caravan going north to Tulimshar, with a friend of mine, old Arvek. He only came along for the fun, of course; it's not as if I really need much help defending a caravan... or at least normally it isn't.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Arvek's fun to have about. His manners are as bad as his breath, but he knows how to make a laugh out of everything. One thing you musnt't ever do with him, though, and that is to try his `homebrew'-- some kind of ale he makes out of maggot slime...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr takes another sip of beer, momentarily irritated as if surprised by the taste.";
+ mes "\"Anyway, This time was different. We were barely three days out in the desert, when we spotted him – `the Black Worm!', the Caravan Master cried, `Over there; it will kill us all!'\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"I had barely enough time to draw out my sword, and the beast was upon us! The caravan people were fleeing for their lives, so it was up to me and Arvek to stop it.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"That was madness, of course; no-one takes on a desert worm, if they have a choice. But we didn't; you see, with most desert worms you can just stand still and it won't notice you and pass by. But not with this one!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr leans forward.";
+ mes "\"So this humongous beast came roaring towards us, a big back hole where the mouth is, spikey fins sticking out to the side, all ready to swallow us all! My sword felt like a toothpick against that monster!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "He pauses, then leans back a little to take another long sip from his beer.";
+ mes "\"So it seemed that our last hour was at hand, that we'd be swallowed and never heard from again!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Aha, but Kfahr doesn't die quite so easily. What happened was this: Me and Arvek charged towards that thing, slashing and stabbing, but our blows would just glance off. The beast roared and just slid by us, slapping us to the side with its fins like maggots, knocking us to the ground.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"It bolted up into the air, and tore down on the caravan, swallowing each and everyone in there in a single big gulp!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Then it turned around towards us. Those fins had hit us pretty badly; I had lost my shield and Arvek his backpack. Better for him, I suppose, but I had been rather fond of that shield – not that it would have helped me much here...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr leans foward again, nearly knocking over his beer.";
+ mes "\"So the beast charges at the two of us again and we dodge – Arvek left, me right. The beast is smarter than the average desert worm, though, and had expected that – so it bends to the side and swallows poor Arvek, hair and hide and all.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr's eyes sparkle with excitement.";
+ mes "\"It turns around, trying to get me too. I dodge it – left, then the same again, I dodge it right. But it can't go on like that, the beast isn't tiring, but I am...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"So for one instant I think that this might be it, that I might die out here! A worthy death, I suppose, against the king of desert worms! And just as I think that, I bump against something\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr slaps on the table.";
+ mes "\"Arvek's backpack! Doesn't sound terribly exciting, of course – what am I going to do, toss it at the beast and hope that it chokes on it?\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "He grins.";
+ mes "\"But I remember something better. That beast had grown nostrils, right? So it can smell and taste! So I tear open his backpack and pull out that big snakeskin of that disgusting maggot ale of his. It's still filled to the brim.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"I quickly put on my gloves again, because I don't want to touch that stuff with my bare skin. The beast is almost upon me, but I have only that one chance – so I squeeze the skin while sticking my thumb into the opening, until I can see the black of its nostrils...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"...and when I think it's almost too late already, I shoot out that revolting brew at the beast's smelling holes, and I hit! Two at once, and up and sideways it rolls, away from me, and roaring and bellowing in pain!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"It roared for a good five minutes, then convulsed... and first it spat out old Arvek, who was a bit irritated at all that because, as he told me, he had `almost pierced the pancreas', whatever that means...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Next it spat out the caravan, and then some other caravan it had plucked off from elswehere. Somehow, everyone from there was still alive, too.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Then it slid away from us, away to the north, but we could see it getting slower and slower.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Two days later we caught up with it, but it was already dead then and had started to smell. We looked around and inside of it, found treasures and remnants of some less fortunate caravans and split them up appropriately.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"(I never told Arvek that it was his brew that killed it; he'd never have forgiven me.)\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"One of the nomads that had been travelling with the other caravan then told me that you could make special kinds of knives and swords and armor out of desert worm bones.\"";
+ next;
+ menu
+ "Hang on... bones in a... worm?", L_worm_bones,
+ "That's neat! Do you have any that I could see?", L_worm_see_bones,
+ "And then?", L_worm_final,
+ "Zzzzzzzz.......", L_End;
+
+L_worm_final:
+ mes "[Kfahr the Warrior]";
+ mes "\"Nothing much else happened on that trip. When we arrived in Tulimshar, people at first didn't believe the story, of course, until we showed them the treasures and the bones. Ah, those were wonderful days...\"";
+ mes "He sighs and leans back, a nostalgic look on his face.";
+ next;
+ goto L_Main_menu;
+
+L_worm_bones:
+ mes "[Kfahr the Warrior]";
+ mes "\"Weren't you listening? A desert worm is not a regular worm; a worm couldn't survive in the desert.\"";
+ next;
+ menu
+ "Do you have any bones that I could see?", L_worm_see_bones,
+ "Never mind that, what happened then?", L_worm_final,
+ "Zzzzzzzz.......", L_End;
+
+L_worm_see_bones:
+ if (@Q_status == @QS_KNIFE_QUEST)
+ goto L_bone_ip;
+ if (@Q_status > @QS_KNIFE_QUEST)
+ goto L_worm_continue2;
+ if (BaseLevel >= 40)
+ goto L_bone_quest;
+
+ mes "[Kfahr the Warrior]";
+ mes "\"Of course!\"";
+ mes "He pulls out a strangely curved knife with a yellow-whiteish blade that is almost transparent at the edge.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"When hardened properly, this bone knife can last a lifetime! One of the best knives you will find, too.\"";
+ mes "He puts the knife back into his pocket.";
+ next;
+ goto L_Main_menu;
+
+L_worm_continue2:
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr laughs.";
+ mes "\"Just have a look at the knife I gave you if you don't believe me!\"";
+ next;
+ goto L_Main_menu;
+
+L_tale_desert_temple:
+ @current_story = 2;
+ callsub L_tale_sub;
+ if (@story_abort) goto L_Main_menu;
+
+ mes "[Kfahr the Warrior]";
+ mes "\"Ah, that...\"";
+ mes "Kfahr leans back and takes a sip from his beer.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"That was many years ago, when George and I were just kids. George later became a pirate, you see; he always loved hunting for treasure. But back in those days it was all on level ground.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"George had found a treasure map somewhere... and when I say `found', I mean that in a fairly liberal sense; he always loved those maps, almost as much as the excitement of hunting for treasure.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Anyway, that map pointed to a spot in the desert a good day's walk south of Tulimshar. So we grabbed our satchels and coats and packed food and water, and headed there in the evening.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"We walked all night. As you know, it's best not to travel during the day if you can avoid it, and we were young and energetic in those days, so that was easily avoided.\"";
+ mes "He sighs and takes another sip.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Anyway, when the sun rose in the morning, we still hadn't found the place. So we climbed up on the nearest dune and looked all around to find it.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"But there was nothing, nothing at all. We looked and looked – and suddenly George screamed: While we weren't paying attention to nearby things, scorpions had crept up on us!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"The scorpions had smelled the food we had brought and cut open our satchels, tearing our waterskins and making a mess of our food – and now that they were done with that, they were coming for us!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"We didn't have any suitable weapons, and not much of a choice either, so we made a break for it. We ran into the desert, fast as our legs would carry us, and the scorpions after us.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"We very nearly didn't make it. There was nothing around but sand, and we had no water, no food – at least we'd had our breakfast already – and the sun kept burning, and burning, and trying to cook us alive.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"We had long lost the scorpions, but we were dry like parchment, and exhausted from all the sun and running. So we sat down in the shades of a dune and contemplated our options.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Without water we couldn't last during the day. So our only hope was to find shelter somewhere – except that the only thing around was sand, and the mid-day sun would rob that of all shelter.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"So we resigned to continuing to search for something, anything – it was either that, or die of thirst for sure. The only problem was that we were already so thirsty and it was so bright that we couldn't see nor walk straight anymore.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"So we had barely made it to the top of the next dune when George slipped and rolled down the other side. I wanted to catch him, but I was too dizzy myself, and so I rolled after him.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"We seemed to roll down for hours, and I kept feeling dizzier and dizzier; I didn't have the strength to stop. When we arrived at the bottom, I just wanted to lie down and let the sun dry me up.\"";
+ mes "Kfahr takes a deep sip of beer. \"Aaah.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"I was being foolish, of course. You should never give up, no matter how hopeless the situation may seem. Anyway, I finally did decide to get up on my knees and look around again...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"...and what I saw right before me, believe it or not, was a giant face of a man, carved into rock – there, in the middle of the desert, half-sunk, a shattered visage!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"I pulled George up – I didn't have the strength to speak, but walking seemed to work – and we slowly made our way over to it. We weren't thinking much, just trying to find some shade, so we climbed into that thing's ear.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Inside it felt moist, as if it was a real ear – not that I've climbed inside a real ear, mind you! But that feeling of cool and dampness and water was like a magical healing potion; we suddenly felt strength in our legs again.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"When we looked around, we noticed that there was a passage leading further underground, and long-spent torches on the wall. Fortunately I still had my tinderbox, so I wrapped my shirt around a torch and lighted it.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"We climbed down, and soon we heard the dripping of water – we had found an underground water-hole! More than that, we had found a gigantic underground cave, and, at the end of it, a huge portal.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"We first drenched ourselves in water – somehow managing not to douse the torch – and drank until we were ready to burst. When we had rested, we went to the portal to have a closer look.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"The portal was made out of bronze, or some similar metal, with images of snakes engraved all over. Curious as we were, we pulled the door open – it wasn't locked or barred in any way – and had a look inside.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"The passages in there were cool and dark, with a ceiling high enough to swallow the light of my torch. There were snakes, quite a few of them, but we were both quick-footed and managed to avoid them.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"There were chambers and inscriptions and more torches, but not a living being besides us and the snakes. Hmm. Though I could have sworn that some of the statues there were following us with their eyes...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"All went well, until George stepped into a trap. A piece of ground just caved in, and if I hadn't grabbed his hand at the last second, he would have ended up on some rusty and probably poisoned spikes on the bottom...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"But I moved too fast, and slipped, and let go of the torch to catch myself with the other hand – and the torch ended up in the bottom of the pit! Well, better the torch than George, I suppose...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Still, we no longer had any light. Being careless, I had gotten my tinderbox wet while we were at the water-hole, so we couldn't make another torch either.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"We had the choice between staying by our torch and watching it die, and then follow suit at the hands, or, well, fangs of the snakes, or wandering off in the dark, to be eaten by snakes someplace else.\"";
+ mes "Kfahr empties his beer, looking a bit disappointed.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Anyway, we took the latter option. We wandered through the dark, somehow barely avoiding the snakes and the traps, running into walls and hitting our heads on archways, until, suddenly, we saw something shining up ahead.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"That thing was on some kind of pedestal, and it looked like a golden tablet of sorts. We clambered towards it – the only source of light in here, the only thing that could save us – and hesitated.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Should we just take it? This was clearly some kind of temple, so it might be something sacred. George and I argued about it for a while, until I decided to end the discussion – so I simply grabbed it: we needed light.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"At that point, a terrible grinding noise started all around us, as the pedestal began to sink into the ground. We had triggered some ancient trap!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Holes on the walls were opening up, and snakes began to gush out – only now did we realise that we were in a huge, opulent chamber, with gold and gems and images all around! But now it was too late for any looting; we had to run for our lives!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"So we ran from that slithering mass, faster than we ever had! We had no idea where we were going of course, but at least we had light again...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Somehow we got lucky, somehow we escaped. It was evening again when we climbed out of that ear into the desert again, with only our lives and that golden tablet. We only barely made it back to Tulimshar in the morning.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"But we did have the tablet as a proof of what happened.\"";
+ mes "He grins.";
+ mes "\"That was my first real adventure, I think. Ah, those were exciting days.\"";
+ next;
+ menu
+ "Wow.", L_Main_menu,
+ "What happened to the tablet?", L_tale_tablet,
+ "Did you go there again?", L_tale_temple_again,
+ "Zzzzzzz.....", L_End;
+
+L_tale_tablet:
+ mes "[Kfahr the Warrior]";
+ mes "\"Well, we couldn't read it. We later sold it for a good price, to a young travelling archeologist; Doctor Nohlidge or something like that. She said that the engravings described sacrifical practices of an ancient snake cult...\"";
+ mes "He shrugs.";
+ next;
+ goto L_Main_menu;
+
+L_tale_temple_again:
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr laughs.";
+ mes "\"Of course we tried to go there again. After seeing all that treasure, George wouldn't give up on it. We tried many times – as did others, from what I've heard – but we never found it again.\"";
+ next;
+ goto L_Main_menu;
+
+L_tale_hero_tulimshar:
+ @current_story = 3;
+ callsub L_tale_sub;
+ if (@story_abort) goto L_Main_menu;
+
+ mes "[Kfahr the Warrior]";
+ mes "\"Yes, Hero of Tulimshar. That was many years";
+ mes "ago, but I did save the city of Tulimshar from a deadly drought.\"";
+ mes "He grins broadly.";
+ mes "\"And quite a feat that was, let me tell you!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Back in those days, there wasn't much trade with Hurnscald, and Tulimshar was dependent on its own water supply – critically dependent, even.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Now, one day the water people drew from the wells started smelling. The smell was nauseating, and people who drank from it became violently sick.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"So the entire town was without water, except for the water reserves in the cistern. Someone had to act quickly – and of course that someone was me.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"With nothing more than a torch, some light armor and a sword, I climbed down one of the wells. It was a long climb; the wells go down fairly deep.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"I noticed that there were some holes in the walls of the wells, with hollow spaces on the sides... Hmm, that reminds me that I still have to check whether the rumors of a labyrinth underneath Tulimshar are true.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Anyway, it took me a long time to get down, and every minute the stench was getting worse – something really bad was down there. I had to stop and tie a wet piece of cloth over my mouth so that I wouldn't inhale all of that nasty stuff.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"My torch was in an even poorer shape – whatever was making that smell had killed the flame, so I soon had to rely on the light from above to see anything.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Finally I arrived at the water level. All Tulimshar wells dip into the same underground lake, which is on the side of a huge underground cavern. And in the midst of that cavern lay – hardly visible through the greenish mist coming from it – a Stinkewyrm!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Stinkewyrms are smaller cousins of dragons, but just as dangerous. They have a green, sticky skin, and, well, they stink. A lot. This one was particularly bad – it had filled up the entire cave with stinkiness!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"I climbed down and swam to the shore. The stench was terrible; I had to hold my breath to get closer to the monster. There it was, lying on the ground, snoring, poisoning all our water! So I tried to wake it up to scare it away.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"I kicked it. I yelled at it. (Bad mistake, I got some of that stinky stuff in my lungs.) I poked at it with my sword. I even tried to poke it in the eyes, but I couldn't get that close to its mouth – that was where most of the smell was coming from.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"After a few attempts I couldn't take it anymore, so I had myself be pulled up again. It took me a while to recover and to tell the tale. We talked about what could be done, but no-one had an idea.\"";
+ mes "Kfahr takes a deep sip from his beer.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Finally, I came up with something. Stinkewyrms love that terrible stench of theirs, so what should be their natural enemy? Why, soap, of course!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"We couldn't just dump all the soap into the underground lake, of course; the water would be undrinkable again. So we collected some of the soap, and I climbed down again with it.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Having arrived at the bottom, I cut off the biggest of the water buckets and filled it with water – and that was a really big one, I could hardly carry it when it was full. Then I dissolved most the soap, and poured that onto the Stinkewyrm's head.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr laughs.";
+ mes "\"Ah, that caught its attention! You should have seen that dragon roar, as it jumped to its feet and tried to find out who had soaped it! I rushed back to the water and made another bucket of soap water.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"But it had noticed me! And as soon as it had realized where I was, it came after me. Then it stopped, towering right before me, its stench nearly killing me, and grinned that broad, crooked-teeth dragon smile of its kind.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Then it took a deep breath – and I realised that that was probably 'it' for me; Stinkewyrms can breathe fire like real dragons, and I didn't have the time to run back to the water.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"But when it breathed out, only a tiny little flame came out – and a lot of terrible smell that nearly knocked me off my feet.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"For you see, it had generated so much of the deadly smell around itself that even its own fire breath couldn't survive!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"So it stared at me, mouth wide agape – the perfect opening!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"I stormed at it and before it could even blink, it had a huge load of bubbly soap water down its throat.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"You should have heard the coughing and shaking! I swear, I thought the roof would collapse as it was jumping and choking...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Bubbles were coming out of its mouth, its nostrils, even its ears! The poor wyrm must have never felt so clean in its life!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"I was out of soap, but the beast didn't know that – so I quickly grabbed another bucket and charged it again.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"And it worked! Seeing me like this again, it ran, squealing, back into the underground caves from where it must have come.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr roars with laughter and slaps his hands on the table.";
+ mes "\"So we defeated it with hygiene! Ah, that was wonderful. After a day, the stench had worn off enough that we could drink the water again, and a week later it was almost completely gone. And of course I was the hero of the day.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr downs the rest of his beer.";
+ mes "\"And from that day on they called me the `Hero of Tulimshar'.\"";
+ next;
+ goto L_Main_menu;
+
+L_tale_desert:
+ @current_story = 4;
+ callsub L_tale_sub;
+ if (@story_abort) goto L_Main_menu;
+
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr leans back, trying to find the right words to describe the desert.";
+ mes "\"The desert... a cold and lonely place at night, and a hot and lonely place during the day.\"";
+ mes "For someone who apparently spent most of his life in the desert, his insights sometimes seem less than profound.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"The desert is a living hell during some times of the year. Filled with black scorpions and snakes, except for the shadier areas, and mountain snakes if you go further east.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"South of Tulimshar is a fairly protected region; the nomads keep the snakes out of there and you'll find only relatively harmless monsters. But go west from there, to the beach, and it's scorpions and snakes...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"...and east of there you find the old Hatmaker cave, now filled to the brim with snakes! Rumors have it that this was once an oasis, in centuries long gone by, but as far as I'm concerned that pit is just a dump that you best avoid.\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Go further to the east and you'll find ol' Pachua up on the mountain. He seems to have some kind of power over the mountain snakes there; they never attack him. I think he's a bit creepy, personally...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"...but if he offers you some of his tobacco, then by all means give it a try! That stuff is amazing.\"";
+ mes "He laughs, then begins to cough.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Not terribly healthy, though, I s'pose...\"";
+ next;
+ goto L_Main_menu;
+
+L_gain_power:
+ if ((@beer_count - @has_beer) < 1)
+ goto L_story_first;
+ if (@Q_status < @QS_KNIFE_QUEST)
+ goto L_bone_quest;
+
+ mes "[Kfahr the Warrior]";
+ mes "\"Yeees, yes... doesn't everyone?\"";
+ mes "He laughs briefly.";
+ mes "\"Don't worry – you can't become as powerful as I, of course, but if you keep practicing, you can get pretty damn close! Just make sure to pick your opponents carefully, and know when to run to live another day!\"";
+ next;
+ goto L_Main_menu;
+
+L_story_first:
+ mes "[Kfahr the Warrior]";
+ mes "\"That's the spirit! Perhaps you better listen to one of my tales, then!\"";
+ next;
+ goto L_Main_menu;
+
+L_bone_quest:
+ if (@Q_status == @QS_KNIFE_QUEST)
+ goto L_bone_ip;
+ if (@Q_status > @QS_KNIFE_QUEST)
+ goto L_bone_completed;
+ if (BaseLevel < 40)
+ goto L_bone_tooweak;
+
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr stares at you for a moment, then nods.";
+ mes "\"You seem reasonably skilled. I think I may have something that I no longer need, but I don't want to give it to just anyone...\"";
+ mes "He hesitates, obviously trying to make up his mind about something, then continues.";
+ @Q_status = @QS_KNIFE_QUEST;
+ callsub L_Update_Var;
+ next;
+ goto L_bone_ip;
+
+L_bone_ip:
+ mes "[Kfahr the Warrior]";
+ mes "\"Bring me " + @BLACK_STINGERS_NR + " black scorpion stingers and " + @MUSHROOMS_NR + " small mushrooms to prove that you are a competent warrior, and I'll see if I have something for you.\"";
+ mes "He grins.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"But while you are here... perhaps you would like to listen to another story?\"";
+ next;
+ goto L_Main_menu;
+
+L_bone_completed:
+ mes "[Kfahr the Warrior]";
+ mes "\"I really don't have anything else I'd want to give away to make you stronger. Look around a bit yourself! You won't become a hero if you keep begging for help!\"";
+ next;
+ goto L_Main_menu;
+
+L_bone_tooweak:
+ mes "[Kfahr the Warrior]";
+ mes "\"You know, little one, if you keep practicing a little and come back once you're a bit stronger, I might have something for you...\"";
+ mes "He winks.";
+ next;
+ goto L_Main_menu;
+
+L_Check:
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr eyes you with unconcealed amusement.";
+ mes "\"Welcome back! Did you bring me the things I asked for?\"";
+ next;
+ menu
+ "Yes, here they are!", L_completecheck,
+ "Er, what were those things again?", L_bone_ip,
+ "No, sorry, I didn't have the time.", L_Main_menu,
+ "I forgot! Let me get them right now.", L_End;
+
+L_completecheck:
+ if (countitem("BlackScorpionStinger") < @BLACK_STINGERS_NR)
+ goto L_missing_stingers;
+ if (countitem("SmallMushroom") < @MUSHROOMS_NR)
+ goto L_missing_mushrooms;
+
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr is delighted.";
+ mes "\"Well done, well done! Now that's what I call Warrior spirit!\"";
+ mes "He laughs, then suddenly stops, turning to you with suspicion in his eyes.";
+ mes "\"You DID get those yourself, didn't you? Not buy them or somesuch...?\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Before you can answer, he laughs and slaps you on the back again.";
+ mes "\"Ah, what am I thinking! Too many years in the desert make you a little suspicious of everyone and everything! Naah, I believe you.\"";
+ mes "He pulls a strangely curved knife out of a side pocket and holds it up to the light. The blade is partly transparent, and looks quite sharp.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"It's a bone knife, carved out of the umplex bone of a desert worm... you can probably guess which one.\"";
+ mes "He grins broadly again, weighing the weapon.";
+ mes "\"It's a little heavy, but one of the best knives you can get. Certainly beats a short sword any time of day.\"";
+ mes "I had the nomads make me a few of them, and I hardly use them nowadays, so I think I can part with this one.";
+ next;
+ if (countitem("BlackScorpionStinger") < @BLACK_STINGERS_NR)
+ goto L_missing_stingers_2;
+ if (countitem("SmallMushroom") < @MUSHROOMS_NR)
+ goto L_missing_mushrooms_2;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_Knife_TooMany;
+ mes "[Kfahr the Warrior]";
+ mes "He hands you the knife.";
+ mes "\"Oh, and I think I'll keep those in return; I know someone who will trade them for antidote potions.\"";
+ mes "He pockets the stingers and mushrooms.";
+ mes "[" + @KNIFE_QUEST_XP + " experience points]";
+ @Q_status = @QS_KNIFE_QUEST_DONE;
+ callsub L_Update_Var;
+ delitem "BlackScorpionStinger", @BLACK_STINGERS_NR;
+ delitem "SmallMushroom", @MUSHROOMS_NR;
+ getexp @KNIFE_QUEST_XP, 0;
+ getitem "BoneKnife", 1;
+ next;
+ goto L_Main_menu;
+
+L_Knife_TooMany:
+ mes "[Kfahr the Warrior]";
+ mes "\"You don't have room for this. Come back when you do.\"";
+ close;
+
+L_missing_stingers:
+ mes "[Kfahr the Warrior]";
+ mes "\"No, no... I said " + @BLACK_STINGERS_NR + " black scorpion stingers.";
+ if (countitem("BlackScorpionStinger"))
+ mes "You will need " + (@BLACK_STINGERS_NR - (countitem ("BlackScorpionStinger"))) + " more of those.\"";
+ if (countitem("BlackScorpionStinger") == 0)
+ mes "You didn't bring even a single one!\"";
+ close;
+
+L_missing_stingers_2:
+ mes "[Kfahr the Warrior]";
+ mes "\"You just had " + @BLACK_STINGERS_NR + " black scorpion stingers. What happened to them?";
+ if (countitem("BlackScorpionStinger"))
+ mes "You will need " + (@BLACK_STINGERS_NR - (countitem ("BlackScorpionStinger"))) + " more of those.\"";
+ if (countitem("BlackScorpionStinger") == 0)
+ mes "You didn't bring even a single one!\"";
+ close;
+
+L_missing_mushrooms:
+ mes "[Kfahr the Warrior]";
+ mes "\"No, no... I said " + @MUSHROOMS_NR + " small mushrooms.";
+ if (countitem("SmallMushroom"))
+ mes "You will need " + (@MUSHROOMS_NR - (countitem ("SmallMushroom"))) + " more of those.\"";
+ if (countitem("SmallMushroom") == 0)
+ mes "You didn't bring me even a single little mushroom!\"";
+ close;
+
+L_missing_mushrooms_2:
+ mes "[Kfahr the Warrior]";
+ mes "\"You just had " + @MUSHROOMS_NR + " small mushrooms. What happened to them?";
+ if (countitem("SmallMushroom"))
+ mes "You will need " + (@MUSHROOMS_NR - (countitem ("SmallMushroom"))) + " more of those.\"";
+ if (countitem("SmallMushroom") == 0)
+ mes "You didn't bring me even a single little mushroom!\"";
+ close;
+
+L_stinger_check:
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr grins at you.";
+ mes "\"Welcome, welcome! Did you bring me my snake skins?\"";
+ next;
+ menu
+ "Yes, here they are!", L_ss_cc,
+ "No, sorry, I didn't have the time.", L_Main_menu,
+ "I forgot! Let me get them right now.", L_End;
+
+L_ss_cc:
+ if (countitem("SnakeSkin") < @SNAKE_SKINS_NR)
+ goto L_snakeskins_missing;
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_SnakeSkins_TooMany;
+ delitem "SnakeSkin", @SNAKE_SKINS_NR;
+ getitem "GoldenScorpionStinger", 1;
+ @Q_status = @QS_STINGER_QUEST_DONE;
+ callsub L_Update_Var;
+ getexp @STINGER_QUEST_XP, 0;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr takes the skins and pulls a golden scorpion stinger out of his pocket.";
+ mes "\"Well, you've earned it. But be careful – the poison in there is still lethal, after all those years.\"";
+ mes "He hands you the scorpion stinger.";
+ mes "[" + @STINGER_QUEST_XP + " experience points]";
+ next;
+ goto L_Main_menu;
+
+L_snakeskins_missing:
+ mes "[Kfahr the Warrior]";
+ mes "\"No, no... I said " + @SNAKE_SKINS_NR + " snake skins.";
+ if (countitem("SnakeSkin"))
+ mes "You will need " + (@SNAKE_SKINS_NR - (countitem ("SnakeSkin"))) + " more of those.\"";
+ if (countitem("SnakeSkin") == 0)
+ mes "You didn't bring even a single skin!\"";
+ close;
+
+L_SnakeSkins_TooMany:
+ mes "[Kfahr the Warrior]";
+ mes "\"You don't have room for this. Come back when you do.\"";
+ close;
+
+L_Give_beer:
+ if (countitem("Beer") < 1)
+ goto L_player_out_of_beer;
+ if (@has_beer)
+ goto L_enough_beer_for_now;
+ if (@beer_count > 4)
+ goto L_too_much_beer;
+
+ setarray @beermessages$,
+ "Ah yes... a warrior's drink!",
+ "Generous, generous! I like that!",
+ "Hahah! That's just what I needed!",
+ "I love this town! Hurnscaldian hospitality! Mrahahahah!",
+ "A'ight, one more can't hurt, eh?";
+
+ @mesg$ = @beermessages$[@beer_count];
+
+ delitem "Beer", 1;
+ @has_beer = 1;
+ @beer_count = @beer_count + 1;
+
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr is visibly delighted.";
+ mes "\"" + @mesg$ + "\"";
+ mes "He takes a deep sip.";
+ mes "\"Aaah, magnificent!\"";
+
+ if (@beer_count > 4)
+ mes "Kfahr seems quite relaxed now.";
+ next;
+ goto L_Main_menu;
+
+L_enough_beer_for_now:
+ mes "[Kfahr the Warrior]";
+ mes "\"Generous, generous! But I still have plenty in here!\"";
+ mes "He laughs and takes a sip from the beer you gave him earlier.";
+ next;
+ goto L_Main_menu;
+
+L_too_much_beer:
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr leans back and sighs heavily.";
+ mes "\"Very, very generous... bu' I think I'm fine for now.\"";
+ mes "He suppresses a burp.";
+ next;
+ goto L_Main_menu;
+
+L_player_out_of_beer:
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr stares at you, then begins to laugh.";
+ mes "\"Mrahahahahaha! Here's the beer! Right, right! Naah, I get it! Save your gold for whatever you need it for! But if you have some spare and want to share a beer, you know where to find me!\"";
+ next;
+ goto L_Main_menu;
+
+L_golden_scorpion:
+ if (@Q_status > @QS_STINGER_QUEST)
+ goto L_gs_over_ask;
+ if (@Q_status == @QS_STINGER_QUEST)
+ goto L_gs_ask_again;
+ if (@Q_status == @QS_LOST_WRESTLING)
+ goto L_gs_wrestle_again;
+
+ mes "[Kfahr the Warrior]";
+ mes "He grins.";
+ mes "\"Fought any? I single-handedly raided a nest of those beasts! Ah, but golden scorpions are almost unheard of in these parts. Why do you ask?\"";
+ next;
+ menu
+ "Never mind, I was just curious.", L_Main_menu,
+ "I need a golden scorpion stinger.", L_Next2;
+
+L_Next2:
+ mes "[Kfahr the Warrior]";
+ mes "\"A golden scorpion stinger? Those are rare and valuable, I hope that you know that!\"";
+ if (BaseLevel < 60)
+ goto L_lowlvl_for_stinger;
+ if (@Q_status < @QS_KNIFE_QUEST)
+ goto L_golden_requires_quest;
+ if (@Q_status < @QS_KNIFE_QUEST_DONE)
+ goto L_golden_requires_done;
+
+ mes "\"Still, you are a warrior of repute. I'll consider giving it to you...\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "A mischievous sparkle lightens up in his eyes.";
+ mes "\"...if you arm-wrestle me for it!\"";
+ next;
+ goto L_gs_wrestle_intro;
+
+L_gs_wrestle_intro:
+ menu
+ "Never!", L_Main_menu,
+ "Wait... what?", L_wrestle_explain,
+ "Bring it on!", L_gs_wrestle;
+
+L_golden_requires_done:
+ mes "He hesitates.";
+ mes "\"But no, this is too valuable. Perhaps if you finish that other quest I gave you...?\".";
+ next;
+ goto L_Main_menu;
+
+L_golden_requires_quest:
+ mes "He hesitates.";
+ mes "\"But no, this is too valuable. I think I should have you prove your worthiness with another quest first...\"";
+ next;
+ goto L_bone_quest;
+
+L_wrestle_explain:
+ mes "[Kfahr the Warrior]";
+ mes "\"Arm wrestling! Arm against arm! And whoever is stronger wins! If you manage to defeat me, I'll give you a little quest for the stinger. How about it?\"";
+ next;
+ goto L_gs_wrestle_intro;
+
+L_lowlvl_for_stinger:
+ mes "\"Well, I have one, but I can't just give it to anyone. Maybe if you train a little and become a worthy warrior I will consider giving it away...\"";
+ next;
+ goto L_Main_menu;
+
+L_gs_over_ask:
+ mes "[Kfahr the Warrior]";
+ mes "\"Is this about the stingers again? I already gave you a golden stinger, I'm not going to part with any more.\"";
+ next;
+ goto L_Main_menu;
+
+L_gs_ask_again:
+ mes "[Kfahr the Warrior]";
+ mes "\"This is about the stinger again, right? Well, just bring me " + @SNAKE_SKINS_NR + " snake skins, and you can have one.\"";
+ next;
+ goto L_Main_menu;
+
+L_gs_wrestle_again:
+ mes "[Kfahr the Warrior]";
+ mes "\"This is about the stinger again, eh? So you want to give it another try?\"";
+ mes "He grins broadly.";
+ next;
+ goto L_gs_wrestle;
+
+L_gs_wrestle:
+ mes "[Kfahr the Warrior]";
+ mes "You sit down. Both of you place your arms on the table, on opposing sides, and grab each other's hands.";
+ next;
+
+ @KFAHR_STR = 70 + @beer_count * 6;
+ @KFAHR_AGI = 60 - @beer_count * 5;
+ @kfahr_stamina = 120;
+
+ @PC_STR = readparam(bStr);
+ @PC_AGI = readparam(bAgi);
+ @PC_MAX_STAMINA = Vit + 20;
+ @pc_stamina = @PC_MAX_STAMINA;
+
+ setarray @positions$,
+ "Kfahr's hand is almost on the table.",
+ "Kfahr's hand is pushed back.",
+ "Kfahr and your hands are centered.",
+ "Your hand is pushed back.",
+ "Your hand is almost on the table.";
+
+ @position = 2;
+ @first_round = 1;
+ goto L_wrestle_loop;
+
+L_wrestle_loop:
+ mes "[Arm-wrestling with Kfahr]";
+ mes @positions$[@position];
+ if ((@pc_stamina * 2 <= @PC_MAX_STAMINA) && (@pc_stamina * 4 > @PC_MAX_STAMINA))
+ mes "You feel a little exhausted.";
+ if (@pc_stamina * 4 <= @PC_MAX_STAMINA)
+ mes "You feel very exhausted.";
+ next;
+ menu
+ "Push!", L_wrestle_push,
+ "Hold!", L_wrestle_hold,
+ "Slam!", L_wrestle_slam,
+ "Consider your options", L_wrestle_info;
+
+L_wrestle_info:
+ mes "[Arm-wrestling with Kfahr]";
+ mes "Kfahr is a strong arm-wrestling opponent. Winning against him won't be easy.";
+ mes "Each round you have to choose an action; what you choose determines both your chances of moving each other's arms and how much weaker you get.";
+ next;
+ mes "[Arm-wrestling with Kfahr]";
+ mes "If you PUSH, you may be able to push him back, but if you fail, you will lose more stamina than if you had succeeded.";
+ next;
+ mes "[Arm-wrestling with Kfahr]";
+ mes "If you HOLD, you lose little stamina and may be able to hold him and drain his stength, but you cannot win just by holding.";
+ next;
+ mes "[Arm-wrestling with Kfahr]";
+ mes "If you SLAM, you try to move against him quickly – if you are successful, you may push him back quite a bit, but losing this will drain you badly.";
+ next;
+ goto L_wrestle_loop;
+
+L_wrestle_push:
+ @kfahr_def = @KFAHR_STR;
+ @attack = @PC_STR;
+ @Cost_factor = 2;
+ callsub L_wrestle_attack;
+ if (@result < -1) set @result, -1; // can't push back further than one
+ goto L_wrestle_next;
+
+L_wrestle_hold:
+ @kfahr_def = @KFAHR_STR;
+ @attack = @PC_STR;
+ @Cost_factor = 1;
+ callsub L_wrestle_attack;
+ if (@result < 0) set @result, 0; // hold only
+ goto L_wrestle_next;
+
+L_wrestle_slam:
+ if (@beer_count == 5 && @first_round)
+ goto L_quick_slam;
+ @kfahr_def = @KFAHR_AGI;
+ @attack = @PC_AGI;
+ @Cost_factor = 4;
+ callsub L_wrestle_attack;
+ goto L_wrestle_next;
+
+L_wrestle_attack:
+ @kfahr_stamina_bonus = @kfahr_stamina;
+ @pc_stamina_bonus = @kfahr_stamina;
+
+ if (@kfahr_stamina_bonus > 40)
+ @kfahr_stamina_bonus = 40;
+ if (@pc_stamina_bonus > 40)
+ @pc_stamina_bonus = 40;
+
+ @score = @kfahr_def + @kfahr_stamina_bonus - @attack - @pc_stamina_bonus + rand(20) - rand(20);
+ @result = @score / 10;
+
+ if (@result > 1)
+ @result = 1;
+ if (@result > 0)
+ @kfahr_stamina = @kfahr_stamina - 12;
+ if (@result == 0)
+ @kfahr_stamina = @kfahr_stamina - 16;
+ if (@result < 0)
+ @kfahr_stamina = @kfahr_stamina - 8;
+ if (@result < 0)
+ @pc_stamina = @pc_stamina - (6 * @Cost_factor);
+ if (@result == 0)
+ @pc_stamina = @pc_stamina - (8 * @Cost_factor);
+ if (@result > 0)
+ @pc_stamina = @pc_stamina - (4 * @Cost_factor);
+ if (@kfahr_stamina < 0)
+ @kfahr_stamina = 0;
+ if (@kfahr_stamina < 0)
+ @pc_stamina = 0;
+ return;
+
+L_wrestle_next:
+ @first_round = 0;
+
+ mes "[Arm-wrestling with Kfahr]";
+ if (@result < 0)
+ mes "You manage to push him back!";
+ if (@result == 0)
+ mes "You hold your position!";
+ if (@result > 0)
+ mes "Kfahr pushes you back!";
+ next;
+ @position = @position + @result;
+ if (@position < 0)
+ goto L_wrestle_win;
+ if (@position > 4)
+ goto L_wrestle_lose;
+ goto L_wrestle_loop;
+
+L_wrestle_lose:
+ mes "[Arm-wrestling with Kfahr]";
+ mes "Kfahr slams your hand on the table.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "\"Don't worry! It was a good attempt – but beating Kfahr is not quite so easy!\"";
+ mes "He laughs and slaps you on the shoulder.";
+ mes "\"But come back any time you want to try again!\"";
+ next;
+ @Q_status = @QS_LOST_WRESTLING;
+ callsub L_Update_Var;
+ goto L_Main_menu;
+
+L_quick_slam:
+ mes "[Arm-wrestling with Kfahr]";
+ mes "Your hands have barely touched as you push against him with all your might. His reactions slowed by the beer, Kfahr doesn't stand a chance.";
+ next;
+ goto L_wrestle_win;
+
+L_wrestle_win:
+ mes "[Arm-wrestling with Kfahr]";
+ mes "You slam Kfahr's hand on the table.";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "Kfahr stares first at the hand, then at you, incredulously.";
+ mes "Then he begins to roar with laughter, slapping you on the shoulder.";
+ mes "\"Excellent, excellent! Caught me in a weak moment there, did ya!\"";
+ next;
+ mes "[Kfahr the Warrior]";
+ mes "After calming down, Kfahr outlines your quest.";
+ mes "\"As I promised, I will give you the stinger if you do something for me. Get me " + @SNAKE_SKINS_NR + " snake skins, and I'll let you have it.\"";
+ next;
+ @Q_status = @QS_STINGER_QUEST;
+ callsub L_Update_Var;
+ goto L_Main_menu;
+
+L_End:
+ close;
+
+L_Update_Var:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(@Q_MASK) | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/009-2/lena.txt b/npc/009-2/lena.txt
new file mode 100644
index 00000000..eb99f21f
--- /dev/null
+++ b/npc/009-2/lena.txt
@@ -0,0 +1,119 @@
+
+009-2,146,43,0 script Lena NPC182,{
+ @state = ((QUEST_Hurnscald & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT);
+
+ if (@state >= 6) goto L_Lena_Done;
+ if (@state == 5) goto L_Lena_Success;
+ if (@state == 4) goto L_LBL_Fail;
+ if (@state == 3) goto L_LBL_Fail;
+ if (@state == 2) goto L_Lena_Bandit_Leader;
+ if (@state == 1) goto L_Lena_Fairy_Hat;
+ if (BaseLevel >= 30) goto L_Lena_Start;
+
+ mes "[Lena]";
+ mes "\"I got ambushed by a group of bandits and one of them stabbed me pretty good. Hopefully I heal up soon so I can fight this menace.\"";
+ next;
+ mes "\"Ah, I wish my dear friend Nickos could be here. He's one of the guards in Tulimshar and he'd know how to deal with those outlaws!\"";
+ goto L_close;
+
+L_Lena_Start:
+ mes "[Lena]";
+ mes "\"While wandering through the forest, I was ambushed by bandits. Though I got them all, one of them stabbed me pretty good. I'm still healing from that encounter. I'm worried that the bandit threat may spread.\"";
+ menu
+ "Don't worry, I can take out some of these scumbags.", L_Lena_Approves,
+ "I think I left my courage in another pair of pants. See you later!", L_Lena_No_Fan;
+
+L_Lena_Approves:
+ @state = 1;
+ callsub S_Update_Var;
+ mes "[Lena]";
+ mes "\"You look like you can handle yourself in a fight. If you can take on this scourge I'll reward you with a hat like mine. In order to prove your mettle, bring me 10 Bandit Hoods so I know they've met their match.\"";
+ areamonster "008-1",25,60,40,65,"Bandit",1064,3, "::";
+ areamonster "011-1",35,40,65,60,"Bandit",1064,3, "::";
+ goto L_close;
+
+L_Lena_No_Fan:
+ mes "[Lena]";
+ mes "\"What will Hurnscald do if these bandits overrun the town? I hope you reconsider.\"";
+ goto L_close;
+
+L_Lena_Fairy_Hat:
+ if (countitem("BanditHood") < 10)
+ goto L_Lena_NotEnough;
+ getinventorylist;
+ if (@inventorylist_count - (countitem("BanditHood")== 10) > 99)
+ goto L_TooMany;
+ @state = 2;
+ callsub S_Update_Var;
+ delitem "BanditHood", 10;
+ getitem "FairyHat", 1;
+ mes "[Lena]";
+ mes "\"Ah, you've brought me the Bandit Hoods. As promised, here is a hat like mine.\"";
+ next;
+ mes "\"Unfortunately, I feel this bandit threat may have grown. Perhaps they are being lead? I noticed many of them seem to hang around a cave just west of Hurnscald. If you could defeat their leader I know they will become less of a threat to Hurnscald. I'll reward you with armor like mine if you do. Sound like something you could do?\"";
+ menu
+ "Consider it done!", L_LBL_Yes,
+ "Woah there, that sounds a bit harder than what I can succeed at.", L_Lena_NoWay;
+
+L_Lena_NotEnough:
+ mes "[Lena]";
+ mes "\"You don't have enough Bandit Hoods to prove you are taking care of this threat. Please come back with 10 Bandit Hoods to show you are taking care of these bandits.\"";
+ goto L_close;
+
+L_Lena_Bandit_Leader:
+ mes "[Lena]";
+ mes "\"I feel this bandit threat may have grown. Perhaps they are being lead? I noticed many of them seem to hang around a cave just west of Hurnscald. If you could defeat their leader I know they will become less of a threat to Hurnscald. I'll reward you with armor like mine if you do. Sound like something you could do?\"";
+ menu
+ "Consider it done!", L_LBL_Yes,
+ "Woah there, that sounds a bit harder than what I can succeed at.", L_Lena_NoWay;
+
+L_LBL_Yes:
+ @state = 3;
+ callsub S_Update_Var;
+ areamonster "008-1",25,60,40,65,"Bandit",1064,3, "::";
+ areamonster "011-1",35,40,65,60,"Bandit",1064,3, "::";
+ mes "[Lena]";
+ mes "\"You have a brave heart. Though I know you can succeed on your own, I recommend finding others to help you defeat the bandit leader. I believe he could pose a significant threat to solitary individuals seeking to challenge him. Good luck!\"";
+ goto L_close;
+
+L_Lena_NoWay:
+ mes "[Lena]";
+ mes "\"That is too bad. Feel free to return at any time. This bandit threat needs to be pushed back.\"";
+ goto L_close;
+
+L_LBL_Fail:
+ @state = 3;
+ callsub S_Update_Var;
+ mes "[Lena]";
+ mes "\"You haven't killed the bandit leader yet. This is a big problem. Please be careful.\"";
+ goto L_close;
+
+L_Lena_Success:
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_TooMany;
+ @state = 6;
+ callsub S_Update_Var;
+ getitem "ForestArmor", 1;
+ mes "[Lena]";
+ mes "\"Excellent! You killed the bandit leader. Here is the armor as I promised you. Safe journeys!\"";
+ goto L_close;
+
+L_Lena_Done:
+ mes "[Lena]";
+ mes "\"Thank you for all your help. With your efforts, we can only hope this scourge doesn't see a resurgence.\"";
+ goto L_close;
+
+L_TooMany:
+ mes "[Lena]";
+ mes "\"You have too many items in your inventory. Please get rid of something so I can reward you.\"";
+ goto L_close;
+
+L_close:
+ @state = 0;
+ close;
+
+S_Update_Var:
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_0_MASK) | (@state << NIBBLE_0_SHIFT));
+ return;
+}
diff --git a/npc/009-2/mapflags.txt b/npc/009-2/mapflags.txt
new file mode 100644
index 00000000..599be6f9
--- /dev/null
+++ b/npc/009-2/mapflags.txt
@@ -0,0 +1,2 @@
+//009-2 mapflag town
+//009-2 mapflag resave 009-2,149,43
diff --git a/npc/009-2/misc.txt b/npc/009-2/misc.txt
new file mode 100644
index 00000000..6106028d
--- /dev/null
+++ b/npc/009-2/misc.txt
@@ -0,0 +1,59 @@
+
+009-2,54,49,0 script Note#bar NPC400,{
+ mesn l("Note");
+ mes l("We refuse service to anyone who:");
+ mes l("• Has a bubblehead");
+ mes l("• Is not properly shaded");
+ mes l("• Can't walk without stopping after every step");
+ close;
+ // In case you don't get the joke, know that it's a parody on Illutia.
+}
+
+009-2,109,44,0 script #Book NPC400,{
+ if (getskilllv(SKILL_MAGIC))
+ goto L_Magic;
+ mesn l("Bookshelf");
+ mes "This bookshelf seems to have a selection of diaries and manuscripts, though you can't find anything that strikes you as being particularly interesting.";
+ close;
+
+L_Magic:
+ mesn l("Bookshelf");
+ mes l("Browsing through the books, you come across a manuscript entitled 'Notes of Potaffe, On Transmutation.'");
+ next;
+ if (getskilllv(SKILL_MAGIC_TRANSMUTE) < 2)
+ goto L_Magic_boring;
+ mesn l("Bookshelf");
+ mes l("Leafing through the manuscript, you find that you can read little of the tiny handwriting and understand only a fraction of what is said.");
+ next;
+ if (getskilllv(SKILL_MAGIC) < 2)
+ goto L_Magic_weak;
+ mesn l("Bookshelf");
+ mes l("After a while, you stumble across a section that appears to be written somewhat legibly. The author notes that he (or perhaps she?) is describing a completely new transmutation.");
+ next;
+ mesn l("Bookshelf");
+ mes l("Excitedly, you turn the page – only to find that it is stuck to the next and can't be freed!");
+ next;
+ mesn l("Bookshelf");
+ mes l("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;
+ mesn l("Bookshelf");
+ mesq l("The last word on that page is '%s' and it's underlined twice with a comment next to it saying 'finally got it right.'", b("Zukminbirf"));
+ learnskill SKILL_ZUKMINBIRF;
+ next;
+ mesn l("Bookshelf");
+ mes l("Unfortunately, you can't make out what the transmutation is for or even whether it requires any materials...");
+ next;
+ mesn l("Bookshelf");
+ mes l("You can't make out anything else of value, so you place the manuscript back in the bookshelf.");
+ close;
+
+L_Magic_boring:
+ mesn l("Bookshelf");
+ mes l("Leafing through the manuscript, you find that you understand too little of what is written to make any sense of it.");
+ close;
+
+L_Magic_weak:
+ mesn l("Bookshelf");
+ mes l("Unfortunately, that seems to require more magical power than you can use right now. If only the Mana Seed granted you more power...");
+ close;
+}
diff --git a/npc/009-2/nicholas.txt b/npc/009-2/nicholas.txt
new file mode 100644
index 00000000..8071ab35
--- /dev/null
+++ b/npc/009-2/nicholas.txt
@@ -0,0 +1,401 @@
+
+009-2,185,55,0 script Nicholas NPC135,{
+ @SETZER_XP = 100000;
+ @SHIELD_XP = 20000;
+
+ @SHIELD_INITIAL = 0;
+ set @SHIELD_KNOWS_PATCH, 1; // knows that a leather patch is needed
+ set @SHIELD_COMPLETED, 2; // shield completed once
+
+ @SETZER_INITIAL = 0;
+ @SETZER_KNOWS_OIL = 1;
+ @SETZER_KNOWS_STINGER = 2;
+ @SETZER_FLAG_MADE_OIL = 4;
+ @SETZER_FLAG_MADE_SETZER = 8;
+
+ @Q_SETZER_MASK = NIBBLE_3_MASK;
+ @Q_SETZER_SHIFT = NIBBLE_3_SHIFT;
+
+ @Q_SHIELD_MASK = NIBBLE_4_MASK;
+ @Q_SHIELD_SHIFT = NIBBLE_4_SHIFT;
+
+ @Q_SETZER_status = (QUEST_Forestbow_state & @Q_SETZER_MASK) >> @Q_SETZER_SHIFT;
+ @Q_SHIELD_status = (QUEST_Forestbow_state & @Q_SHIELD_MASK) >> @Q_SHIELD_SHIFT;
+
+ mes "[Nicholas]";
+ mes "\"Hello, there! I'm an expert blacksmith. If you get me some Coal and Iron Ingots, I could make you a very valuable shield or helmet.\"";
+ next;
+ menu
+ "I have Iron Ingots!", L_Check,
+ "Where can I get Coal and Iron Ingots?", L_Info,
+ "I'm okay, thanks.", L_Pass;
+
+L_Check:
+ mes "[Nicholas]";
+ mes "\"Let me take a look at how much you have...\"";
+ next;
+ if ( (countitem("IronIngot")<3) || (countitem("Coal") < 6) )
+ goto L_NoItem;
+ if ( (countitem("IronIngot")<6) || (countitem("Coal") < 12) )
+ goto L_StageA;
+ if ( (countitem("IronIngot")<9) || (countitem("Coal") < 18) )
+ goto L_StageB;
+ goto L_StageC;
+
+L_Info:
+ mes "[Nicholas]";
+ mes "\"You can find Coal and Iron Ore in mines. Once you have Coal and Iron Ore, find a smith that will smelt the Iron Ore and cast them into Iron Ingots.\"";
+ next;
+ mes "[Nicholas]";
+ mes "\"Come back here with some Coal and Iron Ingots, and I'll make something nice for you.\"";
+ close;
+
+L_Pass:
+ mes "[Nicholas]";
+ mes "\"Oh, okay. Come back any time.\"";
+ close;
+
+L_StageA:
+ mes "[Nicholas]";
+ mes "\"That's just enough for me to make you a winged Knight's Helmet, but it'll cost you 10,000GP, 6 Coal and 3 Iron Ingots.\"";
+ next;
+ goto L_Main_menu;
+
+L_StageB:
+ mes "[Nicholas]";
+ mes "\"Ahh, with that much Coal and Iron Ingots I can make you one of two helmets, for only 10,000GP, or I can make you a shield, for 20,000GP.\"";
+ mes "";
+ mes "\"What would you like?\"";
+ next;
+ goto L_Main_menu;
+
+L_StageC:
+ mes "[Nicholas]";
+ mes "\"Excellent, that's enough to make three different types of helmet. My fee is 10,000GP. I can also make a shield, but that will cost you 20,000 GP.\"";
+ mes "";
+ mes "\"Which will it be?\"";
+ next;
+ goto L_Main_menu;
+
+L_Main_menu:
+
+ @CHOICE_KNIGHT = 1;
+ @CHOICE_CRUSADE = 2;
+ @CHOICE_WARLORD = 3;
+ @CHOICE_SHIELD = 4;
+ @CHOICE_SETZER = 5;
+ @CHOICE_CANCEL = 6;
+
+ setarray @choice$, "", "", "", "", "", "";
+ @choices_nr = 0;
+ setarray @choice_idx, 0, 0, 0, 0, 0, 0;
+
+ if (countitem("ShortSword") < 1)
+ goto L_Main_menu_post_setzer;
+ @choice$[@choices_nr] = "Can you make my Short Sword better?";
+ @choice_idx[@choices_nr] = @CHOICE_SETZER;
+ @choices_nr = 1 + @choices_nr;
+ goto L_Main_menu_post_setzer;
+
+L_Main_menu_post_setzer:
+
+ if ( (countitem("IronIngot")<3) || (countitem("Coal") <6) )
+ goto L_No_more_helmets;
+ @choice$[@choices_nr] = "Knight's Helmet (3 Iron Ingots & 6 Coal).";
+ @choice_idx[@choices_nr] = @CHOICE_KNIGHT;
+ @choices_nr = 1 + @choices_nr;
+
+ if ( (countitem("IronIngot")<6) || (countitem("Coal") < 12) )
+ goto L_No_more_helmets;
+ @choice$[@choices_nr] = "Crusade Helmet (6 Iron Ingots & 12 Coal).";
+ @choice_idx[@choices_nr] = @CHOICE_CRUSADE;
+ @choices_nr = 1 + @choices_nr;
+
+ @choice$[@choices_nr] = "Steel Shield (6 Iron Ingots & 12 Coal).";
+ @choice_idx[@choices_nr] = @CHOICE_SHIELD;
+ @choices_nr = 1 + @choices_nr;
+
+ if ( (countitem("IronIngot")<9) || (countitem("Coal") < 18) )
+ goto L_No_more_helmets;
+ @choice$[@choices_nr] = "Warlord Helmet (9 Iron Ingots & 18 Coal).";
+ @choice_idx[@choices_nr] = @CHOICE_WARLORD;
+ @choices_nr = 1 + @choices_nr;
+ goto L_No_more_helmets;
+
+L_No_more_helmets:
+ @choice$[@choices_nr] = "No thanks.";
+ @choice_idx[@choices_nr] = @CHOICE_CANCEL;
+ @choices_nr = 1 + @choices_nr;
+ menu
+ @choice$[0], L_MenuItems,
+ @choice$[1], L_MenuItems,
+ @choice$[2], L_MenuItems,
+ @choice$[3], L_MenuItems,
+ @choice$[4], L_MenuItems,
+ @choice$[5], L_MenuItems;
+
+L_MenuItems:
+ @menu = @menu - 1;
+ if (@menu >= @choices_nr)
+ close;
+
+ @choice = @choice_idx[@menu];
+ if (@choice == @CHOICE_KNIGHT)
+ goto L_YesKnight;
+ if (@choice == @CHOICE_CRUSADE)
+ goto L_YesCrusade;
+ if (@choice == @CHOICE_WARLORD)
+ goto L_YesWarlord;
+ if (@choice == @CHOICE_SHIELD)
+ goto L_YesShield;
+ if (@choice == @CHOICE_SETZER)
+ goto L_SetzerQuest;
+ if (@choice == @CHOICE_CANCEL)
+ goto L_End;
+ close;
+
+L_NoItem:
+ mes "[Nicholas]";
+ mes "\"It appears you don't have enough Coal and Iron Ingots for me to work with. Please do come back when you have more, though.\"";
+ close;
+
+L_NoMoney:
+ mes "[Nicholas]";
+ mes "\"Oh dear, it seems you don't have enough money.\"";
+ close;
+
+L_YesKnight:
+ if (Zeny < 10000)
+ goto L_NoMoney;
+ if ( (countitem("IronIngot")<3) || (countitem("Coal") < 6) )
+ goto L_NoItem;
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_TooMany;
+ Zeny = Zeny - 10000;
+ delitem "IronIngot", 3;
+ delitem "Coal", 6;
+ getitem "KnightsHelmet", 1;
+ goto L_Done;
+
+L_YesCrusade:
+ if (Zeny < 10000) goto L_NoMoney;
+ if ( (countitem("IronIngot")<6) || (countitem("Coal") < 12) )
+ goto L_NoItem;
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_TooMany;
+ Zeny = Zeny-10000;
+ delitem "IronIngot", 6;
+ delitem "Coal", 12;
+ getitem "CrusadeHelmet", 1;
+ goto L_Done;
+
+L_YesWarlord:
+ if (Zeny < 10000) goto L_NoMoney;
+ if ( (countitem("IronIngot")<9) || (countitem("Coal") < 18) )
+ goto L_NoItem;
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_TooMany;
+ Zeny = Zeny-10000;
+ delitem "IronIngot", 9;
+ delitem "Coal", 18;
+ getitem "WarlordHelmet", 1;
+ goto L_Done;
+
+L_YesShield:
+ mes "[Nicholas]";
+ mes "Nicholas examines your Iron Ingots.";
+ mes "\"No, this iron is too brittle; for something as large as a shield I need to mix in softer iron. Can I see if you have anything suitable?\"";
+ next;
+ menu
+ "Sure, have a look!", L_Next,
+ "No.", L_Pass;
+
+L_Next:
+ if (countitem("InfantryHelmet") == 1)
+ goto L_MoreInfantry;
+ if (countitem("InfantryHelmet") == 0)
+ goto L_NoInfantry;
+
+ mes "[Nicholas]";
+ mes "Nicholas pulls out two of your Infantry Helmets.";
+ mes "\"I can use those... yes, that should work. Now all I need is a Leather Patch for the handle, and 20,000 GP.\"";
+ if (@Q_SHIELD_status < @SHIELD_KNOWS_PATCH)
+ @Q_SHIELD_status = @SHIELD_KNOWS_PATCH;
+ callsub L_Update_Var;
+ next;
+ menu
+ "Here you are!", L_Next1,
+ "Where can I get a Leather Patch?", L_WhereLeather,
+ "No way.", L_Pass;
+
+L_Next1:
+ if (Zeny < 20000)
+ goto L_ShieldNoZeny;
+ if (countitem("InfantryHelmet") < 2)
+ goto L_ShieldNoInfantry;
+ if (countitem("IronIngot") < 6)
+ goto L_ShieldNoIngot;
+ if (countitem("Coal") < 12)
+ goto L_ShieldNoCoal;
+ if (countitem("LeatherPatch") < 1)
+ goto L_ShdNoLeathPatch;
+ // No inventory check needed, as infantry helms are removed, opening two slots
+
+ mes "[Nicholas]";
+ mes "\"Yes, it looks as if you have all that is needed!\"";
+ mes "You watch Nicholas melt the ingots and helmets and form a shield out of the resulting iron. He then cuts your Leather Patch apart and adds it to the handles.";
+ mes "\"Here is your shield!\"";
+ delitem "InfantryHelmet", 1;
+ delitem "InfantryHelmet", 1;
+ delitem "LeatherPatch", 1;
+ delitem "IronIngot", 6;
+ delitem "Coal", 12;
+ Zeny = Zeny - 20000;
+
+ if (@Q_SHIELD_status < @SHIELD_COMPLETED)
+ getexp @SHIELD_XP, 0;
+ if (@Q_SHIELD_status < @SHIELD_COMPLETED)
+ mes "[" + @SHIELD_XP + " experience points]";
+ set @Q_SHIELD_status, @SHIELD_COMPLETED; // get XP only once
+ callsub L_Update_Var;
+ getitem "SteelShield", 1;
+ close;
+
+L_ShieldNoZeny:
+ mes "[Nicholas]";
+ mes "\"I am sorry, but I must ask that you pay 20,000 GP; this is quality work.\"";
+ close;
+
+L_ShieldNoInfantry:
+ mes "[Nicholas]";
+ mes "\"Now this is strange... I could have sworn that you had two Infantry Helmets right here. Well, come back if you have some more!\"";
+ close;
+
+L_ShieldNoIngot:
+ mes "[Nicholas]";
+ mes "\"How odd... didn't I put your Iron Ingots on the table right here? Well, I will need them back to make the shield.\"";
+ close;
+
+L_ShieldNoCoal:
+ mes "[Nicholas]";
+ mes "\"How odd... didn't I put your Coal on the table right here? Well, I will need it back to make the shield.\"";
+ close;
+
+L_ShdNoLeathPatch:
+ mes "[Nicholas]";
+ mes "\"You don't have a suitable Leather Patch. I'm sorry, but a shield without one would chafe terribly.\"";
+ close;
+
+L_MoreInfantry:
+ mes "[Nicholas]";
+ mes "Nicholas takes your Infantry Helmet and examines it.";
+ mes "\"Yes, this is perfect! If you can bring me another one of those, I can make your shield.\"";
+ close;
+
+L_NoInfantry:
+ mes "[Nicholas]";
+ mes "Nicholas shakes his head.";
+ mes "\"No, none of these items are suitable. Try looking for somewhat large metal items.\"";
+ close;
+
+L_WhereLeather:
+ mes "[Nicholas]";
+ mes "\"Hmm. You should look for someone who can work with some kind of leather. Rumor has it that there is someone in the eastern desert who can, but I haven't been there.\"";
+ close;
+
+L_SetzerQuest:
+ mes "[Nicholas]";
+ if (@Q_SETZER_status & @SETZER_FLAG_MADE_SETZER)
+ mes "\"Another one? Sure, why not.\"";
+ mes "Nicholas examines your Short Sword, then nods.";
+ mes "\"This is good quality. I can make something special out of it, with three ingot bars of iron, six lumps of coal and 50,000 GP -- but I will also need a potion of monster oil.\"";
+ if (@Q_SETZER_status < @SETZER_KNOWS_OIL)
+ @Q_SETZER_status = @SETZER_KNOWS_OIL;
+ callsub L_Update_Var;
+ next;
+ menu
+ "Here you are.", L_Next2,
+ "Monster oil? What's that?", L_ExplainMonsterOil,
+ "HOW much? Nevermind then!", L_Pass;
+
+L_Next2:
+ if (Zeny < 50000)
+ goto L_SetzerNoZeny;
+ if ( (countitem("IronIngot") < 3) || (countitem("Coal") < 6) )
+ goto L_SetzerNoIngot;
+ if (countitem("MonsterOilPotion") < 1)
+ goto L_SetzerNoMonsterOil;
+ if (countitem("ShortSword") < 1)
+ goto L_SetzerNoSword;
+ // No inventory check needed, as the short sword is removed, opening a slot
+
+ mes "[Nicholas]";
+ mes "Nicholas takes the items, heats up your sword and pounds it with a heavy hammer. As you watch, it turns thinner and flatter. Finally he pours the monster oil over it, heats the metal up again and douses it in water.";
+ Zeny = Zeny - 50000;
+ delitem "IronIngot", 3;
+ delitem "Coal", 6;
+ delitem "MonsterOilPotion", 1;
+ delitem "ShortSword", 1;
+ getitem "Setzer", 1;
+ if (!(@Q_SETZER_status & @SETZER_FLAG_MADE_SETZER))
+ mes "[" + @SETZER_XP + " experience points]";
+ if (!(@Q_SETZER_status & @SETZER_FLAG_MADE_SETZER))
+ getexp @SETZER_XP, 1;
+ @Q_SETZER_status = @Q_SETZER_status | @SETZER_FLAG_MADE_SETZER;
+ callsub L_Update_Var;
+ next;
+ mes "[Nicholas]";
+ mes "Nicholas hands you the completed sword. It feels strangely light in your hands.";
+ mes "\"I made it lighter and faster, it should also cut a little better now. This kind of sword is called a Setzer, after a famous gambler who invented it as a weapon in between a knife and a sword.\"";
+ next;
+ mes "[Nicholas]";
+ mes "\"I'm quite happy with this one. Be careful around the edge, though, it is quite sharp!\"";
+ close;
+
+L_ExplainMonsterOil:
+ mes "[Nicholas]";
+ mes "\"Monster oil is a special oil that can be used to harden thin sheets of metal, if used properly. Unfortunately, it is very hard to get. Perhaps one of our local alchemists can help you with it?\"";
+ close;
+
+L_SetzerNoZeny:
+ mes "[Nicholas]";
+ mes "\"I am sorry, but I must ask that you pay 50,000 GP; the kind of weapon I am thinking of is not easy to make.\"";
+ close;
+
+L_SetzerNoIngot:
+ mes "[Nicholas]";
+ mes "\"Without 3 ingots of iron, and six lumps of coal, I can't improve your sword.\"";
+ close;
+
+L_SetzerNoMonsterOil:
+ mes "[Nicholas]";
+ mes "\"I know that monster oil is hard to come by, but I can't do much without it. Ask an alchemist if you need help making it.\"";
+ close;
+
+L_SetzerNoSword:
+ mes "[Nicholas]";
+ mes "\"I will need your old Short Sword as a basis. Please bring it to me first.\"";
+ close;
+
+L_End:
+ close;
+
+L_Done:
+ mes "[Nicholas]";
+ mes "\"Here you go!\"";
+ mes "";
+ mes "\"Come back any time.\"";
+ close;
+
+L_Update_Var:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(@Q_SHIELD_MASK | @Q_SETZER_MASK) | (@Q_SHIELD_status << @Q_SHIELD_SHIFT) | (@Q_SETZER_status << @Q_SETZER_SHIFT));
+ return;
+
+L_TooMany:
+ mes "[Nicholas]";
+ mes "\"You don't have room for it. Come back later when you do.\"";
+ close;
+}
diff --git a/npc/009-2/nurse.txt b/npc/009-2/nurse.txt
new file mode 100644
index 00000000..d534f64d
--- /dev/null
+++ b/npc/009-2/nurse.txt
@@ -0,0 +1,538 @@
+
+
+009-2,147,65,0 script Nurse NPC119,{
+ @halloween_npc_id = $@halloween_npc_nurse;
+ callfunc "TrickOrTreat";
+
+ @SNAKET_AMOUNT = 5;
+ @BSCORPIONST_AMOUNT = 10;
+ // This quest can be done very often: so give less xp
+ @QUEST1_EXP = 300;
+ @ACORNS_AMOUNT = 10;
+ @GREENAPPLE_AMOUNT = 5;
+ @REDAPPLE_AMOUNT = 5;
+ @ORANGE_AMOUNT = 5;
+ @HEALING_AMOUNT = 3;
+ // This quest can be done very often: so give less xp
+ @QUEST2_EXP = 700;
+ @ANTIDOTE_EXP = 10000;
+
+ @Q_poison_MASK = NIBBLE_7_MASK;
+ @Q_poison_SHIFT = NIBBLE_7_SHIFT;
+ @Q_poison = (QUEST_Forestbow_state & @Q_poison_MASK) >> @Q_poison_SHIFT;
+
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (@Q_poison == 7) goto L_state7;
+ if (@Q_poison == 6) goto L_state6;
+ if (@Q_poison == 5) goto L_state5;
+ if (@Q_poison == 4) goto L_state4;
+ if (@Q_poison == 3) goto L_state3;
+ if (@Q_poison == 2) goto L_state2;
+ if (@Q_poison == 1) goto L_state1;
+ if (getskilllv(SKILL_POOL)) goto L_state0;
+ goto L_Usual;
+
+L_Usual:
+ mes "[Nurse]";
+ mes "\"How can I help you?\"";
+ next;
+
+ if (@inspector == 1)
+ menu
+ "Oooh, these wounds! They hurt so much!", L_Heal,
+ "I don't feel so well, I might be sick.", L_Doctor,
+ "Have you seen anything out of the ordinary?", L_NohMask,
+ "No, I'm fine.", L_Next;
+ menu
+ "Oooh, these wounds! They hurt so much!", L_Heal,
+ "I don't feel so well, I might be sick.", L_Doctor,
+ "No, I'm fine.", L_Next;
+
+L_Next:
+ mes "[Nurse]";
+ mes "\"Then I would ask you to leave. There are people who really need our help.\"";
+ goto L_close;
+
+L_Doctor:
+ mes "[Nurse]";
+ mes "\"Then you should better see the doctor. He is usually in his office on the 3rd floor.\"";
+ goto L_close;
+
+L_Heal:
+ if (BaseLevel > 20) goto L_NoHeal;
+ mes "[Nurse]";
+ mes "\"Here, let me heal you.\"";
+ next;
+ heal 10000, 10000;
+ goto L_close;
+
+L_NoHeal:
+ mes "[Nurse]";
+ mes "\"I'm sorry but I'm here only to help young people.";
+ mes "Your level is already higher than 20.";
+ mes "You can get some rest in the inn near here.\"";
+ goto L_close;
+
+L_NohMask:
+ mes "[Nurse]";
+ mes "\"I'm too busy here to observe the town.\"";
+ goto L_close;
+
+L_state0:
+ mes "[Nurse]";
+ mes "\"Welcome! You really look like a competent person. Maybe you can help to deal with a problem we have.\"";
+ next;
+ mes "\"We recently had some accidents in the mines. It seems that the creatures in the mines became more aggressive.\"";
+ next;
+ mes "\"Unfortunately, some of them are poisonous and it is very difficult for us to help the miners.\"";
+ next;
+ mes "\"For that reason, I want to do some research on this subject, to create an antidote. But I need help to get some ingredients, someone who is able to deal with the dangerous creatures in the mines.\"";
+ next;
+ menu
+ "I will do what I can. What do you need?", L_firstquest,
+ "I'm really sorry, but I don't think I can help you.", L_Next1;
+
+L_Next1:
+ mes "\"That is disagreeable to hear. Maybe I can find another person to take this task.\"";
+ next;
+ goto L_Usual;
+
+L_firstquest:
+ @Q_poison = 1;
+ callsub S_Update_Var;
+ mes "\"That's great! First, I need some parts of the poisonous creatures.\"";
+ next;
+ goto L_ExplainAgain1;
+
+L_ExplainAgain1:
+ mes "\"Please bring me five tongues of snakes and ten stingers of black scorpions.\"";
+ goto L_close;
+
+L_state1:
+ mes "[Nurse]";
+ mes "\"You are back, wonderful! Did you get what we need for the antidote?\"";
+ next;
+ menu
+ "Actually, I have another question.", L_Usual,
+ "Sorry, I forgot. What shall I bring you?", L_ExplainAgain1,
+ "I have what you asked for.", L_Next2,
+ "I'm still working on that.", L_close;
+
+L_Next2:
+ if (countitem("SnakeTongue") < @SNAKET_AMOUNT || countitem("BlackScorpionStinger") < @BSCORPIONST_AMOUNT)
+ goto L_NotEnough;
+ delitem "SnakeTongue", @SNAKET_AMOUNT;
+ delitem "BlackScorpionStinger", @BSCORPIONST_AMOUNT;
+ getexp @QUEST1_EXP, 0;
+ @Q_poison = 2;
+ callsub S_Update_Var;
+ mes "[Nurse]";
+ mes "\"Very good. Now I have to extract the poison from this, it will take some time.\"";
+ next;
+ mes "\"But there are some other things we will need in any case. It would be courteous if you could get them meanwhile.\"";
+ next;
+ goto L_ExplainAgain2;
+
+L_ExplainAgain2:
+ mes "\"Please bring me ten acorns, five red apples, five green apples and also five oranges. And we need some small healing potions. They will be useful to hold off the baneful effects. Three of them will be enough, I guess.\"";
+ goto L_close;
+
+L_state2:
+ mes "You look at the nurse, who seems to be really tired, with shadows under her eyes. When she recognizes you, she smiles.";
+ mes "[Nurse]";
+ mes "\"I managed to extract the poisonous components. We should be able to create an antidote, if you have everything else we need.\"";
+ next;
+ menu
+ "Actually, I have another question.", L_Usual,
+ "I have a bad memory. Can you tell me again what we need?", L_ExplainAgain2,
+ "I managed to get everything we need.", L_Next3,
+ "I will go and get it.", L_close;
+
+L_Next3:
+ if (countitem("Acorn") < @ACORNS_AMOUNT
+ || countitem("GreenApple") < @GREENAPPLE_AMOUNT
+ || countitem("RedApple") < @REDAPPLE_AMOUNT
+ || countitem("Orange") < @ORANGE_AMOUNT
+ || countitem("SmallHealingPotion") < @HEALING_AMOUNT)
+ goto L_NotEnough;
+ delitem "Acorn", @ACORNS_AMOUNT;
+ delitem "GreenApple", @GREENAPPLE_AMOUNT;
+ delitem "RedApple", @REDAPPLE_AMOUNT;
+ delitem "Orange", @ORANGE_AMOUNT;
+ delitem "SmallHealingPotion", @HEALING_AMOUNT;
+ getexp @QUEST2_EXP, 0;
+ @Q_poison = 3;
+ callsub S_Update_Var;
+ goto L_Chemistry;
+
+L_Chemistry:
+ callsub L_Shuffle_Need;
+ mes "The nurse takes the ingredients you brought and starts to squeeze the fruits and to crush the acorns. Then she put the fruit juices in some complicated looking chemical device.";
+ next;
+ mes "After some minutes, it is blubbering and steaming and a liquid is dripping in a pot under the device.";
+ next;
+ mes "Then she takes the acorn flour and the liquid and goes to a place back in the room, where she does something you don't see.";
+ next;
+ mes "After just a few moments, she comes back with a smiling face, holding two different bottles in her hand.";
+ next;
+ mes "[Nurse]";
+ mes "\"That was easy compared to the things to be done with the stingers and snake tongues.\"";
+ next;
+ mes "Then her facial expression gets more serious.";
+ next;
+ mes "\"When we try to find the right mixture for the antidote, we need to test it.\"";
+ next;
+ mes "\"For that purpose, I will poison you. Then you drink the antidote to see if it works.\"";
+ next;
+ mes "\"If we make a mistake, this might be exhausting and painful, so you should rest a while and prepare yourself.\"";
+ next;
+ mes "\"Come back when you feel ready for that task.\"";
+ goto L_close;
+
+L_state3:
+ mes "[Nurse]";
+ mes "\"Hello my friend. You feel prepared to test the antidote?\"";
+ next;
+ menu
+ "Actually, I have another question.", L_Usual,
+ "Yes, let us begin.",L_Exp_Game;
+
+L_Exp_Game:
+ mes "[Nurse]";
+ mes "\"Listen carefully! I will explain what you need to do.\"";
+ next;
+ mes "\"I have here two different distillates. One is the venom extract, the other one is a stabilizer.\"";
+ next;
+ mes "\"We also have the healing potion.\"";
+ next;
+ mes "\"The problem is that I can only guess the concentration of the venom and the stabilizer. My equipment isn't good enough to determine them precisely.\"";
+ next;
+ mes "\"You need to find the right amount of each ingredient. I will tell you what I can know with my analysis methods.\"";
+ next;
+ mes "\"Shall we start?\"";
+ next;
+ menu
+ "Please explain it again.", L_Exp_Game,
+ "Alright.", L_Game;
+
+L_Game:
+ callsub S_Update_Var;
+ // healing, venom, stabilizer
+ callsub L_Load_Need;
+ //descriptions
+ @desc_length = 6;
+
+ setarray @desc$,"very little","only a little", "little","much", "a lot", "very much", "a huge amount";
+
+ @divisor = @count / @desc_length;
+
+ @hlIndex = (@hlNeed-@offset) /@divisor;
+ @vnIndex = (@vnNeed-@offset) /@divisor;
+ @stIndex = (@stNeed-@offset) /@divisor;
+
+ mes "[Nurse]";
+ mes "\"I guess you need " + @desc$[@hlIndex] + " of the healing potion.\"";
+ next;
+ mes "\"You need " + @desc$[@vnIndex] + " of the venom extracts, I suppose.\"";
+ next;
+ mes "\"As far as I can tell you will need " + @desc$[@stIndex] + " of the stabilizer.\"";
+ next;
+
+ if(@hlNeed/@vnNeed > 1 )
+ mes "\"I see that the healing potions are needed at least " + @hlNeed/@vnNeed + " times as much as the venom.\"";
+ if(@vnNeed/@hlNeed > 1 )
+ mes "\"I see that the venom extracts are needed at least " + @vnNeed/@hlNeed + " times as much as the healing potions.\"";
+ if ( (@hlNeed/@vnNeed > 1 ) || (@vnNeed/@hlNeed > 1 ))
+ next;
+
+ if(@stNeed/@vnNeed > 1 )
+ mes "\"I see that the stabilizer is needed at least " + @stNeed/@vnNeed + " times as much as the venom extracts.\"";
+ if(@vnNeed/@stNeed > 1 )
+ mes "\"I see that the venom extracts are needed at least " + @vnNeed/@stNeed + " times as much as the stabilizer.\"";
+ if ((@vnNeed/@stNeed > 1 ) || (@stNeed/@vnNeed > 1 ))
+ next;
+
+ if(@stNeed/@hlNeed > 1 )
+ mes "\"I see that the stabilizer is needed at least " + @stNeed/@hlNeed + " times as much as the healing potions.\"";
+ if(@hlNeed/@stNeed > 1 )
+ mes "\"I see that the healing potions are needed at least " + @hlNeed/@stNeed + " times as much as the stabilizer.\"";
+ if ((@hlNeed/@stNeed > 1 ) || (@stNeed/@hlNeed > 1 ))
+ next;
+ goto L_choosePut;
+
+L_choosePut:
+ @max = @count+@offset-1;
+ @min = @offset;
+ mes "\"My scale goes up to " + @max + ". I suggest to put at least " + @min +" drops on the scale.\"";
+ next;
+
+ mes "\"How many drops of the healing potion should we use?\"";
+ input @hlPut;
+ if (@hlPut < @offset)
+ goto L_Game_tooless;
+ if (@hlPut > @max)
+ goto L_Game_toomuch;
+
+ mes "\"How many drops of the venom extract potion should we use? \"";
+ input @vnPut;
+ if (@vnPut < @offset)
+ goto L_Game_tooless;
+ if (@vnPut > @max)
+ goto L_Game_toomuch;
+
+ mes "\"How many drops of the stabilizer potion should we use? \"";
+ input @stPut;
+ if (@stPut < @offset)
+ goto L_Game_tooless;
+ if (@stPut > @max)
+ goto L_Game_toomuch;
+
+ mes "The nurse puts the potions together according to your instructions. Then she takes a spoon and stirs it.";
+ next;
+ mes "You take the glass and look suspiciously at the liquid, which has changed to an odd colour.";
+ next;
+ mes "[Nurse]";
+ mes "\"Alright, now I will inject the venom into you, then you should drink the antidote immediately. Are you ready?\"";
+ next;
+ mes "You take a deep breath and nod.";
+ next;
+ mes "The nurse take a scary looking syringe out of a drawer and swabs your arm with disinfection dabber.";
+ next;
+ mes "Then she stings the syringe in your vein and pushs it down. After a few seconds, your heart starts pounding quicker and you begin to sweat all over your body.";
+ next;
+ mes "[Nurse]";
+ mes "\"Drink the antidote!\"";
+ next;
+ mes "You lift the glass to your lips and drink it all at once.";
+ next;
+
+ @Q_poison = @Q_poison + 1;
+
+ if ( (@hlPut > @hlNeed) && (@vnPut > @vnNeed) )
+ goto L_m_hl_m_vn;
+ if ( (@hlPut > @hlNeed) && (@vnPut <= @vnNeed) )
+ goto L_m_hl_l_vn;
+ if ( (@hlPut <= @hlNeed) && (@vnPut > @vnNeed) )
+ goto L_hl_m_vn;
+ if ( (@hlPut < @hlNeed) && (@vnPut < @vnNeed) )
+ goto L_hl_l_vn;
+
+ mes "You feel quite normal.";
+ mes "[Nurse]";
+ mes "\"Oh yes, the concentration of the healing potions and the venom extracts seem to be right.\"";
+ next;
+ @hl_vn_ok = 1;
+ goto L_check_st;
+
+L_m_hl_m_vn:
+ //poison for 3 minutes
+ sc_start SC_POISON, 1, 20;
+ mes "You begin to feel really dizzy. And you feel so light - you can't help yourself and burst out with laughter. What a strange feeling!";
+ next;
+ mes "The nurse looks at you with a really worried look on her face. As you open your mouth to tell her that you feel alright, the content of your stomach finds its way out through your throat and on the floor.";
+ next;
+ mes "The feeling of happiness disappears, but you seem to be still poisoned.";
+ goto L_check_st;
+
+L_m_hl_l_vn:
+ //poison for 1 minute
+ sc_start SC_POISON, 1, 20;
+ mes "You feel the pain of the poison weaken. This seems promising. The thought that you might have been successful makes you feel enormously happy.";
+ next;
+ mes "But a few seconds later, you wonder what was the reason for your happiness.";
+ next;
+ mes "Anyway, what are you doing here? Actually, where are you?";
+ next;
+ mes "You don't care, you feel so great. You start to giggle and laugh uncontrollably. What a wonderful feeling. ";
+ next;
+ mes "Suddenly, the world has some really strange colors. As you watch this woman in front of you changing her color from dark green to a light purple, you become really tired.";
+ next;
+ mes "You lay down on the floor and fall asleep.";
+ next;
+ mes "As you open your eyes again, the nurse shines in your face with a lamp and pulls your eyelids open. Then she nods.";
+ next;
+ mes "\"Very well, you are sober again.\"";
+ next;
+ goto L_check_st;
+
+L_hl_m_vn:
+ // first poison for 10 minutes, player will die anyway
+ sc_start SC_POISON, 1, 20;
+ mes "You feel a sting in your stomach and your heart starts pounding loudly.";
+ next;
+ mes "The room is getting dark.";
+ next;
+ mes "...and darker...";
+ next;
+ mes ".......";
+ // bye bye player!
+ heal -Hp, 0;
+ // close instead of telling how much stabilizer is needed
+ goto L_close;
+ // goto L_check_st;
+
+L_hl_l_vn:
+ //poison for 1 minute
+ sc_start SC_POISON, 1, 20;
+ mes "The antidote seems to have no effect.";
+ goto L_check_st;
+
+L_check_st:
+ if ( (@stPut < @stNeed) )
+ goto L_st;
+ if ( (@stPut > @stNeed) )
+ goto L_m_st;
+ if (@hl_vn_ok == 1)
+ goto L_AllCorrect;
+
+ mes "[Nurse]";
+ mes "\"The amount of the stabilizer seems alright, but we have to think again about the other ingredients.\"";
+ next;
+ goto L_NotAllCorrect;
+
+L_st:
+ mes "[Nurse]";
+ mes "\"It looks like we used not enough of the stabilizer. The antidote will lose its effect after some time.\"";
+ next;
+ goto L_NotAllCorrect;
+
+L_m_st:
+ mes "[Nurse]";
+ mes "\"It looks like we used too much of the stabilizer. The antidote will turn into venom again after some time.\"";
+ next;
+ goto L_NotAllCorrect;
+
+L_AllCorrect:
+ mes "You feel totally normal again.";
+ next;
+ mes "[Nurse]";
+ mes "\"Wonderful! You made it! Now I will be able to help all the people who get poisoned in the mines!\"";
+ next;
+ mes "\"Thank you so much! Oh, and it seems as if you have gained the skill to resist poison someway. This is great.\"";
+ next;
+ mes "\"You should talk to someone who can help you to focus on your skills.\"";
+ next;
+ getexp @ANTIDOTE_EXP, 0;
+ updateskill SKILL_RESIST_POISON, 1;
+ @Q_poison = 7;
+ callsub S_Update_Var;
+ goto L_close;
+
+L_NotAllCorrect:
+ mes "[Nurse]";
+ mes "\"It didn't work. You are a really brave person. Now you should rest and recover. I hope you won't give up now. Please come back later, so we can try it again.\"";
+ next;
+ goto L_close;
+
+L_state4:
+ mes "The nurse has a worried look in her face.";
+ mes "[Nurse]";
+ mes "\"Hello. I hope you recovered well.\"";
+ next;
+ mes "\"There is enough of the distillates left to have another try.\"";
+ next;
+ mes "\"Oh no, with all that trouble I forgot to label your distillate.\"";
+ next;
+ mes "She holds up two ampullas.";
+ next;
+ mes "\"I hope this one is yours. I'm sorry.\"";
+ next;
+ mes "\"If you feel ok, we could try it again.\"";
+ next;
+ menu
+ "I still feel a bit dizzy, so I don't want to do it now.", L_Usual,
+ "I'm ok. We can try, but please explain again.", L_Exp_Game,
+ "Let's start right now.", L_Game;
+
+L_state5:
+ mes "The nurse looks at you pitifully.";
+ mes "[Nurse]";
+ mes "\"Hello. I'm really sorry for causing you so much pain.\"";
+ next;
+ mes "\"But if we succeed we will be heroes! I will be able to help a lot of people.\"";
+ next;
+ mes "\"Next time you might remind me to label the distillates correctly. I am sorry that it is screwed up again.\"";
+ next;
+ mes "\"There is enough stuff left for one last try.\"";
+ next;
+ mes "\"If we don't get it this time, you will have to get new ingredients.\"";
+ next;
+ mes "\"Do you want to try again?\"";
+ next;
+ menu
+ "I still feel a bit dizzy, so I don't want to do it now.", L_Usual,
+ "I'm ok. We can try, but please explain again.", L_Exp_Game,
+ "Let's start right now.", L_Game;
+
+L_state6:
+ mes "The nurse looks at you pitifully.";
+ mes "[Nurse]";
+ mes "\"There is not enough stuff left for another try.\"";
+ next;
+ mes "\"We should try again, right?\"";
+ @Q_poison = 1;
+ callsub S_Update_Var;
+ goto L_ExplainAgain1;
+
+L_state7: // geschafft
+ mes "[Nurse]";
+ mes "\"Thanks a lot, you can call yourself a true hero now!\"";
+ next;
+ mes "\"I am able to help the poisoned miners quite well now.\"";
+ next;
+ goto L_Usual;
+
+L_NotEnough:
+ mes "[Nurse]";
+ mes "\"This must be a misunderstanding. You don't have all the things I asked you for.\"";
+ if (@Q_poison == 1)
+ goto L_ExplainAgain1;
+ if (@Q_poison == 2)
+ goto L_ExplainAgain2;
+ // the following close *should* never be reached, but who knows, whoever will mess this script up!
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+
+S_Update_Var:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(@Q_poison_MASK) | (@Q_poison << @Q_poison_SHIFT));
+ return;
+
+L_Game_init_vars:
+ @count = 24;
+ @offset = 1;
+ return;
+
+L_Shuffle_Need:
+ callsub L_Game_init_vars;
+ @hlNeed = @offset + rand(@count);
+ @vnNeed = @offset + rand(@count);
+ @stNeed = @offset + rand(@count);
+
+ set $NPC_NURSE,
+ ($NPC_NURSE & ~(BYTE_0_MASK | BYTE_1_MASK | BYTE_2_MASK)
+ | (@hlNeed << BYTE_0_SHIFT)
+ | (@vnNeed << BYTE_1_SHIFT)
+ | (@stNeed << BYTE_2_SHIFT));
+ return;
+
+L_Load_Need:
+ callsub L_Game_init_vars;
+ @hlNeed = ($NPC_NURSE & BYTE_0_MASK) >> BYTE_0_SHIFT;
+ @vnNeed = ($NPC_NURSE & BYTE_1_MASK) >> BYTE_1_SHIFT;
+ @stNeed = ($NPC_NURSE & BYTE_2_MASK) >> BYTE_2_SHIFT;
+ return;
+
+L_Game_tooless:
+ mes "[Nurse]";
+ mes "\"That is nothing! You need to put in there at least a small amount.";
+ goto L_choosePut;
+
+L_Game_toomuch:
+ mes "[Nurse]";
+ mes "\"This would be way too much for my scale. I don't want to break it.\"";
+ goto L_choosePut;
+}
diff --git a/npc/009-2/olana.txt b/npc/009-2/olana.txt
new file mode 100644
index 00000000..c6eff147
--- /dev/null
+++ b/npc/009-2/olana.txt
@@ -0,0 +1,238 @@
+
+009-2,63,79,0 script Olana NPC190,{
+ @minLevel = 60;
+
+ @Cherry_Amount = 10;
+ @Cherry_EXP = 1000;
+ @Cherry_Money = 1000;
+
+ @RedRose_Amount = 15;
+ @RedTulip_Amount = 15;
+ @Flower_Money = 1500;
+
+ @Finish_EXP = 5000;
+ @Finish_Money = 5000;
+
+ if (FLAGS & FLAG_ROSSI_COMPLETED) goto L_FinalEnd;
+ if (Rossy_Quest == 17 || Rossy_Quest == 18) goto L_End;
+
+ if (Rossy_Quest >= 14 && Rossy_Quest <= 16) goto L_Julia;
+ if (Rossy_Quest == 13) goto L_Best;
+ if (Rossy_Quest == 12) goto L_Give;
+ if (Rossy_Quest == 11) goto L_Allergic;
+ if (Rossy_Quest == 10) goto L_BringRose;
+ if (Rossy_Quest == 9) goto L_RC;
+ if (Rossy_Quest == 8) goto L_Rose;
+ if (Rossy_Quest >= 6 && Rossy_Quest < 8) goto L_BL;
+ if (Rossy_Quest == 5) goto L_Bring;
+ if (Rossy_Quest == 4) goto L_See;
+ if (Rossy_Quest == 3) goto L_Worried;
+ if (Rossy_Quest == 1 || Rossy_Quest == 2) goto L_Daughter;
+
+ mes "[Olana]";
+ mes "\"Hello. We don't usually get guests back here.\"";
+ next;
+ mes "\"My name is Olana and my father owns this inn. I live in Tulimshar, but came to Hurnscald on vacation with my two young daughters, Rossy and Julia.\"";
+ if (BaseLevel < @minLevel) close;
+ next;
+ mes "\"I let my two lovely girls play in the woods nearby but they haven't come back yet!\"";
+ next;
+ mes "Olana suddenly looks very pale and starts to shiver.";
+ next;
+ mes "\"I'm starting to get a bad feeling about this. If you go to the forest near the swamps, could you see if you can find my daughters? I need to know if they are safe!\"";
+ menu
+ "Sure, I can do that.", L_Next,
+ "I am sorry, I don't usually go to that area.", L_No;
+
+L_Next:
+ Rossy_Quest = 1;
+ close;
+
+L_Daughter:
+ mes "Olana looks really worried - she seems about to burst into tears.";
+ mes "[Olana]";
+ mes "\"I would be relieved if you could look for my daughters.";
+ mes "They must be playing in the forest near the swamps.\"";
+ if (Rossy_Quest == 1)
+ close;
+ next;
+ menu
+ "Wait, I saw Rossy, she is fine.", L_Help,
+ "Hey, don't worry, I'm sure they'll be back soon.", L_No;
+
+L_No:
+ close;
+
+L_Help:
+ mes "[Olana]";
+ mes "\"Oh you did? That's good. I'm relieved. But what about Julia?\"";
+ next;
+ menu
+ "I haven't found Julia yet, sorry.", L_Next1;
+
+L_Next1:
+ mes "\"Ok. They must be playing hide and seek. Thanks again... I can't express how grateful I am.\"";
+ Rossy_Quest = 3;
+ close;
+
+L_Worried:
+ mes "Olana smiles at you, trying to show some happiness, but her facial expression only conveys tension and preoccupation.";
+ next;
+ mes "You suddenly remember that Rossy asked for your help to collect some fruits. Maybe she could also have some ideas on how to cheer her mother up.";
+ close;
+
+L_See:
+ if (gotcherry == 1)
+ goto L_Task;
+ if (countitem("Cherry") < @Cherry_Amount)
+ goto L_Worried;
+ delitem "Cherry", @Cherry_Amount;
+ menu
+ "Hi, Rossy asked me to give you this. She says it is a gift from both her and Julia.", L_Next2;
+
+L_Next2:
+ mes "[Olana]";
+ mes "\"Ohhh... How sweet... Sometimes Rossy impresses me with her kindness. Here... You are spending so much time helping us, and we give nothing back. Take this as a small reward.\"";
+ getexp @Cherry_EXP, 0;
+ Zeny = Zeny + @Cherry_Money;
+ gotcherry = 1;
+ goto L_Task;
+
+L_Task:
+ mes "[Olana]";
+ mes "\"I know I barely know you, but can I ask you for a small favor?\"";
+ menu
+ "Sure, tell me about it.", L_Cont,
+ "No, sorry, I'm busy.", L_No;
+
+L_Cont:
+ mes "[Olana]";
+ mes "\"Would you mind giving this letter to my little Rossy? Today is the last day for her final exam, and I know my daughter. If I don't remind her, she will surely forget about it and flunk the exam. I would deliver the letter myself, but I can't walk, my aching knees...\"";
+ menu
+ "Of course I can. Hand me the letter, I'll give it to Rossy as soon as I see her.", L_Let,
+ "No, sorry, I'm not interested in that sort of task. Hand it to her yourself.", L_No;
+
+L_Let:
+ mes "[Olana]";
+ Rossy_Quest = 5;
+ gotcherry = 0;
+ mes "\"Thank you again. Please, bring it to her as fast as you can.\"";
+ close;
+
+L_Bring:
+ mes "[Olana]";
+ mes "\"Please, bring this letter to my daughter as fast as you can.\"";
+ close;
+
+L_BL:
+ mes "[Olana]";
+ mes "\"Good, now she won't forget her final exam.\"";
+ close;
+
+L_Rose:
+ menu
+ "Hi, Rossy did great in the exam. David told me her potion was flawless.", L_Next3;
+
+L_Next3:
+ mes "[Olana]";
+ mes "\"Wow! Really? That is great! I would like to congratulate my little Rossy. Would you mind helping me a little more?\"";
+ menu
+ "Just tell me what to do.", L_Next4,
+ "No, I'm busy, maybe later.", L_No;
+
+L_Next4:
+ mes "[Olana]";
+ mes "\"Can you bring me " + @RedRose_Amount + " Red Roses? I would like to give them to Rossy. I am sure she will love them!\"";
+ menu
+ "Ok, I will be back with the roses.", L_RG,
+ "I'm allergic to roses, can't even touch them. Sorry.", L_No;
+
+L_RG:
+ if (Rossy_Quest == 8)
+ Rossy_Quest = 9;
+ mes "[Olana]";
+ mes "\"Please, bring me " + @RedRose_Amount + " Red Roses as soon as you can.\"";
+ close;
+
+L_RC:
+ if(countitem("RedRose") < @RedRose_Amount)
+ goto L_RG;
+ mes "[Olana]";
+ Rossy_Quest = 10;
+ mes "\"Great job! Please hand them to my brilliant daughter, Rossy.\"";
+ close;
+
+L_BringRose:
+ mes "[Olana]";
+ mes "\"Now please hand them to my brilliant daughter, Rossy.\"";
+ close;
+
+L_Allergic:
+ mes "[Olana]";
+ mes "\"Did she like my present?\"";
+ menu
+ "Sure she did...", L_No,
+ "Well, you should have known that your daughter is allergic to roses.", L_Next5;
+
+L_Next5:
+ Rossy_Quest = 12;
+ mes "[Olana]";
+ mes "\"Oh, how stupid I am! Here, take some of my money and buy Red Tulips instead, the same amount. Keep the flowers.\"";
+ Zeny = Zeny + @Flower_Money;
+ next;
+ mes "\"Please, tell Rossy I am really sorry. My mind was on Julia when I asked you to bring the red roses, they are her favorite.\"";
+ menu
+ "I will give her the tulips when I see her.", L_Next6;
+
+L_Next6:
+ mes "[Olana]";
+ mes "\"Thank you. And don't forget to tell her that I'm really sorry.\"";
+ close;
+
+L_Give:
+ mes "[Olana]";
+ mes "\""+ strcharinfo(0) +", please, get " + @RedTulip_Amount + " Red Tulips and hand them to Rossy. Don't forget to tell her that I'm really sorry.\"";
+ close;
+
+L_Best:
+ mes "[Olana]";
+ mes "\"Thank you for your help "+ strcharinfo(0) +"!\"";
+ close;
+
+L_Julia:
+ mes "[Olana]";
+ mes "\"Oh no, I can't take this anymore. Something must have happened... Where is Julia? I want to know where she is! Please, find her "+ strcharinfo(0) +"!\"";
+ close;
+
+L_End:
+ mes "[Olana]";
+ mes "\"Where is Julia? I want to know where she is! Please, find her "+ strcharinfo(0) +"!\"";
+ menu
+ "She'll be back soon, trust me. I saved her from an evil spirit.", L_Found,
+ "I haven't seen her yet, sorry.", L_No;
+
+L_Found:
+ mes "[Olana]";
+ if (Rossy_Quest == 17)
+ Rossy_Quest = 18;
+ if (Rossy_Quest == 18)
+ Rossy_Quest = 19;
+ mes "\"Thank you "+ strcharinfo(0) +", thank you! Here is a reward for you.\"";
+ getexp @Finish_EXP, 0;
+ Zeny = Zeny + @Finish_Money;
+ if (Rossy_Quest == 19)
+ goto L_Clear;
+ close;
+
+L_Clear:
+ Rossy_Quest = 0;
+ cavefights = 0;
+ FLAGS = FLAGS | FLAG_ROSSI_COMPLETED;
+ close;
+
+L_FinalEnd:
+ mes "[Olana]";
+ mes "\"Thanks again for your help.";
+ mes "I hope the girls will come home soon enough for dinner.\"";
+ close;
+}
diff --git a/npc/009-2/peter.txt b/npc/009-2/peter.txt
new file mode 100644
index 00000000..b48ebe4a
--- /dev/null
+++ b/npc/009-2/peter.txt
@@ -0,0 +1,153 @@
+009-2,183,57,0 script #PeterShop NPC32767,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Knife;
+ sellitem SharpKnife;
+ sellitem Dagger;
+ .distance = 5;
+ end;
+}
+
+009-2,183,57,0 script Peter NPC157,{
+ @peter_chain_mail_coal = 10;
+ @peter_chain_mail_ingot = 5;
+ @peter_chain_mail_money = 20000;
+
+ @peter_light_plate_coal = 20;
+ @peter_light_plate_ingot = 10;
+ @peter_light_plate_money = 50000;
+
+ @peter_warlord_plate_coal = 30;
+ @peter_warlord_plate_ingot = 15;
+ @peter_warlord_plate_money = 100000;
+
+ @peter_warlord_boots_coal = 16;
+ @peter_warlord_boots_ingot = 8;
+ @peter_warlord_boots_money = 35000;
+
+ mes "[Peter]";
+ mes "\"Hello, I am Peter, apprentice to Nicholas.\"";
+ next;
+ mes "\"I can make you some sturdy armor: you must give me Iron Ingots to craft with and some gold pieces for my efforts.\"";
+ next;
+ mes "[Peter]";
+ mes "\"What would you like me to make?\"";
+ menu
+ "Chain Mail ("+@peter_chain_mail_coal+" coal, "+@peter_chain_mail_ingot+" ingots and "+@peter_chain_mail_money+" GP).", L_Peter_Chain_Mail,
+ "Light Plate ("+@peter_light_plate_coal+" coal, "+@peter_light_plate_ingot+" ingots and "+@peter_light_plate_money+" GP).", L_Peter_Light_Plate,
+ "Warlord Plate ("+@peter_warlord_plate_coal+" coal, "+@peter_warlord_plate_ingot+" ingots and "+@peter_warlord_plate_money+" GP).", L_Peter_Warlord_Plate,
+ "Do you know anything else than armor crafting?", L_Peter_New_Skills,
+ "Do you have anything else for sale?", L_Shop,
+ "Nevermind.", L_close;
+
+L_Peter_Chain_Mail:
+ @peter_crafting_coal = @peter_chain_mail_coal;
+ @peter_crafting_iron_ingot = @peter_chain_mail_ingot;
+ @peter_crafting_money = @peter_chain_mail_money;
+ @peter_crafting_item$ = "ChainmailShirt";
+ callsub S_Smithery_Item;
+ goto L_close;
+
+L_Peter_Light_Plate:
+ @peter_crafting_coal = @peter_light_plate_coal;
+ @peter_crafting_iron_ingot = @peter_light_plate_ingot;
+ @peter_crafting_money = @peter_light_plate_money;
+ @peter_crafting_item$ = "LightPlatemail";
+ callsub S_Smithery_Item;
+ goto L_close;
+
+L_Peter_Warlord_Plate:
+ @peter_crafting_coal = @peter_warlord_plate_coal;
+ @peter_crafting_iron_ingot = @peter_warlord_plate_ingot;
+ @peter_crafting_money = @peter_warlord_plate_money;
+ @peter_crafting_item$ = "WarlordPlate";
+ callsub S_Smithery_Item;
+ goto L_close;
+
+L_Peter_New_Skills:
+ mes "[Peter]";
+ mes "\"Actually, Nicholas, my master, taught me new smithery techniques.";
+ mes "My very first creation are new kind of steel boots. Interested ? That would be "+@peter_warlord_boots_coal+" Coals, "+@peter_warlord_boots_ingot+" Iron Ingots and "+@peter_warlord_boots_money+" GP.\"";
+ menu
+ "Sure!", L_Peter_Warlord_Boots,
+ "No thanks, that sounds too heavy for me.", L_close;
+
+L_Shop:
+ close2;
+ shop "#PeterShop";
+
+L_Peter_Warlord_Boots:
+ @peter_crafting_coal = @peter_warlord_boots_coal;
+ @peter_crafting_iron_ingot = @peter_warlord_boots_ingot;
+ @peter_crafting_money = @peter_warlord_boots_money;
+ @peter_crafting_item$ = "WarlordBoots";
+ callsub S_Smithery_Item;
+ goto L_close;
+
+S_Smithery_Item:
+ if (Zeny < @peter_crafting_money)
+ goto L_Peter_NotEnough_Zeny;
+ if (countitem("IronIngot") < @peter_crafting_iron_ingot)
+ goto L_Peter_NotEnough_Ingot;
+ if (countitem("Coal") < @peter_crafting_coal)
+ goto L_Peter_NotEnough_Coal;
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Peter_TooMany;
+ Zeny = Zeny - @peter_crafting_money;
+ delitem "IronIngot", @peter_crafting_iron_ingot;
+ delitem "Coal", @peter_crafting_coal;
+ getitem @peter_crafting_item$, 1;
+ mes "[Peter]";
+ mes "\"Here you go!\"";
+ return;
+
+L_Peter_NotEnough_Zeny:
+ mes "[Peter]";
+ mes "\"You don't have enough gold.\"";
+ goto L_close;
+
+L_Peter_NotEnough_Ingot:
+ mes "[Peter]";
+ mes "\"You don't have enough ingots.\"";
+ goto L_close;
+
+L_Peter_NotEnough_Coal:
+ mes "[Peter]";
+ mes "\"You don't have enough Coal.\"";
+ goto L_close;
+
+L_Peter_TooMany:
+ mes "[Peter]";
+ mes "\"You have too much stuff. Please get rid of something if you want some armor.\"";
+ goto L_close;
+
+L_close:
+ // Clear all local variables
+ @peter_chain_mail_coal = 0;
+ @peter_chain_mail_ingot = 0;
+ @peter_chain_mail_money = 0;
+
+ @peter_light_plate_coal = 0;
+ @peter_light_plate_ingot = 0;
+ @peter_light_plate_money = 0;
+
+ @peter_warlord_plate_coal = 0;
+ @peter_warlord_plate_ingot = 0;
+ @peter_warlord_plate_money = 0;
+
+ @peter_warlord_boots_coal = 0;
+ @peter_warlord_boots_ingot = 0;
+ @peter_warlord_boots_money = 0;
+
+ @peter_crafting_coal = 0;
+ @peter_crafting_iron_ingot = 0;
+ @peter_crafting_money = 0;
+ @peter_crafting_item$ = "";
+ close;
+
+}
diff --git a/npc/009-2/richard.txt b/npc/009-2/richard.txt
new file mode 100644
index 00000000..287ddb7c
--- /dev/null
+++ b/npc/009-2/richard.txt
@@ -0,0 +1,6 @@
+
+009-2,20,99,0 script Richard NPC161,{
+ @npcname$ = "Richard";
+ callfunc "Banker";
+ close;
+}
diff --git a/npc/009-2/selim.txt b/npc/009-2/selim.txt
new file mode 100644
index 00000000..9f757c2a
--- /dev/null
+++ b/npc/009-2/selim.txt
@@ -0,0 +1,173 @@
+009-2,32,104,0 script Selim NPC326,{
+ goto L_Main;
+
+L_Main:
+ mes "[Selim]";
+ mes "\"Greetings, fair traveler. With what may I help you?\"";
+ menu
+ "Greetings, are you the store merchant?", L_Ask_selim,
+ "But what are dyes and what purpose do they serve?", L_Ask_dye,
+ "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.";
+ mes "For that, you would need to visit Candide in the Tulimshar marketplace.\"";
+ goto L_Main;
+
+L_Ask_selim:
+ mes "[Selim]";
+ mes "\"That is an honest mistake you have made.";
+ mes "However I am not the merchant, but rather a Master Dyer here to serve the good people of this town.";
+ mes "I dye things, upon request.\"";
+ menu
+ "But what are dyes and where can I get them?", L_Ask_dye,
+ "Can you dye something for me?", L_clothes_choice,
+ "Can you also remove color from clothing?", L_Ask_bleach,
+ "Good bye.", L_close;
+
+L_Ask_dye:
+ mes "[Selim]";
+ mes "\"Dyes are special liquids used to add color to clothing. If you want me to dye something for you you will have to bring me some dye first.";
+ mes "Those behind me are nearly empty and won't last for your item.\"";
+ menu
+ "What do you mean, `bring you dye'?", L_explain_dye,
+ "Where would I get dye?", L_explain_dye,
+ "Good bye.", L_close;
+
+L_clothes_choice:
+ cleararray @items$, "", getarraysize(@items$);
+ cleararray @item_names$, "", getarraysize(@item_names$);
+ @r = 0;
+ @j = getarraysize($@DYE_items$);
+ goto L_CloneArray; // clone the array from DyeConfig
+
+L_CloneArray:
+ @items$[@r] = $@DYE_items$[@r];
+ @item_names$[@r] = $@DYE_item_names$[@r];
+ @r = @r + 1;
+ if(@r < @j) goto L_CloneArray;
+ @r = 0;
+ @j = 0;
+ goto L_clothes_choice2;
+
+L_clothes_choice2:
+ mes "[Selim]";
+ mes "\"What can I dye for you today?\"";
+ next;
+ callfunc "DynamicItemMenu$";
+ @default_choice$ = "";
+ @item_del$ = @item$;
+ @name$ = @item_names$[@index];
+ cleararray @items$, "", getarraysize(@items$);
+ cleararray @item_names$, "", getarraysize(@item_names$);
+ if(@item$ == "") goto L_close;
+ goto L_picked_item;
+
+
+L_Asksorcererrobe:
+ mes "[Selim]";
+ mes "\"Yes?\"";
+ next;
+ menu
+ "Do you think you can dye that line to a different color?", L_Next1;
+
+L_Next1:
+ mes "[Selim]";
+ mes "\"Hum, I fear I can't do that. The area is too small and I can operate only on large ones.";
+ mes "But with the appropriate materials, maybe a talented tailor can make the change.\"";
+ next;
+ menu
+ "Oh, I see!", L_Next;
+
+L_Next:
+ mes "[Selim]";
+ mes "\"Of course I can help you by dyeing the materials your tailor will want.";
+ mes "All I need is a piece of Cotton Cloth.\"";
+ @item_del$ = "CottonCloth";
+ @name$ = "Cotton Cloth";
+ menu
+ "Sure. Here is one.", L_picked_item,
+ "I have to go pick that.", L_close;
+
+L_picked_item:
+ if (countitem(@item_del$) == 0) goto L_havenone;
+ goto L_colour;
+
+L_colour:
+ mes "[Selim]";
+ mes "\"Excellent. Now, what color do you want?\"";
+ next;
+ @r = 0;
+ @j = getarraysize($@DYE_colors$);
+ cleararray @items$, "", getarraysize(@items$);
+ cleararray @item_names$, "", getarraysize(@item_names$);
+ callsub S_CloneColors;
+ @default_choice$ = "I have no dye.";
+ callfunc "DynamicItemMenu$";
+ cleararray @items$, "", getarraysize(@items$);
+ cleararray @item_names$, "", getarraysize(@item_names$);
+ @default_choice$ = "";
+ if (@item$ == "") goto L_No_dye;
+ @colour = @index;
+ goto L_Finish;
+
+S_CloneColors:
+ @items$[@r] = $@DYE_colors$[@r] + "Dye";
+ @item_names$[@r] = $@DYE_color_names$[@r];
+ @r = @r + 1;
+ if(@r < @j) goto S_CloneColors;
+ @r = 0;
+ @j = 0;
+ return;
+
+L_No_dye:
+ mes "[Selim]";
+ mes "\"I would love to dye your " + @name$ + " for you, but you will have to bring me some dye first.";
+ mes "Those behind me are nearly empty and won't last for your item.\"";
+ next;
+ menu
+ "I wanted to dye a different item anyway.", L_clothes_choice,
+ "What do you mean, `bring you dye'?", L_explain_dye,
+ "Where would I get dye?", L_explain_dye,
+ "Never mind.", L_close;
+
+L_explain_dye:
+ if (QUEST_clothdyer_knowsdye < 1)
+ QUEST_clothdyer_knowsdye = 1;
+ mes "[Selim]";
+ mes "\"Well, dye is very expensive, and since I don't charge adventurers anything, I can't give you any for free.";
+ mes "But most alchemists can make dye; perhaps you can find one around here.\"";
+ goto L_close;
+
+L_Finish:
+ if(getitemlink($@DYE_colors$[@colour] + @item_del$) == "Unknown Item") mapexit;
+ if(countitem(@item_del$) < 1) goto L_havenone;
+ delitem @item$, 1;
+ delitem @item_del$, 1;
+ getitem $@DYE_colors$[@colour] + @item_del$, 1;
+ mes "[Selim]";
+ mes "\"Here's your " + $@DYE_color_names$[@colour] + " " + @name$ + "! Please let dry for a minute.\"";
+ goto L_close;
+
+L_havenone:
+ mes "[Selim]";
+ mes "\"You don't have any uncolored " + @name$ + "? That's unfortunate.";
+ mes "Would you like to dye something else?\"";
+ next;
+ goto L_clothes_choice;
+
+L_close:
+ mes "\"Farewell and good luck in your journeys!\"";
+ close2;
+ emotion EMOTE_WINK, strcharinfo(0);
+ end;
+}
diff --git a/npc/009-2/shops.txt b/npc/009-2/shops.txt
new file mode 100644
index 00000000..5269ab9b
--- /dev/null
+++ b/npc/009-2/shops.txt
@@ -0,0 +1,75 @@
+// The Mana World Script
+// (C) Jesusalva, 2021
+// Licensed under GPLv2 or later
+
+009-2,65,49,0 script Barkeeper NPC112,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Beer;
+ sellitem Cake;
+ sellitem Steak;
+ .distance = 5;
+ end;
+}
+
+009-2,97,24,0 script Donald NPC120,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem SlingBullet;
+ sellitem Arrow, 2;
+ sellitem IronArrow;
+ sellitem Bow;
+ sellitem ShortBow, 4000;
+ .distance = 5;
+ end;
+}
+
+009-2,123,22,0 script Potions#_M NPC400,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem CactusDrink;
+ sellitem CactusPotion;
+ sellitem IronPotion;
+ sellitem ConcentrationPotion;
+ sellitem SlowPoisonPotion;
+ .distance = 5;
+ end;
+}
+
+009-2,32,99,0 script General Store#hurnscald NPC112,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Milk;
+ sellitem BottleOfWater;
+ sellitem CottonShirt;
+ sellitem CottonShorts;
+ sellitem Boots;
+ sellitem SerfHat;
+ sellitem CottonHeadband;
+ sellitem CottonGloves;
+ .distance = 5;
+ end;
+}
+
+009-2,50,48,0 script Receptionist#inn NPC108,{
+ @npcname$ = "Receptionist";
+ @Cost = 100;
+ callfunc "Inn";
+ end;
+}
diff --git a/npc/009-2/trader.txt b/npc/009-2/trader.txt
new file mode 100644
index 00000000..ff1076e5
--- /dev/null
+++ b/npc/009-2/trader.txt
@@ -0,0 +1,153 @@
+
+009-2,29,98,0 script Trader NPC115,{
+ @ironprice = 1000;
+ @Sulphurprice = 1200;
+ @Potionprice = 500;
+ if (BaseLevel >= 25) goto L_Trade;
+
+ mes "[Trader]";
+ mes "\"Hello. I came here to trade wares with the people of Hurnscald. Unfortunately for you, I've traded everything I had.\"";
+ next;
+ menu
+ "Oh. I'll go then.", L_close,
+ "You don't have anything?", L_More;
+
+L_More:
+ mes "[Trader]";
+ mes "\"No. I have nothing for you. Except...\"";
+ next;
+ menu
+ "Yes?", L_Except,
+ "Ok then.", L_close;
+
+L_Except:
+ mes "[Trader]";
+ mes "\"I could teach you how to trade. It'll cost you 2GP.\"";
+ next;
+ menu
+ "Sure.", L_Teach,
+ "No thank you.", L_close;
+
+L_Teach:
+ if (Zeny < 2) goto L_NotEnoughMoney;
+ Zeny = Zeny - 2;
+ mes "[Trader]";
+ mes "\"You can initiate trade with someone by right-clicking on them and choosing trade.";
+ mes "You'll both add the items and set the GP you're putting up then press propose trade.";
+ mes "After both parties have proposed their side, you can both review the trade, and then accept or reject by closing the window.\"";
+ next;
+ mes "[Trader]";
+ mes "\"Items added to the trade cannot be removed, and so mistakes have to be dealt with by canceling the trade.";
+ mes "You need to press the change button to let the other person know about GP changes.\"";
+ next;
+ goto L_Later;
+
+L_Later:
+ mes "[Trader]";
+ mes "\"Please feel free to check back later. I'm expecting a large shipment of goods to trade.\"";
+ goto L_close;
+
+L_Trade:
+ mes "[Trader]";
+ mes "\"Welcome back! My shipment came in and I have a bunch of things that I can trade now. What would you like?\"";
+ goto L_Trademenu;
+
+L_Trademenu:
+ menu
+ "Do you have Iron Powder?", L_Iron,
+ "How about Sulphur Powder?", L_Sulphur,
+ "I need Medium Healing Potions.", L_Healpots,
+ "I think I have everything I need, thanks.", L_close;
+
+L_Iron:
+ mes "[Trader]";
+ mes "\"I do have a few of those. I will give you 4 Iron Powders for 1 Iron Ore and " + @ironprice + "gp.\"";
+ menu
+ "Sure.", L_Ipowder,
+ "What a ripoff! No way!", L_close;
+
+L_Sulphur:
+ mes "[Trader]";
+ mesq l("I can trade you %d %ss for %d %s and %d GP.",
+ 20, getitemlink(SulphurPowder),
+ 1, getitemlink(PileOfAsh),
+ @Sulphurprice);
+ menu
+ "Here you go.", L_Spowder,
+ "Are you nuts?! Forget it!", L_close;
+
+L_Healpots:
+ mes "[Trader]";
+ mes "\"Healing potions are always useful, but I rarely need anything larger than the small ones. I will happily trade you 1 Medium Healing Potion for 3 Small Healing Potions and " + @Potionprice + "gp.\"";
+ menu
+ "Alright.", L_Pots,
+ "Whoa, that's way too much.", L_close;
+
+L_Ipowder:
+ if (countitem("IronOre") < 1) goto L_Missing;
+ if (Zeny < @ironprice) goto L_NotEnoughMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("IronOre") > 1 && countitem("IronPowder") < 1) goto L_Full;
+ delitem "IronOre", 1;
+ Zeny = Zeny - @ironprice;
+ getitem "IronPowder", 4;
+ mes "[Trader]";
+ mes "\"There you go. Would you like to trade anything else?\"";
+ menu
+ "Yes.", L_Trademenu,
+ "No.", L_No;
+
+L_Spowder:
+ if (countitem("PileOfAsh") < 1) goto L_Missing;
+ if (Zeny < @Sulphurprice) goto L_NotEnoughMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("PileOfAsh") > 1 && countitem("SulphurPowder") < 1) goto L_Full;
+ delitem "PileOfAsh", 1;
+ Zeny = Zeny - @Sulphurprice;
+ getitem "SulphurPowder", 20;
+ mes "[Trader]";
+ mes "\"There you go. Would you like to trade anything else?\"";
+ menu
+ "Yes.", L_Trademenu,
+ "No.", L_No;
+
+L_Pots:
+ if (countitem("SmallHealingPotion") < 3) goto L_Missing;
+ if (Zeny < @Potionprice) goto L_NotEnoughMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("SmallHealingPotion") > 3 && countitem("MediumHealingPotion") < 1) goto L_Full;
+ delitem "SmallHealingPotion", 3;
+ Zeny = Zeny - @Potionprice;
+ getitem "MediumHealingPotion", 1;
+ mes "[Trader]";
+ mes "\"There you go. Would you like to trade anything else?\"";
+ menu
+ "Yes.", L_Trademenu,
+ "No.", L_No;
+
+L_Full:
+ mes "[Trader]";
+ mes "\"You must have been making a lot of trades...your bag is completely full! Come back after you've made some room.\"";
+ goto L_close;
+
+L_Missing:
+ mes "[Trader]";
+ mes "\"It looks like you're missing some items. Please come back when you have enough to trade.\"";
+ goto L_close;
+
+L_NotEnoughMoney:
+ mes "[Trader]";
+ mes "\"You don't have enough money.\"";
+ goto L_close;
+
+L_No:
+ mes "[Trader]";
+ mes "\"Have a great day!\"";
+ goto L_close;
+
+L_close:
+ @ironprice = 0;
+ @Sulphurprice = 0;
+ @Potionprice = 0;
+ close;
+}
diff --git a/npc/009-2/waitress.txt b/npc/009-2/waitress.txt
new file mode 100644
index 00000000..6c7ceb5b
--- /dev/null
+++ b/npc/009-2/waitress.txt
@@ -0,0 +1,71 @@
+
+009-2,60,52,0 script Melinda NPC140,{
+ mes "[Melinda]";
+ mes "\"Hi, sweetie! Want a fresh beer for 170 GP?\"";
+ next;
+
+ menu
+ "\"Sure! [don't tip]\"", L_NoTip,
+ "Sure! [tip 5 GP]", L_5Tip,
+ "Sure! [tip 10 GP]", L_10Tip,
+ "Nah, maybe later.", L_No;
+
+L_NoTip:
+ if (Zeny < 170)
+ goto L_NoMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("Beer") == 0)
+ goto L_TooMany;
+ Zeny = Zeny - 170;
+ getitem "Beer", 1;
+ mes "[Melinda]";
+ mes "Pff... nickel nurser!";
+ close;
+
+L_5Tip:
+ if (Zeny < 175)
+ goto L_NoMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("Beer") == 0)
+ goto L_TooMany;
+ Zeny = Zeny - 175;
+ getitem "Beer", 1;
+ mes "[Melinda]";
+ mes "\"Here you go, sweetheart!\"";
+ close;
+
+L_10Tip:
+ if (Zeny < 180)
+ goto L_NoMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("Beer") == 0)
+ goto L_TooMany;
+ Zeny = Zeny - 180;
+ getitem "Beer", 1;
+ mes "[Melinda]";
+ mes "\"Thank you, sweetie! Want to hear a secret?\"";
+ next;
+ menu
+ "What is it, darling?", L_Next,
+ "Nah, I don't feel like chatting.", L_No;
+
+L_Next:
+ mes "[Melinda]";
+ mes "\"The master bowyer in this village used to construct exceptional bows. When you want one you should go and ask him.\"";
+ close;
+
+L_No:
+ mes "[Melinda]";
+ mes "\"Just call me when you've changed your mind.\"";
+ close;
+
+L_NoMoney:
+ mes "[Melinda]";
+ mes "\"You look broke. Don't think that you can dine and dash here!\"";
+ close;
+
+L_TooMany:
+ mes "[Melinda]";
+ mes "\"You don't have room for a beer!\"";
+ close;
+}
diff --git a/npc/009-2/wyara.txt b/npc/009-2/wyara.txt
new file mode 100644
index 00000000..88a32dee
--- /dev/null
+++ b/npc/009-2/wyara.txt
@@ -0,0 +1,553 @@
+009-2,121,26,0 script Wyara#_M NPC103,{
+ @Q_MASK = NIBBLE_2_MASK;
+ @Q_SHIFT = NIBBLE_2_SHIFT;
+ @Q_status = (QUEST_MAGIC2 & @Q_MASK) >> @Q_SHIFT;
+
+ // Set up SkillUp function
+ @SUP_id = SKILL_MAGIC_NATURE;
+ @SUP_name$ = "Nature Magic";
+
+ @STATUS_INITIAL = 0;
+ @STATUS_PURIFY_EXPLAINED = 1;
+ @STATUS_PURIFY_ONCE = 2;
+ @STATUS_PURIFY_TWICE = 3;
+ @STATUS_PURIFY_OVER = 4;
+ @STATUS_MAX = @STATUS_PURIFY_OVER;
+
+ // This operation works around an earlier possible corruption of this state
+ if (@Q_status > @STATUS_MAX)
+ @Q_status = @STATUS_INITIAL;
+ if ((@Q_status == @STATUS_PURIFY_OVER) && (getskilllv(SKILL_MAGIC_NATURE) < 2))
+ @Q_status = @STATUS_INITIAL;
+ callsub S_Update_Var;
+
+ @has_magic = getskilllv(SKILL_MAGIC);
+
+ if (@Q_status == @STATUS_PURIFY_ONCE) goto L_M_purify_once;
+ if (@Q_status == @STATUS_PURIFY_TWICE) goto L_M_purify_done;
+
+ mes "[Wyara the witch]";
+ mes "\"Greetings, fair traveller! What can I do for you?\"";
+ next;
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_WYARA;
+ goto L_Main;
+
+L_Main:
+ if (!@has_magic && (MAGIC_FLAGS & MFLAG_TOUCHED_MANASEED))
+ menu
+ "What do you know about...", L_Question,
+ "Can you help me use the mana seed?", L_Q_manaseed_unabsorbed,
+ "Can you help me learn magic?", L_Magic,
+ "I would like to buy potions.", L_Shop,
+ "Can you reset my stats?", L_StatReset,
+ "Bye!", L_close;
+ if (!(!@has_magic && (MAGIC_FLAGS & MFLAG_TOUCHED_MANASEED)))
+ menu
+ "What do you know about...", L_Question,
+ "Can you help me learn magic?", L_Magic,
+ "I would like to buy potions.", L_Shop,
+ "Can you reset my stats?", L_StatReset,
+ "Bye!", L_close;
+ goto L_Shop;
+
+L_Shop:
+ mesn l("Wyara the Witch");
+ mes "\"Please have a look at the shelf behind me.\"";
+ close;
+
+L_StatReset:
+ @npcname$ = "Wyara";
+ callfunc "StatReset";
+ goto L_close;
+
+L_Question:
+ callfunc "MagicTalkOptionsSetup";
+ @ignore = @QQ_WYARA;
+ callfunc "MagicTalkMenu";
+
+ if (@c == 0) goto L_Main;
+ if (@c == @QQ_ELANORE) goto L_Q_elanore;
+ if (@c == @QQ_MANASEED) goto L_Q_manaseed;
+ if (@c == @QQ_MANAPOTION) goto L_Q_manapotion;
+ if (@c == @QQ_SAGATHA) goto L_Q_sagatha;
+ if (@c == @QQ_AULDSBEL) goto L_Q_auldsbel;
+ if (@c == @QQ_IMP) goto L_Q_imp;
+ if (@c == @QQ_OLDWIZ) goto L_Q_old_wizard;
+ if (@c == @QQ_ASTRALSOUL) goto L_Q_astralsoul;
+
+ mesn l("Wyara the Witch");
+ mes "\"I fear that I can't help you with that.\"";
+ next;
+ goto L_Main;
+
+
+L_Q_astralsoul:
+ mesn l("Wyara the Witch");
+ mes "\"The astral soul skill? Yes, I have heard about that. It can be taught by old and wise mages usually.\"";
+ next;
+ mes "\"You need lots of practise until you can handle the ability, and even more practise until you have the powers to teach it to someone else.\"";
+ next;
+ goto L_Main;
+
+L_Q_old_wizard:
+ mesn l("Wyara the Witch");
+ mes "\"I don't know his name, but I do know that he has been living in the mountains since I first came here. He is a master of many schools of magic, I believe.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "She smiles.";
+ mes "\"He is also a nice and friendly person to talk to, and quite knowledgeable about the teas of this area.\"";
+ next;
+ goto L_Main;
+
+L_Q_elanore:
+ mesn l("Wyara the Witch");
+ mes "\"Elanore is the Tulimshar healer. She is a very kind person and an outstanding healer.\"";
+ next;
+ goto L_Main;
+
+L_Q_manaseed:
+ if (!@has_magic && (MAGIC_FLAGS & MFLAG_TOUCHED_MANASEED))
+ goto L_Q_manaseed_unabsorbed;
+ mesn l("Wyara the Witch");
+ mesq l("A mana seed? I'm afraid that I can't help you with that.");
+ next;
+ mesn l("Wyara the Witch");
+ mesq l("...Actually. I've heard rumors there was one on the hills northwest of here. They're just rumors, but feel free to go on an errand if you wish.");
+ next;
+ goto L_Main;
+
+L_Q_manaseed_unabsorbed:
+ mesn l("Wyara the Witch");
+ mes "\"So you touched the mana seed but weren't able to absorb its powers? That means that you're lacking a natural magical ability. Still, there are ways around that.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"If you drink a mana potion, you should be able to retain this magical power and slowly build up a magical skill.\"";
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_MANAPOTION;
+ next;
+ goto L_Main;
+
+L_Q_manapotion:
+ mesn l("Wyara the Witch");
+ mes "\"I have a simple recipe for making mana potions, but I don't have one ready right now. Can you bring me 40 mauve leaves and a bottle of water? I can make one from those quite easily.\"";
+ next;
+ menu
+ "Sure!", L_make_manapotion,
+ "No.", L_Main;
+
+L_manapotion_toomany:
+ mesn l("Wyara the Witch");
+ mes "\"Hmm... looking at you, I don't think that you would be able to carry it.\"";
+ next;
+ goto L_Main;
+
+L_make_manapotion:
+ if(countitem("MauveHerb") < 40)
+ goto L_make_manapotion_lack;
+ if(countitem("BottleOfWater") < 1)
+ goto L_make_manapotion_lack;
+ getinventorylist;
+ if ((@inventorylist_count == 100)
+ && (countitem("MauveHerb") > 40)
+ && (countitem("BottleOfWater") > 100)
+ && (countitem("ManaPotion") < 1))
+ goto L_manapotion_toomany;
+
+ delitem "MauveHerb", 40;
+ delitem "BottleOfWater", 1;
+ getitem "ManaPotion", 1;
+
+ mesn l("Wyara the Witch");
+ mes "Wyara takes your mauve leaves, grinds them, and pours some of the resultant paste into her cauldron. She then takes your bottle and sticks it into her brew, head-first.";
+ next;
+ mesn l("Wyara the Witch");
+ mes "The water in the bottle takes on a strange golden hue, but doesn't flow out.";
+ mes "After a while, she retrieves the bottle and pours some of the liquid into a smaller clay bottle. She proceeds to mix in the rest of the paste, then plugs the bottle and shakes it.";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"I shall keep the rest of your water and the bottle as a payment, if you don't mind. But here is the potion; let it rest for a minute before you use it for maximum effect.\"";
+ next;
+ goto L_Main;
+
+L_make_manapotion_lack:
+ mesn l("Wyara the Witch");
+ mes "\"No, we need forty mauve leaves and a bottle of water.\"";
+ next;
+ goto L_Main;
+
+L_Q_imp:
+ mesn l("Wyara the Witch");
+ mes "\"Sagatha told me that she imprisoned an evil earth spirit in a dried-up well. She wants it to stay there until it has mended its ways, or forever, if it doesn't.\"";
+ next;
+ goto L_Main;
+
+L_Q_sagatha:
+ mesn l("Wyara the Witch");
+ mes "Wyara smiles.";
+ mes "\"You have met Sagatha? She's a wonderful person, isn't she? Well, she does hold back a little towards humans, but deep down she feels for them, too.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"She does hold all plants and animals very dear, though. Well, the peaceful ones more than the aggressive ones, I suppose, and scorpions not very much at all.\"";
+ next;
+ goto L_Main;
+
+L_Q_auldsbel:
+ mesn l("Wyara the Witch");
+ mes "\"Auldsbel... the guild wizard? I don't know him very well; as far as I know, he is only visiting.\"";
+ next;
+ goto L_Main;
+
+L_M_no:
+ mesn l("Wyara the Witch");
+ mes "\"I am sorry, but you don't seem to be able to control any magic. That means that I really can't help you with that.\"";
+ next;
+ goto L_Main;
+
+L_Magic:
+ if (!@has_magic)
+ goto L_M_no;
+ mesn l("Wyara the Witch");
+ mes "\"Perhaps I can help you a little, but I am not a master of any school of magic.\"";
+ next;
+ goto L_M_main;
+
+L_M_main:
+ menu
+ "Can you explain magic to me?", L_M_explain,
+ "Can you teach me a spell?", L_M_spell,
+ "Can you train me?", L_M_train,
+ "Never mind.", L_Main;
+
+L_M_explain:
+ mesn l("Wyara the Witch");
+ mes "\"Magic is just a name for the force that lives in all plants and animals and emanates from there into all things, living or dead.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"Some things it finds easier to pass through – natural things, living things – but dead things, such as rock or metal, can slow it down.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"There are different kinds of magic, too; nature, astral, and so on, but if this interests you, you should talk to a scholar.\"";
+ next;
+ goto L_M_main;
+
+L_M_spell:
+ if (getskilllv(SKILL_MAGIC_NATURE) > 1)
+ goto L_M_spell3;
+ if (getskilllv(SKILL_MAGIC) > 1)
+ goto L_M_spell2;
+ mesn l("Wyara the Witch");
+ mes "\"No... I don't think that you are ready yet. But please ask me again when you have some more control over your magical powers.\"";
+ next;
+ goto L_M_main;
+
+L_M_spell3:
+ mesn l("Wyara the Witch");
+ if (getskilllv(SKILL_MAGIC) < 2) {
+ mesq l("I want to teach you my favorite. However, you are not powerful enough to use it yet; You will first have to absorb more magic from the mana seed.");
+ } else {
+ mesq l("Now that you know the basics of nature magic, here is one of my favourites: '%s' will summon rain, whereever you are standing. It will consume a bottle of water, though.", b("Kaflosh"));
+ learnskill SKILL_KAFLOSH;
+ }
+ next;
+ goto L_M_spell2;
+
+L_M_spell2:
+ mesn l("Wyara the Witch");
+ mesq l("Here is another useful one: '%s'. It will tell you the stats of the target monster, so you can know how dangerous it is.", b("miteyo"));
+ learnskill SKILL_MONSTERINFO;
+ next;
+ goto L_M_main;
+
+L_M_train:
+ if (getskilllv(SKILL_MAGIC_NATURE) > 1)
+ goto L_M_train_no;
+ mesn l("Wyara the Witch");
+ if (@Q_status >= @STATUS_PURIFY_EXPLAINED)
+ goto L_M_train_wb;
+ mes "\"Train you? No... you should talk to Sagatha.\"";
+ mes "She hesitates.";
+ next;
+ callfunc "SagathaStatus";
+ if (@evil) goto L_M_train_evil;
+ mesn l("Wyara the Witch");
+ mes "\"It would be difficult to ask her to accept you unless you understand some of the basics already.\"";
+ next;
+ goto L_M_train_dispatch;
+
+L_M_train_evil:
+ mes "Wyara looks at you sadly.";
+ mes "\"I have heard that you have done something unforgiveable. No witch in this land will teach you now.\"";
+ next;
+ goto L_M_main;
+
+L_M_train_wb:
+ callfunc "SagathaStatus";
+ if (@evil)
+ goto L_M_train_evil;
+ mesq l("Ah, yes, your training...");
+ next;
+ goto L_M_train_dispatch;
+
+L_M_train_dispatch:
+ if (@Q_status == @STATUS_PURIFY_TWICE)
+ goto L_M_purify_done;
+ if (@Q_status == @STATUS_PURIFY_ONCE)
+ goto L_M_purify_once;
+ if (@Q_status == @STATUS_PURIFY_EXPLAINED)
+ goto L_M_purify_explained;
+
+ mesn l("Wyara the Witch");
+ mes "\"Well, let me help you get started, then! But first, to make sure that you are serious, I have a small task for you.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"There is a pond west of Hurnscald, a very small one, almost square in shape, with a rock on its southern ledge leading to its center. This pond is close to dying.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"I want to save it; for that, someone will have to pour a purification potion into it.\"";
+ next;
+ @Q_status = @STATUS_PURIFY_EXPLAINED;
+ callsub S_Update_Var;
+ goto L_M_purify_explained;
+
+L_M_purify_explained:
+ if (countitem("PurificationPotion"))
+ goto L_M_purify_doit;
+
+ mesn l("Wyara the Witch");
+ mes "\"To make the purification potion, I will need twenty maggot slimes and twenty leaves of mauve.\"";
+ next;
+ menu
+ "I shall get them later.", L_M_main,
+ "Booring.", L_M_main,
+ "Here they are.", L_Next;
+
+L_Next:
+ getinventorylist;
+ if ((@inventorylist_count == 100) && (countitem("MauveHerb") > 20) && (countitem("MaggotSlime") > 20))
+ goto L_M_purify_nospace;
+ if (countitem("MauveHerb") < 20)
+ goto L_M_purify_lacking;
+ if (countitem("MaggotSlime") < 20)
+ goto L_M_purify_lacking;
+ delitem "MauveHerb", 20;
+ delitem "MaggotSlime", 20;
+ getitem "PurificationPotion", 1;
+ mesn l("Wyara the Witch");
+ mes "Wyara grinds the leaves and mixes them with the slime, boils them, then speaks a brief incantation over them and hands you the result.";
+ next;
+ goto L_M_purify_doit;
+
+L_M_purify_doit:
+ mesn l("Wyara the Witch");
+ mes "\"Take your purification potion to the pond, right next to its center, and pour the potion in.\"";
+ close;
+
+L_M_purify_nospace:
+ mesn l("Wyara the Witch");
+ mes "\"You don't have enough space to carry the potion. Please come back later.\"";
+ next;
+ goto L_M_main;
+
+L_M_purify_lacking:
+ mesn l("Wyara the Witch");
+ mes "\"You'll need twenty mauve leaves and twenty maggot slimes for the potion.\"";
+ next;
+ goto L_M_main;
+
+L_M_purify_once:
+ mesn l("Wyara the Witch");
+ mes "Wyara nods.";
+ mes "\"You have purified the pond a little, but not enough, I think. We'll need another potion.\"";
+ next;
+ if (countitem("PurificationPotion"))
+ goto L_M_purify_doit2;
+ mesn l("Wyara the Witch");
+ mes "\"I'll need twenty more maggot slimes and leaves of mauve.\"";
+ next;
+ menu
+ "I'll do that later.", L_Main,
+ "No way.", L_Main,
+ "Here you are.", L_Next1;
+
+L_Next1:
+ getinventorylist;
+ if ((@inventorylist_count == 100) && (countitem("MauveHerb") > 20) && (countitem("MaggotSlime") > 20))
+ goto L_M_purify_nospace;
+ if (countitem("MauveHerb") < 20)
+ goto L_M_purify_lacking;
+ if (countitem("MaggotSlime") < 20)
+ goto L_M_purify_lacking;
+ delitem "MauveHerb", 20;
+ delitem "MaggotSlime", 20;
+ getitem "PurificationPotion", 1;
+ mesn l("Wyara the Witch");
+ mes "Wyara brews another purification potion.";
+ next;
+ goto L_M_purify_doit2;
+
+L_M_purify_doit2:
+ mesn l("Wyara the Witch");
+ mes "\"Please apply this one quickly, again.\"";
+ close;
+
+L_M_purify_done:
+ mesn l("Wyara the Witch");
+ mes "Wyara smiles at you.";
+ mes "\"A friend told me... you have saved the pond for now. Perhaps it will need some more attention later, but I'll ask others for this.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"Please sit down and touch the ground.\"";
+ next;
+ menu
+ "Very well.", L_Next2,
+ "No way!", L_M_purify_abort;
+
+L_Next2:
+ mesn l("Wyara the Witch");
+ mes "You sit down and touch the ground, and so does Wyara.";
+ next;
+ mesn l("Wyara the Witch");
+ mes "You sense the earth, through the floor boards, and begin to feel one with it, as if you were a plant or rock.";
+ next;
+ mesn l("Wyara the Witch");
+ mes "The gentle breeze coming in through the window begins to take on a very different quality, as if it were the gentle caress of a mother soothing her child.";
+ next;
+ mesn l("Wyara the Witch");
+ mes "You can sense the water within the ground, and from it you sense your sisters and brothers, plants, animals, people...";
+ next;
+ mesn l("Wyara the Witch");
+ mes "Slowly, the sensation recedes, but you feel changed.";
+ @SUP_xp = 5000;
+ @SUP_lvl = 2;
+ callfunc "SkillUp";
+ @Q_status = @STATUS_PURIFY_OVER;
+ callsub S_Update_Var;
+ close;
+
+L_M_purify_abort:
+ mesn l("Wyara the Witch");
+ mes "\"I can't help you if you don't subject yourself to the ritual.\"";
+ close;
+
+L_M_train_no:
+ mesn l("Wyara the Witch");
+ mes "\"I can't teach you anything at this time. Perhaps Sagatha can help you, but I'm not sure if she will accept you as a student.\"";
+ next;
+ goto L_M_train_sagatha;
+
+L_M_train_sagatha:
+ menu
+ "OK.", L_M_main,
+ "How can I convince her to accept me?", L_Next3;
+
+L_Next3:
+ callfunc "SagathaStatus";
+ mesn l("Wyara the Witch");
+ if (@evil)
+ goto L_M_train_s_fail;
+ if (getskilllv(SKILL_MAGIC) < 2)
+ goto L_M_train_s_lvl1;
+ if (@good > 1)
+ mes "\"Come to think of it, I have heard good things about you. Perhaps she will be willing to accept you as a student now?\"";
+ if (@good == 1)
+ mes "\"I have heard some good things about you, but I'm not sure if it will be enough to sway her – she is hesitant to accept students.\"";
+ if (@good == 0)
+ mes "\"Sagatha cares greatly about all living creatures, but particularly about the creatures of the forest. If you are kind to them, she will be more likely to be kind to you.\"";
+ next;
+ if (@druid == 3)
+ goto L_M_main;
+ mesn l("Wyara the Witch");
+ mes "She smiles.";
+ mes "\"Actually, I think I know of a good thing you could do. There is a very special tree in the desert south-east of Tulimshar, a tree that has been there for a very long time.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"The tree is slowly dying – and has been for a long time – but it is there because of a wonderful thing that happened long ago. Tend to it, and I am sure that she will learn about this.\"";
+ next;
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_DRUIDTREE;
+ menu
+ "What is that tree?", L_M_train_t_backgd,
+ "How should I tend to it?", L_Next4,
+ "Nah.", L_M_main;
+
+L_Next4:
+ mesn l("Wyara the Witch");
+ mes "\"The tree has been there alone and unattended for a long time; what he needs most is water and affection. Give him both.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "She hesitates for a moment.";
+ mes "\"But stay away from the well in the area. There is no water in there anymore, and it's also dangerous.\"";
+ next;
+ goto L_M_main;
+
+L_M_train_t_backgd:
+ mesn l("Wyara the Witch");
+ mes "\"Many generations ago, there was a lush, green oasis in the desert south-east of Tulimshar. Plants of all kinds grew there, and many animals, including mouboos, made this place their home.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"Then there came war, and some people pleaded to the demon Grenxen. He founded Tulimshar, and to provide it with water he changed the underground waterflow. The oasis began to dry out quickly.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"But the oasis, like many such places back in the old days, had a druid watching over it. The druid refused to accept what Grenxen had done, but he was powerless to revert or change it.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"All he could do was to delay the inevitable, to give the animals and nomads some time to adapt.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"But to do so, he had to reach the water streams deep underground. Thus, he turned himself into a tree, a deep-rooted fyrad, so that his roots could reach underground.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"He had to exert himself tremendously; he had to grow deep, quickly; I believe that no druid or witch has summoned such magic before or since. But he succeeded, and for a while he saved the oasis.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"Many generations he remained the only one ever to have successfully defied Grenxen, but this came at a price: he had to remain a tree, and he never turned back.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"I believe that he has not forgotten his old magic, because even though a tree remembers many things for a very long time, trees are not keen to change things, not even themselves.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"Now he stands alone in the desert, dried-up and forgotten, with no-one remembering him.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"Please give him water, for he is always in need of it, and thank him for his sacrifice. It is all we can do for him now.\"";
+ next;
+ goto L_M_t_menu;
+
+L_M_t_menu:
+ menu
+ "How should I give him water?", L_M_t_water,
+ "How should I thank him?", L_M_t_remind,
+ "I will.", L_M_main,
+ "No.", L_M_main;
+
+L_M_t_water:
+ mesn l("Wyara the Witch");
+ mes "\"A bottle of water would probably not be enough. No, you would have to water the ground all around... that's too many bottles. You will have to get water from elsewhere.\"";
+ next;
+ goto L_M_t_menu;
+
+L_M_t_remind:
+ mesn l("Wyara the Witch");
+ mes "\"Give him a sign of affection. Something that works with a tree, but also something that humans might do to each other, to remind him of his days as a human.\"";
+ next;
+ mesn l("Wyara the Witch");
+ mes "\"Yes... that would be important. Show your affection in the same way that you might towards a human.\"";
+ next;
+ goto L_M_t_menu;
+
+L_M_train_s_fail:
+ mes "She shakes her head.";
+ mes "\"No... from what I have heard, you have done something unforgivable. I very much doubt that you can be her student now, and I won't teach you any further either.\"";
+ next;
+ goto L_M_main;
+
+L_M_train_s_lvl1:
+ mes "\"Well, you're still a bit of a beginner, so I don't think she will accept you yet. Maybe you can absorb some more power from the mana seed? If you can grow your magical powers a little, I might be able to help you.\"";
+ next;
+ goto L_M_main;
+
+L_close:
+ close;
+
+S_Update_Var:
+ QUEST_MAGIC2 = (QUEST_MAGIC2 & ~(@Q_MASK) | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/009-2/yalina.txt b/npc/009-2/yalina.txt
new file mode 100644
index 00000000..1f8a889c
--- /dev/null
+++ b/npc/009-2/yalina.txt
@@ -0,0 +1,10 @@
+009-2,148,47,0 script Yalina NPC209,{
+ @npcname$ = "Yalina";
+
+ mes "[" + @npcname$ + "]";
+ mes "\"Ian knows a lot! I had so many questions he helped me with!\"";
+ next;
+ mes "\"He rewards those that know what they are doing. When the Nurse stops healing you, check in with Ian.\"";
+ @npcname$ = "";
+ close;
+}
diff --git a/npc/009-3/_import.txt b/npc/009-3/_import.txt
new file mode 100644
index 00000000..ad094dec
--- /dev/null
+++ b/npc/009-3/_import.txt
@@ -0,0 +1,7 @@
+// Map 009-3: Hurnscald Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/009-3/_mobs.txt",
+"npc/009-3/_warps.txt",
+"npc/009-3/mapflags.txt",
+"npc/009-3/sword.txt",
+"npc/009-3/warp.txt",
diff --git a/npc/009-3/_mobs.txt b/npc/009-3/_mobs.txt
new file mode 100644
index 00000000..4c43b675
--- /dev/null
+++ b/npc/009-3/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-3: Hurnscald Cave mobs
+009-3,0,0,0,0 monster Yellow Slime 1007,20,0,0
+009-3,62,75,62,75 monster Black Scorpion 1009,25,0,0
+009-3,63,75,63,75 monster Red Slime 1008,35,0,0
+009-3,145,75,55,75 monster Cave Maggot 1056,20,100000,30000
diff --git a/npc/009-3/_warps.txt b/npc/009-3/_warps.txt
new file mode 100644
index 00000000..f5aa9542
--- /dev/null
+++ b/npc/009-3/_warps.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-3: Hurnscald Cave warps
+009-3,173,20,0 warp #009-3_173_20 0,0,009-2,147,89
+009-3,20,57,0 warp #009-3_20_57 0,0,011-4,154,107
+009-3,157,30,0 warp #009-3_157_30 0,0,018-3,179,180
+009-3,117,19,0 warp #009-3_117_19 0,0,013-3,160,102
diff --git a/npc/009-3/mapflags.txt b/npc/009-3/mapflags.txt
new file mode 100644
index 00000000..120bf75f
--- /dev/null
+++ b/npc/009-3/mapflags.txt
@@ -0,0 +1 @@
+//009-3 mapflag resave 009-2,149,43
diff --git a/npc/009-3/sword.txt b/npc/009-3/sword.txt
new file mode 100644
index 00000000..f0332db6
--- /dev/null
+++ b/npc/009-3/sword.txt
@@ -0,0 +1,177 @@
+009-3,26,100,0 script #MysticSword#_M NPC400,{
+ if (getskilllv(SKILL_MAGIC))
+ goto L_message;
+ close;
+
+L_message:
+ @Q_MASK = NIBBLE_6_MASK;
+ @Q_SHIFT = NIBBLE_6_SHIFT;
+ @Q_status = (QUEST_MAGIC & @Q_MASK) >> @Q_SHIFT;
+
+ // Set up SkillUp function
+ @SUP_id = SKILL_MAGIC_WAR;
+ @SUP_name$ = "War Magic";
+
+ @STATUS_INITIAL = 0;
+ @STATUS_LEARNED_FLAREDART = 1;
+ @STATUS_LEARNED_MAGICBLADE = 2;
+ @STATUS_LEVEL2 = 3;
+ @STATUS_W11 = 4;
+ @STATUS_W12 = 5;
+ @STATUS_W11_12 = 6;
+ @STATUS_L2_ALLSPELLS = 7;
+
+ if (@Q_status == @STATUS_INITIAL) goto L_Initial;
+ if (@Q_status == @STATUS_LEARNED_FLAREDART) goto L_PostFlareDart;
+ if (@Q_status == @STATUS_LEARNED_MAGICBLADE) goto L_PostFlareDart_teach2;
+ if (@Q_status == @STATUS_LEVEL2) goto L_L2_W11;
+ if (@Q_status == @STATUS_W12) goto L_L2_W11;
+ if (@Q_status == @STATUS_W11) goto L_L2_almost_done;
+ if (@Q_status == @STATUS_W11_12) goto L_L2_almost_done;
+
+ mesn l("Magic Sword");
+ mesq l("Come back when thou art stronger.");
+ close;
+
+L_Initial:
+ mesn l("Magic Sword");
+ mesc l("As you look at the sword, you suddenly hear a voice in your head!");
+ mesq l("Welcome to my prison, mortal!");
+ next;
+ mesn l("Magic Sword");
+ mesc l("Well, either you are going mad, or that sword in the stone is talking to you.");
+ next;
+ mesn l("Magic Sword");
+ mesc l("Or, well, both.");
+ next;
+ mesn l("Magic Sword");
+ mesc l("The deep basso voice continues.");
+ mesq l("I know not what brought thee hither, but I kindly ask that thou leavest me alone in my sorrow.");
+ next;
+ menu
+ "Leave", L_close,
+ "Sorry.", L_Next,
+ "Who or what are you?", L_Next,
+ "What sorrow?", L_Next,
+ "Can I help?", L_Next,
+ "Can you teach me magic?", L_Next;
+
+L_Next:
+ mesn l("Magic Sword");
+ mesc l("There is no answer.");
+ close;
+
+L_PostFlareDart:
+ mesn l("Magic Sword");
+ mes "As you look at the sword, you hear a deep voice resounding in your head.";
+ mes "\"Welcome, mortal!\"";
+ next;
+ menu
+ "Hi! How are you?", L_PostFlareDart_hi,
+ "Can you teach me magic?", L_PostFlareDart_teach,
+ "Your sister sent me.", L_PostFlareDart_sister,
+ "Bye!", L_close;
+
+L_PostFlareDart_hi:
+ mesn l("Magic Sword");
+ mes "\"Mortal... I have seen pain and death beyond thine reckoning! Mock me not with thine idle questions!\"";
+ close;
+
+L_PostFlareDart_sister:
+ mesn l("Magic Sword");
+ mes "\"My sister...? Alas! I remember now; abandoned she was, just as I; buried in stone, never to be wielded again.\"";
+ mes "\"Wherefore did she send thee?\"";
+ next;
+ menu
+ "She asked me to ask you to teach me a spell.", L_PostFlareDart_teach;
+
+L_PostFlareDart_teach:
+ mesn l("Magic Sword");
+ mes "\"Beware, mortal... the only spells I can teach thee are those of the school of war. Dark and dreary spells, that lot! Pain and misery is all they bring...\"";
+ next;
+ mesn l("Magic Sword");
+ mes "The sword's voice is growing apprehensive.";
+ mes "\"Once a spell has been learned, it cannot be taken back, no more than a death can be undone. So be careful, mortal... dost thou truly wish to know the secrets of thus destructive power?\"";
+ next;
+ menu
+ "Yes.", L_Next1,
+ "No.", L_close;
+
+L_Next1:
+ mesn l("Magic Sword");
+ mes "\"So thou art bound to the path of War, as am I, as is my sister...\"";
+ next;
+ mesn l("Magic Sword");
+ mesq l("So be it, fellow warrior. Hear the incantation for the blade spell: '%s'", b("Chiza"));
+ mes "\"Hold a knife, sharp or regular, when thou speakest it.\"";
+ learnskill SKILL_CHIZA;
+ @Q_status = @STATUS_LEARNED_MAGICBLADE;
+ callsub S_Update_Var;
+ next;
+ mesn l("Magic Sword");
+ mes "\"But beware... the path of war that thou hast embarked upon is one from which few return. May luck be on thy side...\"";
+ close;
+
+L_PostFlareDart_teach2:
+ mesn l("Magic Sword");
+ mes "\"Seek out my sister, and leave me alone in my sorrows.\"";
+ next;
+ goto L_close;
+
+L_close:
+ close;
+
+L_L2_W11:
+ mesn l("Magic Sword");
+ mes "\"Thou hast returned. That must mean that thy wish to learn the magic of war is still alive?\"";
+ next;
+ menu
+ "No, I just wanted to say `hi'.", L_Farewell2,
+ "Yes, teach me more!", L_Next2;
+
+L_Next2:
+ mesn l("Magic Sword");
+ mes "\"If that is thou wishest, I shall not stop thee. But do not expect to find merriment down this road.\"";
+ mes "\"I must ask that thou sacrificest five thousand monster points for this, however.\"";
+ menu
+ "No, I don't want that.", L_close,
+ "Very well.", L_Next3;
+
+L_Next3:
+ if (Mobpt < 5000)
+ goto L_lacking_mobpoints;
+ mesn l("Magic Sword");
+ mes "\"So be it, then.\"";
+ mes "[1000 experience points]";
+ Mobpt = Mobpt - 5000;
+ getexp 1000, 0;
+ @Q_status = @Q_status + 1;
+ callsub S_Update_Var;
+ next;
+ mesn l("Magic Sword");
+ 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;
+ mesn l("Magic Sword");
+ mesq l("Take %s arrows, sprinkle sulphur powder over them, and then speak '%s'. Throw them high up in the air, and watch the hail unfold before thy feet.", l("fifteen"), b("Frillyar"));
+ learnskill SKILL_FRILLYAR;
+ close;
+
+L_L2_almost_done:
+ mesn l("Magic Sword");
+ mesq l("Return to my sister now. I expect that she shall teach thee one more spell.");
+ close;
+
+L_lacking_mobpoints:
+ mesn l("Magic Sword");
+ mes "\"Thou lackest the monster points needed to prove thy worthiness. I shall not reveal more to thee until thou hast slain more monsters.\"";
+ close;
+
+L_Farewell2:
+ mesn l("Magic Sword");
+ mesq l("Please leave me in peace.");
+ close;
+
+S_Update_Var:
+ QUEST_MAGIC = (QUEST_MAGIC & ~(@Q_MASK) | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/009-3/warp.txt b/npc/009-3/warp.txt
new file mode 100644
index 00000000..f0313c42
--- /dev/null
+++ b/npc/009-3/warp.txt
@@ -0,0 +1,26 @@
+009-3,162,80,0 script #PVPCaveBarrier NPC45,0,0,{
+ mes "Do you want to enter the PVP cave? It costs 150GP.";
+ menu
+ "No.", L_Exit,
+ "Yes.", L_Next;
+
+L_Next:
+ if (Zeny < 150)
+ goto L_NotEnoughMoney;
+ if (Zeny >= 150)
+ goto L_Pay;
+ goto L_Exit;
+
+L_Exit:
+ close;
+
+L_Pay:
+ Zeny = Zeny - 150;
+ warp "009-6", 36, 47;
+ close;
+
+L_NotEnoughMoney:
+ mes "You don't have enough money!";
+ close;
+
+}
diff --git a/npc/009-4/_import.txt b/npc/009-4/_import.txt
new file mode 100644
index 00000000..761cbf7e
--- /dev/null
+++ b/npc/009-4/_import.txt
@@ -0,0 +1,10 @@
+// Map 009-4: Orum Caves
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/009-4/_mobs.txt",
+"npc/009-4/_warps.txt",
+"npc/009-4/barriers.txt",
+"npc/009-4/mapflags.txt",
+"npc/009-4/orum.txt",
+"npc/009-4/orum_warps.txt",
+"npc/009-4/torches.txt",
+"npc/009-4/waric.txt",
diff --git a/npc/009-4/_mobs.txt b/npc/009-4/_mobs.txt
new file mode 100644
index 00000000..1ea86fb8
--- /dev/null
+++ b/npc/009-4/_mobs.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-4: Orum Caves mobs
+009-4,117,97,12,7 monster Silkworm 1035,3,20000,14000
+009-4,115,98,12,7 monster Cave Snake 1021,5,20000,14000
+009-4,103,28,12,7 monster Cave Snake 1021,3,20000,14000
+009-4,106,27,12,7 monster Silkworm 1035,3,20000,14000
+009-4,119,45,6,5 monster Silkworm 1035,3,20000,14000
+009-4,72,130,12,7 monster Maggot 1002,3,20000,14000
+009-4,38,116,12,7 monster Maggot 1002,3,20000,14000
diff --git a/npc/009-4/_warps.txt b/npc/009-4/_warps.txt
new file mode 100644
index 00000000..42d12c0c
--- /dev/null
+++ b/npc/009-4/_warps.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-4: Orum Caves warps
+009-4,37,112,0 warp #009-4_37_112 0,0,009-3,163,114
+009-4,72,136,0 warp #009-4_72_136 0,0,009-4,36,27
+009-4,37,123,0 warp #009-4_37_123 0,0,009-4,36,27
+009-4,72,125,0 warp #009-4_72_125 0,0,009-3,163,114
+009-4,103,22,0 warp #009-4_103_22 0,0,009-4,51,46
+009-4,103,76,0 warp #009-4_103_76 0,0,009-4,51,46
diff --git a/npc/009-4/barriers.txt b/npc/009-4/barriers.txt
new file mode 100644
index 00000000..08998e94
--- /dev/null
+++ b/npc/009-4/barriers.txt
@@ -0,0 +1,268 @@
+function script GetBarrierColor {
+ if (@Barrier < 0 || @Barrier > 2)
+ goto L_Error;
+ if (@BarrierColor <= 0 || @BarrierColor > 12)
+ goto L_Error2;
+ goto L_GetBarrierColor;
+
+L_GetBarrierColor:
+ @Mask = 15;
+ @shift = 4 * @Barrier;
+ @BarrierColor = (OrumQuestBarrier >> @shift) & @Mask;
+ return;
+
+L_Error:
+ mes "Barrier number is out of range.";
+ close2;
+ return;
+
+L_Error2:
+ callfunc "SetUpOrumQuest";
+ goto L_GetBarrierColor;
+}
+
+function script SetBarrierColor {
+ if (@Barrier < 0 || @Barrier > 2)
+ goto L_Error;
+ if (@BarrierColor <= 0 || @BarrierColor > 12)
+ goto L_Error2;
+
+ @Mask = (15 << (4 * @Barrier));
+ OrumQuestBarrier = (OrumQuestBarrier & (~(@Mask))) | @BarrierColor << (4 * @Barrier);
+ return;
+
+L_Error:
+ mes "Barrier number is out of range.";
+ close2;
+ return;
+
+L_Error2:
+ mes "Barrier color is out of range.";
+ close2;
+ return;
+}
+
+
+009-4,37,119,0 script #OrumCaveStartMessage NPC32767,0,0,{
+ if (OrumQuest >= 3) end;
+ if (OrumQuest == 2) goto L_Started;
+
+ mes "As you try to pass, two torches begin to flare and push you back. They seem to form some kind of barrier.";
+ close;
+
+L_Started:
+ message strcharinfo(0), "The torches dim as you approach, granting you passage.";
+ OrumQuest = 3;
+ end;
+}
+
+009-4,37,120,0 script #OrumCaveStartBarrier NPC32767,0,0,{
+ if (OrumQuest >= 3) end;
+ warp "009-4", 37, 118;
+ end;
+}
+
+009-4,57,29,0 script #OrumCaveFirstBarrier NPC32767,0,0,{
+ if (OrumQuest >= 5) end;
+
+ message strcharinfo(0), "Nothing seems to happen as you enter this room. The barrier must need both of its torches to function properly.";
+ OrumQuest = 5;
+ end;
+}
+
+009-4,61,55,0 script #OrumCaveSecondMessage NPC32767,0,0,{
+ if (OrumQuest >= 9) end;
+ if (OrumQuest == 3) set OrumQuest, 4;
+
+ @Barrier = 0;
+ callfunc("GetBarrierColor");
+ @Torch = 0;
+ callfunc("GetTorchColor");
+ if (OrumQuest > 7 && @TorchColor == @BarrierColor)
+ goto L_Allow_Second_Passage;
+
+ mes "As you try to pass, the torches begin to flare and push you back. Perhaps there's a way to get past it.";
+ mes "";
+ setarray @colors$,"transparent","red","dark orange","orange","light orange","yellow","light green","green","dark green","blue","dark purple","purple","light purple";
+ mes "Looking closely between the two torches you can see the barrier has a ##B" + @colors$[@BarrierColor] + "##b tint to it.";
+ close;
+
+L_Allow_Second_Passage:
+ if (OrumQuest < 9) goto L_Advance_Quest;
+ end;
+
+L_Advance_Quest:
+ message strcharinfo(0), "The torches dim as you enter like the first. You must be on the right trail.";
+ OrumQuest = 9;
+ end;
+}
+
+009-4,61,54,0 script #OrumCaveSecondBarrier NPC32767,0,0,{
+ if (OrumQuest >= 9) end;
+ warp "009-4", 60, 56;
+ end;
+}
+
+009-4,24,65,0 script #OrumCaveThirdMessage NPC32767,0,0,{
+ if (OrumQuest >= 10) end;
+ if (OrumQuest == 3) set OrumQuest, 4;
+ if (OrumQuest > 8 && @Torch1Color == @firstColor && @Torch2Color == @secondColor)
+ goto L_Allow_Third_Passage;
+ if (OrumQuest > 8 && @Torch2Color == @firstColor && @Torch1Color == @secondColor)
+ goto L_Allow_Third_Passage;
+
+ @Barrier = 1;
+ callfunc("GetBarrierColor");
+
+ @Torch = 0;
+ callfunc("GetTorchColor");
+ @Torch1Color = @TorchColor;
+
+ @Torch = 1;
+ callfunc("GetTorchColor");
+ @Torch2Color = @TorchColor;
+
+ @firstColor = @BarrierColor - 2;
+ @secondColor = @BarrierColor + 2;
+ if (@firstColor < 1)
+ @firstColor = 12;
+ if (@secondColor > 12)
+ @secondColor = 1;
+
+ mes "As you try to pass, the torches begin to flare and push you back. Perhaps there is a way to get past it.";
+ mes "";
+ setarray @colors$,"transparent","red","dark orange","orange","light orange","yellow","light green","green","dark green","blue","dark purple","purple","light purple";
+ mes "Looking closely between the two torches you can see the barrier has a ##B" + @colors$[@BarrierColor] + "##b tint to it.";
+ close;
+
+L_Allow_Third_Passage:
+ if (OrumQuest < 10) goto L_Advance_Quest;
+ end;
+
+L_Advance_Quest:
+ OrumQuest = 10;
+ end;
+}
+
+009-4,24,66,0 script #OrumCaveThirdBarrier NPC32767,0,0,{
+ if (OrumQuest >= 10) end;
+ warp "009-4", 23, 64;
+ end;
+}
+
+009-4,48,37,0 script #OrumCaveEndMessage NPC32767,0,0,{
+ if (OrumQuest >= 11) end;
+ if (OrumQuest == 3) set OrumQuest, 4;
+
+ @Barrier = 2;
+ callfunc("GetBarrierColor");
+
+ if (OrumQuest < 10)
+ goto L_Deny_Final_Passage;
+
+ @Torch = 0;
+ callfunc("GetTorchColor");
+ @Torch1Color = @TorchColor;
+
+ @Torch = 1;
+ callfunc("GetTorchColor");
+ @Torch2Color = @TorchColor;
+
+ @Torch = 2;
+ callfunc("GetTorchColor");
+ @Torch3Color = @TorchColor;
+
+ // Extract the secondary color
+ @secondary = @BarrierColor - 1;
+ if (@secondary != 3 && @secondary != 7 && @secondary != 11)
+ @secondary = @BarrierColor + 1;
+
+ // Make sure it's in bounds
+ if (@secondary > 12)
+ @secondary = @secondary - 12;
+ if (@secondary < 1)
+ @secondary = @secondary + 12;
+
+ // Extract first 2 required colors
+ @firstColor = @secondary - 2;
+ @secondColor = @secondary + 2;
+ if (@firstColor > 12)
+ @firstColor = @firstColor - 12;
+ if (@firstColor < 1)
+ @firstColor = @firstColor + 12;
+ if (@secondColor > 12)
+ @secondColor = @secondColor - 12;
+ if (@secondColor < 1)
+ @secondColor = @secondColor + 12;
+
+ @thirdColor = 12;
+ @offsetOne = @BarrierColor + 1;
+ @offsetTwo = @BarrierColor - 1;
+
+ // Make sure they in bounds
+ if (@offsetOne > 12)
+ @offsetOne = @offsetOne - 12;
+ if (@offsetOne < 1)
+ @offsetOne = @offsetOne + 12;
+ if (@offsetTwo > 12)
+ @offsetTwo = @offsetTwo - 12;
+ if (@offsetTwo < 1)
+ @offsetTwo = @offsetTwo + 12;
+
+ // Extract third needed color
+ if (@secondary == @offsetOne)
+ @thirdColor = @firstColor;
+ if (@secondary == @offsetTwo)
+ @thirdColor = @secondColor;
+
+ @firstDone = 0;
+ @secondDone = 0;
+ @thirdDone = 0;
+
+ if (@firstDone == 0 && @secondDone != 1 && @thirdDone != 1 && @Torch1Color == @firstColor)
+ @firstDone = 1;
+ if (@firstDone != 1 && @secondDone == 0 && @thirdDone != 1 && @Torch1Color == @secondColor)
+ @secondDone = 1;
+ if (@firstDone != 1 && @secondDone != 1 && @thirdDone == 0 && @Torch1Color == @thirdColor)
+ @thirdDone = 1;
+
+ if (@firstDone == 0 && @secondDone != 2 && @thirdDone != 2 && @Torch2Color == @firstColor)
+ @firstDone = 2;
+ if (@firstDone != 2 && @secondDone == 0 && @thirdDone != 2 && @Torch2Color == @secondColor)
+ @secondDone = 2;
+ if (@firstDone != 2 && @secondDone != 2 && @thirdDone == 0 && @Torch2Color == @thirdColor)
+ @thirdDone = 2;
+
+ if (@firstDone == 0 && @secondDone != 3 && @thirdDone != 3 && @Torch3Color == @firstColor)
+ @firstDone = 3;
+ if (@firstDone != 3 && @secondDone == 0 && @thirdDone != 3 && @Torch3Color == @secondColor)
+ @secondDone = 3;
+ if (@firstDone != 3 && @secondDone != 3 && @thirdDone == 0 && @Torch3Color == @thirdColor)
+ @thirdDone = 3;
+
+ if (@firstDone != 0 && @secondDone != 0 && @thirdDone != 0)
+ goto L_Allow_Final_Passage;
+ goto L_Deny_Final_Passage;
+
+L_Deny_Final_Passage:
+ mes "As you try to pass, the torches begin to flare and push you back. Perhaps there is a way to get past it.";
+ mes "";
+ setarray @colors$,"transparent","red","dark orange","orange","light orange","yellow","light green","green","dark green","blue","dark purple","purple","light purple";
+ mes "Looking closely between the two torches you can see the barrier has a ##B" + @colors$[@BarrierColor] + "##b tint to it.";
+ close;
+
+L_Allow_Final_Passage:
+ if (OrumQuest < 11) goto L_Advance_Quest;
+ end;
+
+L_Advance_Quest:
+ message strcharinfo(0), "The torches dim as you enter. At last you finally have access!";
+ OrumQuest = 11;
+ end;
+}
+
+009-4,48,38,0 script #OrumCaveEndBarrier NPC32767,0,0,{
+ if (OrumQuest >= 11) end;
+ warp "009-4", 47, 36;
+ end;
+}
diff --git a/npc/009-4/mapflags.txt b/npc/009-4/mapflags.txt
new file mode 100644
index 00000000..458eb60f
--- /dev/null
+++ b/npc/009-4/mapflags.txt
@@ -0,0 +1 @@
+//009-4 mapflag resave 009-4,37,118
diff --git a/npc/009-4/orum.txt b/npc/009-4/orum.txt
new file mode 100644
index 00000000..42ae60d9
--- /dev/null
+++ b/npc/009-4/orum.txt
@@ -0,0 +1,607 @@
+
+009-4,35,115,0 script OrumDebug NPC158,{
+ mes "[Orum Debug]";
+ menu
+ "Set Quest State", L_SetQuest,
+ "Reset Quest", L_ResetQuest,
+ "Display Quest", L_Display;
+
+L_SetQuest:
+ input @quest_state;
+ OrumQuest = @quest_state;
+ goto L_close;
+
+L_ResetQuest:
+ OrumQuest = 0;
+ OrumQuestBarrier = 0;
+ OrumQuestTorch = 0;
+ goto L_close;
+
+L_Display:
+ mes OrumQuest;
+ goto L_close;
+
+L_close:
+ end;
+
+OnInit:
+ if (!debug)
+ disablenpc "OrumDebug";
+ end;
+}
+009-4,37,115,0 script Orum#barrier NPC158,{
+ // needed to pass the very first barrier
+ @B0_WISPPOWDER = 4;
+ @B0_POLTERGEISTPOWDER = 2;
+ @B0_SPECTREPOWDER = 1;
+ @B0_HARDSPIKES = 1;
+
+ // needed stuff to get colorful powders
+ @BT_IRONPOWDER = 10;
+ @BT_PILESOFASH = 10;
+ @BT_HERBS = 15;
+
+ // how many colorful powders each do you get as reward?
+ @BT_REWARDCOUNT = 10;
+
+ @Exp_BREAK_BARRIERS = 5000;
+
+ if (OrumQuest > 0) goto L_Started;
+
+ mes "[Orum]";
+ mes "\"It's not wise to venture around this place! Well hmm... I guess since you're here, maybe you can lend a little help?\"";
+ menu
+ "What exactly is 'this place'?", L_Explain,
+ "Umm... what kind of help?", L_Explain,
+ "You're right, I'll be on my way.", L_Next;
+
+L_Next:
+ mes "[Orum]";
+ mes "\"Very smart thinking!\"";
+ goto L_close;
+
+L_Explain:
+ mes "[Orum]";
+ mes "\"Recently a woman claiming to be a witch came to my village seeking help from my mentor Waric, who is a very powerful wizard, but he refused and she left. But...\"";
+ next;
+ mes "\"The next day he went missing! I'm no wizard yet, but from what I overheard... I think that witch is attempting some very foul magic and has kidnapped him for some reason!\"";
+ next;
+ mes "\"I traveled in the direction she left until I came accross this cave, but it appears to be protected by some type of magical barrier and I haven't been able to get further than this room.\"";
+ menu
+ "So where would I come in?", L_Explain_Barriers,
+ "I'd like to help but I have to go...", L_Next1;
+
+L_Next1:
+ mes "[Orum]";
+ mes "\"Thats too bad... well, if you ever have some free time, I probably won't figure this out any time soon.\"";
+ goto L_close;
+
+L_Explain_Barriers:
+ mes "[Orum]";
+ mes "\"I've examined this room and it appears that the barrier is made up of two torches on each side. The flame on them has a strange glow. They must be imbued with magical properties.\"";
+ next;
+ mes "\"I've never come across anything like this barrier before. It must be drawing it's power from the torches. I tried putting them out with conventional means but I had no luck.\"";
+ menu
+ "Have any other ideas on how we get past it?", L_Explain_Note,
+ "I think its meant to keep us out... Bye.", L_Next2;
+
+L_Next2:
+ mes "[Orum]";
+ mes "\"You may be right... but she kidnapped Waric. I know it! So I must do something! If you ever change your mind I could surely use the help.\"";
+ goto L_close;
+
+L_Explain_Note:
+ mes "[Orum]";
+ mes "\"Actually! After Waric went missing I looked around at his house a bit and came across a note the witch must have dropped. I skimmed over it and didn't pay much attention but I think it mentioned something about this barrier!\"";
+ next;
+ mes "He pulls it out of his pocket and begins examining it.";
+ next;
+ mes "[Orum]";
+ mes "\"Ah! Here it is! If I'm reading this right we may have found a way past it after all. I guess she would need a way to come and go unaffected while everyone else is kept from entering.\"";
+ menu
+ "What does it say?", L_Explain_Aura,
+ "Looks like you can do this without me.", L_Next3;
+
+L_Next3:
+ mes "[Orum]";
+ mes "\"Eh... well I guess I can't force you to stay.\"";
+ goto L_close;
+
+L_Explain_Aura:
+ mes "[Orum]";
+ mes "\"Appears to be some kind of spell to place a magical aura around someone... Hmm, with these materials listed on here I'm going to guess this aura makes the wearer partly incorporeal.\"";
+ next;
+ mes "\"It looks like the barrier requires substances from 3 different incorporeal creatures. I've heard of Wisps, Poltergeists, and Spectres before but I've never seen such a thing.\"";
+ next;
+ mes "\"Luckily I happen to be skilled in this field of magic! I'm pretty sure if I can get my hands on the materials listed on here I'll be able to cast this aura on us, and hopefully then we can get past this barrier!\"";
+ menu
+ "Let me guess... that is my job?", L_Offer_Quest,
+ "I think someone is calling me... Bye!", L_close;
+
+L_Offer_Quest:
+ mes "[Orum]";
+ mes "\"Well you would probably do better than me since I don't know this area very well. It's not too much stuff so I'm sure you won't have any trouble at all.\"";
+ menu
+ "Alright alright, just give me a list.", L_Start_Quest,
+ "I'm not your servant! Bye.", L_Leave1;
+
+L_Leave1:
+ mes "[Orum]";
+ mes "\"Everyone answers to someone... that's just how the world is. If you ever change your mind I'll probably be here forever gathering these materials on my own.\"";
+ goto L_close;
+
+L_Start_Quest:
+ mes "He pulls a crumpled piece of paper from his pocket, smooths it out and writes a list on it before handing it to you.";
+ next;
+ mes "" + @B0_WISPPOWDER + " Wisp Powders,";
+ mes "" + @B0_POLTERGEISTPOWDER + " Poltergeist Powders,";
+ mes "" + @B0_SPECTREPOWDER + " Spectre Powders,";
+ mes "" + @B0_HARDSPIKES + " Hard Spikes";
+ menu
+ "Alright, I'll go get these.", L_Start_Gathering,
+ "You can forget it! I quit!", L_Next4;
+
+L_Next4:
+ mes "[Orum]";
+ mes "\"I know you'll be back... they always come back!\"";
+ goto L_close;
+
+L_Start_Gathering:
+ mes "[Orum]";
+ mes "\"That's the spirit! But try not to take too long.\"";
+ OrumQuest = 1;
+ goto L_close;
+
+L_Started:
+ if (OrumQuest == 1) goto L_Gathering;
+ if (OrumQuest == 2) goto L_Use_First_Barrier;
+ if (OrumQuest == 3) goto L_Explore;
+ if (OrumQuest == 4) goto L_Found_Barriers;
+ if (OrumQuest == 5) goto L_Found_Barriers;
+ if (OrumQuest == 6) goto L_Found_Torches;
+ if (OrumQuest == 7) goto L_Still_Gathering;
+ if (OrumQuest == 8) goto L_Finish_Up;
+ if (OrumQuest >= 9) goto L_Finished_Up;
+ goto L_close;
+
+L_Gathering:
+ mes "[Orum]";
+ mes "\"Got all the things I asked for yet?\"";
+ menu
+ "Yep, I have every last one of them!", L_Check_Materials,
+ "Can I get another list?", L_List_Materials,
+ "I still need a few things...", L_Next5;
+
+L_Next5:
+ mes "Orum shakes his head in frustration.";
+ next;
+ mes "[Orum]";
+ mes "\"You'd better get that stuff soon!\"";
+ goto L_close;
+
+L_List_Materials:
+ mes "He scavenges around in his pocket for another piece of paper then writes a new list.";
+ next;
+ mes @B0_WISPPOWDER + " Wisp Powders,";
+ mes @B0_POLTERGEISTPOWDER + " Poltergeist Powders,";
+ mes @B0_SPECTREPOWDER + " Spectre Powders,";
+ mes @B0_HARDSPIKES + " Hard Spikes";
+ next;
+ mes "[Orum]";
+ mes "\"And try not to lose this one... I'm running out of stuff to write on!\"";
+ goto L_close;
+
+L_Check_Materials:
+ if (countitem("WispPowder") < @B0_WISPPOWDER ||
+ countitem("PoltergeistPowder") < @B0_POLTERGEISTPOWDER ||
+ countitem("SpectrePowder") < @B0_SPECTREPOWDER ||
+ countitem("HardSpike") < @B0_HARDSPIKES)
+ goto L_Missing_Materials;
+
+ // check directly before deleting the objects.
+ delitem "WispPowder", @B0_WISPPOWDER;
+ delitem "PoltergeistPowder", @B0_POLTERGEISTPOWDER;
+ delitem "SpectrePowder", @B0_SPECTREPOWDER;
+ delitem "HardSpike", @B0_HARDSPIKES;
+
+ mes "Orum carefully looks over all of the items then grins.";
+ next;
+ mes "[Orum]";
+ mes "\"Well done! And you did not even take as long as I thought you would!\"";
+ next;
+ mes "Orum takes the hard spikes in his hand and begins chanting some words.";
+ next;
+ mes "You watch as they begin to mold together, glowing brightly. He sprinkles in the powder you gathered and presses his hands together.";
+ misceffect sfx_magic_transmute;
+ next;
+ mes "Suddenly a feeling of dizzyness hits you and you begin to feel weightless... It passes after a moment...";
+ misceffect sfx_magic_nature;
+ misceffect 11, strcharinfo(0);
+ next;
+ mes "[Orum]";
+ mes "\"Well we are both still in one piece so that is a good sign! Now we'll have to see if I did it right... mind going first?\"";
+ goto L_Setup_Lair;
+
+L_Missing_Materials:
+ mes "Orum carefully looks over all of the items then squints his eyes at you.";
+ next;
+ mes "[Orum]";
+ mes "\"I'm not going to attempt this spell until I have ALL the items on this note. Go gather the missing materials!\"";
+ goto L_close;
+
+L_Setup_Lair:
+ OrumQuest = 2;
+ callfunc "SetUpOrumQuest";
+ goto L_close;
+
+L_Use_First_Barrier:
+ mes "[Orum]";
+ mes "\"Casting that aura took a lot out of me. Why don't you go explore the cave a bit while I rest?\"";
+ goto L_close;
+
+L_Explore:
+ mes "Orum looks up as you approach.";
+ next;
+ mes "[Orum]";
+ mes "\"Find anything interesting in this place?\"";
+ next;
+ menu
+ "Yep. A whole mess of torches!", L_Explain_Objective,
+ "I'm not sure what to look for...", L_Explain_Objective,
+ "Going to explore more, bye.", L_Leave2;
+
+L_Leave2:
+ mes "[Orum]";
+ mes "\"Be sure to let me know if you find anything. I've almost gained my energy back.\"";
+ goto L_close;
+
+L_Explain_Objective:
+ mes "[Orum]";
+ mes "\"I'm positive this is where that witch took Waric, so this cave must lead to somewhere. Try looking around for another exit. I've almost gained my energy back and then I can help.\"";
+ goto L_close;
+
+L_Found_Barriers:
+ mes "Orum looks up as you approach.";
+ next;
+ mes "[Orum]";
+ mes "\"Find anything interesting in this place?\"";
+ menu
+ "Yep. A whole mess of torches!", L_Explain_Objective,
+ "I'm not sure what to look for...", L_Explain_Objective,
+ "I found more barriers, but...", L_Explain_Barriers_More,
+ "Going to explore more, bye.", L_Leave3;
+
+L_Leave3:
+ mes "[Orum]";
+ mes "\"Be sure to let me know if you find anything. I'm still gaining my energy back.\"";
+ goto L_close;
+
+L_Explain_Barriers_More:
+ mes "[Orum]";
+ mes "\"Hm let me guess... the aura is ineffective on the rest of the barriers here?\"";
+ menu
+ "How did you know?", L_Explain_Note_More,
+ "I'm not sure, I'll go try again.", L_Next6;
+
+L_Next6:
+ mes "[Orum]";
+ mes "\"Always a good idea to double check things!\"";
+ goto L_close;
+
+L_Explain_Note_More:
+ mes "[Orum]";
+ mes "\"Well while I was resting I spent more time looking over the note that witch dropped. And I think the aura is only to get past the entrance.\"";
+ next;
+ mes "[Orum]";
+ mes "\"It mentions some sort of security system to keep people from entering the actual lair but it doesn't explain in great detail. Try exploring more, maybe we will find some answers.\"";
+ next;
+ mes "Orum continues examining the note.";
+ goto L_close;
+
+L_Found_Torches:
+ mes "Orum looks up as you approach.";
+ next;
+ mes "[Orum]";
+ mes "\"Did you find something interesting?\"";
+ next;
+ menu
+ "Yep. A whole mess of torches!", L_Explain_Objective,
+ "I'm not sure what to look for...", L_Explain_Objective,
+ "I found more barriers, but...", L_Explain_Barriers_More,
+ "I found a strange torch by itself.", L_Explain_Torches,
+ "Going to explore more, bye.", L_Leave4;
+
+L_Leave4:
+ mes "[Orum]";
+ mes "\"Be sure to let me know if you find anything new.\"";
+ goto L_close;
+
+L_Explain_Torches:
+ mes "Orum has you direct him to the torch and he walks off to examine it before returning shortly after.";
+ next;
+ mes "[Orum]";
+ mes "\"Ah yes! I was hoping we would find something like this!\"";
+ next;
+ mes "\"While examining the note I found another set of spells to create some type of powder and with them was a few notes on using it with some type of torch.\"";
+ next;
+ mes "\"I bet this torch has something to do with the rest of these barriers which are probably the security system this note mentions.\"";
+ next;
+ mes "\"We will probably need to transmute this powder before we can get any further past these barriers. Would you mind gathering a few more materials?\"";
+ menu
+ "It better be the last time.", L_Gather_More,
+ "I'm done doing stuff for you!", L_Next61;
+
+L_Next61:
+ mes "[Orum]";
+ mes "\"I'm surprised you give up after we've gotten so far. Shame.\"";
+ goto L_close;
+
+L_Gather_More:
+ mes "Orum begins writing down another list of materials.";
+ next;
+ mes @BT_IRONPOWDER + " Piles of Iron Powder,";
+ mes @BT_PILESOFASH + " Piles of Sand or Ash,";
+ mes @BT_HERBS + " Gamboge Herbs,";
+ mes @BT_HERBS + " Alizarin Herbs,";
+ mes @BT_HERBS + " Cobalt Herbs";
+ menu
+ "Yikes! I'll try...", L_Gathering_More,
+ "No way! Too much stuff!", L_Next7;
+
+L_Next7:
+ mes "[Orum]";
+ mes "\"The note says to get these and I'm not going to attempt this spell until I have what the note says.\"";
+ goto L_close;
+
+L_Gathering_More:
+ OrumQuest = 7;
+ mes "[Orum]";
+ mes "\"Wonderful! Try to make it quick, we must save Waric!\"";
+ goto L_close;
+
+L_Still_Gathering:
+ mes "[Orum]";
+ mes "\"Have you finished gathering those things yet?\"";
+ menu
+ "I believe I have!", L_F_Gather_More,
+ "I lost my list... again.", L_List_Materials_More,
+ "I've almost got them all.", L_Next8;
+
+L_Next8:
+ mes "[Orum]";
+ mes "\"Don't make me remind you again! Warics life is on the line here! Hurry up!\"";
+ goto L_close;
+
+L_List_Materials_More:
+ mes "He scavenges around in his pocket for another piece of paper then writes a new list.";
+ next;
+ mes @BT_IRONPOWDER + " Piles of Iron Powder,";
+ mes @BT_PILESOFASH + " Piles of Sand or Ash,";
+ mes @BT_HERBS + " Gamboge Herbs,";
+ mes @BT_HERBS + " Alizarin Herbs,";
+ mes @BT_HERBS + " Cobalt Herbs";
+ next;
+ mes "[Orum]";
+ mes "\"And try not to lose this one. I don't have much more to write on!\"";
+ goto L_close;
+
+L_F_Gather_More:
+ if (countitem("IronPowder") < @BT_IRONPOWDER ||
+ countitem("PileOfAsh") < @BT_PILESOFASH ||
+ countitem("GambogeHerb") < @BT_HERBS ||
+ countitem("AlizarinHerb") < @BT_HERBS ||
+ countitem("CobaltHerb") < @BT_HERBS)
+ goto L_Missing_Mats_M;
+
+ delitem "IronPowder", @BT_IRONPOWDER;
+ delitem "PileOfAsh", @BT_PILESOFASH;
+ delitem "GambogeHerb", @BT_HERBS;
+ delitem "AlizarinHerb", @BT_HERBS;
+ delitem "CobaltHerb", @BT_HERBS;
+
+ mes "[Orum]";
+ mes "\"Excellent work! And once again you did not take as long as I was expecting. I guess I will get started.\"";
+ next;
+ mes "You watch as Orum takes the iron powder and ash and begins chanting some words. The two start to glow and mold together turning into a light, metallic looking powder.";
+ next;
+ misceffect sfx_magic_transmute;
+ mes "He then splits the powder into three piles and performs separate spells on each using the herbs. After he finishes you see 3 piles of colored metallic powder that appear to be red, yellow, and blue.";
+ next;
+ misceffect sfx_magic_transmute;
+ mes "[Orum]";
+ mes "\"Well if I did it right... These three powders are hopefully the key to getting past these barriers!\"";
+ next;
+ mes "\"I'm weary, I must take some time to rest. Why don't you go ahead and experiment with these powders on that torch and let me know if you figure what they have to do with it.\"";
+
+ getitem "RedPowder", @BT_REWARDCOUNT;
+ getitem "YellowPowder", @BT_REWARDCOUNT;
+ getitem "BluePowder", @BT_REWARDCOUNT;
+ OrumQuest = 8;
+ goto L_close;
+
+L_Missing_Mats_M:
+ mes "Orum carefully looks over all of the items then squints his eyes at you.";
+ next;
+ mes "[Orum]";
+ mes "\"You really enjoy playing games with Warics life, don't you! Come back when you have ALL of the items I told you.\"";
+ goto L_close;
+
+L_Finish_Up:
+ mes "Orum seems to be sitting around doing nothing as you approach.";
+ next;
+ mes "[Orum]";
+ mes "\"Did you find a way past any of the barriers yet?\"";
+ menu
+ "No, I'm still not sure how.", L_Explain_Torches_More,
+ "I need more of that powder.", L_More_Powder,
+ "I'm still trying...", L_Next9;
+
+L_Next9:
+ mes "[Orum]";
+ mes "\"Excellent! Let me know when you've made any progress.\"";
+ goto L_close;
+
+L_Explain_Torches_More:
+ mes "[Orum]";
+ mes "\"Most of the barriers here have a certain color radiating from them and so do the torches. The torches seem to react with this powder so maybe we have to make these torches turn a certain color in order to lower the barriers.\"";
+ next;
+ mes "\"It seems that the powders are only in these 3 colors, so you may have to experiment a bit to get the colors right.\"";
+ next;
+ mes "\"Also while looking around I saw that behind one of the barriers was a cave. Maybe Waric is in there... we should try to get that barrier dropped.\"";
+ goto L_close;
+
+L_More_Powder:
+ mes "[Orum]";
+ mes "\"You really used up that powder fast. Luckily I can make more as long as you can bring me those materials again.\"";
+ menu
+ "I have them right here!", L_More_Powder_Make,
+ "Hmmm... what are they again?", L_List_Materials_More,
+ "I'll go get those for you.", L_Next10;
+
+L_Next10:
+ mes "[Orum]";
+ mes "\"You better not waste any time gathering those materials!\"";
+ goto L_close;
+
+L_More_Powder_Make:
+ if (countitem("IronPowder") < @BT_IRONPOWDER ||
+ countitem("PileOfAsh") < @BT_PILESOFASH ||
+ countitem("GambogeHerb") < @BT_HERBS ||
+ countitem("AlizarinHerb") < @BT_HERBS ||
+ countitem("CobaltHerb") < @BT_HERBS)
+ goto L_Missing_Mats_M;
+
+ delitem "IronPowder", @BT_IRONPOWDER;
+ delitem "PileOfAsh", @BT_PILESOFASH;
+ delitem "GambogeHerb", @BT_HERBS;
+ delitem "AlizarinHerb", @BT_HERBS;
+ delitem "CobaltHerb", @BT_HERBS;
+
+ mes "[Orum]";
+ mes "\"Hmm all of the items appear to be here. Give me a moment to make that powder for you.\"";
+ next;
+ mes "Orum begins chanting the same words as he did when he made the powder before. He seems to be quicker this time.";
+ misceffect sfx_magic_transmute;
+ next;
+ mes "[Orum]";
+ mes "\"Here you are. And try to conserve this time! The more powder I have to make, the more time and resources we use up that we could be using to save Waric!\"";
+
+ getitem "RedPowder", @BT_REWARDCOUNT;
+ getitem "YellowPowder", @BT_REWARDCOUNT;
+ getitem "BluePowder", @BT_REWARDCOUNT;
+ goto L_close;
+
+L_Finished_Up:
+ mes "As you approch you think you see Orum rolling his eyes... maybe you're imagining it.";
+ next;
+ mes "[Orum]";
+ mes "\"I hope you finally dropped that barrier we need to get past!\"";
+ menu
+ "Actually... I have!", L_Enter_Cavern,
+ "I need more of that powder.", L_More_Powder,
+ "Cut me some slack! I'm working on it!", L_Next11;
+
+L_Next11:
+ mes "[Orum]";
+ mes "\"Just hurry it up! Warics life is on the line here!\"";
+ goto L_close;
+
+L_Enter_Cavern:
+ if (OrumQuest >= 10) goto L_Ready_Cavern;
+
+ mes "Orum heads to the barrier then gives you a look as if he does not believe you before walking forward.";
+ next;
+ mes "He is suddenly thrown against the wall behind him! Angered, he gets up, brushes himself off, and heads back to the entrance without speaking.";
+ goto L_close;
+
+L_Ready_Cavern:
+ // you should not get that twice ;)
+ if (OrumQuest == 12) goto L_Got_Reward;
+
+ mes "Orum heads to the barrier then gives you a look as if he does not believe you before walking forward.";
+ next;
+ mes "He makes it through without any problems and grins.";
+ next;
+ mes "[Orum]";
+ mes "\"Very good work you have done! Please take this for your efforts. It has helped me in a bind.\"";
+ next;
+ getinventorylist;
+ if ((checkweight("CandleHelmet", 1) == 0) || (@inventorylist_count == 100))
+ goto L_Inventory;
+ getexp @Exp_BREAK_BARRIERS, 0;
+ getitem "CandleHelmet", 1;
+ OrumQuest = 12;
+ mes "You receive the Candle Helmet.";
+ next;
+ mes "\"You've done enough here to help. I will go the rest of the way alone so that your life is not endangered. You must promise me not to go any further!\"";
+ menu
+ "Sure, I promise!", L_Next12,
+ "I thought this would never be over!", L_Next12;
+
+L_Next12:
+ mes "[Orum]";
+ mes "\"Well I guess this is farewell!\"";
+ goto L_close;
+
+L_Inventory:
+ mes "\"You're carrying too much. Come back to me after you got rid of some stuff. And hurry, I don't want to spent all day waiting on you.\"";
+ goto L_close;
+
+L_Got_Reward:
+ mes "\"You've done enough here to help. I will go the rest of the way alone so that your life is not endangered.\"";
+ goto L_close;
+
+L_close:
+ @B0_WISPPOWDER = 0;
+ @B0_POLTERGEISTPOWDER = 0;
+ @B0_SPECTREPOWDER = 0;
+ @B0_HARDSPIKES = 0;
+
+ @BT_IRONPOWDER = 0;
+ @BT_PILESOFASH = 0;
+ @BT_HERBS = 0;
+
+ @BT_REWARDCOUNT = 0;
+
+ @Exp_BREAK_BARRIERS = 0;
+
+ @Barrier = 0;
+ @BarrierColor = 0;
+ @Torch = 0;
+ @TorchColor = 0;
+ close;
+}
+function script SetUpOrumQuest {
+ // Second Barrier
+ @BarrierColor = 1 + rand(3) * 4;
+ @Barrier = 0;
+ callfunc "SetBarrierColor";
+
+ @TorchIntensity = 0;
+
+ @Torch = 0;
+ @TorchColor = rand(1, 12);
+ callfunc "SetTorchColor";
+ callfunc "SetTorchIntensity";
+
+ // Third Barrier
+ @BarrierColor = 3 + rand(3) * 4;
+ @Barrier = 1;
+ callfunc "SetBarrierColor";
+
+ @Torch = 1;
+ @TorchColor = rand(1, 12);
+ callfunc "SetTorchColor";
+ callfunc "SetTorchIntensity";
+
+ // End Barrier
+ @BarrierColor = 2 + rand(6) * 2;
+ @Barrier = 2;
+ callfunc "SetBarrierColor";
+
+ @Torch = 2;
+ @TorchColor = rand(1, 12);
+ callfunc "SetTorchColor";
+ callfunc "SetTorchIntensity";
+ return;
+}
diff --git a/npc/009-4/orum_warps.txt b/npc/009-4/orum_warps.txt
new file mode 100644
index 00000000..8cf74919
--- /dev/null
+++ b/npc/009-4/orum_warps.txt
@@ -0,0 +1,33 @@
+009-3,162,113,0 script #OrumQuestEnter NPC45,0,0,{
+ if (OrumQuest >= 12) goto L_Second_Entrance;
+ warp "009-4", 37, 113;
+ close;
+
+L_Second_Entrance:
+ warp "009-4", 72, 126;
+ close;
+}
+009-4,36,26,0 script #LairExit NPC45,0,0,{
+ if (OrumQuest >= 12) goto L_Second_Entrance;
+ warp "009-4", 37, 122;
+ close;
+
+L_Second_Entrance:
+ warp "009-4", 72, 135;
+ close;
+}
+
+009-4,51,47,0 script #CavernEnter NPC45,0,0,{
+ if (OrumQuest >= 14) goto L_Second_Cavern;
+ if (OrumQuest < 12) goto L_See_Orum;
+ warp "009-4", 103, 23;
+ close;
+
+L_Second_Cavern:
+ warp "009-4", 103, 77;
+ close;
+
+L_See_Orum:
+ mes "Right as you are entering you hear Orum call out for you. Perhaps you should see what he wants first.";
+ close;
+}
diff --git a/npc/009-4/torches.txt b/npc/009-4/torches.txt
new file mode 100644
index 00000000..fe1fc187
--- /dev/null
+++ b/npc/009-4/torches.txt
@@ -0,0 +1,286 @@
+function script GetTorchColor {
+ if (@Torch < 0 || @Torch > 2) goto L_Error;
+
+ @Mask = 15;
+ @shift = 4 * @Torch;
+ @TorchColor = (OrumQuestTorch >> @shift) & @Mask;
+ return;
+
+L_Error:
+ mes "Torch number is out of range.";
+ close2;
+ return;
+}
+
+function script SetTorchColor {
+ if (@Torch < 0 || @Torch > 2) goto L_Error;
+ if (@TorchColor < 1 || @TorchColor > 12) goto L_Error2;
+
+ @Mask = (15 << (4 * @Torch));
+ OrumQuestTorch = (OrumQuestTorch & (~(@Mask))) | @TorchColor << (4 * @Torch);
+ return;
+
+L_Error:
+ mes "Torch number is out of range.";
+ close2;
+ return;
+
+L_Error2:
+ mes "Torch color is out of range.";
+ close2;
+ return;
+}
+
+function script GetTorchIntensity {
+ if (@Torch < 0 || @Torch > 2) goto L_Error;
+
+ @Mask = 15;
+ @shift = 4 * (@Torch + 3);
+ @TorchIntensity = (OrumQuestTorch >> @shift) & @Mask;
+ return;
+
+L_Error:
+ mes "Torch number is out of range.";
+ close2;
+ return;
+}
+
+function script SetTorchIntensity {
+ if (@Torch < 0 || @Torch > 2) goto L_Error;
+ if (@TorchIntensity < 0 || @TorchIntensity > 2) goto L_Error2;
+
+ @Mask = (15 << (4 * (@Torch + 3)));
+ OrumQuestTorch = (OrumQuestTorch & (~(@Mask))) | @TorchIntensity << (4 * (@Torch + 3));
+ return;
+
+L_Error:
+ mes "Torch number is out of range.";
+ close2;
+ return;
+
+L_Error2:
+ mes "Torch intensity is out of range.";
+ close2;
+ return;
+}
+
+function script DoneWithTorches {
+ if (OrumQuest < 11 && OrumQuest >= 8)
+ goto L_Return;
+
+ if (OrumQuest < 7) goto L_Different;
+
+ if (OrumQuest >= 11)
+ mes "The flame on the torch looks ordinary. Lowering the final barrier seems to have drained them of their magic.";
+
+ if (OrumQuest < 8)
+ mes "Without that powder the note mentions there isn't much you can do with this torch.";
+ close2;
+ goto L_Return;
+
+L_Different:
+ mes "The flame on this torch looks different than the rest. You better tell Orum about it before doing anything.";
+ OrumQuest = 6;
+ close2;
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+function script TorchLoop {
+ // Variables used here:
+ // @Torch - pass before calling
+ // @TorchColor - initialized here, updated throughout
+ // @TorchIntensity - initialized here, updated throughout
+ callfunc "GetTorchColor";
+ callfunc "GetTorchIntensity";
+
+ setarray @colors$, "transparent",
+ "red", "dark orange", "orange", "light orange",
+ "yellow", "light green", "green", "dark green",
+ "blue", "dark purple", "purple", "light purple";
+ setarray @intensities$, "calm", "bright", "blinding";
+ mes "Looking closely you notice that this torch is not like the others. This one has a " + @intensities$[@TorchIntensity] + " ##B" + @colors$[@TorchColor] + "##b tint to it.";
+ goto L_Color_Loop;
+
+L_Color_Loop:
+ menu
+ "Add Red Powder", L_Use_Red,
+ "Add Yellow Powder", L_Use_Yellow,
+ "Add Blue Powder", L_Use_Blue,
+ "Leave it alone.", L_Leave;
+
+L_Leave:
+ mes "The flame flickers as if it's laughing at you.";
+ close2;
+ return;
+
+L_Use_Red:
+ if (countitem("RedPowder") < 1)
+ goto L_No_Powder;
+ delitem "RedPowder", 1;
+
+ // 0 1 2 3 4 5 6 7 8 9 a b c
+ // T R o Y g B p
+ // ^ < < < < , X . > > > >
+ if (@TorchColor == 1)
+ goto L_WrongColor;
+ if (2 <= @TorchColor && @TorchColor <= 5)
+ goto L_Color_Dec;
+ if (@TorchColor == 6)
+ goto L_Color_Dec_Wrong;
+ if (@TorchColor == 7)
+ goto L_WrongColor;
+ if (@TorchColor == 8)
+ goto L_Color_Inc_Wrong;
+ if (9 <= @TorchColor && @TorchColor <= 12)
+ goto L_Color_Inc;
+
+ // work around an old bug
+ if (@TorchColor == 0)
+ @TorchColor = 1;
+ goto L_Show_Color;
+
+L_Use_Yellow:
+ if (countitem("YellowPowder") < 1)
+ goto L_No_Powder;
+ delitem "YellowPowder", 1;
+
+ // 0 1 2 3 4 5 6 7 8 9 a b c
+ // T R o Y g B p
+ // > > > > ^ < < < < , X .
+ if (1 <= @TorchColor && @TorchColor <= 4)
+ goto L_Color_Inc;
+ if (@TorchColor == 5)
+ goto L_WrongColor;
+ if (6 <= @TorchColor && @TorchColor <= 9)
+ goto L_Color_Dec;
+ if (@TorchColor == 10)
+ goto L_Color_Dec_Wrong;
+ if (@TorchColor == 11)
+ goto L_WrongColor;
+ if (@TorchColor == 12)
+ goto L_Color_Inc_Wrong;
+
+ // work around an old bug
+ if (@TorchColor == 0)
+ @TorchColor = 5;
+ goto L_Show_Color;
+
+L_Use_Blue:
+ if (countitem("BluePowder") < 1)
+ goto L_No_Powder;
+ delitem "BluePowder", 1;
+
+ // 0 1 2 3 4 5 6 7 8 9 a b c
+ // T R o Y g B p
+ // < , X . > > > > ^ < < <
+ if (@TorchColor == 1)
+ goto L_Color_Dec;
+ if (@TorchColor == 2)
+ goto L_Color_Dec_Wrong;
+ if (@TorchColor == 3)
+ goto L_WrongColor;
+ if (@TorchColor == 4)
+ goto L_Color_Inc_Wrong;
+ if (5 <= @TorchColor && @TorchColor <= 8)
+ goto L_Color_Inc;
+ if (@TorchColor == 9)
+ goto L_WrongColor;
+ if (10 <= @TorchColor && @TorchColor <= 12)
+ goto L_Color_Dec;
+
+ // work around an old bug
+ if (@TorchColor == 0)
+ @TorchColor = 9;
+ goto L_Show_Color;
+
+L_No_Powder:
+ mes "You notice you're all out of that color of powder. Perhaps Orum can make you some more.";
+ close2;
+ return;
+
+L_Color_Dec:
+ @TorchColor = @TorchColor - 1;
+ if (@TorchColor == 0)
+ @TorchColor = 12;
+ goto L_Show_Color;
+
+L_Color_Dec_Wrong:
+ @TorchColor = @TorchColor - 1;
+ if (@TorchColor == 0)
+ @TorchColor = 12;
+ goto L_WrongColor;
+
+L_Color_Inc_Wrong:
+ @TorchColor = @TorchColor + 1;
+ if (@TorchColor == 13)
+ @TorchColor = 1;
+ goto L_WrongColor;
+
+L_Color_Inc:
+ @TorchColor = @TorchColor + 1;
+ if (@TorchColor == 13)
+ @TorchColor = 1;
+ goto L_Show_Color;
+
+L_Show_Color:
+ callfunc "SetTorchColor";
+ misceffect 5;
+ mes "As your pour the powder into the flame you can see its tint transform to a " + @intensities$[@TorchIntensity] + " ##B" + @colors$[@TorchColor] + "##b.";
+ goto L_Color_Loop;
+
+L_WrongColor:
+ callfunc "SetTorchColor";
+ @TorchIntensity = @TorchIntensity + 1;
+ if (@TorchIntensity > 2)
+ goto L_Failed;
+ callfunc "SetTorchIntensity";
+ misceffect 5;
+ mes "As you pour the powder into the flame it flares violently for a moment and then turns into a " + @intensities$[@TorchIntensity] + " ##B" + @colors$[@TorchColor] + "##b.";
+ goto L_Color_Loop;
+
+L_Failed:
+ mes "As you pour the powder into the flame it flares violently before bursting into your face!";
+ misceffect 5;
+ misceffect 16;
+ @TorchIntensity = 0;
+ callfunc "SetTorchIntensity";
+ heal -Hp, 0;
+ close2;
+ return;
+}
+
+009-4,68,21,0 script Torch#1 NPC400,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "DoneWithTorches";
+
+ @Torch = 0;
+ callfunc "TorchLoop";
+ // unreachable
+ end;
+}
+
+009-4,67,42,0 script Torch#2 NPC400,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "DoneWithTorches";
+
+ @Torch = 1;
+ callfunc "TorchLoop";
+ // unreachable
+ end;
+}
+
+009-4,33,86,0 script Torch#3 NPC400,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "DoneWithTorches";
+
+ @Torch = 2;
+ callfunc "TorchLoop";
+ // unreachable
+ end;
+}
diff --git a/npc/009-4/waric.txt b/npc/009-4/waric.txt
new file mode 100644
index 00000000..dee2787f
--- /dev/null
+++ b/npc/009-4/waric.txt
@@ -0,0 +1,93 @@
+
+009-4,99,33,0 script #WizardTrap NPC32767,2,1,{
+ mes "As you explore further into the cave you see a figure looking at you who appears angry. But as you begin to speak, he quickly chants some words and you start to lose conciousness!";
+ next;
+ warp "009-4", 117, 40;
+ mes "When you awake you find yourself unable to move. You seem to be held in place by something. As your eyes regain focus you see Orum talking with the figure you saw earlier. Orum looks over at you and mumbles.";
+ mes "";
+ mes "[Orum]";
+ mes "\"Be quiet Waric... They're awake...\"";
+ close;
+}
+
+009-4,120,43,0 script Orum#trap NPC158,{
+ mes "[Orum]";
+ mes "\"I told you to forget about this place but you did not heed my advice!\"";
+ next;
+ mes "\"Your fate is up to Waric now... don't expect me to do anything else for you.\"";
+ close;
+}
+
+009-4,118,42,0 script Waric#trap NPC153,{
+ @Exp_LEARNED_ALOT = 10000;
+ if (OrumQuest >= 13)
+ goto L_Behave;
+ mes "Waric looks toward you rubbing his chin...";
+ next;
+ mes "[Waric]";
+ mes "\"So... Orum tells me your the one that helped him break me out of this dreadful place, so I guess I must thank you for that.\"";
+ menu
+ "My pleasure! Mind letting me out of here?", L_Explain,
+ "This doesn't look like a thank you!", L_Explain,
+ "Let me out of here at once!", L_Next;
+
+L_Next:
+ mes "Waric turns toward Orum.";
+ next;
+ mes "[Waric]";
+ mes "\"We've got a feisty one here, Orum!\"";
+ next;
+ mes "They begin discussing plans of some sort...";
+ OrumQuest = 13;
+ goto L_close;
+
+L_Behave:
+ mes "Waric looks toward you shaking his finger.";
+ next;
+ mes "[Waric]";
+ mes "\"So... are you ready to behave yourself now?\"";
+ menu
+ "Yes mister...", L_Explain,
+ "Let me out here!", L_Next1;
+
+L_Next1:
+ mes "[Waric]";
+ mes "\"Having fun I take it?\"";
+ next;
+ mes "They continue discussing their plans.";
+ goto L_close;
+
+L_Explain:
+ mes "[Waric]";
+ mes "\"I'm not sure what Orum told you but I was not kidnapped and brought here. I was in fact imprisoned here very long ago by a witch for practicing spells on the insignificant forest life.\"";
+ next;
+ mes "\"She cared about the forest and all of that stuff you see. Now this cave is not bad... I actually enjoyed it the first nights, but after a few years...\"";
+ next;
+ mes "Waric gets a bitter look and his face and pauses for a moment.";
+ next;
+ mes "[Waric]";
+ mes "\"So now you can see my motive to get out of here. The only air and water I get is what's given to me through that cave over there. And as for food... theres only so many recipes for cave snakes and silk worms.\"";
+ next;
+ mes "Waric shivers in disgust.";
+ next;
+ mes "[Waric]";
+ mes "\"I'm sorry I had to constrain you like this but now that I'm free, I'm not about to let anyone stand in my way!\"";
+ next;
+ mes "\"Now if you'll excuse us, Orum and I have some things to attend to. And don't bother coming back to stop us because we'll be long gone.\"";
+ next;
+ mes "Waric raises his hands and begins chanting some words. You watch as streams of energy begin swirling around you.";
+ next;
+ mes "Once more you start to lose conciousness as your surroundings begin to fade...";
+ next;
+ OrumQuest = 14;
+ misceffect 10;
+ warp "008-1", 65, 90;
+ getexp @Exp_LEARNED_ALOT, 0;
+ mes "You awake on your back with a squirrel sitting on top of you arranging it's acorns. It quickly gathers them up and runs off as it sees you looking at it them.";
+ monster "008-1", 65, 90, "Squirrel", 1038, 1;
+ goto L_close;
+
+L_close:
+ @Exp_LEARNED_ALOT = 0;
+ close;
+}
diff --git a/npc/009-5/_import.txt b/npc/009-5/_import.txt
new file mode 100644
index 00000000..8caab9a6
--- /dev/null
+++ b/npc/009-5/_import.txt
@@ -0,0 +1,4 @@
+// Map 009-5: Last man standing
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/009-5/_warps.txt",
+"npc/009-5/mapflags.txt",
diff --git a/npc/009-5/_warps.txt b/npc/009-5/_warps.txt
new file mode 100644
index 00000000..301533d9
--- /dev/null
+++ b/npc/009-5/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-5: Last man standing warps
+009-5,53,74,0 warp #009-5_53_74 2,0,009-3,162,81
diff --git a/npc/009-5/mapflags.txt b/npc/009-5/mapflags.txt
new file mode 100644
index 00000000..a1d35c0d
--- /dev/null
+++ b/npc/009-5/mapflags.txt
@@ -0,0 +1,2 @@
+009-5 mapflag nosave 009-3,162,82
+009-5 mapflag zone MMO
diff --git a/npc/009-6/_import.txt b/npc/009-6/_import.txt
new file mode 100644
index 00000000..42f5206e
--- /dev/null
+++ b/npc/009-6/_import.txt
@@ -0,0 +1,5 @@
+// Map 009-6: Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/009-6/_warps.txt",
+"npc/009-6/brodomir.txt",
+"npc/009-6/mapflags.txt",
diff --git a/npc/009-6/_warps.txt b/npc/009-6/_warps.txt
new file mode 100644
index 00000000..b06192a0
--- /dev/null
+++ b/npc/009-6/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-6: Cave warps
+009-6,36,48,0 warp #009-6_36_48 0,0,009-3,162,82
diff --git a/npc/009-6/brodomir.txt b/npc/009-6/brodomir.txt
new file mode 100644
index 00000000..6ced87cd
--- /dev/null
+++ b/npc/009-6/brodomir.txt
@@ -0,0 +1,249 @@
+
+
+
+
+009-6,36,40,0 script Brodomir NPC116,{
+ @brodomir_money = 0;
+ @brodomir_item_amount = 0;
+ @brodomir_item$ = "";
+
+ if ($@BRODOMIR_PVP_STATUS == 2)
+ goto L_AlreadyStarted;
+ if ($@BRODOMIR_PVP_STATUS == 1 && $@BRODOMIR_START_TIME > gettimetick(2))
+ goto L_Wait;
+ mes "[Brodomir]";
+ mes "\"Hi Warrior.\"";
+ mes "\"Do you know me? I'm pretty old and I have never been good with faces?\"";
+ menu
+ "Yes of course! Don't you remember me?", L_Shorttalk,
+ "No, who are you?", L_Longtalk,
+ "I don't want to know you!", L_close;
+
+L_Longtalk:
+ mes "[Brodomir]";
+ mes "\"I'm Brodomir\"";
+ mes "Brodomir sighs.";
+ mes "\"Once I as well was a powerful warrior. It's been quite a while. But before that I was a miner in Tonori. I can still remember it very good. The Earth was shaking for hours and everything was torn apart. Many many of my friends and beloved ones were devoured by the crevasses which opened up. It was horrific and I am very lucky to have survived that.\"";
+ next;
+ mes "\"Then everything was pure chaos and I had to fight to survive. We had hardly anything to eat, therefore the strongest survived. I turned out to be a very good warrior. I fought hard. When I felt strong enough to defend others I created a school of martial arts. I took in the weak and tended to them and made them stronger.\"";
+ next;
+ mes "\"I trained them to fight with all weapons and how to fight bare handed. Taught them how to make their own weapons and what could be used as a weapon. Those were dark times. I'm happy that those times are over and you do not have to live through it.\"";
+ next;
+ mes "\"When my shelter was no longer required I started to wander around. Now I ended up here old and wrinkly. I'm only able to drive away those weak creatures who try to enter my home all the time. Slowly they learn to leave me alone or I'll squish them.\"";
+ next;
+ mes "\"I am sorry but I cannot teach you anything anymore. I am too old. But I am still quite good with my pickaxe and I made a cave where you can fight against your friends.\"";
+ mes "\"The only things you need is to sponsor some prize money and at least two of your friends. If you pay me I will give you about five minutes and after that I will bring you to the cave where you can fight. I will reward the winner. Do you want to give it a shot?\"";
+ goto L_Menu;
+
+L_Shorttalk:
+ mes "Well... I'm sorry I cannot remember. I'm old. I hope you can forgive me. Well then. Do you want to fight with your friends in my cave? All you need is to sponsor some prize money and at least two of your friends.";
+ goto L_Menu;
+
+L_Menu:
+ menu
+ "No.", L_Exit,
+ "Yes.", L_Pay,
+ "I'd like this item to be the prize.", L_Item;
+
+L_Exit:
+ mes "[Brodomir]";
+ mes "\"Okay, you can come back anytime.\"";
+ goto L_close;
+
+L_Item:
+ mes "[Brodomir]";
+ mes "\"Ok, which item?\"";
+ mes "Make sure to spell correctly and if the item name contains whitespaces, leave them out.";
+ input @brodomir_item$;
+ mes "[Brodomir]";
+ mes "\"And how many?\"";
+ input @brodomir_item_amount;
+ if (@brodomir_item_amount < 1)
+ goto L_Fool;
+ mes "[Brodomir]";
+ mes "\"So the prize should be " + @brodomir_item_amount + " " + @brodomir_item$ + "?\"";
+ mes "\"In case there aren't enough people to start the fight, I'll try to give it back to you. If you're not here then... well, then I'll keep it for myself.\"";
+ menu
+ "Ok.", L_Next,
+ "No, you missunderstood me.", L_Item,
+ "I changed my mind, forget it.", L_close;
+
+L_Next:
+ if ($@BRODOMIR_PVP_STATUS == 1)
+ goto L_Wait;
+ if (countitem(@brodomir_item$) < @brodomir_item_amount)
+ goto L_NoItem;
+
+ // we need this loop because for items that can't be stacked, delitem can only delete a single one
+ @loopcounter = @brodomir_item_amount;
+ goto L_Delitem;
+
+L_Delitem:
+ delitem @brodomir_item$, 1;
+ @loopcounter = @loopcounter - 1;
+ if (@loopcounter > 0)
+ goto L_Delitem;
+
+ $@BRODOMIR_SPONSOR = getcharid(3);
+ goto L_Go;
+
+L_NoItem:
+ mes "[Brodomir]";
+ mes "\"Hey, you don't have " + @brodomir_item_amount + " " + @brodomir_item$ + "!\"";
+ goto L_close;
+
+L_Fool:
+ mes "[Brodomir]";
+ mes "\"Are you trying to fool me? Come back when you're more serious.\"";
+ goto L_close;
+
+L_Pay:
+ mes "[Brodomir]";
+ mes "\"How much money do you want to sponsor as prize? It should be at least 5000GP.\"";
+ input @brodomir_money;
+ if (@brodomir_money < 5000)
+ goto L_TooCheap;
+ if ($@BRODOMIR_PVP_STATUS == 1)
+ goto L_Wait;
+ if (Zeny < @brodomir_money)
+ goto L_NotEnoughMoney;
+ Zeny = Zeny - @brodomir_money;
+ goto L_Go;
+
+L_Go:
+ $@BRODOMIR_ITEM$ = @brodomir_item$;
+ $@BRODOMIR_ITEM_AMOUNT = @brodomir_item_amount;
+ $@BRODOMIR_MONEY = @brodomir_money;
+ $@brodomir_delay_seconds = 600;
+ $@BRODOMIR_START_TIME = gettimetick(2) + $@brodomir_delay_seconds;
+ $@BRODOMIR_PVP_STATUS = 1;
+ announce "Brodomir : In "+$@brodomir_delay_seconds/60+" minutes, I will start a PvP tournament, if at least 3 fighters are present. Make your way in Hurnscald Underground Caves!", 0;
+ if ($@BRODOMIR_ITEM_AMOUNT > 0)
+ announce "Brodomir : The winner will receive 150GP per fighter and " + $@BRODOMIR_ITEM_AMOUNT + " " + $@BRODOMIR_ITEM$ + ".", 0;
+ if ($@BRODOMIR_MONEY > 0)
+ announce "Brodomir : The winner will receive " + $@BRODOMIR_MONEY + "GP and additionally 150GP per fighter.", 0;
+ mes "[Brodomir]";
+ mes "\"In "+$@brodomir_delay_seconds/60+" minutes I will bring you all to the PvP cave. If there are less than 3 players here the event will not start and your money will be lost.\"";
+ $@brodomir_delay_seconds = 0;
+ initnpctimer;
+ goto L_close;
+
+L_Wait:
+ @seconds = $@BRODOMIR_START_TIME - gettimetick(2);
+ callfunc "HumanTime";
+ mes "[Brodomir]";
+ mes "\"Just a little longer. I will bring you there in " + @time$ + ".\"";
+ goto L_close;
+
+OnTimer5000:
+ setnpctimer 0;
+ if ($@BRODOMIR_PVP_STATUS > 1)
+ goto L_Check;
+ if (gettimetick(2) >= $@BRODOMIR_START_TIME)
+ goto L_Warp;
+ end;
+
+L_Warp:
+ if (getareausers("009-6", 20, 20, 80, 80, 1) < 3)
+ goto L_Warpfail;
+ $@BRODOMIR_PVP_STATUS = $@BRODOMIR_PVP_STATUS + 1;
+ $@BRODOMIR_PLAYERS = getareausers("009-6", 20, 20, 80, 80, 1);
+ mapwarp "009-6", "009-5", 0, 0;
+ mapannounce "009-5", "Brodomir : PvP On!", 0;
+ pvpon "009-5";
+ end;
+
+L_Warpfail:
+ mapannounce "009-6", "Brodomir : There are not enough players around to start!", 0;
+ if ($@BRODOMIR_ITEM_AMOUNT == 0 || $@BRODOMIR_ITEM$ == "")
+ goto L_CleanUp;
+ if (attachrid($@BRODOMIR_SPONSOR) == 0)
+ goto L_SkipItemback;
+ // we need this loop because for items that can't be stacked, getitem will stack them nevertheless
+ goto L_GetitemLoop;
+
+L_GetitemLoop:
+ getitem $@BRODOMIR_ITEM$, 1;
+ $@BRODOMIR_ITEM_AMOUNT = $@BRODOMIR_ITEM_AMOUNT - 1;
+ if ($@BRODOMIR_ITEM_AMOUNT > 0)
+ goto L_GetitemLoop;
+ goto L_SkipItemback;
+
+L_SkipItemback:
+ $@BRODOMIR_ITEM_AMOUNT = 0;
+ $@BRODOMIR_ITEM$ = "";
+ $@BRODOMIR_SPONSOR = 0;
+ goto L_CleanUp;
+
+L_Check:
+ if (getareausers("009-5", 20, 20, 80, 80, 1) > 1)
+ end;
+ areatimer 0, "009-5", 20, 20, 80, 80, 0, "Brodomir::OnReward";
+ goto L_End;
+
+OnReward:
+ if (ispcdead())
+ goto L_Dead;
+ message strcharinfo(0), "Congratulations you won!";
+ Zeny = Zeny + ($@BRODOMIR_MONEY + 150 * $@BRODOMIR_PLAYERS);
+ if ($@BRODOMIR_ITEM_AMOUNT == 0 || $@BRODOMIR_ITEM$ == "")
+ goto L_SkipItem;
+ // we need this loop because for items that can't be stacked, getitem will stack them nevertheless
+ goto L_Getitem;
+
+L_Getitem:
+ getitem $@BRODOMIR_ITEM$, 1;
+ $@BRODOMIR_ITEM_AMOUNT = $@BRODOMIR_ITEM_AMOUNT - 1;
+ if ($@BRODOMIR_ITEM_AMOUNT > 0)
+ goto L_Getitem;
+ goto L_SkipItem;
+
+L_SkipItem:
+ $@BRODOMIR_ITEM$ = "";
+ $@BRODOMIR_SPONSOR = 0;
+ $@BRODOMIR_MONEY = 0;
+ $@BRODOMIR_PLAYERS = 0;
+ end;
+
+L_Dead_Duels:
+ DUELS = DUELS &~ $@DuelPvpBit;
+ warp "009-7", 39, 37;
+ end;
+
+L_Dead:
+ if(DUELS & $@DuelPvpBit) goto L_Dead_Duels;
+ warp "009-3", 155,83;
+ end;
+
+L_End:
+ mapwarp "009-5", "009-6", 36, 42;
+ goto L_CleanUp;
+
+L_AlreadyStarted:
+ mes "[Brodomir]";
+ mes "\"Please wait until the cave is clear again.\"";
+ goto L_close;
+
+L_NotEnoughMoney:
+ mes "[Brodomir]";
+ mes "\"You don't have enough money.\"";
+ goto L_close;
+
+L_TooCheap:
+ mes "[Brodomir]";
+ mes "\"That's too cheap as a prize.\"";
+ goto L_close;
+
+L_CleanUp:
+ pvpoff "009-5";
+ $@BRODOMIR_PVP_STATUS = 0;
+ $@BRODOMIR_START_TIME = 0;
+ stopnpctimer;
+ end;
+
+L_close:
+ @brodomir_money = 0;
+ @brodomir_item_amount = 0;
+ @brodomir_item$ = "";
+ close;
+}
diff --git a/npc/009-6/mapflags.txt b/npc/009-6/mapflags.txt
new file mode 100644
index 00000000..c6a65e72
--- /dev/null
+++ b/npc/009-6/mapflags.txt
@@ -0,0 +1,2 @@
+009-6 mapflag nosave 009-3,162,82
+009-6 mapflag zone MMO
diff --git a/npc/009-7/_import.txt b/npc/009-7/_import.txt
new file mode 100644
index 00000000..4b4202c9
--- /dev/null
+++ b/npc/009-7/_import.txt
@@ -0,0 +1,11 @@
+// Map 009-7: The Sanguine Vault
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/009-7/_warps.txt",
+"npc/009-7/battlemaster.txt",
+"npc/009-7/core.txt",
+"npc/009-7/debug.txt",
+"npc/009-7/eventHandler.txt",
+"npc/009-7/mapflags.txt",
+"npc/009-7/rouge.txt",
+"npc/009-7/shops.txt",
+"npc/009-7/trapdoor.txt",
diff --git a/npc/009-7/_warps.txt b/npc/009-7/_warps.txt
new file mode 100644
index 00000000..bdb3f37b
--- /dev/null
+++ b/npc/009-7/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-7: The Sanguine Vault warps
+009-7,21,19,0 warp #009-7_21_19 0,0,009-2,38,104
diff --git a/npc/009-7/battlemaster.txt b/npc/009-7/battlemaster.txt
new file mode 100644
index 00000000..d6e43559
--- /dev/null
+++ b/npc/009-7/battlemaster.txt
@@ -0,0 +1,83 @@
+009-7,40,35,0 script Battle Master#Duels NPC322,{
+ if($SANGUINE & $@SV_BMDBit != 0) goto L_Disabled;
+ mes "[Battle Master]";
+ mes "\"Hey, you seem tough enough! Would you like to prove your skills?\"";
+ next;
+ menu
+ "PvP Cave (50gp)", L_Pvp,
+ "Last Man Standing (150gp)", L_Brodomir,
+ "Nevermind.", L_Next;
+
+L_Disabled:
+ mes "[Battle Master]";
+ mes "I am busy, come back later.";
+ close;
+
+L_Next:
+ mes "[Battle Master]";
+ mes "\"Ha ha, coward.\"";
+ close;
+
+L_Brodomir:
+ if (Zeny < 150) goto L_NoMoney;
+ Zeny = Zeny - 150;
+ mes "[Battle Master]";
+ mes "\"Get ready!\"";
+ close2;
+ set DUELS, DUELS | $@DuelPvpBit; // tell the arena to send the player back here when he exits
+ warp "009-6", 33, 37;
+ savepoint "009-7", 39, 37;
+ end;
+
+L_Pvp:
+ if (Zeny < 50) goto L_NoMoney;
+ Zeny = Zeny - 50;
+ mes "[Battle Master]";
+ mes "\"Get ready!\"";
+ close2;
+ set DUELS, DUELS | $@DuelPvpBit; // tell the arena to send the player back here when he dies
+ warp "001-3", 0, 0;
+ savepoint "009-7", 39, 37;
+ end;
+
+L_NoMoney:
+ mes "\"Wait a second, you don't have enough money.\"";
+ close;
+}
+
+
+
+function script fightclub_GoBack {
+ @Duel_PVP = DUELS & $@DuelPvpBit;
+ if(@Duel_PVP != 0) goto L_GoBack;
+ return;
+
+L_GoBack:
+ DUELS = DUELS &~ $@DuelPvpBit;
+ warp "009-7", 39, 37;
+ heal MaxHp, MaxSp;
+ message strcharinfo(0), "Thank you for participating!";
+ return;
+}
+009-6,36,48,0 script #GoBack2Duels NPC32767,0,1,{
+ callfunc "fightclub_GoBack";
+ end;
+}
+009-5,53,74,0 script #GoBack3Duels NPC32767,3,1,{
+ callfunc "fightclub_GoBack";
+ end;
+}
+009-3,158,83,0 script #GoBack5Duels NPC32767,7,0,{
+ callfunc "fightclub_GoBack";
+ end;
+}
+
+
+001-2,130,22,0 script #GoBack4Duels NPC32767,1,1,{
+ callfunc "fightclub_GoBack";
+ end;
+}
+001-3,73,28,0 script #GoBack1Duels NPC32767,0,1,{
+ callfunc "fightclub_GoBack";
+ end;
+}
diff --git a/npc/009-7/core.txt b/npc/009-7/core.txt
new file mode 100644
index 00000000..cb94ef97
--- /dev/null
+++ b/npc/009-7/core.txt
@@ -0,0 +1,114 @@
+// Replaced with @duel
+
+function script fightclub_sendrequest {
+ message @caster_name$, "You already requested a duel with this player.";
+ return;
+}
+
+function script fightclub_getrules {
+ return;
+}
+
+function script fightclub_AddToQueue {
+ mes "This battle is already in the queue.";
+ return;
+}
+
+function script fightclub_NextBattle {
+ return;
+}
+
+function script fightclub_NextBattleProceed {
+ return;
+}
+
+function script fightclub_StartBattle {
+ return;
+}
+
+function script fightclub_TimeOut {
+ return;
+}
+
+function script fightclub_Intrusion {
+ // nothing to do here (yet)
+ return;
+}
+
+function script fightclub_EmergencyWipe {
+ callfunc "fightclub_CleanStage";
+ callfunc "fightclub_StartUp";
+ // TODO: check if everything is clean (function) and mapexit otherwise
+ return;
+}
+
+function script fightclub_Victory {
+ // TODO: give some sort of reward
+ // TODO: increase score
+ // TODO: update leaderboard
+ return;
+}
+
+function script fightclub_DestroyMe {
+ @Duel_Fighter = 0;
+ sc_end 132; sc_end 14; sc_end 37; sc_end 185; sc_end 194; sc_end 195; sc_end 196; sc_end 197; sc_end 198; sc_end 199; // remove effects
+ heal MaxHp, MaxSp; // refill hp/mana
+ if(getmapname() == "009-7") warp "009-7", rand($@fightclub_x1, $@fightclub_x2), rand(($@fightclub_y1 - 2), ($@fightclub_y1 - 3));
+ return;
+}
+
+function script fightclub_Missing {
+ return;
+}
+
+function script fightclub_StartUp {
+ return;
+}
+
+function script fightclub_CleanStage {
+ if($@Duel_NoWarp != 1) areawarp "009-7", $@fightclub_x1, $@fightclub_y1, $@fightclub_x2, $@fightclub_y2, "009-7", 31, 40; // kick all players from stage
+ $@Duel_NoWarp = 0;
+ set $@Duel_NoMagic, 0; // clean the Duel parameters
+ set $@Duel_CurrentDuel, 0; // no duel atm
+ set $@Duel_Started, 0; // no duel atm
+ $@Duel_RedPlayer = 0;
+ $@Duel_BluePlayer = 0;
+ $@Duel_Missing = 0;
+ $@Duel_TotalTime = 0;
+ npcwarp 32, 45, "Rouge#Duels";
+ donpcevent "#FightClubTimeLimit::OnStopTimer";
+ killmonster "009-7", "All";
+ return;
+}
+
+function script fightclub_setrules {
+ return;
+}
+
+function script fightclub_death {
+L_NoDuel:
+ if(debug) donpcevent "Debug#Duels::OnVictimNotInDuel";
+ return;
+}
+
+function script fightclub_enter {
+ return;
+}
+
+function script fightclub_enter_killer {
+ return;
+}
+
+function script fightclub_exit {
+ return;
+}
+
+
+
+function script fightclub_event_killed {
+ return;
+}
+
+function script fightclub_event_die {
+ return;
+}
diff --git a/npc/009-7/debug.txt b/npc/009-7/debug.txt
new file mode 100644
index 00000000..47ee823c
--- /dev/null
+++ b/npc/009-7/debug.txt
@@ -0,0 +1,155 @@
+function script fightclub_Debug {
+ goto L_Menu;
+
+L_Menu:
+ next;
+ set @bme,0; if($SANGUINE & $@SV_BMDBit == 0) set @bme,1;
+ set @due,0; if($SANGUINE & $@SV_FCDBit == 0) set @due,1;
+ mes "---";
+ mes "##3$##0Duel_Enabled: ##7" + @due;
+ mes "##3$##0fightclub_bm_enabled: ##7" + @bme;
+ mes "##3$##2@##0Duel_TimeBeforeNext: ##7" + $@Duel_TimeBeforeNext;
+ mes "##3$##2@##0Duel_TimeBeforeWarp: ##7" + $@Duel_TimeBeforeWarp;
+ mes "##3$##2@##0Duel_TimeBeforeStart: ##7" + $@Duel_TimeBeforeStart;
+ mes "##3$##2@##0Duel_TimeLimit: ##7" + $@Duel_TimeLimit;
+ mes "##3$##2@##0Duel_QueueLimit: ##7" + $@Duel_QueueLimit;
+ mes "##3$##2@##0Duel_PlayerQueueLimit: ##7" + $@Duel_PlayerQueueLimit;
+ mes "##3$##2@##0Duel_PlayerQueueTimeOut: ##7" + $@Duel_PlayerQueueTimeOut;
+ mes "##3$##0Duel_LastDuel: ##7" + $Duel_LastDuel + "##0";
+ mes "---";
+ mes "##2@##0Duel_Fighter: ##7" + @Duel_Fighter + "##0";
+ next;
+ menu
+ "toggle|Toggle $Duel_Enabled", L_DuelEnabled,
+ "toggle|Toggle $fightclub_bm_enabled", L_BmEnabled,
+ "edit|Set $@Duel_TimeBeforeNext", L_TimeBeforeNext,
+ "edit|Set $@Duel_TimeBeforeWarp", L_TimeBeforeWarp,
+ "edit|Set $@Duel_TimeBeforeStart", L_TimeBeforeStart,
+ "edit|Set $@Duel_TimeLimit", L_TimeLimit,
+ "edit|Set $@Duel_QueueLimit", L_QueueLimit,
+ "edit|Set $@Duel_PlayerQueueLimit", L_PlayerQueueLimit,
+ "edit|Set $@Duel_PlayerQueueTimeOut", L_PlayerQueueTimeOut,
+ "edit|Set $Duel_LastDuel", L_LastDuel,
+ "toggle|Toggle @Duel_Fighter", L_DuelFighter,
+ "restart|Restart fightclub.", L_Restart,
+ "quit|Nevermind.", L_End;
+
+L_DuelEnabled:
+ if(@due < 1) goto L_DuelEnabled2;
+ $SANGUINE = $SANGUINE | $@SV_FCDBit;
+ goto L_Menu;
+L_DuelEnabled2:
+ $SANGUINE = $SANGUINE &~ $@SV_FCDBit;
+ goto L_Restart;
+
+L_BmEnabled:
+ if(@bme < 1) goto L_BmEnabled2;
+ $SANGUINE = $SANGUINE | $@SV_BMDBit;
+ goto L_Menu;
+L_BmEnabled2:
+ $SANGUINE = $SANGUINE &~ $@SV_BMDBit;
+ goto L_Menu;
+
+L_DuelFighter:
+ if(@Duel_Fighter < 1) goto L_DuelFighter2;
+ @Duel_Fighter = 0;
+ goto L_Menu;
+L_DuelFighter2:
+ @Duel_Fighter = 1;
+ goto L_Menu;
+
+L_TimeBeforeNext:
+ mes "range: 1~600";
+ input @time;
+ if((@time < 1) || (@time > 600)) goto L_OutOfRange;
+ $@Duel_TimeBeforeNext = @time;
+ goto L_Menu;
+
+L_TimeBeforeWarp:
+ mes "range: 1~600";
+ input @time;
+ if((@time < 1) || (@time > 600)) goto L_OutOfRange;
+ $@Duel_TimeBeforeWarp = @time;
+ goto L_Menu;
+
+L_TimeBeforeStart:
+ mes "range: 1~600";
+ input @time;
+ if((@time < 1) || (@time > 600)) goto L_OutOfRange;
+ $@Duel_TimeBeforeStart = @time;
+ goto L_Menu;
+
+L_TimeLimit:
+ mes "range: 1~900";
+ input @time;
+ if((@time < 1) || (@time > 900)) goto L_OutOfRange;
+ $@Duel_TimeLimit = @time;
+ goto L_Menu;
+
+L_QueueLimit:
+ mes "range: 1~20";
+ input @limit;
+ if((@limit < 1) || (@limit > 20)) goto L_OutOfRange;
+ $@Duel_QueueLimit = @limit;
+ goto L_Menu;
+
+L_PlayerQueueLimit:
+ mes "range: 1~5";
+ input @limit;
+ if((@limit < 1) || (@limit > 5)) goto L_OutOfRange;
+ $@Duel_PlayerQueueLimit = @limit;
+ goto L_Menu;
+
+L_PlayerQueueTimeOut:
+ mes "range: 30~600";
+ input @limit;
+ if((@limit < 30) || (@limit > 600)) goto L_OutOfRange;
+ $@Duel_PlayerQueueTimeOut = @limit;
+ goto L_Menu;
+
+L_LastDuel:
+ mes "range: 1+";
+ mes "[R] This will trigger a reboot";
+ input @last;
+ if(@last < 1) goto L_OutOfRange;
+ $Duel_LastDuel = @last;
+ next;
+ goto L_Restart;
+
+L_OutOfRange:
+ mes "Value out of range or empty.";
+ goto L_Menu;
+
+L_Restart:
+ callfunc "fightclub_EmergencyWipe";
+ donpcevent "#FightClubHandler::OnTimer2000"; // this re-starts the main timer if it was stopped
+ mes "The temporary variables have been reset.";
+ goto L_Menu;
+
+L_End:
+ return;
+}
+
+009-7,41,45,0 script Debug#Duels NPC181,{
+ mes "The debug menu can also be accessed by wearing a dev cap while talking to Rouge.";
+ mes "For the documentation, @@https://wiki.themanaworld.org/index.php/User:Meko/FightClub/debug|click here@@##0";
+ callfunc "fightclub_Debug";
+ end;
+
+OnInit:
+ if(!debug) disablenpc "Debug#Duels";
+ end;
+
+ // debug messages below
+OnKillerNotInDuel:
+ npctalk strnpcinfo(0), "WARNING: The victim was not killed by its adversary. Aborting duel...";
+ end;
+
+OnVictimNotInDuel:
+ npctalk strnpcinfo(0), "WARNING: The victim is not part of the duel";
+ end;
+
+OnVictimInDuelNoDuel:
+ npctalk strnpcinfo(0), "WARNING: The victim is part of the duel but no duel is ongoing at the moment.";
+ end;
+}
diff --git a/npc/009-7/eventHandler.txt b/npc/009-7/eventHandler.txt
new file mode 100644
index 00000000..0ddf96d2
--- /dev/null
+++ b/npc/009-7/eventHandler.txt
@@ -0,0 +1,88 @@
+
+009-7,45,33,0 script #trapdoor2FightClub NPC327,0,0,{
+ if(countitem(647)||countitem(725)||countitem(1178)||countitem(5131)||countitem(5132)||countitem(5133)||countitem(5134)||countitem(5135)||countitem(5136)||countitem(5137)||countitem(5138)||countitem(5139)||countitem(5140)||(getgmlevel()>=20)) goto L_Enter;
+ end;
+
+L_Enter:
+ warp "009-7",34,22; // this warp is a special thanks for contributors
+ end;
+}
+009-7,33,21,0 script #trapdoor3FightClub NPC327,0,0,{
+ warp "009-7",44,32;
+ end;
+}
+
+009-7,22,38,0 script #FightClubUtils NPC32767,{
+ end;
+
+OnIntrusion:
+ if(getgmlevel() >= 60) end; // allow GMs to be in the ring
+ if(getcharid(3) == $@Duel_RedPlayer) end; // do not kill the red fighter
+ if(getcharid(3) == $@Duel_BluePlayer) end; // do not kill the blue fighter
+ donpcevent "Rouge#Duels::OnAnnounceIntrusion";
+ callfunc "fightclub_DestroyMe"; // only kill the intruder(s)
+ end;
+
+OnDelayedStart:
+ callfunc "fightclub_StartBattle";
+ end;
+
+OnDelayedNextBattle:
+ callfunc "fightclub_NextBattleProceed";
+ end;
+
+OnBecomeKiller:
+ callfunc "fightclub_enter_killer";
+ end;
+
+OnCommandIntrusion:
+ 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;
+}
+
+009-7,20,45,0 script #FightClubTimeLimit NPC32767,0,0,{
+ end;
+
+OnStartTimer:
+ $@Duel_TotalTime = 0;
+ goto L_StartTimer;
+
+OnStopTimer:
+ stopnpctimer;
+ end;
+
+OnTimer1000:
+ $@Duel_TotalTime = ($@Duel_TotalTime + 1);
+ if($@Duel_TotalTime >= $@Duel_TimeLimit) goto L_TimeOut;
+ goto L_StartTimer;
+
+L_TimeOut:
+ stopnpctimer;
+ callfunc "fightclub_TimeOut";
+ end;
+
+L_StartTimer:
+ setnpctimer 0;
+ initnpctimer;
+ end;
+
+OnInit:
+ $@Duel_TotalTime = 0;
+ end;
+}
+
+009-7,20,44,0 script #FightClubHandler NPC32767,0,0,{
+ end;
+
+OnInit:
+ // this event is called when the map server boots up
+ $@fightclub_x1 = 27;
+ $@fightclub_y1 = 42;
+ $@fightclub_x2 = 38;
+ $@fightclub_y2 = 48;
+ end;
+
+OnTimer2000:
+ // this events checks who is on stage every 2 seconds
+ end;
+}
diff --git a/npc/009-7/mapflags.txt b/npc/009-7/mapflags.txt
new file mode 100644
index 00000000..104ea626
--- /dev/null
+++ b/npc/009-7/mapflags.txt
@@ -0,0 +1,2 @@
+009-7 mapflag noteleport
+009-7 mapflag monster_noteleport
diff --git a/npc/009-7/rouge.txt b/npc/009-7/rouge.txt
new file mode 100644
index 00000000..157da9fb
--- /dev/null
+++ b/npc/009-7/rouge.txt
@@ -0,0 +1,129 @@
+009-7,32,45,0 script Rouge#Duels NPC181,{
+if (getgmlevel() >= 40 && (getequipid(equip_head) == 647 || getequipid(equip_head) == 725)) goto L_CallDebug;
+goto L_Main;
+
+L_CallDebug:
+ mes "You are wearing a dev cap: calling debug menu...";
+ mes "For the documentation, @@https://wiki.themanaworld.org/index.php/Legacy:FightClub|click here@@##0";
+ callfunc "fightclub_Debug";
+ goto L_End;
+
+L_Main:
+ @requests = 0;
+ if(@Duel_Queue$[0] != "") goto L_Queue;
+ if(@Duel_Queue$[1] != "") goto L_Decline; // if the user previously closed without declining we resume the procedure
+ mes "[Rouge]";
+ mes "Welcome to the Sanguine Vault's duel arena.";
+ if($SANGUINE & $@SV_FCDBit != 0) goto L_Disabled;
+ mes "What do you want to do?";
+ menu
+ "See the commands.", L_Challenge,
+ "Set my rules.", L_Rules,
+ "Nevermind.", L_End;
+
+L_Queue:
+ @caster_name$ = @Duel_Queue$[0];
+ @caster_time = @Duel_Queue[0];
+ @target_name$ = strcharinfo(0);
+ @target = getcharid(3, @caster_name$);
+ $@my_rid = getcharid(3);
+ @Duel_Queue$[0] = "";
+ @Duel_Queue[0] = 0;
+ if((gettimetick(2) - @caster_time) >= $@Duel_PlayerQueueTimeOut) goto L_Decline;
+ if(attachrid(@target) != 1) goto L_Missing;
+ if(getmapname() != "009-7") goto L_Missing;
+ if(attachrid($@my_rid) != 1) goto L_End;
+ @requests = (@requests + 1);
+ set $@my_rid, 0; // clean this ASAP
+ mes @caster_name$ + " wishes to challenge you to a duel.";
+ mes "";
+ callfunc "fightclub_getrules";
+ mes "";
+ mes "Do you accept?";
+ next;
+ menu
+ "Yes, I do!", L_Accept,
+ "No.", L_Decline;
+
+L_ShiftQueue: // here we shift the array to the left
+ if((@Duel_Queue$[@loop] == "" ) && (@requests < 1)) goto L_Main;
+ if(@Duel_Queue$[@loop] == "") goto L_End;
+ @Duel_Queue$[(@loop - 1)] = @Duel_Queue$[@loop];
+ @Duel_Queue[(@loop - 1)] = @Duel_Queue[@loop];
+ @Duel_Queue$[@loop] = "";
+ @Duel_Queue[@loop] = 0;
+ @loop = (@loop + 1);
+ if(@loop >= getarraysize(@Duel_Queue$)) goto L_Queue;
+ goto L_ShiftQueue;
+
+L_Accept:
+ callfunc "fightclub_AddToQueue";
+ @loop = 1;
+ goto L_ShiftQueue;
+
+L_Decline:
+ @loop = 1;
+ goto L_ShiftQueue;
+
+L_Missing:
+ if(attachrid($@my_rid) != 1) goto L_End;
+ set $@my_rid, 0; // clean this ASAP
+ goto L_Decline;
+
+L_Challenge:
+ if($SANGUINE & $@SV_FCDBit != 0) goto L_Disabled;
+ @ms = $@Duel_PlayerQueueTimeOut * 1000;
+ callfunc "HumanTime";
+ next;
+ mes "[Rouge]";
+ mes "To challenge a player to a duel, you need to write this command:";
+ 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"+ ("dueloff") +"##0";
+ next;
+ mes "To un-ignore, simply write the same command again.";
+ goto L_End;
+
+L_Disabled:
+ mes "Sadly, the duel system is currently disabled. Please try again later.";
+ goto L_End;
+
+L_Rules:
+ callfunc "fightclub_setrules";
+ goto L_End;
+
+L_End:
+ close;
+
+OnAnnounceNext:
+ npctalk strnpcinfo(0), "##0The next battle ("+ $@Duel_Queue_ID[0] +") is ##1" + $@Duel_Queue_Red$[0] + "##0 vs. ##3" + $@Duel_Queue_Blue$[0] + "##0.The battle will start in "+ $@Duel_TimeBeforeWarp +" seconds.";
+ end;
+
+OnAnnounceIntrusion:
+ npctalk strnpcinfo(0), "Intrusion detected. Annihilation in progress... Done.";
+ end;
+
+OnAnnounceTimeOut:
+ npctalk strnpcinfo(0), "Time limit reached! Both player lose!";
+ end;
+
+OnAnnounceRedWins:
+ npctalk strnpcinfo(0), $@Duel_Queue_Red$[0] + " wins the duel against "+ $@Duel_Queue_Blue$[0] +"!";
+ end;
+
+OnAnnounceRedForfeit:
+ npctalk strnpcinfo(0), $@Duel_Queue_Red$[0] + " wins by forfeit!";
+ end;
+
+OnAnnounceBlueWins:
+ npctalk strnpcinfo(0), $@Duel_Queue_Blue$[0] + " wins the duel against "+ $@Duel_Queue_Red$[0] +"!";
+ end;
+
+OnAnnounceBlueForfeit:
+ npctalk strnpcinfo(0), $@Duel_Queue_Blue$[0] + " wins by forfeit!";
+ end;
+}
diff --git a/npc/009-7/shops.txt b/npc/009-7/shops.txt
new file mode 100644
index 00000000..1d08d55b
--- /dev/null
+++ b/npc/009-7/shops.txt
@@ -0,0 +1,36 @@
+// The Mana World Script
+// (C) Jesusalva, 2021
+// Licensed under GPLv2 or later
+
+009-7,34,23,0 script Bartender#Duels NPC177,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Beer;
+ sellitem IronPotion;
+ sellitem ConcentrationPotion;
+ sellitem BottleOfWater;
+ sellitem Milk;
+ .distance = 5;
+ end;
+}
+
+009-7,27,26,0 script Garcon#Duels NPC180,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem RoastedMaggot;
+ sellitem PickledBeets;
+ sellitem ChickenLeg;
+ sellitem Steak;
+ sellitem Beer;
+ .distance = 5;
+ end;
+}
+
diff --git a/npc/009-7/trapdoor.txt b/npc/009-7/trapdoor.txt
new file mode 100644
index 00000000..14422fc7
--- /dev/null
+++ b/npc/009-7/trapdoor.txt
@@ -0,0 +1,62 @@
+009-2,38,105,0 script #trapdoor#FightClub NPC327,0,0,{
+ @index = rand(0,(getarraysize($@fightclub_randompasswords$) - 1));
+ @password$ = $@fightclub_definitions$[@index];
+ mes "[Bouncer]";
+ mes "\"To enter, you must find the word I have in mind.\"";
+ mes "\"Here's a hint: ##2"+ @password$ + "##0.\"";
+ next;
+ mes "Pick the correct word for this definition.";
+ @choices_nr = 3;
+ @good = rand(0,(@choices_nr - 1));
+ setarray @choices$, "";
+ cleararray @choices$, "", getarraysize(@choices$);
+ @loop = 0;
+ goto L_Shuffle;
+
+L_Shuffle:
+ @nindex = rand(0,(getarraysize($@fightclub_randompasswords$) - 1));
+ if(@nindex == @index) goto L_Shuffle; // do not get the good definition
+ @loop2 = 0;
+ goto L_Search;
+
+L_Search:
+ if(@choices$[@loop2] == $@fightclub_randompasswords$[@nindex]) goto L_Shuffle; // array is already populated with this choice
+ if(@loop2 >= (@choices_nr - 1)) goto L_Shuffle2;
+ @loop2 = @loop2 + 1;
+ goto L_Search;
+
+L_Shuffle2:
+ @choices$[@loop] = $@fightclub_randompasswords$[@nindex];
+ if(@loop >= (@choices_nr - 1)) goto L_Answer;
+ @loop = @loop + 1;
+ goto L_Shuffle;
+
+L_Answer:
+ set @choices$[@good], $@fightclub_randompasswords$[@index]; // set the good definition
+ @choices$[getarraysize(@choices$)] = "I have no clue";
+ menu
+ @choices$[0], L_Enter,
+ @choices$[1], L_Enter,
+ @choices$[2], L_Enter,
+ @choices$[3], L_Enter,
+ @choices$[4], L_Enter,
+ @choices$[5], L_Enter,
+ @choices$[6], L_Enter;
+
+L_Enter:
+ if(@menu != (@good + 1)) goto L_close;
+ mes "Correct. You may enter.";
+ close2;
+ warp "009-7", 22, 21;
+ end;
+
+L_close:
+ mes "Incorrect.";
+ close;
+
+OnInit:
+ setarray $@fightclub_randompasswords$, "Abibliophobia", "Anencephalous", "Batrachomyomachy", "Blunderbuss", "Boustrophedon", "Bumbershoot", "Canoodle", "Cockalorum", "Cockamamie", "Collywobbles", "Eructation", "Flibbertigibbet", "Formication", "Gaberlunzie", "Gastromancy", "Gobemouche", "Hemidemisemiquaver", "Hobbledehoy", "Hootenanny", "Lickspittle", "Lollygag", "Mumpsimus", "Nincompoop", "Oocephalus", "Pettifogger", "Sialoquent", "Slangwhanger", "Smellfungus", "Tatterdemalion", "Vomitory", "Widdershins", "Avoirdupois", "Embonpoint", "Bibble", "Erinaceous", "Impignorate", "Nudiustertian", "Tittynope", "Winklepicker", "Yarborough", "Floccinaucinihilipilification";
+ setarray $@fightclub_definitions$, "The fear of running out of reading material","Lacking a brain","Making a mountain out of a molehill","A gun with a flared muzzle or disorganized activity","A back and forth pattern","An umbrella","To hug and kiss","A small, haughty man","Absurd, outlandish","Butterflies in the stomach","A burp, belch","Nonsense, balderdash","The sense of ants crawling on your skin","A wandering beggar","Telling fortune from the rumblings of the stomach","A highly gullible person","A musical timing of 1/64","An awkward or ill-mannered young boy","A country or folk music get-together","A servile person, a toady","To move slowly, fall behind","To move slowly, fall behind","A foolish person","An egghead","A person who tries to befuddle others with his speech","Spitting while speaking","A loud abusive speaker or obnoxious writer","A perpetual pessimist","A child in rags","An exit or outlet","In a contrary or counterclockwise direction", "Commodities sold by weight", "A plump, hourglass figure", "To drink often; to eat and/or drink noisily", "Resembling a hedgehog", "To pawn or mortgage something", "The day before yesterday", "A small quantity of something left over", "Style of shoe or boot with a sharp and long pointed toe", "Hand of cards containing no card above a nine", "Estimation that something is valueless";
+ if(getarraysize($@fightclub_randompasswords$) != getarraysize($@fightclub_definitions$)) mapexit;
+ end;
+}
diff --git a/npc/009-8/_import.txt b/npc/009-8/_import.txt
new file mode 100644
index 00000000..be35dd64
--- /dev/null
+++ b/npc/009-8/_import.txt
@@ -0,0 +1,5 @@
+// Map 009-8: Chez Celestia
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/009-8/_warps.txt",
+"npc/009-8/celestia.txt",
+"npc/009-8/mapflags.txt",
diff --git a/npc/009-8/_warps.txt b/npc/009-8/_warps.txt
new file mode 100644
index 00000000..cec1ec14
--- /dev/null
+++ b/npc/009-8/_warps.txt
@@ -0,0 +1,15 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 009-8: Chez Celestia warps
+009-8,26,122,0 warp #009-8_26_122 0,0,009-1,74,48
+009-8,22,134,0 warp #009-8_22_134 0,0,009-1,71,54
+009-8,56,55,0 warp #009-8_56_55 1,0,069-2,44,127
+009-8,53,40,0 warp #009-8_53_40 0,0,069-2,97,127
+009-8,58,40,0 warp #009-8_58_40 0,0,069-2,116,127
+009-8,79,99,0 warp #009-8_79_99 0,0,069-2,117,61
+009-8,87,78,0 warp #009-8_87_78 0,0,069-2,86,61
+009-8,87,56,0 warp #009-8_87_56 0,0,069-2,55,61
+009-8,79,39,0 warp #009-8_79_39 0,0,069-2,24,61
+009-8,33,39,0 warp #009-8_33_39 0,0,069-2,117,30
+009-8,24,56,0 warp #009-8_24_56 0,0,069-2,86,30
+009-8,24,78,0 warp #009-8_24_78 0,0,069-2,55,30
+009-8,32,98,0 warp #009-8_32_98 0,0,069-2,24,30
diff --git a/npc/009-8/celestia.txt b/npc/009-8/celestia.txt
new file mode 100644
index 00000000..e4ef6f2d
--- /dev/null
+++ b/npc/009-8/celestia.txt
@@ -0,0 +1,297 @@
+
+009-8,29,124,0 script Celestia NPC144,{
+ 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,
+ rif(get_nibble(##03_TMWQUEST, 0), l("Actually, have you ever heard of Yeti's kidnapping little girls?")), L_VaultQuest,
+ "(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
+ rif(get_nibble(##03_TMWQUEST, 0), l("Actually, have you ever heard of Yeti's kidnapping little girls?")), L_VaultQuest,
+ "(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
+ rif(get_nibble(##03_TMWQUEST, 0), l("Actually, have you ever heard of Yeti's kidnapping little girls?")), L_VaultQuest,
+ "(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 "[10,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_VaultQuest:
+ mesn;
+ mesq l("I've heard of Yetis %s little girls, and kidnapping them to eat immediately after.", b(l("eating")));
+ next;
+ mesn;
+ mesq l("If a Yeti kidnapped your friend and you had the time to come here tell me this, they're likely already gone.");
+ next;
+ mesc l("Thinking back, Cindy was in a cage. Something seems off.");
+ close;
+
+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 l("%s", getitemlink("HeartNecklace"));
+ getitem HeartNecklace, 1;
+ 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]";
+ Zeny = Zeny + 150000;
+ 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;
+
+
+
+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:
+ @scared_celestia = !(@scared_celestia);
+ goto L_Debug;
+
+L_ResetState:
+ QL_CELESTIA = 0;
+ @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)
+ 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,49,0 script Celestia Door NPC32767,0,0,{
+ warp "009-8", 26, 124;
+ callfunc "CelestiaState";
+ end;
+}
+009-1,72,54,0 script Celestia BackDoor NPC32767,0,0,{
+ warp "009-8", 23, 134;
+ callfunc "CelestiaState";
+ end;
+}
diff --git a/npc/009-8/mapflags.txt b/npc/009-8/mapflags.txt
new file mode 100644
index 00000000..b87cce76
--- /dev/null
+++ b/npc/009-8/mapflags.txt
@@ -0,0 +1,2 @@
+//009-8 mapflag town
+//009-8 mapflag resave 009-2,149,43
diff --git a/npc/010-1/_import.txt b/npc/010-1/_import.txt
new file mode 100644
index 00000000..c367909c
--- /dev/null
+++ b/npc/010-1/_import.txt
@@ -0,0 +1,5 @@
+// Map 010-1: Woodland
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/010-1/_mobs.txt",
+"npc/010-1/_warps.txt",
+"npc/010-1/mapflags.txt",
diff --git a/npc/010-1/_mobs.txt b/npc/010-1/_mobs.txt
new file mode 100644
index 00000000..ef0700db
--- /dev/null
+++ b/npc/010-1/_mobs.txt
@@ -0,0 +1,15 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 010-1: Woodland mobs
+010-1,82,63,9,9 monster Scorpion 1003,1,100000,30000
+010-1,49,71,15,9 monster Spiky Mushroom 1019,1,100000,30000
+010-1,0,0,0,0 monster Pink Flower 1014,30,50,0
+010-1,0,0,0,0 monster Snail 1041,20,50,0
+010-1,0,0,0,0 monster Spiky Mushroom 1019,45,50,0
+010-1,0,0,0,0 monster Log Head 1025,40,100,0
+010-1,0,0,0,0 monster Mouboo 1028,15,0,10
+010-1,0,0,0,0 monster Mauve Plant 1029,3,270000,180000
+010-1,0,0,0,0 monster Cobalt Plant 1030,1,2700000,1800000
+010-1,0,0,0,0 monster Silkworm 1035,2,60000,30000
+010-1,0,0,0,0 monster Clover Patch 1037,2,0,1000
+010-1,0,0,0,0 monster Squirrel 1038,25,30,20
+010-1,0,0,0,0 monster Butterfly 1055,10,30,20
diff --git a/npc/010-1/_warps.txt b/npc/010-1/_warps.txt
new file mode 100644
index 00000000..80147987
--- /dev/null
+++ b/npc/010-1/_warps.txt
@@ -0,0 +1,7 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 010-1: Woodland warps
+010-1,49,24,0 warp #010-1_49_24 1,0,011-1,48,103
+010-1,15,55,0 warp #010-1_15_55 0,1,015-1,92,54
+010-1,36,94,0 warp #010-1_36_94 0,0,010-2,32,44
+010-1,56,105,0 warp #010-1_56_105 2,0,016-1,56,19
+010-1,131,54,0 warp #010-1_131_54 0,1,007-1,21,53
diff --git a/npc/010-1/mapflags.txt b/npc/010-1/mapflags.txt
new file mode 100644
index 00000000..d71c78a4
--- /dev/null
+++ b/npc/010-1/mapflags.txt
@@ -0,0 +1 @@
+//010-1 mapflag resave 010-1,27,97
diff --git a/npc/010-2/_import.txt b/npc/010-2/_import.txt
new file mode 100644
index 00000000..9c36c071
--- /dev/null
+++ b/npc/010-2/_import.txt
@@ -0,0 +1,10 @@
+// Map 010-2: Dimond's Cove
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/010-2/_warps.txt",
+"npc/010-2/band.txt",
+"npc/010-2/chef.txt",
+"npc/010-2/dimonds.txt",
+"npc/010-2/doug.txt",
+"npc/010-2/loratay.txt",
+"npc/010-2/mapflags.txt",
+"npc/010-2/workers.txt",
diff --git a/npc/010-2/_warps.txt b/npc/010-2/_warps.txt
new file mode 100644
index 00000000..493735d2
--- /dev/null
+++ b/npc/010-2/_warps.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 010-2: Dimond's Cove warps
+010-2,27,24,0 warp #010-2_27_24 0,0,010-2,35,68
+010-2,32,45,0 warp #010-2_32_45 0,0,010-1,36,95
+010-2,40,27,0 warp #010-2_40_27 2,0,010-2,83,28
+010-2,36,68,0 warp #010-2_36_68 0,0,010-2,28,24
+010-2,67,27,0 warp #010-2_67_27 2,0,010-2,67,72
+010-2,83,29,0 warp #010-2_83_29 2,0,010-2,40,28
+010-2,67,73,0 warp #010-2_67_73 2,0,010-2,67,28
diff --git a/npc/010-2/band.txt b/npc/010-2/band.txt
new file mode 100644
index 00000000..a94fc3a7
--- /dev/null
+++ b/npc/010-2/band.txt
@@ -0,0 +1,36 @@
+010-2,40,35,0 script Phil NPC157,{
+ callfunc "DimondBand";
+ end;
+}
+
+010-2,40,37,0 script Jerry NPC160,{
+ callfunc "DimondBand";
+ end;
+}
+
+010-2,42,36,0 script Robert NPC162,{
+ callfunc "DimondBand";
+ end;
+}
+function script DimondBand {
+ npctalk strnpcinfo(0), $@SongLyrics$[$@LyricSpot];
+ $@LyricSpot = ($@LyricSpot + 1);
+ if (getarraysize($@SongLyrics$) <= $@LyricSpot)
+ $@LyricSpot = 0;
+ goto L_Return;
+
+L_Return:
+ return;
+}
+- script #BandConfig NPC32767,{
+ end;
+
+OnInit:
+ $@LyricSpot = 0;
+ setarray $@SongLyrics$, "Laid back in Hurnscald, with a GP in my hand,",
+ "Watchin' GMs and players on the street,",
+ "And I catch a glimpse of cheap rares on ManaMarket once a while,",
+ "There's a woman who wants me to save their child.",
+ "I got the Argean blues!";
+ end;
+}
diff --git a/npc/010-2/chef.txt b/npc/010-2/chef.txt
new file mode 100644
index 00000000..550f571b
--- /dev/null
+++ b/npc/010-2/chef.txt
@@ -0,0 +1,126 @@
+010-2,33,25,0 script Chef#dimond NPC148,{
+ mes "[Chef]";
+ mes "";
+ mes "\"I'm too busy right now to talk.\"";
+
+ callfunc "KadiyaSubquestConsts";
+ if ((@Q_kadiya_status == @Q_STATUS_WANTS_CHOCOCAKE) && (countitem ("MopoxCurePotion") > 0))
+ goto L_lace_chococake;
+ if ((@Q_kadiya_status == @Q_STATUS_WANTS_ORANGECUPCAKE) && (countitem ("MopoxCurePotion") > 0))
+ goto L_lace_cupcake;
+ close;
+
+L_lace_chococake:
+ next;
+ menu
+ "Sorry.", L_End,
+ "I need your help with a sick young girl!", L_Next;
+
+L_Next:
+ mes "[Chef]";
+ mes "";
+ mes "You explain Kadiya's situation to him.";
+ mes "\"Hmrmf. I can't help you; I'm a chef, not a baker!\"";
+ close;
+
+L_lace_cupcake:
+ next;
+ menu
+ "Sorry.", L_End,
+ "I need your help with a sick young girl!", L_Next1;
+
+L_Next1:
+ mes "[Chef]";
+ mes "";
+ mes "You explain Kadiya's situation to him.";
+ mes "\"Hmrmf. I was about to make another batch of orange cupcakes. Do you have that potion with you?\"";
+ next;
+ menu
+ "No, sorry.", L_bringit,
+ "Yes, here you are.", L_Next2;
+
+L_Next2:
+ if (countitem ("MopoxCurePotion") < 1)
+ goto L_bringit;
+ mes "[Chef]";
+ mes "";
+ mes "He shudders as he smells the bottle.";
+ mes "\"That is disgusting! How do you expect me to mask this?\"";
+ mes "He ponders his own question for a moment.";
+ next;
+ mes "[Chef]";
+ mes "";
+ mes "\"Ah yes. We need to bind the smell in gingerbread. Bring me three pieces of gingerbread, one orange, and 500 GP for the other ingredients, and I will make you your cupcake.\"";
+ next;
+ menu
+ "I'll go and get it.", L_End,
+ "Here you are!", L_Next3,
+ "Not now.", L_End;
+
+L_Next3:
+ if (countitem ("GingerBreadMan") < 3)
+ goto L_No_gingerbread;
+ if (countitem ("Orange") < 1)
+ goto L_No_orange;
+ if (countitem ("MopoxCurePotion") < 1)
+ goto L_No_Potion;
+ if (Zeny < 500)
+ goto L_No_Zeny;
+
+ Zeny = Zeny - 500;
+ delitem "GingerBreadMan", 3;
+ delitem "Orange", 1;
+ delitem "MopoxCurePotion", 1;
+
+ getitem "LacedOrangeCupcake", 1;
+
+ mes "[Chef]";
+ mes "";
+ mes "\"Good, good. This should work.\"";
+ mes "He crumbles the gingerbread, mixes it with the potion and some spices, and finally adds some cupcake batter and the orange pieces.";
+ next;
+ mes "[Chef]";
+ mes "";
+ mes "\"Take a seat.\"";
+ mes "He fills the mixture into a cupcake form and puts it into the oven. You watch the cupcake grow for a while.";
+ mes "Finally, he removes the form and carefully extracts the cupcake.";
+ next;
+ mes "[Chef]";
+ mes "";
+ mes "\"Here you are. It's a bit bigger than a regular cupcake and will taste a bit like ginger, I think, but otherwise it should be fine.\"";
+ close;
+
+L_No_gingerbread:
+ mes "[Chef]";
+ mes "";
+ mes "\"I will need three pieces of gingerbread.\"";
+ close;
+
+L_No_orange:
+ mes "[Chef]";
+ mes "";
+ mes "\"Please bring me an orange for these cupcakes.\"";
+ close;
+
+L_No_Zeny:
+ mes "[Chef]";
+ mes "";
+ mes "\"No. I need extra ingredients worth 500 GP, and I expect you to pay for those.\"";
+ close;
+
+L_No_Potion:
+ mes "[Chef]";
+ mes "";
+ mes "\"Where did your Mopox potion go?\"";
+ close;
+
+L_bringit:
+ mes "[Chef]";
+ mes "";
+ mes "\"Bring it here when you do.\"";
+ next;
+ goto L_End;
+
+L_End:
+ close;
+}
diff --git a/npc/010-2/dimonds.txt b/npc/010-2/dimonds.txt
new file mode 100644
index 00000000..6d3c729c
--- /dev/null
+++ b/npc/010-2/dimonds.txt
@@ -0,0 +1,595 @@
+
+010-2,34,38,0 script Dimond NPC165,{
+ mes "[Dimond]";
+ mes "\"Welcome to Dimond's Cove!\"";
+ mes "";
+ mes "\"Talk to the waitress to get some Food.\"";
+ mes "";
+ mes "\"We also have shops on the 2nd Floor,";
+ mes "and an inn on the 3rd Floor.\"";
+ close;
+}
+
+010-2,35,35,0 script Shannon NPC193,{
+ @month = 1;
+ @start_day = 24;
+ @end_day = 26;
+ if (gettime(6) != @month) goto L_No_Event;
+ if (gettime(5) < @start_day) goto L_No_Event;
+ if (gettime(5) > @end_day) goto L_No_Event;
+ if (gettimetick(2)-TUT_var < 2*7*86400 ) //player must be created at least 2 weeks ago
+ goto L_No_Event;
+ if (FLAGS & FLAG_HAS_BOWLER_BURNSDAY ) goto L_Event_Done;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_Full_Inv;
+
+ mes "[Shannon]";
+ mes "\"Welcome to Dimond's Cove. We are celebrating Robert Burns with supper and poems. You provide the supper and I'll provide a poem by Robert Burns. He was otherwise known as 'The Bard' and wrote many poems. The music of language is what I love most. The language of poetry. While his accent is thick, his poems tell stories that stir the soul. I'll read a poem by him and you can tell me what you think.\"";
+ next;
+ mes "\"Before I start, it is traditional to eat, drink and be merry, so help from you will be great and keep me reading.\"";
+ next;
+ mes "\"O thou! whatever title suit thee,--\"";
+ mes "\"Auld Hornie, Satan, Nick, or Clootie!\"";
+ mes "\"Wha in yon cavern, grim an' sootie,\"";
+ mes "\"Clos'd under hatches,\"";
+ mes "\"Spairges about the brunstane cootie\"";
+ mes "\"To scaud poor wretches!\"";
+ callsub S_food_menu;
+ mes "\"Hear me, Auld Hangie, for a wee,\"";
+ mes "\"An' let poor damned bodies be;\"";
+ mes "\"I'm sure sma' pleasure it can gie,\"";
+ mes "\"E'en to a deil,\"";
+ mes "\"To skelp an' scaud poor dogs like me,\"";
+ mes "\"An' hear us squeel!\"";
+ callsub S_food_menu;
+ mes "\"Great is thy pow'r, an' great thy fame;\"";
+ mes "\"Far ken'd an' noted is thy name;\"";
+ mes "\"An' tho' yon lowin heugh's thy hame,\"";
+ mes "\"Thou travels far;\"";
+ mes "\"An' faith! thou's neither lag nor lame,\"";
+ mes "\"Nor blate nor scaur.\"";
+ callsub S_food_menu;
+ mes "\"Whyles, ranging like a roarin lion,\"";
+ mes "\"For prey a' holes an' corners tryin;\"";
+ mes "\"Whyles, on the strong-wing'd tempest flyin,\"";
+ mes "\"Tirlin' the kirks;\"";
+ mes "\"Whyles, in the human bosom pryin,\"";
+ mes "\"Unseen thou lurks.\"";
+ callsub S_food_menu;
+ mes "\"I've heard my rev'rend graunie say,\"";
+ mes "\"In lanely glens ye like to stray;\"";
+ mes "\"Or whare auld ruin'd castles gray\"";
+ mes "\"Nod to the moon,\"";
+ mes "\"Ye fright the nightly wand'rer's way\"";
+ mes "\"Wi' eldritch croon.\"";
+ callsub S_food_menu;
+ mes "\"When twilight did my graunie summon\"";
+ mes "\"To say her pray'rs, douce honest woman!\"";
+ mes "\"Aft yont the dike she's heard you bummin,\"";
+ mes "\"Wi' eerie drone;\"";
+ mes "\"Or, rustlin thro' the boortrees comin,\"";
+ mes "\"Wi' heavy groan.\"";
+ callsub S_food_menu;
+ mes "\"Ae dreary, windy, winter night,\"";
+ mes "\"The stars shot down wi' sklentin light,\"";
+ mes "\"Wi' you mysel I gat a fright,\"";
+ mes "\"Ayont the lough;\"";
+ mes "\"Ye like a rash-buss stood in sight,\"";
+ mes "\"Wi' waving sugh.\"";
+ callsub S_food_menu;
+ mes "\"The cudgel in my nieve did shake,\"";
+ mes "\"Each bristl'd hair stood like a stake,\"";
+ mes "\"When wi' an eldritch, stoor 'Quaick, quaick,'\"";
+ mes "\"Amang the springs,\"";
+ mes "\"Awa ye squatter'd like a drake,\"";
+ mes "\"On whistling wings.\"";
+ callsub S_food_menu;
+ mes "\"Let warlocks grim an' wither'd hags\"";
+ mes "\"Tell how wi' you on ragweed nags\"";
+ mes "\"They skim the muirs an' dizzy crags\"";
+ mes "\"Wi' wicked speed;\"";
+ mes "\"And in kirk-yards renew their leagues,\"";
+ mes "\"Owre howket dead.\"";
+ callsub S_food_menu;
+ mes "\"Thence, countra wives wi' toil an' pain\"";
+ mes "\"May plunge an' plunge the kirn in vain;\"";
+ mes "\"For oh! the yellow treasure's taen\"";
+ mes "\"By witchin skill;\"";
+ mes "\"An' dawtet, twal-pint hawkie's gaen\"";
+ mes "\"As yell's the bill.\"";
+ callsub S_food_menu;
+ mes "\"Thence, mystic knots mak great abuse,\"";
+ mes "\"On young guidmen, fond, keen, an' croose;\"";
+ mes "\"When the best wark-lume i' the house,\"";
+ mes "\"By cantraip wit,\"";
+ mes "\"Is instant made no worth a louse,\"";
+ mes "\"Just at the bit.\"";
+ callsub S_food_menu;
+ mes "\"When thowes dissolve the snawy hoord,\"";
+ mes "\"An' float the jinglin icy-boord,\"";
+ mes "\"Then water-kelpies haunt the foord\"";
+ mes "\"By your direction,\"";
+ mes "\"An' nighted trav'lers are allur'd\"";
+ mes "\"To their destruction.\"";
+ callsub S_food_menu;
+ mes "\"And aft your moss-traversing spunkies\"";
+ mes "\"Decoy the wight that late an drunk is:\"";
+ mes "\"The bleezin, curst, mischievous monkeys\"";
+ mes "\"Delude his eyes,\"";
+ mes "\"Till in some miry slough he sunk is,\"";
+ mes "\"Ne'er mair to rise.\"";
+ callsub S_food_menu;
+ mes "\"When Masons' mystic word an grip\"";
+ mes "\"In storms an' tempests raise you up,\"";
+ mes "\"Some cock or cat your rage maun stop,\"";
+ mes "\"Or, strange to tell!\"";
+ mes "\"The youngest brither ye wad whip\"";
+ mes "\"Aff straught to hell!\"";
+ callsub S_food_menu;
+ mes "\"Lang syne, in Eden'd bonie yard,\"";
+ mes "\"When youthfu' lovers first were pair'd,\"";
+ mes "\"An all the soul of love they shar'd,\"";
+ mes "\"The raptur'd hour,\"";
+ mes "\"Sweet on the fragrant flow'ry swaird,\"";
+ mes "\"In shady bow'r;\"";
+ callsub S_food_menu;
+ mes "\"Then you, ye auld snick-drawin dog!\"";
+ mes "\"Ye cam to Paradise incog,\"";
+ mes "\"And play'd on man a cursed brogue,\"";
+ mes "\"(Black be your fa'!)\"";
+ mes "\"An gied the infant warld a shog,\"";
+ mes "\"Maist ruin'd a'.\"";
+ callsub S_food_menu;
+ mes "\"D'ye mind that day, when in a bizz,\"";
+ mes "\"Wi' reeket duds an reestet gizz,\"";
+ mes "\"Ye did present your smoutie phiz\"";
+ mes "\"Mang better folk,\"";
+ mes "\"An' sklented on the man of Uz\"";
+ mes "\"Your spitefu' joke?\"";
+ callsub S_food_menu;
+ mes "\"An' how ye gat him i' your thrall,\"";
+ mes "\"An' brak him out o' house and hal',\"";
+ mes "\"While scabs and blotches did him gall,\"";
+ mes "\"Wi' bitter claw,\"";
+ mes "\"An' lows'd his ill-tongued, wicked scaul,\"";
+ mes "\"Was warst ava?\"";
+ callsub S_food_menu;
+ mes "\"But a' your doings to rehearse,\"";
+ mes "\"Your wily snares an' fechtin fierce,\"";
+ mes "\"Sin' that day Michael did you pierce,\"";
+ mes "\"Down to this time,\"";
+ mes "\"Wad ding a Lallan tongue, or Erse,\"";
+ mes "\"In prose or rhyme.\"";
+ callsub S_food_menu;
+ mes "\"An' now, Auld Cloots, I ken ye're thinkin,\"";
+ mes "\"A certain Bardie's rantin, drinkin,\"";
+ mes "\"Some luckless hour will send him linkin,\"";
+ mes "\"To your black pit;\"";
+ mes "\"But faith! he'll turn a corner jinkin,\"";
+ mes "\"An' cheat you yet.\"";
+ callsub S_food_menu;
+ mes "\"But fare you weel, Auld Nickie-ben!\"";
+ mes "\"O wad ye tak a thought an' men'!\"";
+ mes "\"Ye aiblins might--I dinna ken--\"";
+ mes "\"Still hae a stake:\"";
+ mes "\"I'm wae to think upo' yon den,\"";
+ mes "\"Ev'n for your sake!\"";
+ next;
+ mes "\"Well, that was the poem. What do you think of it?\"";
+ menu
+ "It was a bit long and kind of hard to understand, but thanks for reading.", L_Next;
+
+L_Next:
+ mes "[Shannon]";
+ mes "\"Well, thanks for coming to the supper. Also, thanks for helping me make it through the poem. Here, take this hat. When you wear it, wear it with the class you showed me today. Happy Burns' Supper!\"";
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+ getitem "BowlerHat", 1;
+ FLAGS = FLAGS | FLAG_HAS_BOWLER_BURNSDAY;
+ close;
+
+L_No_Event:
+ mes "[Shannon]";
+ mes "\"I'm a traveling poet and admirer of Robert Burns.\"";
+ close;
+
+L_Event_Done:
+ mes "[Shannon]";
+ mes "\"Ah, my dear friend. Good to see you again in this remarkable time of the year.\"";
+ next;
+ mes "\"Welcome to Dimond's Cove. We are celebrating Robert Burns with supper and poems. You provide the supper and I'll provide a poem by Robert Burns. He was otherwise known as 'The Bard' and wrote many poems. The music of language is I love most. The language of poetry. While his accent is thick, his poems tell stories that stir the soul. I'll read a poem by him and you can tell me what you think.\"";
+ next;
+ mes "\"O thou! whatever title suit thee,--\"";
+ mes "\"Auld Hornie, Satan, Nick, or Clootie!\"";
+ mes "\"Wha in yon cavern, grim an' sootie,\"";
+ mes "\"Clos'd under hatches,\"";
+ mes "\"Spairges about the brunstane cootie\"";
+ mes "\"To scaud poor wretches!\"";
+ next;
+ mes "\"Hear me, Auld Hangie, for a wee,\"";
+ mes "\"An' let poor damned bodies be;\"";
+ mes "\"I'm sure sma' pleasure it can gie,\"";
+ mes "\"E'en to a deil,\"";
+ mes "\"To skelp an' scaud poor dogs like me,\"";
+ mes "\"An' hear us squeel!\"";
+ next;
+ mes "\"Great is thy pow'r, an' great thy fame;\"";
+ mes "\"Far ken'd an' noted is thy name;\"";
+ mes "\"An' tho' yon lowin heugh's thy hame,\"";
+ mes "\"Thou travels far;\"";
+ mes "\"An' faith! thou's neither lag nor lame,\"";
+ mes "\"Nor blate nor scaur.\"";
+ next;
+ mes "\"Whyles, ranging like a roarin lion,\"";
+ mes "\"For prey a' holes an' corners tryin;\"";
+ mes "\"Whyles, on the strong-wing'd tempest flyin,\"";
+ mes "\"Tirlin' the kirks;\"";
+ mes "\"Whyles, in the human bosom pryin,\"";
+ mes "\"Unseen thou lurks.\"";
+ next;
+ mes "\"I've heard my rev'rend graunie say,\"";
+ mes "\"In lanely glens ye like to stray;\"";
+ mes "\"Or whare auld ruin'd castles gray\"";
+ mes "\"Nod to the moon,\"";
+ mes "\"Ye fright the nightly wand'rer's way\"";
+ mes "\"Wi' eldritch croon.\"";
+ next;
+ mes "\"When twilight did my graunie summon\"";
+ mes "\"To say her pray'rs, douce honest woman!\"";
+ mes "\"Aft yont the dike she's heard you bummin,\"";
+ mes "\"Wi' eerie drone;\"";
+ mes "\"Or, rustlin thro' the boortrees comin,\"";
+ mes "\"Wi' heavy groan.\"";
+ next;
+ mes "\"Ae dreary, windy, winter night,\"";
+ mes "\"The stars shot down wi' sklentin light,\"";
+ mes "\"Wi' you mysel I gat a fright,\"";
+ mes "\"Ayont the lough;\"";
+ mes "\"Ye like a rash-buss stood in sight,\"";
+ mes "\"Wi' waving sugh.\"";
+ next;
+ mes "\"The cudgel in my nieve did shake,\"";
+ mes "\"Each bristl'd hair stood like a stake,\"";
+ mes "\"When wi' an eldritch, stoor 'Quaick, quaick,'\"";
+ mes "\"Amang the springs,\"";
+ mes "\"Awa ye squatter'd like a drake,\"";
+ mes "\"On whistling wings.\"";
+ next;
+ mes "\"Let warlocks grim an' wither'd hags\"";
+ mes "\"Tell how wi' you on ragweed nags\"";
+ mes "\"They skim the muirs an' dizzy crags\"";
+ mes "\"Wi' wicked speed;\"";
+ mes "\"And in kirk-yards renew their leagues,\"";
+ mes "\"Owre howket dead.\"";
+ next;
+ mes "\"Thence, countra wives wi' toil an' pain\"";
+ mes "\"May plunge an' plunge the kirn in vain;\"";
+ mes "\"For oh! the yellow treasure's taen\"";
+ mes "\"By witchin skill;\"";
+ mes "\"An' dawtet, twal-pint hawkie's gaen\"";
+ mes "\"As yell's the bill.\"";
+ next;
+ mes "\"Thence, mystic knots mak great abuse,\"";
+ mes "\"On young guidmen, fond, keen, an' croose;\"";
+ mes "\"When the best wark-lume i' the house,\"";
+ mes "\"By cantraip wit,\"";
+ mes "\"Is instant made no worth a louse,\"";
+ mes "\"Just at the bit.\"";
+ next;
+ mes "\"When thowes dissolve the snawy hoord,\"";
+ mes "\"An' float the jinglin icy-boord,\"";
+ mes "\"Then water-kelpies haunt the foord\"";
+ mes "\"By your direction,\"";
+ mes "\"An' nighted trav'lers are allur'd\"";
+ mes "\"To their destruction.\"";
+ next;
+ mes "\"And aft your moss-traversing spunkies\"";
+ mes "\"Decoy the wight that late an drunk is:\"";
+ mes "\"The bleezin, curst, mischievous monkeys\"";
+ mes "\"Delude his eyes,\"";
+ mes "\"Till in some miry slough he sunk is,\"";
+ mes "\"Ne'er mair to rise.\"";
+ next;
+ mes "\"When Masons' mystic word an grip\"";
+ mes "\"In storms an' tempests raise you up,\"";
+ mes "\"Some cock or cat your rage maun stop,\"";
+ mes "\"Or, strange to tell!\"";
+ mes "\"The youngest brither ye wad whip\"";
+ mes "\"Aff straught to hell!\"";
+ next;
+ mes "\"Lang syne, in Eden'd bonie yard,\"";
+ mes "\"When youthfu' lovers first were pair'd,\"";
+ mes "\"An all the soul of love they shar'd,\"";
+ mes "\"The raptur'd hour,\"";
+ mes "\"Sweet on the fragrant flow'ry swaird,\"";
+ mes "\"In shady bow'r;\"";
+ next;
+ mes "\"Then you, ye auld snick-drawin dog!\"";
+ mes "\"Ye cam to Paradise incog,\"";
+ mes "\"And play'd on man a cursed brogue,\"";
+ mes "\"(Black be your fa'!)\"";
+ mes "\"An gied the infant warld a shog,\"";
+ mes "\"Maist ruin'd a'.\"";
+ next;
+ mes "\"D'ye mind that day, when in a bizz,\"";
+ mes "\"Wi' reeket duds an reestet gizz,\"";
+ mes "\"Ye did present your smoutie phiz\"";
+ mes "\"Mang better folk,\"";
+ mes "\"An' sklented on the man of Uz\"";
+ mes "\"Your spitefu' joke?\"";
+ next;
+ mes "\"An' how ye gat him i' your thrall,\"";
+ mes "\"An' brak him out o' house and hal',\"";
+ mes "\"While scabs and blotches did him gall,\"";
+ mes "\"Wi' bitter claw,\"";
+ mes "\"An' lows'd his ill-tongued, wicked scaul,\"";
+ mes "\"Was warst ava?\"";
+ next;
+ mes "\"But a' your doings to rehearse,\"";
+ mes "\"Your wily snares an' fechtin fierce,\"";
+ mes "\"Sin' that day Michael did you pierce,\"";
+ mes "\"Down to this time,\"";
+ mes "\"Wad ding a Lallan tongue, or Erse,\"";
+ mes "\"In prose or rhyme.\"";
+ next;
+ mes "\"An' now, Auld Cloots, I ken ye're thinkin,\"";
+ mes "\"A certain Bardie's rantin, drinkin,\"";
+ mes "\"Some luckless hour will send him linkin,\"";
+ mes "\"To your black pit;\"";
+ mes "\"But faith! he'll turn a corner jinkin,\"";
+ mes "\"An' cheat you yet.\"";
+ next;
+ mes "\"But fare you weel, Auld Nickie-ben!\"";
+ mes "\"O wad ye tak a thought an' men'!\"";
+ mes "\"Ye aiblins might--I dinna ken--\"";
+ mes "\"Still hae a stake:\"";
+ mes "\"I'm wae to think upo' yon den,\"";
+ mes "\"Ev'n for your sake!\"";
+ next;
+ mes "\"Well, that was the poem. What do you think of it?\"";
+ menu
+ "It was a bit long and kind of hard to understand, but thanks for reading.", L_close;
+
+L_Full_Inv:
+ mes "[Shannon]";
+ mes "\"Your possessions seems to be a burden to you.\"";
+ next;
+ mes "\"Maybe you should turn away from the mundane world and get rid of this burden to change your view to the beauty of poetry.\"";
+ close;
+
+S_food_menu:
+ setarray @choice_idx, 0,0,0,0,0,0;
+ setarray @choice$, "","","","","","";
+
+ @C_steak = 676;
+ @C_chickenleg = 562;
+ @C_redapple = 535;
+ @C_greenapple = 719;
+ @C_beer = 539;
+
+ // counter of available answers
+ @choices_nr = 0;
+
+ if (countitem("Steak") == 0)
+ goto L_Nosteaks;
+ @choice_idx[@choices_nr] = @C_steak;
+ @choice$[@choices_nr] = "Offer him a steak.";
+ @choices_nr = @choices_nr + 1;
+ goto L_Nosteaks;
+
+L_Nosteaks:
+ if (countitem("ChickenLeg") == 0)
+ goto L_Nochickenleg;
+ @choice_idx[@choices_nr] = @C_chickenleg;
+ @choice$[@choices_nr] = "Offer him a chicken leg.";
+ @choices_nr = @choices_nr + 1;
+ goto L_Nochickenleg;
+
+L_Nochickenleg:
+ if (countitem("RedApple") == 0)
+ goto L_Noredapple;
+ @choice_idx[@choices_nr] = @C_redapple;
+ @choice$[@choices_nr] = "Offer him a red apple.";
+ @choices_nr = @choices_nr + 1;
+ goto L_Noredapple;
+
+L_Noredapple:
+ if (countitem("GreenApple") == 0)
+ goto L_Nogreenapple;
+ @choice_idx[@choices_nr] = @C_greenapple;
+ @choice$[@choices_nr] = "Offer him a green apple.";
+ @choices_nr = @choices_nr + 1;
+ goto L_Nogreenapple;
+
+L_Nogreenapple:
+ if (countitem("Beer") == 0)
+ goto L_NoBeer;
+ @choice_idx[@choices_nr] = @C_beer;
+ @choice$[@choices_nr] = "Offer him a beer.";
+ @choices_nr = @choices_nr + 1;
+ goto L_NoBeer;
+
+L_NoBeer:
+ @choice_idx[@choices_nr] = @C_nevermind;
+ @choice$[@choices_nr] = "Leave";
+
+ menu
+ @choice$[0],L_MenuItems,
+ @choice$[1],L_MenuItems,
+ @choice$[2],L_MenuItems,
+ @choice$[3],L_MenuItems,
+ @choice$[4],L_MenuItems,
+ @choice$[5],L_MenuItems,
+ @choice$[6],L_MenuItems,
+ @choice$[7],L_MenuItems,
+ @choice$[8],L_MenuItems,
+ @choice$[9],L_MenuItems,
+ @choice$[10],L_MenuItems;
+
+L_MenuItems:
+ @choose = @menu - 1;
+ if (@choice_idx[@choose] == 0)
+ goto L_close;
+ if ((countitem("Steak") != 0) && (@choice_idx[@choose] == @C_steak))
+ goto L_RmItem;
+ if ((countitem("ChickenLeg") != 0) && (@choice_idx[@choose] == @C_chickenleg))
+ goto L_RmItem;
+ if ((countitem("RedApple") != 0) && (@choice_idx[@choose] == @C_redapple))
+ goto L_RmItem;
+ if ((countitem("GreenApple") != 0) && (@choice_idx[@choose] == @C_greenapple))
+ goto L_RmItem;
+ if ((countitem("Beer") != 0) && (@choice_idx[@choose] == @C_beer))
+ goto L_RmItem;
+
+ // fallthrough only when player remove the items while in menu, trying to cheat
+ // the quest will need to be started again
+ mes "\"What you are offering, you do not have. Do not try to betray me. Come back when you have better morals.\"";
+ close;
+
+L_RmItem:
+ delitem @choice_idx[@choose], 1;
+ return;
+
+L_close:
+ close;
+}
+
+010-2,27,30,0 script Bar Rules NPC400,{
+ mes "Dimonds Cove Bar Rules";
+ next;
+ mes "No excessive drinking!";
+ mes "If your sprite starts to stagger we will ask you to leave.";
+ next;
+ mes "No offensive chat.";
+ mes "This is a nice establishment.";
+ mes "Crude and offensive behavior will be reported to TMW GM's.";
+ next;
+ mes "Please be respectful of others.";
+ mes "Not everyone has the same experience and should all be treated";
+ mes "with equal respect.";
+ next;
+ mes "Thank You,";
+ mes "Dimonds Cove Management";
+ close;
+}
+
+010-2,71,38,0 script Store Policy#1 NPC400,{
+ mes "All sales are final.";
+ mes "Returns are subject to a 50% re-stocking fee.";
+ close;
+}
+
+010-2,77,38,0 script Store Policy#2 NPC400,{
+ mes "All sales are final.";
+ mes "Returns are subject to a 50% re-stocking fee.";
+ close;
+}
+
+010-2,36,30,0 script Directions NPC400,{
+ mes "This way to the Dimonds Cove Inn.";
+ mes "Five star accommodation for the weary traveler!";
+ close;
+}
+
+010-2,80,32,0 script Dimonds Cove 1 NPC400,{
+ mes "The Story of Dimonds Cove";
+ next;
+ mes "One day Dimond D. Stone dreamed of her own restaurant.";
+ mes "Dimond sold her food alone in this spot for some time,";
+ mes "longing for the day she would have a building.";
+ mes "She met an adventurer named Merlin outside of the";
+ mes "desert mines one day.";
+ next;
+ mes "They became friends and Dimond told Merlin about her idea.";
+ mes "Merlin was a accomplished carpenter and wanted to make a new";
+ mes "place in the world. He told Dimond that he would make her";
+ mes "restaurant for her. He gathered the tools and after much";
+ mes "hard work, Dimonds Cove was built.";
+ next;
+ mes "(See Dimonds Cove 2)";
+ close;
+}
+
+010-2,85,32,0 script Dimonds Cove 2 NPC400,{
+ mes "List of Events at Dimonds Cove";
+ mes "January 2008 - Construction of Dimonds Cove.";
+ close;
+}
+
+
+010-2,71,30,0 script Inn NPC400,{
+ mes "Welcome to the Dimonds Cove Inn";
+ mes "Rooms are 200 gp a night.";
+ mes "Plese check in with Basil.";
+ close;
+}
+
+
+010-2,24,27,0 script Bartender NPC112,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Beer;
+ sellitem IronPotion;
+ sellitem ConcentrationPotion;
+ .distance = 5;
+ end;
+}
+
+010-2,32,34,0 script Waitress NPC139,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem CherryCake;
+ sellitem RoastedMaggot;
+ sellitem OrangeCupcake;
+ sellitem ChickenLeg;
+ sellitem Steak;
+ .distance = 5;
+ end;
+}
+
+010-2,85,41,0 script Blacksmith NPC146,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem ForestBow;
+ sellitem IronArrow;
+ sellitem LeatherShield;
+ .distance = 5;
+ end;
+}
+
+010-2,65,41,0 script General Store#dimond NPC137,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem CottonShorts;
+ sellitem FancyHat;
+ sellitem SilkHeadband;
+ sellitem CottonSkirt;
+ sellitem Boots;
+ sellitem CottonBoots;
+ .distance = 5;
+ end;
+}
+
+010-2,75,68,0 script Basil NPC107,{
+ @npcname$ = "Basil the Inn Keeper";
+ @Cost = 200;
+ callfunc "Inn";
+ end;
+}
diff --git a/npc/010-2/doug.txt b/npc/010-2/doug.txt
new file mode 100644
index 00000000..e16a2997
--- /dev/null
+++ b/npc/010-2/doug.txt
@@ -0,0 +1,21 @@
+
+010-2,68,87,0 script Doug NPC113,{
+ mes "[Doug]";
+ mes "\"This room is too dark. I want to brighten it up.\"";
+ next;
+
+ @dq_level = 15;
+ @dq_cost = 10;
+ @dq_count = 5;
+ @dq_name$ = "CaveSnakeLamp";
+ @dq_friendly_name$ = "Cave Snake Lamps";
+ @dq_money = 1000;
+ @dq_exp = 1500;
+
+ callfunc "DailyQuest";
+
+ next;
+ mes "[Doug]";
+ mes "\"Too bad these lamps wear off after a while...\"";
+ close;
+}
diff --git a/npc/010-2/loratay.txt b/npc/010-2/loratay.txt
new file mode 100644
index 00000000..43517bb7
--- /dev/null
+++ b/npc/010-2/loratay.txt
@@ -0,0 +1,1053 @@
+010-2,83,85,0 script Lora Tay Debug NPC151,{
+ mes "[Lora Tay Debug]";
+ mes "What do you want to do?";
+ menu
+ "Show Quest State", L_ShowState,
+ "Set Quest State", L_SetState,
+ "Reset", L_Reset,
+ "Nothing.", L_close;
+
+L_ShowState:
+ @wg_state = ((QUEST_WG_state & BYTE_0_MASK) >> BYTE_0_SHIFT);
+ mes "Current State is " + @wg_state;
+ goto L_close;
+
+L_SetState:
+ mes "What state do you want?";
+ input @wg_state;
+ callfunc "setWGState";
+ mes "Set to " + @wg_state;
+ goto L_close;
+
+L_Reset:
+ @wg_state = 0;
+ callfunc "setWGState";
+ mes "Reset!";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "Lora Tay Debug";
+ end;
+}
+010-2,85,85,0 script Lora Tay NPC151,{
+ set @ROBE_COCOONS_NR, 150; // must be multiple of ten
+ @ROBE_ZENY = 10000;
+ set @ROBE_SHEETS_NR, 6; // number of silk sheets required for the silk robe. Must be less than 10.
+ set @ROBE_SHEETS_ZENY, 6000; // price of the silk robe when bringing silk sheets.
+ set @Robe_with_sheets, 0; // will be set to 1 if silk robe is made with sheets
+ @FINEDRESS_COCOONS = 180;
+ @SORCERER_ROBE_SEW_ZENY = 25000;
+ @SORCERER_ROBE_NUM_COTTON_CLOTH = 2;
+ @wg_state = ((QUEST_WG_state & BYTE_0_MASK) >> BYTE_0_SHIFT);
+
+ if (@loratay_asking_robe == 1) goto L_ExamineSR;
+ if (@wg_state == 10) goto L_agostine_menu;
+ if (@wg_state == 11 || @wg_state == 12) goto L_regular_intro;
+ if (@wg_state == 13) goto L_Intro;
+ if (@wg_state == 14) goto L_show_materials;
+ if (@wg_state == 15) goto L_search_items;
+ if (@wg_state == 16) goto L_retrieve_design;
+ if (@wg_state == 17) goto L_bringing_design;
+ if (@wg_state == 18) goto L_wait_dress_finished;
+ if (@wg_state == 19) goto L_dress_finished;
+ if (@wg_state >= 20 && @wg_state < 23) goto L_deliver_dress;
+ if (@wg_state >= 23) goto L_regular_intro;
+
+ @t = rand(3);
+ if (@t == 0) goto L_Intro_0;
+ if (@t == 1) goto L_Intro_1;
+
+ mes "You see a middle-aged woman furiously sewing away at what appears to be a very expensive dress. Her fingers are moving so nimbly that you find it near-impossible to follow the needle.";
+ goto L_Intro_over;
+
+L_Intro_0:
+ mes "You notice a middle-aged woman carefully drawing lines on a large sheet of cotton.";
+ goto L_Intro_over;
+
+L_Intro_1:
+ mes "You see a middle-aged woman cautiously but surprisingly swiftly cutting out shapes from a huge cotton sheet. The scissors glide along the cloth as if it were butter, never leaving the premarked lines.";
+ goto L_Intro_over;
+
+L_Intro_over:
+ next;
+ mes "She suddenly stops and looks up.";
+ next;
+ mes "\"Now who are you, and what are you doing here?\"";
+ mes "She squints, pushes her thick spectacles up the bridge of her nose and eyes you suspiciously.";
+ next;
+
+ @agostine_msg0$ = "";
+ @agostine_msg1$ = "";
+
+ if (@wg_state >= 1)
+ @agostine_msg0$ = "Do you know Agostine?";
+ if ((@wg_state >= 9) && (countitem("FurBoots")))
+ @agostine_msg1$ = "Can you make fur boots, like Agostine?";
+
+ menu
+ "Hello! My name is " + strcharinfo(0) + ".", L_hello_0,
+ "Hello; are you a tailor?", L_hello_1,
+ "Can you make something for me?", L_hello_2,
+ @agostine_msg0$, L_agostine_0,
+ @agostine_msg1$, L_agostine_1;
+
+L_hello_0:
+ mes "She raises an eyebrow.";
+ mes "\"That,\", she notes dryly, \"is hardly my fault. And now I would greatly appreciate it if you were to get out of here and leave me to my work!\"";
+ goto L_close;
+
+L_hello_1:
+ mes "She frowns.";
+ mes "\"No, I am an accupuncturist, I just happen to practice on cloth! Get out of here with your silly questions!\"";
+ goto L_close;
+
+L_hello_2:
+ mes "She glares at you indignantly.";
+ mes "\"Do you even know whom you are talking to? I am Lora Tay, greatest of the seven seamstresses of the South!\"";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"I do not work for petty peasants or arrogant adventurers. Get out of my sight!\"";
+ mes "She waves you away and returns to her work.";
+ goto L_close;
+
+L_agostine_0:
+ if (@wg_state < 1)
+ goto L_close;
+ mes "She shoots an incensed glare at you.";
+ mes "\"Ah, Agostine! The 'legendary tailor'! Now who has not heard of him, been inspired by him! Such charisma! Such popularity! Such unprecedented lack of talent!\"";
+ mes "You notice that she prononuces the 't's as if she were trying to slap someone.";
+ next;
+ mes "\"Please spare me your tales of this fool. He couldn't mend a sock without getting himself trapped inside!\"";
+ mes "She frowns and turns back to her work, clearly not interested in discussing the matter further.";
+ goto L_close;
+
+L_agostine_1:
+ if ((@wg_state < 9) || (countitem (655) == 0))
+ goto L_close;
+ mes "[Lora Tay the Seamstress]";
+ mes "She glares at your boots, her lips forming barely more than a thin line. Deep furrows form above her brows.";
+ mes "\"I can't believe it! He copied Illana's design but used fluffy fur in place of ice wolvern fur-- Fluffy fur! Of all things! Who would wear such an atrocity of fashion! Everyone knows that you need ice-white, not pale-white, to go with such leather!\"";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "She looks at them more closely.";
+ mes "\"This insolent upstart! Even worse, he copied my very own double-backward cross-stitch pattern... I can't believe it!\"";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "Angry red spots begin to form on her cheeks.";
+ mes "\"Get those... things out of my sight before I forget myself!\"";
+ if (@wg_state == 9) goto L_Next13;
+ goto L_close;
+
+L_Next13:
+ @wg_state = 10;
+ callfunc "setWGState";
+ goto L_close;
+
+L_agostine_menu:
+ mes "[Lora Tay the Seamstress]";
+ mes "The seamstress looks up at you from her work.";
+ mes "\"I do hope that you have not had any more dealings with this... this lumberjack of a tailor?\"";
+ next;
+ if (countitem("WinterGloves") > 0)
+ menu
+ "You mean Agostine?", L_agostine_3,
+ "Actually, he also made me gloves...", L_agostine_2,
+ "Why don't you like him?", L_agostine_4,
+ "No, none, really.", L_agostine_5;
+ menu
+ "You mean Agostine?", L_agostine_3,
+ "Why don't you like him?", L_agostine_4,
+ "No, none, really.", L_agostine_5;
+
+L_agostine_2:
+ if ((@wg_state < 9) || (countitem("WinterGloves") == 0))
+ goto L_close;
+ mes "[Lora Tay the Seamstress]";
+ mes "Lora inspects your gloves, shock apparent on her face.";
+ mes "\"Winter gloves? And he managed the join stitches without adding a single crease... no, that can't be the Agostine we were talking about...\"";
+ mes "Without asking, she takes your gloves and inspects them further.";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Triple inverted crossbar... he stole another of my stitching patterns! Except... no, that couldn't hold... what kind of yarn...\"";
+ mes "Torn between excitement, worry, and latent disgust, she frantically turns the gloves from side to side, looking for obvious flaws, her face reddening.";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"No, it's perfect... Inconceivable! How could that little upstart... I don't believe it!\"";
+ mes "Breathing heavily with something that might be anger or confusion, she turns them inside out.";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "She slides her fingers over the now-exposed inside whilst the color of her face approaches that of an over-ripe tomato.";
+ mes "\"Almost perfectly smooth...\", she whispers.";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "She jumps up in a fit of sudden rage.";
+ mes "\"That's impossible! Where did he learn to sew like that! How did he cut the shapes so perfectly! When did he...";
+ mes "Suddenly, she breaks into a cough.";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"*cough* ... can't possibly... *cough*...\"";
+ mes "Lora sinks back on her chair, trying to control her cough.";
+ next;
+ if (countitem("BottleOfWater"))
+ menu
+ "(sneak out of the room)", L_End,
+ "Are you alright?", L_NextMenu,
+ "Here, have a bottle of water...", L_Give_water,
+ "Can I help you?", L_NextMenu;
+ goto L_NextMenu;
+
+L_NextMenu:
+ if (countitem("BottleOfWater") == 0)
+ menu
+ "(sneak out of the room)", L_End,
+ "Are you alright?", L_Next,
+ "Can I help you?", L_Next;
+ goto L_Next;
+
+L_Next:
+ mes "[Lora Tay the Seamstress]";
+ mes "She holds out your gloves for you to pick up, then waves you out of the room. Fortunately, her cough seems to be slowly subsiding.";
+ goto L_close;
+
+L_agostine_3:
+ mes "[Lora Tay the Seamstress]";
+ mes "She frowns at you.";
+ mes "\"What other self-absorbed tailor-pretends with the sewing skill of a mouboo are there around? Stop wasting my time.\"";
+ goto L_close;
+
+L_agostine_4:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Is it not obvious? We are talking about someone so self-absorbed that he chose to ignore the advice of myself, greatest of the seven southern seamstresses! I cannot stand such arrogance.\"";
+ goto L_close;
+
+L_agostine_5:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Good for you. That arrogant good-for-nothing couldn't tell a piece of cotton from chain mail if he wiped his nose with it!\"";
+ goto L_close;
+
+L_No_Water:
+ mes "Checking more closely, you realize that you are out of water.";
+ mes "You apologise to Lora, though it fortunately seems that her cough is subsiding.";
+ mes "She waves you out of the room.";
+ goto L_close;
+
+L_regular_intro:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Ah, you again. Is there anything in particular you need?\"";
+ next;
+ if (@wg_state == 12)
+ goto L_Main_menu_proposal;
+ goto L_Main_menu;
+
+L_Give_water:
+ if (countitem("BottleOfWater") == 0)
+ goto L_No_Water;
+ delitem "BottleOfWater", 1;
+ @wg_state = 11;
+ callfunc "setWGState";
+
+ @xpval = 50000;
+
+ getexp @xpval, 0;
+ mes "[Lora Tay the Seamstress]";
+ mes "Lora grabs your water bottle and take a deep sip. Slowly, her head regains a more natural color. As she puts the bottle down, her cough seems to have subsided.";
+ mes "\"Thank you, dear; that was just the right thing at the right time.\"";
+ mes "[You gain " + @xpval + " experience points]";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "She hands you the winter gloves again.";
+ mes "\"Now what happened I don't know, but this wasn't made by the Agostine I remember. But I shan't be made a fool out of by one such as him.\"";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"If HE can sew petty every-day items for ordinary peasants, then so can I. Very well, is there anything in particular that you need made? I shall show you how a proper seamstress operates!\"";
+ next;
+
+ if (@wg_state == 12)
+ goto L_Main_menu_proposal;
+ goto L_Main_menu;
+
+L_Main_menu:
+ menu
+ "Can you trim something for me?", L_trim,
+ "Can you lengthen something for me?", L_lengthen,
+ "Can you make me a shirt?", L_Shirt,
+ "Can you make me a tank top?", L_tanktop,
+ "Can you make me a cape?", L_cape,
+ "Can you make fur boots for me?", L_Fur,
+ "Can you make winter gloves me?", L_Fur,
+ "Can you sew a robe for me?", L_robe,
+ "Can you make a desert hat for me?", L_desert_hat,
+ "Can you enhance a sorcerer robe with another line color?", L_sr_linecolor,
+ "Goodbye for now.", L_End;
+
+L_Fur:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"From what? Fluffy fur? I won't work with such lowly materials.\"";
+ next;
+ goto L_Main_menu;
+
+L_Main_menu_proposal:
+ menu
+ "Actually...I have a proposal for you...", L_agostine_proposal,
+ "Goodbye for now.", L_End;
+
+L_agostine_proposal:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"What kind of proposal are you asking of me?\"";
+ next;
+
+ menu
+ "I have talked to Agostine and he needs your help.", L_Next1,
+ "I forgot...", L_End;
+
+L_Next1:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"That cheat! What could he possibly want from me?";
+ mes "We don't even have the same style in seaming. Is this a joke?\"";
+ next;
+
+ menu
+ "It's no joke. He needs your help in creating a new fashion!", L_Next2,
+ "Yeah you're right, he was probably joking.", L_End;
+
+L_Next2:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Well it depends what he wants from me.";
+ mes "Go see Agostine, ask him what he's planning and I will think about it.\"";
+
+ @wg_state = 13;
+ callfunc "setWGState";
+ goto L_close;
+
+L_Intro:
+ mes "Lora Tay seems lost in her thoughts... ";
+ menu
+ "Sorry to disturb you, but...", L_Main_menu,
+ "I better go talk to Agostine.", L_End;
+
+L_show_materials:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Did you talk to Agostine about his idea?\"";
+ next;
+ menu
+ "Yes, he explained he saw a dress in a dream and gave me these materials.", L_Next3,
+ "No, that guy is a total wacko.", L_End;
+
+L_Next3:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Wow these are such fine materials!";
+ mes "These are certainly not for just any ordinary clothes...";
+ mes "He must be thinking of something magnificent.\"";
+ next;
+
+ menu
+ "He said this garment would be his first dress creation and he wanted it to be fabulous!", L_Next4;
+
+L_Next4:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Fine I will accept his offer...";
+ mes "But the materials he has given you need some sewing on the edges.\"";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"I will fix them, but I cannot use normal threading to fix these materials.";
+ mes "I will need a soft thin thread so I won't spoil the textures.\"";
+ next;
+ goto L_search_items;
+
+L_search_items:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Please bring me " + @FINEDRESS_COCOONS + " silk cocoons.";
+ mes "This should cover the materials needed, and will leave extra for sewing the pieces together later on.\"";
+ next;
+
+ menu
+ "I will go get them right away!", L_Next5,
+ "Here you are.", L_Give_items,
+ @FINEDRESS_COCOONS+" silk cocoons for a dress? Find somebody else.", L_End;
+
+L_Next5:
+ @wg_state = 15;
+ callfunc "setWGState";
+ goto L_close;
+
+L_Not_enough_items:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"This is not funny. I need " + @FINEDRESS_COCOONS + " silk cocoons. No less.";
+ goto L_close;
+
+L_Give_items:
+ if (countitem ("SilkCocoon") < @FINEDRESS_COCOONS)
+ goto L_Not_enough_items;
+ delitem "SilkCocoon", @FINEDRESS_COCOONS;
+ @wg_state = 16;
+ callfunc "setWGState";
+
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Great, now I can spin the silk threading and fix this mess made of these fine materials.";
+ mes "While I do this, you will need to go get the design drawings from Agostine...";
+ mes "Every tailor puts their designs on paper before they forget about it.\"";
+ next;
+ goto L_retrieve_design;
+
+L_retrieve_design:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"May you go retrieve the design from Agostine?\"";
+ next;
+ menu
+ "Certainly I'll be back soon!", L_close,
+ "Actually I want something else...", L_Main_menu;
+
+L_bringing_design:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Welcome back, did you get the drawings I requested?\"";
+ next;
+ menu
+ "Here they are!", L_Next6;
+
+L_Next6:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Wonderful, this dress design is magnificent!";
+ mes "I am done with the threading but I will now need to sew these materials together into the design.\"";
+ next;
+ @wg_state = 18;
+ callfunc "setWGState";
+ goto L_wait_dress_finished;
+
+L_wait_dress_finished:
+ // Sets @time_start to the current time
+ // if not set yet, or if the player logged off.
+ if (@time_start == 0) set @time_start, gettimetick(2);
+ if (gettimetick(2) - @time_start > 30)
+ goto L_dress_finished;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"It will take some time to have the dress finished.";
+ mes "Meanwhile, why don't you go take some air outside?\"";
+ goto L_close;
+
+L_dress_finished:
+ @wg_state = 19;
+ callfunc "setWGState";
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Well it was difficult seaming with such fragile materials.";
+ mes "But I have done it. The design is finished except for one part of it.\"";
+ next;
+
+ menu
+ "Wow it looks great, but what's missing?", L_Next7;
+
+L_Next7:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Well there are white flare designs on the bottom of the dress.";
+ mes "I'm not great with fine cloth design so this might be something Agostine must do on his own.";
+ next;
+
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Please take the unfinished dress to him so he may finish the edges with the cloth.\"";
+ next;
+
+ menu
+ "Okay, can't wait to see the finished product! Thanks for your help!", L_Next8;
+
+L_Next8:
+ @wg_state = 20;
+ callfunc "setWGState";
+ goto L_close;
+
+L_deliver_dress:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Please take the unfinished dress to him so he may finish the edges with the cloth.\"";
+ menu
+ "I'm on my way.", L_close,
+ "I have a request...", L_Main_menu;
+
+L_desert_hat:
+ mes "[Lora Tay the Seamstress]";
+ mes "The seamstress sighs.";
+ mes "\"One of these days it would be nice to have an actual challenge... yes, of course I can make a desert hat. A Cotton Headband, three pieces of cotton cloth. Hmm. And let's add 300 GP to that.\"";
+ next;
+ cleararray @items$, "", getarraysize(@items$);
+ cleararray @item_names$, "", getarraysize(@item_names$);
+ @o = 1;
+ setarray @items$, "CottonHeadband";
+ setarray @item_names$, "Here is a Cotton Headband.";
+ callsub S_CottonHeadbandColors;
+
+ callfunc "DynamicItemMenu$";
+ if (@item$ == "")
+ goto L_Main_menu;
+ if (@item$ == "CottonHeadband")
+ @genitem$ = "DesertHat";
+ if (@item$ != "CottonHeadband")
+ @genitem$ = $@DYE_colors$[@index] + "DesertHat";
+ if (countitem(@item$) < 1)
+ goto L_desert_hat_noheadband;
+ if (countitem("CottonCloth") < 3)
+ goto L_desert_hat_nocotton;
+ if (Zeny < 300)
+ goto L_desert_hat_nogp;
+ delitem @item$, 1;
+ delitem "CottonCloth", 3;
+ Zeny = Zeny - 300;
+ getitem @genitem$, 1;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Now then, this should only take a minute.\"";
+ mes "The seamstress folds your cotton cloth in a complicated fashion, wraps the resulting bundle into and out of the headband, and finally sews together several loose ends.";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "The result resembles a huge knot.";
+ mes "Lora picks two ends and pulls, hard-- to your amazement, the knot unfolds, yielding a Desert Hat.";
+ mes "\"Here you are.\"";
+ next;
+ goto L_Main_menu;
+
+S_CottonHeadbandColors:
+ @items$[@o] = $@DYE_colors$[@o]+"CottonHeadband";
+ @item_names$[@o] = "Here is a "+$@DYE_color_names$[@o]+" Cotton Headband";
+ @o = @o + 1;
+ if(@o < getarraysize($@DYE_colors$)) goto S_CottonHeadbandColors;
+ return;
+
+L_desert_hat_nocotton:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"You're asking me to make a desert hat without enough cloth? Here, have your headband back-- see, that's how much I can do without cloth! And since I'm generous today, you can even keep your GP...\"";
+ next;
+ goto L_Main_menu;
+
+L_desert_hat_nogp:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"No, no, no. 300 GP. That's not that much, I've been told. I can't just work for free, now can I?\"";
+ next;
+ goto L_Main_menu;
+
+L_desert_hat_noheadband:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Now that is odd. Where did your headband vanish to? Well, I'm not going to make you something as silly as a headband, so get one from elsewhere.\"";
+ next;
+ goto L_Main_menu;
+
+L_trim:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Trimming... you mean that you can't do that yourself? Well, alright... I suppose I should charge 100 GP and do it.\"";
+ mes "\"Alright. What is it that you want trimmed?\"";
+ next;
+
+ cleararray @items, 0, getarraysize(@items);
+ cleararray @item_names$, "", getarraysize(@item_names$);
+ setarray @items, 1202, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 688, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 632, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 648, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189;
+ setarray @item_names$, "Cotton Shirt", "Red Cotton Shirt", "Green Cotton Shirt", "Dark Blue Cotton Shirt", "Yellow Cotton Shirt", "Light Blue Cotton Shirt", "Pink Cotton Shirt", "Black Cotton Shirt", "Orange Cotton Shirt", "Purple Cotton Shirt", "Dark Green Cotton Shirt", "Tank Top", "Red Tank Top", "Green Tank Top", "Dark Blue Tank Top", "Yellow Tank Top", "Light Blue Tank Top", "Pink Tank Top", "Black Tank Top", "Orange Tank Top", "Purple Tank Top", "Dark Green Tank Top", "Cotton Skirt", "Red Cotton Skirt", "Green Cotton Skirt", "Dark Blue Cotton Skirt", "Yellow Cotton Skirt", "Light Blue Cotton Skirt", "Pink Cotton Skirt", "Black Cotton Skirt", "Orange Cotton Skirt", "Purple Cotton Skirt", "Dark Green Cotton Skirt", "Cotton Trousers", "Red Cotton Trousers", "Green Cotton Trousers", "Dark Blue Cotton Trousers", "Yellow Cotton Trousers", "Light Blue Cotton Trousers", "Pink Cotton Trousers", "Black Cotton Trousers", "Orange Cotton Trousers", "Purple Cotton Trousers", "Dark Green Cotton Trousers";
+ callfunc "DynamicItemMenu";
+ if (@item == 0)
+ goto L_Main_menu;
+ @delitem = @item;
+ @genitem = 0;
+ if (@item == 1202)
+ @genitem = 688;
+ if (@item == 688)
+ @genitem = 689;
+ if (@item == 632)
+ @genitem = 771;
+ if (@item == 648)
+ @genitem = 586;
+ if (@item >= 2090 && @item <= 2099)
+ @genitem = @item + 30;
+ if (@item >= 2050 && @item <= 2059)
+ @genitem = @item + 40;
+ if (@item >= 2100 && @item <= 2109)
+ @genitem = @item + 70;
+ if (@item >= 2180 && @item <= 2189)
+ @genitem = @item - 70;
+ if (@genitem == 0)
+ goto L_trim_impossible;
+ if (Zeny < 100)
+ goto L_trim_noZeny;
+ if (countitem(@delitem) < 1)
+ goto L_Main_menu;
+
+ delitem @delitem, 1;
+ getitem @genitem, 1;
+ Zeny = Zeny - 100;
+ mes "[Lora Tay the Seamstress]";
+ mes "";
+ mes "\"There you are, dear.\"";
+ next;
+ goto L_Main_menu;
+
+L_trim_impossible:
+ mes "[Lora Tay the Seamstress]"; // INTERNAL ERROR
+ mes "\"I don't really want to shorten this any more.\"";
+ next;
+ goto L_Main_menu;
+
+L_trim_noZeny:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Not enough GP? Well, just do it yourself-- trimming really is trivial.\"";
+ next;
+ goto L_Main_menu;
+
+L_lengthen:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Naturally, I will need a piece of Cotton Cloth to sew onto it; I must also charge you some... hmm... does 500 GP sound reasonable? Yes, I think I shall charge that.\"";
+ mes "\"Now, let me see. What is it that you want lengthened?\"";
+ next;
+
+ cleararray @items, 0, getarraysize(@items);
+ cleararray @item_names$, "", getarraysize(@item_names$);
+ setarray @items, 688, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 689, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 771, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 586, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119;
+ setarray @item_names$, "Tank Top", "Red Tank Top", "Green Tank Top", "Dark Blue Tank Top", "Yellow Tank Top", "Light Blue Tank Top", "Pink Tank Top", "Black Tank Top", "Orange Tank Top", "Purple Tank Top", "Dark Green Tank Top", "Short Tank Top", "Red Short Tank Top", "Green Short Tank Top", "Dark Blue Short Tank Top", "Yellow Short Tank Top", "Light Blue Short Tank Top", "Pink Short Tank Top", "Black Short Tank Top", "Orange Short Tank Top", "Purple Short Tank Top", "Dark Green Short Tank Top", "Miniskirt", "Red Miniskirt", "Green Miniskirt", "Dark Blue Miniskirt", "Yellow Miniskirt", "Light Blue Miniskirt", "Pink Miniskirt", "Black Miniskirt", "Orange Miniskirt", "Purple Miniskirt", "Dark Green Miniskirt", "Cotton Shorts", "Red Cotton Shorts", "Green Cotton Shorts", "Dark Blue Cotton Shorts", "Yellow Cotton Shorts", "Light Blue Cotton Shorts", "Pink Cotton Shorts", "Black Cotton Shorts", "Orange Cotton Shorts", "Purple Cotton Shorts", "Dark Green Cotton Shorts";
+
+ callfunc "DynamicItemMenu";
+ if (@item == 0)
+ goto L_Main_menu;
+
+ @delitem = @item;
+ @genitem = 0;
+ if (@item == 688)
+ @genitem = 1202;
+ if (@item == 689)
+ @genitem = 688;
+ if (@item == 771)
+ @genitem = 632;
+ if (@item == 586)
+ @genitem = 648;
+ if (@item >= 2120 && @item <= 2129)
+ @genitem = @item - 30;
+ if (@item >= 2090 && @item <= 2099)
+ @genitem = @item - 40;
+ if (@item >= 2170 && @item <= 2179)
+ @genitem = @item - 70;
+ if (@item >= 2110 && @item <= 2119)
+ @genitem = @item + 70;
+ if (@genitem == 0)
+ goto L_lengthen_impossible;
+ if (Zeny < 500)
+ goto L_lengthen_noZeny;
+ if (countitem ("CottonCloth") < 1)
+ goto L_lengthen_nocotton;
+ if (countitem(@delitem) < 1)
+ goto L_Main_menu;
+
+ delitem @delitem, 1;
+ delitem "CottonCloth", 1;
+ getitem @genitem, 1;
+ Zeny = Zeny - 500;
+ mes "[Lora Tay the Seamstress]";
+ mes "The seamstress cuts your piece of cotton cloth into stripes and sews them on. Using some odd liquid, she flattens the seams and borders.";
+ if (@delitem > 2000) // dyed
+ mes "She then applies another liquid-- smelling strangely of fermented apples-- to the result, wraps it up, and wrings it tightly. As she unwraps it, you observe to your amazement that the dye has spread to the newly attached area.";
+ mes "\"There you are, dear.\"";
+ next;
+ goto L_Main_menu;
+
+L_lengthen_nocotton:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Who do you think I am? The cotton fairy? Get yourself some cloth before you ask me to sew it on.\"";
+ next;
+ goto L_Main_menu;
+
+L_lengthen_noZeny:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"No gold, no sewing.\"";
+ next;
+ goto L_Main_menu;
+
+L_lengthen_impossible:
+ mes "[Lora Tay the Seamstress]"; // INTERNAL ERROR
+ mes "\"I really can't lengthen that any more.\"";
+ next;
+ goto L_Main_menu;
+
+L_Shirt:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Oh, how silly. You can buy those everywhere. Please don't bore me with such trifles, dear.\"";
+ next;
+ goto L_Main_menu;
+
+L_tanktop:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"A tank top? Well, hardly a challenge, but I suppose I could do that. Please get me some cloth-- plain cotton will do-- and, let's see, how does 100,000 GP for my efforts sound?\"";
+ mes "\"Wait, I keep forgetting, you are just an adventurer... let's make that 1000 GP, then.\"";
+ next;
+ goto L_tanktop_menu;
+
+L_tanktop_menu:
+ menu
+ "I think I would like something else.", L_Main_menu,
+ "A tank top, please (6 Cotton Cloth)", L_tanktop_long,
+ "A short tank top, please (5 Cotton Cloth)", L_tanktop_short,
+ "Goodbye for now.", L_End;
+
+L_tanktop_short:
+ if (countitem ("CottonCloth") < 5)
+ goto L_tanktop_ins_cloth;
+ if (Zeny < 1000)
+ goto L_tanktop_ins_Zeny;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("CottonCloth") > 5)
+ goto L_TooMany;
+ Zeny = Zeny - 1000;
+ delitem "CottonCloth", 5;
+ getitem "ShortTankTop", 1;
+ mes "[Lora Tay the Seamstress]";
+ mes "You watch as Lora sews the pieces of cloth together, then flattens the seams and ends with some odd liquid.";
+ mes "Amazingly, the result looks like a single piece of cloth.";
+ mes "After little more than a few elegant cuts and folds, your tank top is ready.";
+ mes "\"Oh dear, it seems that I am done already. Do you need anything else?\"";
+ next;
+ goto L_tanktop_menu;
+
+L_tanktop_long:
+ if (countitem ("CottonCloth") < 6)
+ goto L_tanktop_ins_cloth;
+ if (Zeny < 1000)
+ goto L_tanktop_ins_Zeny;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("CottonCloth") > 6)
+ goto L_TooMany;
+ Zeny = Zeny - 1000;
+ delitem "CottonCloth", 6;
+ getitem "TankTop", 1;
+ mes "[Lora Tay the Seamstress]";
+ mes "After combining your pieces of cloth into one-- miraculously making the seams and stitches vanish-- the seamstress cuts out all that doesn't belong into a tank top, then folds and stabilises the edges with additional seam lines.";
+ mes "\"There you are. Don't worry, I have trimmed it to match your size perfectly.\"";
+ next;
+ goto L_tanktop_menu;
+
+L_tanktop_ins_cloth:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"No, no, no, count again-- how much Cotton Cloth did I say I needed? That's not enough.\"";
+ next;
+ goto L_tanktop_menu;
+
+L_tanktop_ins_Zeny:
+ mes "[Lora Tay the Seamstress]";
+ mes "As you note that you don't have enough GP on you, Lora rolls her eyes.";
+ mes "\"I don't work for free, you know. I already gave you a discounted peasant price.\"";
+ next;
+ goto L_Main_menu;
+
+L_cape:
+ mes "[Lora Tay the Seamstress]";
+ mes "She shakes her head.";
+ mes "\"No capes. You're an adventurer, right? Do you want to get caught by a closing portcullis? Or strangled when your cape gets tangled in a tree? Or brought down by a mushroom stomping on your cape while you're trying to run away? No capes.\"";
+ next;
+ goto L_Main_menu;
+
+L_robe:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"A robe? Well, as long as you're not asking me to make it out of cotton...\"";
+ next;
+ if (countitem("SilkCocoon")== 0 && countitem("SilkSheet")== 0)
+ goto L_robe_nosilk;
+ goto L_robe_menu;
+
+L_robe_menu:
+ menu
+ "Here, I have some silk cocoons!", L_Next9,
+ "Here, I have some silk sheets!", L_robe_sheets,
+ "Where can I find silk?", L_where_silk,
+ "How much silk do you need?", L_how_much_silk,
+ "Oh, never mind.", L_Main_menu;
+
+L_Next9:
+ mes "[Lora Tay the Seamstress]";
+ mes "The seamstress stares at you as if you had gone out of your mind.";
+ mes "\"And what precisely do you expect me to do with Silk Cocoons? String them together in some baubly chain? Somehow remove the thread and spin and weave it so that some random person can have their robe?\"";
+ next;
+ menu
+ "Will you trade cocoons for sheets?", L_Next10,
+ "Never mind.", L_Main_menu;
+
+L_Next10:
+ mes "[Lora Tay the Seamstress]";
+ mes "Lora frowns.";
+ mes "\"It's not all that easy to get properly processed silk around here. Easier for me than for you, I admit...\"";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "She sighs.";
+ mes "\"All right, very well then. I have enough spare silk sheets right now, but you pay the silk processing for your cocoons.\"";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Let's see... " + @ROBE_COCOONS_NR + " silk cocoons and " + @ROBE_ZENY + " GP should just about cover that.\"";
+ next;
+ menu
+ "I'm not interested.", L_Main_menu,
+ "Very well then, here you are.", L_Next11;
+
+L_Next11:
+ if (countitem("SilkCocoon") < @ROBE_COCOONS_NR)
+ goto L_robe_missing_cocoons;
+ if (Zeny < @ROBE_ZENY)
+ goto L_robe_missing_Zeny;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("SilkCocoon") > @ROBE_COCOONS_NR)
+ goto L_TooMany;
+ Zeny = Zeny - @ROBE_ZENY;
+ delitem "SilkCocoon", @ROBE_COCOONS_NR;
+ mes "[Lora Tay the Seamstress]";
+ mes "The seamstress puts your cocoons and GP away, takes your measurements and pulls out several silk sheets. She asks you to stretch out your arms, then pins the silk sheets in place all over your body.";
+ next;
+ goto L_Get_robe;
+
+L_robe_sheets:
+ @Robe_with_sheets = 1;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Let's see... " + @ROBE_SHEETS_NR + " silk sheets and " + @ROBE_SHEETS_ZENY + " GP should just about cover that.\"";
+ next;
+ menu
+ "I'm not interested.", L_Main_menu,
+ "Very well then, here you are.", L_Next12;
+
+L_Next12:
+ if (countitem("SilkSheet") < @ROBE_SHEETS_NR)
+ goto L_robe_missing_sheets;
+ if (Zeny < @ROBE_SHEETS_ZENY)
+ goto L_r_sh_miss_Zeny;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("SilkSheet") > @ROBE_SHEETS_NR)
+ goto L_TooMany;
+ Zeny = Zeny - @ROBE_SHEETS_ZENY;
+ delitem "SilkSheet", @ROBE_SHEETS_NR;
+ mes "[Lora Tay the Seamstress]";
+ mes "The seamstress puts your GP away, takes your measurements and puts the silk sheets on the table. She asks you to stretch out your arms, then pins the silk sheets in place all over your body.";
+ next;
+ goto L_Get_robe;
+
+L_Get_robe:
+ mes "[Lora Tay the Seamstress]";
+ mes "She proceeds to make a number of mysterious marks on the sheets with a charcoal pen. Meanwhile, your arms are getting tired, but you're afraid to lower them-- she used a lot of pins to put everything into place, and you lost track of where they went...";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Splendid.\"";
+ mes "After removing the sheets (and pins!), she picks up a pair of scissors and plows through the cloth at her usual amazing pace, only stopping briefly to sew together parts here and there.";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "She then treats the seams with some odorless liquid, making them vanish completely. Finally she hands you the finished robe.";
+ getitem "SilkRobe", 1;
+ if (@Robe_with_sheets == 1)
+ goto L_robe_sheet_end;
+ mes "\"Here you are now, this will fit. And don't you dare tell anyone that I did this! I'm not about to start a silk cocoon collection!\"";
+ next;
+ goto L_Main_menu;
+
+L_robe_sheet_end:
+ mes "\"Here you are now, this will fit. Thank you for bringing the sheets. People are so lazy nowadays! \"";
+ next;
+ goto L_Main_menu;
+
+L_robe_missing_cocoons:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"" + @ROBE_COCOONS_NR + " cocoons is what I said, not " + countitem("SilkCocoon") + ".";
+ mes @ROBE_COCOONS_NR + " is " + (@ROBE_COCOONS_NR / 10) + " as many times as you have fingers, in case that helps.\"";
+ next;
+ goto L_Main_menu;
+
+L_robe_missing_Zeny:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"No, no no. The way this works is that you give me the GP first and I give you the robe afterwards. You're " + (@ROBE_ZENY - Zeny) + " GP short, so come back when you can afford the robe!\"";
+ next;
+ goto L_Main_menu;
+
+L_robe_missing_sheets:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"" + @ROBE_SHEETS_NR + " silk sheets is what I said, not " + countitem("SilkSheet") + ".";
+ mes @ROBE_SHEETS_NR + " is " + (10-@ROBE_SHEETS_NR) + " less than you have fingers, in case that helps.\"";
+ next;
+ goto L_Main_menu;
+
+L_r_sh_miss_Zeny:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"No, no no. The way this works is that you give me the GP first and I give you the robe afterwards. You're " + (@ROBE_SHEETS_ZENY - Zeny) + " GP short, so come back when you can afford the robe!\"";
+ next;
+ goto L_Main_menu;
+
+L_where_silk:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Oh, Hetchel on the Tulimshar Marketplace can weave them for you.\"";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "She hesitates.";
+ mes "\"I didn't see her there the last time I visited, though. She may be visiting family. Tough luck.\"";
+ next;
+ goto L_robe_menu;
+
+L_how_much_silk:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Six sheets should do fine, if they're the usual double-elbow squares.\"";
+ next;
+ goto L_robe_menu;
+
+L_robe_nosilk:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"What is that? You don't have any silk? Well, you're out of luck, I would say. I shan't make one out of those cotton rags; you might as well be wearing an apple sack.\"";
+ next;
+ goto L_Main_menu;
+
+L_End:
+ @ROBE_COCOONS_NR = 0;
+ @ROBE_ZENY = 0;
+ @ROBE_SHEETS_NR = 0;
+ @ROBE_SHEETS_ZENY = 0;
+ @Robe_with_sheets = 0;
+ goto L_close;
+
+L_TooMany:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"You don't have anywhere to put this. Come back when you have more room.\"";
+ goto L_close;
+
+L_sr_linecolor:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Hmm, this has a line sewed on it already. I don't see another way than remove it and sew a new one.";
+ mes "That is quite a difficult work... for a casual tailor of course. I'll do that in a heart beat.\"";
+ next;
+ mes "\"However, you can expect this will cost you a large fee. Let's say " + @SORCERER_ROBE_SEW_ZENY + " GP.";
+ mes "Also, I will need " + @SORCERER_ROBE_NUM_COTTON_CLOTH + " sheets of Cotton Cloth of the color you want.\"";
+ next;
+ mes "\"Ok. Now please wear the robe you want me to change.\"";
+ @loratay_asking_robe = 1;
+ goto L_close;
+
+L_ExamineSR:
+ @loratay_asking_robe = 0;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Let's see...\"";
+ next;
+ @chest_equip_id = getequipid(equip_torso);
+ callsub S_Get_SRColors;
+ mes "Lora Tay takes a closer look at what you are wearing.";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Hmm. This " + $@DYE_color_names$[@current_linecolor] + " lined " + $@DYE_color_names$[@current_maincolor] + " sorcerer robe. I see. Is that ok?\"";
+ if (@current_maincolor == -1 || @current_linecolor == -1)
+ goto L_NotSR;
+ menu
+ "Yes, that's fine. Take this one.", L_ChooseSRLineColor,
+ "No, I changed my mind.", L_CleanSR;
+
+L_NotSR:
+ mes "\"This isn't a Sorcerer Robe dear. Stop taking me for a fool.\"";
+ goto L_CleanSR;
+
+L_ChooseSRLineColor:
+ // Unequip the robe, just to simulate Lora Tay really took it
+ unequipbyid(equip_torso);
+ mes "[Lora Tay the Seamstress]";
+ mes "\"And which Cotton Cloth color will you give me?\"";
+ menu
+ "A " + $@DYE_color_names$[0] + " one.", L_ItemMenus2,
+ "A " + $@DYE_color_names$[1] + " one.", L_ItemMenus2,
+ "A " + $@DYE_color_names$[2] + " one.", L_ItemMenus2,
+ "A " + $@DYE_color_names$[3] + " one.", L_ItemMenus2,
+ "A " + $@DYE_color_names$[4] + " one.", L_ItemMenus2,
+ "A " + $@DYE_color_names$[5] + " one.", L_ItemMenus2,
+ "A " + $@DYE_color_names$[6] + " one.", L_ItemMenus2,
+ "A " + $@DYE_color_names$[7] + " one.", L_ItemMenus2,
+ "A " + $@DYE_color_names$[8] + " one.", L_ItemMenus2,
+ "A " + $@DYE_color_names$[9] + " one.", L_ItemMenus2,
+ "A White one.", L_ItemMenus2,
+ "Hum. I changed my mind. Later maybe.", L_End;
+
+L_ItemMenus2:
+ @chosen_color = @menu - 1;
+ @cotton_cloth_id = 2250 + @chosen_color;
+ // The White Cotton Cloth is in fact the undyed one.
+ if (@cotton_cloth_id == 2260)
+ @cotton_cloth_id = 660;
+ if (countitem(@cotton_cloth_id) < 2)
+ goto L_NoColoredCottonCloth;
+ if (@current_linecolor == @chosen_color)
+ goto L_SR_SameColor;
+ callsub S_Get_NewSRId;
+ // Should not happen since it has been checked the player submitted a sorcerer robe
+ if (@new_sr_id == 0)
+ goto L_End;
+
+ if (Zeny < @SORCERER_ROBE_SEW_ZENY)
+ goto L_SR_NoZeny;
+ if (countitem(@chest_equip_id) == 0)
+ goto L_SR_Vanished;
+ delitem @cotton_cloth_id, @SORCERER_ROBE_NUM_COTTON_CLOTH;
+ // Since we delete an unstackable item, we don't need to check
+ // for an available inventory slot.
+ delitem @chest_equip_id, 1;
+ Zeny = Zeny - @SORCERER_ROBE_SEW_ZENY;
+ getitem @new_sr_id, 1;
+ mes "Lora Tay adjusts her glasses and removes carefully the " + $@DYE_color_names$[@current_linecolor] + " string of the robe.";
+ mes "Then she grabs the " + $@DYE_color_names$[@chosen_color] + " cotton cloth, unfolds it and pins her needle in it.";
+ next;
+ mes "She begins to sew the new string onto the sorcerer robe.";
+ next;
+ mes "She regularly flips and flips again the robe, which starts to show her new color.";
+ next;
+ mes "After a few minutes you barely noticed, the robe seems to be ready.";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"There you are dear. I have to say I made a perfect job... As always.";
+ mes "I hope you'll enjoy your new robe.\"";
+ goto L_CleanSR;
+
+L_SR_SameColor:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Are you blind? Your robe is already of this color dear!\"";
+ goto L_CleanSR;
+
+L_SR_Vanished:
+ mes "Lora Tay adjusts her glasses and looks around, as if something was missing.";
+ next;
+ mes "[Lora Tay the Seamstress]";
+ mes "\"Uh? Where is your sorcerer robe?\"";
+ goto L_CleanSR;
+
+S_Get_NewSRId:
+ if (@chosen_color == 0 && @current_maincolor == 10)
+ @new_sr_id = 798;
+ if (@chosen_color == 0 && @current_maincolor < 10)
+ @new_sr_id = 2220 + @current_maincolor;
+ if (@chosen_color > 0)
+ @new_sr_id = 5000 + @current_maincolor + (@chosen_color-1)*11;
+ return;
+
+L_NoColoredCottonCloth:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"You don't seem to own enough Cotton Cloth of this color. I need " + @SORCERER_ROBE_NUM_COTTON_CLOTH + " of them. Too bad.\"";
+ goto L_CleanSR;
+
+L_SR_NoZeny:
+ mes "[Lora Tay the Seamstress]";
+ mes "\"You don't seem to be able to afford my services, dear.\"";
+ goto L_CleanSR;
+
+S_Get_SRColors:
+ @current_maincolor = -1;
+ @current_linecolor = -1;
+ // Line color
+ if (@chest_equip_id == 798 || (@chest_equip_id >= 2220 && @chest_equip_id <= 2229))
+ @current_linecolor = 0;
+ if (@chest_equip_id >= 5000 && @chest_equip_id <= 5109)
+ @current_linecolor = 1 + (@chest_equip_id-5000)/11;
+ // Main color
+ if (@chest_equip_id == 798)
+ @current_maincolor = 10;
+ if (@chest_equip_id >= 2220 && @chest_equip_id <= 2229)
+ @current_maincolor = @chest_equip_id - (@chest_equip_id/10)*10;
+ if (@chest_equip_id >= 5000 && @chest_equip_id <= 5109)
+ @current_maincolor = @chest_equip_id - 5000 - (@current_linecolor-1)*11;
+ return;
+
+L_CleanSR:
+ @current_maincolor = 0;
+ @current_linecolor = 0;
+ @chest_equip_id = 0;
+ @new_sr_id = 0;
+ @chosen_color = 0;
+ @cotton_cloth_id = 0;
+ goto L_close;
+
+L_close:
+ @wg_state = 0;
+ close;
+}
diff --git a/npc/010-2/mapflags.txt b/npc/010-2/mapflags.txt
new file mode 100644
index 00000000..b6c9c958
--- /dev/null
+++ b/npc/010-2/mapflags.txt
@@ -0,0 +1 @@
+//010-2 mapflag resave 010-1,27,97
diff --git a/npc/010-2/workers.txt b/npc/010-2/workers.txt
new file mode 100644
index 00000000..912cd8a6
--- /dev/null
+++ b/npc/010-2/workers.txt
@@ -0,0 +1,15 @@
+
+010-2,23,70,0 script Josh NPC155,{
+ mes "[Josh]";
+ mes "\"We're working on getting the cellar pass open.\"";
+ close;
+}
+
+010-2,39,75,0 script Zack NPC155,{
+ @halloween_npc_id = $@halloween_npc_zack;
+ callfunc "TrickOrTreat";
+
+ mes "[Zack]";
+ mes "\"My brother and I are fixing the cellar pass.\"";
+ close;
+}
diff --git a/npc/011-1/_import.txt b/npc/011-1/_import.txt
new file mode 100644
index 00000000..c24607c5
--- /dev/null
+++ b/npc/011-1/_import.txt
@@ -0,0 +1,9 @@
+// Map 011-1: Woodland
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/011-1/_mobs.txt",
+"npc/011-1/_warps.txt",
+"npc/011-1/alchemist.txt",
+"npc/011-1/auldsbel.txt",
+"npc/011-1/mapflags.txt",
+"npc/011-1/oscar.txt",
+"npc/011-1/shops.txt",
diff --git a/npc/011-1/_mobs.txt b/npc/011-1/_mobs.txt
new file mode 100644
index 00000000..0ac6cebe
--- /dev/null
+++ b/npc/011-1/_mobs.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 011-1: Woodland mobs
+011-1,0,0,0,0 monster Evil Mushroom 1013,30,0,0
+011-1,0,0,0,0 monster Pink Flower 1014,20,0,0
+011-1,0,0,0,0 monster Spiky Mushroom 1019,5,0,0
+011-1,0,0,0,0 monster Snail 1041,1,0,0
+011-1,0,0,0,0 monster Mouboo 1028,5,0,10
+011-1,0,0,0,0 monster Mauve Plant 1029,3,270000,180000
+011-1,0,0,0,0 monster Alizarin Plant 1032,1,2700000,1800000
+011-1,0,0,0,0 monster Silkworm 1035,2,60000,30000
+011-1,0,0,0,0 monster Clover Patch 1037,2,0,1000
+011-1,0,0,0,0 monster Squirrel 1038,25,30,20
+011-1,0,0,0,0 monster Butterfly 1055,10,30,20
+011-1,0,0,0,0 monster Mouboo 1028,5,0,10
+011-1,1,1,0,0 monster Mana Bug 1131,18,30,0
+011-1,92,44,17,14 monster Maggot 1002,10,30,0
diff --git a/npc/011-1/_warps.txt b/npc/011-1/_warps.txt
new file mode 100644
index 00000000..f4752f4c
--- /dev/null
+++ b/npc/011-1/_warps.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 011-1: Woodland warps
+011-1,58,92,0 warp #011-1_58_92 0,0,011-3,31,45
+011-1,30,61,0 warp #011-1_30_61 0,2,014-1,108,91
+011-1,49,104,0 warp #011-1_49_104 1,0,010-1,48,25
+011-1,124,62,0 warp #011-1_124_62 0,3,008-1,25,61
+011-1,73,14,0 warp #011-1_73_14 1,0,012-1,132,173
+011-1,38,36,0 warp #011-1_38_36 0,0,011-6,49,100
diff --git a/npc/011-1/alchemist.txt b/npc/011-1/alchemist.txt
new file mode 100644
index 00000000..5f915236
--- /dev/null
+++ b/npc/011-1/alchemist.txt
@@ -0,0 +1,1033 @@
+011-1,117,77,0 script Rauk NPC103,{
+ // Setzer quest/monster oil quest participation
+ @SETZER_INITIAL = 0;
+ @SETZER_KNOWS_OIL = 1;
+ @SETZER_KNOWS_STINGER = 2;
+
+ @Q_MASK = NIBBLE_3_MASK;
+ @Q_SHIFT = NIBBLE_3_SHIFT;
+
+ @wants_sulphur = (QUEST_MAGIC & (NIBBLE_6_MASK | NIBBLE_7_MASK));
+ @wants_ironpowder = (((QUEST_MAGIC & (NIBBLE_6_MASK | NIBBLE_7_MASK)) >> NIBBLE_6_SHIFT) >= 7);
+ @Q_status = (QUEST_Forestbow_state & @Q_MASK) >> @Q_SHIFT;
+ // End of Setzer quest/monster oil quest participation
+
+ @QUEST_CAN_GET_DYE_HERE = 2;
+ @QUEST_HAS_SOLVED_DYE_PUZZLE = 3;
+ @QUEST_GUESS_BASE = 4;
+
+ @CHOICE_IRON = 0;
+ @CHOICE_CONCENTRATION = 1;
+ @CHOICE_DYEING_INTRO = 2;
+ @CHOICE_DYE = 3;
+ @CHOICE_MONSTER_OIL = 4;
+ @CHOICE_MANA_POTION = 5;
+ @CHOICE_SULPHUR_POWDER = 6;
+ @CHOICE_IRON_POWDER = 7;
+ @CHOICE_ABORT = 8;
+
+ setarray @menuitems$, "", "", "", "", "", "", "", "";
+ @c = 0;
+
+ @menuitems$[@c] = "Iron potion.";
+ @menuid[@c] = @CHOICE_IRON;
+ @c = @c + 1;
+
+ @menuitems$[@c] = "Concentration potion.";
+ @menuid[@c] = @CHOICE_CONCENTRATION;
+ @c = @c + 1;
+
+ if (!(MAGIC_FLAGS & MFLAG_KNOWS_MANAPOTION))
+ goto L_post_mana_potion_c;
+ @menuitems$[@c] = "Mana potion.";
+ @menuid[@c] = @CHOICE_MANA_POTION;
+ @c = @c + 1;
+ goto L_post_mana_potion_c;
+
+L_post_mana_potion_c:
+ if (QUEST_clothdyer_knowsdye >= @QUEST_CAN_GET_DYE_HERE)
+ goto L_skip_introducing;
+
+ mes "[Rauk the Alchemist]";
+ mes "\"I'm learning the ancient science of the alchemy.";
+ mes "I already know how to create a couple of potions!!\"";
+ mes "\"Do you want me to create one for you?\"";
+ next;
+ if (QUEST_clothdyer_knowsdye == 1)
+ goto L_pre_dyeing;
+ goto L_certain_condition;
+
+L_skip_introducing:
+ mes "[Rauk the Alchemist]";
+ mes "\"Hello, welcome back! Are you interested in dyes again, or in one of my potions?\"";
+ next;
+ @menuitems$[@c] = "Dye, please.";
+ @menuid[@c] = @CHOICE_DYE;
+ @c = @c + 1;
+ goto L_certain_condition;
+
+L_pre_dyeing:
+ @menuitems$[@c] = "Actually, can you make dye?";
+ @menuid[@c] = @CHOICE_DYEING_INTRO;
+ @c = @c + 1;
+ goto L_certain_condition;
+
+L_certain_condition:
+ if (!@wants_sulphur)
+ goto L_post_sulphur_option;
+ @menuitems$[@c] = "Can you make sulphur powder?";
+ @menuid[@c] = @CHOICE_SULPHUR_POWDER;
+ @c = @c + 1;
+ goto L_post_sulphur_option;
+
+L_post_sulphur_option:
+ if (!@wants_ironpowder)
+ goto L_post_ironpwd_option;
+ @menuitems$[@c] = "Can you make iron powder?";
+ @menuid[@c] = @CHOICE_IRON_POWDER;
+ @c = @c + 1;
+ goto L_post_ironpwd_option;
+
+L_post_ironpwd_option:
+ if (@Q_status == @SETZER_INITIAL)
+ goto L_post_monster_oil;
+ @menuitems$[@c] = "Can you make monster oil?";
+ @menuid[@c] = @CHOICE_MONSTER_OIL;
+ @c = @c + 1;
+ goto L_post_monster_oil;
+
+L_post_monster_oil:
+ @menuitems$[@c] = "No thanks.";
+ @menuid[@c] = @CHOICE_ABORT;
+ @c = @c + 1;
+ goto L_Main_menu;
+
+L_Main_menu:
+
+ menu
+ @menuitems$[0], L_MenuItems,
+ @menuitems$[1], L_MenuItems,
+ @menuitems$[2], L_MenuItems,
+ @menuitems$[3], L_MenuItems,
+ @menuitems$[4], L_MenuItems,
+ @menuitems$[5], L_MenuItems,
+ @menuitems$[6], L_MenuItems,
+ @menuitems$[7], L_MenuItems;
+
+L_MenuItems:
+ @menu = @menu - 1;
+
+ if (@menu >= @c)
+ goto L_Abort;
+ if (@menuid[@menu] == @CHOICE_IRON)
+ goto L_Iron;
+ if (@menuid[@menu] == @CHOICE_CONCENTRATION)
+ goto L_concentration;
+ if (@menuid[@menu] == @CHOICE_DYEING_INTRO)
+ goto L_dyeing_intro;
+ if (@menuid[@menu] == @CHOICE_DYE)
+ goto L_pick_colour;
+ if (@menuid[@menu] == @CHOICE_MONSTER_OIL)
+ goto L_monster_oil;
+ if (@menuid[@menu] == @CHOICE_MANA_POTION)
+ goto L_mana_potion;
+ if (@menuid[@menu] == @CHOICE_SULPHUR_POWDER)
+ goto L_Sulphur;
+ if (@menuid[@menu] == @CHOICE_IRON_POWDER)
+ goto L_Iron_powder;
+ if (@menuid[@menu] == @CHOICE_ABORT)
+ goto L_Abort;
+ goto L_Abort;
+
+L_Iron_powder:
+ mes "[Rauk the Alchemist]";
+ mes "\"Iron powder? Hmm, I can extract some iron powder out of a chunk of iron ore, but that will require me to dissolve it. If you give me a chunk of iron ore and 100 GP for the acid, I can do it.\"";
+ next;
+ menu
+ "Never mind.", L_Abort,
+ "Here you are!", L_Next;
+
+L_Next:
+ if (countitem("IronOre") < 1)
+ goto L_Iron_powder_noore;
+ if (Zeny < 100)
+ goto L_Iron_powder_noZeny;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("IronOre") > 1
+ && countitem("IronPowder") < 1)
+ goto L_Iron_powder_full;
+ delitem "IronOre", 1;
+ Zeny = Zeny - 100;
+ getitem "IronPowder", 4;
+ mes "[Rauk the Alchemist]";
+ mes "Rauk places your chunk of ore in a strange glass container, then pours a steaming yellow liquid over it. Before your eyes, the ore dissolves.";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "Rauk pours another liquid over the resultant mixture, then pours the result through a piece of cloth placed in a funnel, followed by a cup of water. He removes the residual metal powder from the cloth and hands it to you.";
+ mes "\"This is about as fine as I can make it without mechanical help.\"";
+ close;
+
+L_Iron_powder_noore:
+ mes "[Rauk the Alchemist]";
+ mes "\"I do need a chunk of iron ore. Please return when you have one.\"";
+ close;
+
+L_Iron_powder_noZeny:
+ mes "[Rauk the Alchemist]";
+ mes "\"I'm sorry, but I must ask that you pay 100 GP – the acid I use is not cheap.\"";
+ close;
+
+L_Iron_powder_full:
+ mes "[Rauk the Alchemist]";
+ mes "\"I don't think that you have room to carry this. Please come back later.\"";
+ close;
+
+L_Sulphur:
+ mes "[Rauk the Alchemist]";
+ mes "\"Oh, that is easy. Bring me three piles of volcanic ash and three mauve leaves, and I will extract forty eight piles of sulphur ash for you.\"";
+ next;
+ menu
+ "I will be back.", L_Abort,
+ "No, I won't!", L_Abort,
+ "Here you are!", L_Next1;
+
+L_Next1:
+ if (countitem("PileOfAsh") < 3)
+ goto L_Sulphur_noash;
+ if (countitem("MauveHerb") < 3)
+ goto L_Sulphur_nomauve;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("SulphurPowder") == 0
+ && countitem("PileOfAsh") > 3
+ && countitem("MauveHerb") > 3)
+ goto L_Sulphur_nospace;
+
+ delitem "PileOfAsh", 3;
+ delitem "MauveHerb", 3;
+ getitem "SulphurPowder", 48;
+ mes "[Rauk the Alchemist]";
+ mes "You watch Rauk burn the mauve leaves in the midst of the ashes. He then dissolves the result and pours it through a filter, finally heating up the residual liquid.";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "The water having evaporated, only some yellow powder is left over. Rauk carefully pours it into your hand.";
+ mes "\"This should be precisely twelve half-ounces of sulphur powder.\"";
+ close;
+
+L_Sulphur_noash:
+ mes "[Rauk the Alchemist]";
+ mes "\"You don't seem to have all three piles of volcanic ash.\"";
+ close;
+
+L_Sulphur_nomauve:
+ mes "[Rauk the Alchemist]";
+ mes "\"You don't seem to have the three mauve leaves I asked for.\"";
+ close;
+
+L_Sulphur_nospace:
+ mes "[Rauk the Alchemist]";
+ mes "\"Oh dear. You don't seem to be able to carry the sulphur powder.\"";
+ close;
+
+L_mana_potion:
+ mes "[Rauk the Alchemist]";
+ mes "\"Humh... I do believe that I have a recipe somewhere. One moment...\"";
+ mes "Rauk pulls a small book out of his sleeve and leafs through it.";
+ mes "\"Aha, here we are. Hmm, I'm not convinced that this is the best possible recipe...\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"I shall need one pearl, one bottle of water, thirty mauve leaves, twenty gamboge leaves, and five piles of volcanic ash.\"";
+ next;
+ menu
+ "Here you are!", L_Get_mana_potion,
+ "Never mind.", L_Main_menu;
+
+L_Get_mana_potion:
+ if(countitem("MauveHerb") < 30)
+ goto L_mana_potion_lacking;
+ if(countitem("GambogeHerb") < 20)
+ goto L_mana_potion_lacking;
+ if(countitem("PileOfAsh") < 5)
+ goto L_mana_potion_lacking;
+ if(countitem("Pearl") < 1)
+ goto L_mana_potion_lacking;
+ if(countitem("BottleOfWater") < 1)
+ goto L_mana_potion_lacking;
+ getinventorylist;
+ if ((@inventorylist_count == 100)
+ && (countitem("MauveHerb") > 30)
+ && (countitem("PileOfAsh") > 5)
+ && (countitem("Pearl") > 1)
+ && (countitem("BottleOfWater") > 1)
+ && (countitem("ManaPotion") < 1))
+ goto L_mana_potion_toomuch;
+ delitem "MauveHerb", 30;
+ delitem "GambogeHerb", 20;
+ delitem "PileOfAsh", 5;
+ delitem "Pearl", 1;
+ delitem "BottleOfWater", 1;
+ getitem "ManaPotion", 1;
+ mes "[Rauk the Alchemist]";
+ mes "Rauk grinds the leaves, then crushes the pearl. Taking out a small charcoal oven, he heats up your water bottle and dissolves first the pearl powder, then the ashes.";
+ mes "The brew begins to bubble violently.";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "Taking the bottle with a pair of tongs, he pours the liquid through a fine sieve, discarding the liquid.";
+ mes "He then mixes the residual paste with the leaves, stirs in a little water from the pond and fills the result into a separate bottle.";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"Here you are. I hope that this is what you wanted.\"";
+ next;
+ goto L_Main_menu;
+
+L_mana_potion_toomuch:
+ mes "[Rauk the Alchemist]";
+ mes "\"You look quite burdened already. Why don't you drop off a few things first, and come back later?\"";
+ next;
+ goto L_Main_menu;
+
+L_mana_potion_lacking:
+ mes "[Rauk the Alchemist]";
+ mes "\"Sorry, but I need one Pearl, one Bottle of Water, 30 Mauve Leaves, 20 Gamboge Leaves, and five Piles of Ash.\"";
+ next;
+ goto L_Main_menu;
+
+L_Iron:
+ @COST_PER_IRON_POTION = 2;
+
+ mes "\" To make them, I'm going to need " + @COST_PER_IRON_POTION + " Small Mushrooms per Iron Potion. How many Iron Potions would you like?\"";
+ input @count;
+
+ if (@count == 0)
+ close;
+ @empty = countitem("SmallMushroom");
+
+ if (@empty < @count * @COST_PER_IRON_POTION)
+ goto L_No_iron;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("SmallMushroom") == 0 && @empty > @count)
+ goto L_TooMany;
+
+ delitem "SmallMushroom", @COST_PER_IRON_POTION * @count;
+ getitem "IronPotion", @count;
+ close;
+
+L_concentration:
+ @COST_PER_CONCENTRATION_POTION = 2;
+
+ mes "\" To make them, I'm going to need " + @COST_PER_CONCENTRATION_POTION + " Pink Petals per Concentration Potion. How many Concentration Potions would you like?\"";
+ input @count;
+
+ if (@count == 0)
+ close;
+ @empty = countitem("PinkPetal");
+
+ if (@empty < @count * @COST_PER_CONCENTRATION_POTION)
+ goto L_No_concentration;
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("PinkPetal") == 0 && @empty > @count)
+ goto L_TooMany;
+
+ delitem "PinkPetal", @COST_PER_CONCENTRATION_POTION * @count;
+ getitem "ConcentrationPotion", @count;
+ close;
+
+L_No_iron:
+ mes "\"You have to bring me 2 Small Mushrooms for each Iron Potion.\"";
+ close;
+
+L_No_concentration:
+ mes "\"You have to bring me 2 Pink Petals for each Concentration Potion.\"";
+ close;
+
+L_dyeing_intro:
+ mes "[Rauk the Alchemist]";
+ mes "Rauk pauses for a moment.";
+ mes "\"Hmm, I'm not very good at that... I can only make simple dyes, the ones that you can use for cotton and wool.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"For the truly powerful ones that you can use to dye a person or an entire lake with, I would need a powerful catalyst, like an Obsidian Spork or a Wumpus Egg...\"";
+ mes "Rauk seems to be lost in his thoughts.";
+ next;
+ menu
+ "I only want to dye clothes, though...", L_Next2,
+ "What's a 'Wumpus egg'?", L_wumpus_egg_intro,
+ "What's an 'Obsidian Spork'?", L_ObsidianSporkIntro,
+ "Er, never mind...", L_Abort;
+
+L_Next2:
+ mes "[Rauk the Alchemist]";
+ mes "\"Oh, just for clothes? Well, that is easy. I can make red, yellow, light blue, orange, pink, green, dark blue, black and purple dye, if you can get me the ingredients for it.\"";
+ next;
+ QUEST_clothdyer_knowsdye = 2;
+ goto L_pick_colour;
+
+L_wumpus_egg_intro:
+ mes "[Rauk the Alchemist]";
+ mes "Rauk's eyes brighten up.";
+ mes "\"Ah, a wumpus egg is one of the most powerful catalysts out there, useful for transmutation and transchromation! Unfortunately the Common Wumpus is almost completely extinct these days, so they are hard to find.";
+ mes "Should you find one, please let me know – I will pay well for one!\"";
+ close;
+
+L_ObsidianSporkIntro:
+ mes "[Rauk the Alchemist]";
+ mes "Rauk scratches his head.";
+ mes "\"Hm, obsidian is a dark, glass-like material that you can normally find near volcanos. Shaping it isn't too hard, but shaping it without it losing its magical properties is almost impossible.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"Obsidian sporks are therefore hard to make, but they are said to be very useful in certain kinds of alchemy.";
+ mes "Should you find one, please let me know!\"";
+ close;
+
+L_pick_colour:
+ menu
+ "What are the ingredients you need?", L_description,
+ "Red", L_Red,
+ "Yellow", L_Yellow,
+ "Light blue", L_light_blue,
+ "Green", L_Green,
+ "Orange", L_Orange,
+ "Pink", L_Pink,
+ "Dark blue", L_dark_blue,
+ "Black", L_black,
+ "Purple", L_Purple,
+ "Dark Green", L_dark_green,
+ "Nothing, really.", L_Abort;
+
+L_description:
+ mes "[Rauk the Alchemist]";
+ mes "\"The kinds of dyes I know are made from herbs – alizarin for red, gamboge for yellow, cobalt for blue, and mauve as binding agent for dark colors.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"Some of the colors need more ingredients, including some that you can't find here, so I have to charge money for them.";
+ mes "Oh, and for a proper dark blue and purple I also need a pearl; without pearl dust they would not shimmer properly.\"";
+ next;
+ goto L_description_quick;
+
+L_description_quick:
+ menu
+ "What do you need for red dye?", L_d_red,
+ "What do you need for yellow dye?", L_d_yellow,
+ "What do you need for light blue dye?", L_d_light_blue,
+ "What do you need for green dye?", L_d_green,
+ "What do you need for orange dye?", L_d_orange,
+ "What do you need for pink dye?", L_d_pink,
+ "What do you need for dark blue dye?", L_d_dark_blue,
+ "What do you need for black dye?", L_d_black,
+ "What do you need for purple dye?", L_d_purple,
+ "What do you need for dark green dye?", L_d_dark_green,
+ "Actually...", L_NextMenu;
+
+L_NextMenu:
+ menu
+ "Can you make some dye for me, please?", L_pick_colour,
+ "Where can I get the herbs?", L_d_herbs,
+ "Where can I find pink petals?", L_d_pink_petals,
+ "Where can I find iron ore?", L_d_ore,
+ "Where can I find a pearl?", L_d_pearl,
+ "Where can I find maggot slime?", L_d_maggot_slime,
+ "I see. Thank you, and a good day to you!", L_Abort;
+
+L_d_herbs:
+ mes "[Rauk the Alchemist]";
+ mes "\"Alizarin, mauve, cobalt and gamboge bushes grow in this general area. I haven't seen them nearby, but take a look around; I am sure you will find some.\"";
+ next;
+ goto L_description_quick;
+
+L_d_pink_petals:
+ mes "[Rauk the Alchemist]";
+ mes "\"Just take some from the pink flowers around here. But be careful, they seem to be a bit fond of them.\"";
+ next;
+ goto L_description_quick;
+
+L_d_ore:
+ mes "[Rauk the Alchemist]";
+ mes "\"Iron ore you should be able to find in some mine, I think. That's where people usually get it from, I have been told.\"";
+ next;
+ goto L_description_quick;
+
+L_d_pearl:
+ mes "[Rauk the Alchemist]";
+ mes "\"A pearl... hm, that might be tricky. You normally find them in clams, but I haven't seen many of those here in the woodlands.\"";
+ next;
+ goto L_description_quick;
+
+L_d_maggot_slime:
+ mes "[Rauk the Alchemist]";
+ mes "\"As the name might have given away already, maggot slime is most easily obtained from maggots. Still, there are some other creatures – such as bats – that secrete a similar kind of slime that for alchemistic purposes is equivalent.\"";
+ next;
+ goto L_description_quick;
+
+L_intermediate:
+ menu
+ "Can you make some dye for me?", L_pick_colour,
+ "Can you describe the ingredients?", L_description_quick,
+ "Never mind.", L_Abort;
+
+L_Ok3:
+ mes "[Rauk the Alchemist]";
+ mes "\"Here is your dye. Remember to use all of it at once or the color may bleach out.\"";
+ next;
+ goto L_pick_colour;
+
+L_Red:
+ if (countitem("AlizarinHerb") < 10)
+ goto L_Red_fail;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("AlizarinHerb") > 10)
+ goto L_TooMany;
+ delitem "AlizarinHerb", 10;
+ getitem "RedDye", 1;
+ goto L_Ok3;
+
+L_Red_fail:
+ mes "[Rauk the Alchemist]";
+ mes "\"Hmm, sorry, but I do need ten alizarin leaves to make red dye.\"";
+ next;
+ goto L_intermediate;
+
+L_d_red:
+ mes "[Rauk the Alchemist]";
+ mes "\"Red dye is fairly simple to make. Bring me ten leaves of alizarin, and I can brew it for you right away.\"";
+ next;
+ goto L_intermediate;
+
+L_Yellow:
+ if (countitem("GambogeHerb") < 10)
+ goto L_Yellow_fail;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("GambogeHerb") > 10)
+ goto L_TooMany;
+ delitem "GambogeHerb", 10;
+ getitem "YellowDye", 1;
+ goto L_Ok3;
+
+L_Yellow_fail:
+ mes "[Rauk the Alchemist]";
+ mes "\"Without enough gamboge leaves – I would need at least ten--, I can't make yellow dye for you.\"";
+ next;
+ goto L_intermediate;
+
+L_d_yellow:
+ mes "[Rauk the Alchemist]";
+ mes "\"Yellow dye is no more than gamboge extract. If you get me ten gamboge leaves, I can make it easily.\"";
+ next;
+ goto L_intermediate;
+
+L_light_blue:
+ if (countitem("CobaltHerb") < 10)
+ goto L_light_blue_fail;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("CobaltHerb") > 10)
+ goto L_TooMany;
+ delitem "CobaltHerb", 10;
+ getitem "LightBlueDye", 1;
+ goto L_Ok3;
+
+L_light_blue_fail:
+ mes "[Rauk the Alchemist]";
+ mes "\"Sorry, but I won't give it to you for less than ten cobalt leaves.\"";
+ next;
+ goto L_intermediate;
+
+L_d_light_blue:
+ mes "[Rauk the Alchemist]";
+ mes "\"Light blue dye is what you get if you let cobalt leaves sit in alcohol over night. I have some here and will trade it for ten fresh cobalt leaves.\"";
+ next;
+ goto L_intermediate;
+
+L_Green:
+ if (countitem("CobaltHerb") < 20)
+ goto L_Green_fail;
+ if (countitem("GambogeHerb") < 20)
+ goto L_Green_fail;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("CobaltHerb") > 20
+ && countitem("GambogeHerb") > 20)
+ goto L_TooMany;
+ if (Zeny < 1000)
+ goto L_Green_fail;
+ delitem "CobaltHerb", 20;
+ delitem "GambogeHerb", 20;
+ Zeny = Zeny - 1000;
+ getitem "GreenDye", 1;
+ goto L_Ok3;
+
+L_Green_fail:
+ mes "[Rauk the Alchemist]";
+ mes "\"No... I need enough gamboge and cobalt to make your dye.\"";
+ mes "\"Twenty gamboge leaves, twenty cobalt leaves, and 1000 GP should be sufficient.\"";
+ next;
+ goto L_intermediate;
+
+L_d_green:
+ mes "[Rauk the Alchemist]";
+ mes "\"Green dye is a little tricky to make, since you have to boil gamboge leaves at just the right temperature while stirring in a cobalt ester.";
+ mes "Making the cobalt ester is not easy, and every time I try I end up melting a crystal flask beyond repair...\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"Thus, I will need twenty gamboge leaves, twenty cobalt leaves, and 1000 GP for materials.";
+ next;
+ goto L_intermediate;
+
+L_d_no_green:
+ mes "[Rauk the Alchemist]";
+ mes "\"Come back when you are a little more experienced. I might be able to tell you how to make green dye then.\"";
+ close;
+
+L_Orange:
+ if (countitem("AlizarinHerb") < 10)
+ goto L_Orange_fail;
+ if (countitem("GambogeHerb") < 10)
+ goto L_Orange_fail;
+ if (countitem("IronOre") < 2) goto L_Orange_fail;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("AlizarinHerb") > 10
+ && countitem("GambogeHerb") > 10
+ && countitem("IronOre") > 2)
+ goto L_TooMany;
+ if (Zeny < 1000)
+ goto L_Orange_fail;
+ delitem "AlizarinHerb", 10;
+ delitem "GambogeHerb", 10;
+ delitem "IronOre", 2;
+ Zeny = Zeny - 1000;
+ getitem "OrangeDye", 1;
+ goto L_Ok3;
+
+L_Orange_fail:
+ mes "[Rauk the Alchemist]";
+ mes "\"I'm sorry, but I need 1000 GP, two chunks of iron ore, and ten each of gamboge and alizarin leaves.\"";
+ next;
+ goto L_intermediate;
+
+L_d_orange:
+ mes "[Rauk the Alchemist]";
+ mes "\"Orange dye is fun to make, but it requires some burnt iron, and also consummate sulphur powder, which you cannot get here easily.";
+ mes "\"Still, for 1000 GP, two pieces of iron ore, ten alizarin leaves and ten gamboge leaves, I can make you a vial of orange dye.\"";
+ next;
+ goto L_intermediate;
+
+L_Pink:
+ if (countitem("AlizarinHerb") < 10)
+ goto L_Pink_fail;
+ if (countitem("PinkPetal") < 6)
+ goto L_Pink_fail;
+ if (Zeny < 1000)
+ goto L_Pink_fail;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("AlizarinHerb") > 10
+ && countitem("PinkPetal") > 6)
+ goto L_TooMany;
+ delitem "AlizarinHerb", 10;
+ delitem "PinkPetal", 6;
+ Zeny = Zeny - 1000;
+ getitem "PinkDye", 1;
+ goto L_Ok3;
+
+L_Pink_fail:
+ mes "[Rauk the Alchemist]";
+ mes "\"No, you don't have all I need, and that would be ten alizarin leaves, six pink flower petals, and 1000 GP.\"";
+ next;
+ goto L_intermediate;
+
+L_d_pink:
+ mes "[Rauk the Alchemist]";
+ mes "\"Pink dye... that's a funny one: you can't get proper pink out of the usual herbs. You do need ten leaves of alizarin, but you also need six pink flower petals.";
+ mes "To properly extract the pink from the petals, you have to boil it in concentrated utenum; I will have to charge 1000 GP for that.\"";
+ next;
+ goto L_intermediate;
+
+L_dark_blue:
+ if (countitem("CobaltHerb") < 100)
+ goto L_dark_blue_fail;
+ if (countitem("MauveHerb") < 50)
+ goto L_dark_blue_fail;
+ if (countitem("Pearl") < 1)
+ goto L_dark_blue_fail;
+ if (Zeny < 10000)
+ goto L_dark_blue_fail;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("CobaltHerb") > 100
+ && countitem("MauveHerb") > 50
+ && countitem("Pearl") > 1)
+ goto L_TooMany;
+ delitem "CobaltHerb", 100;
+ delitem "MauveHerb", 50;
+ delitem "Pearl", 1;
+ Zeny = Zeny - 10000;
+ getitem "DarkBlueDye", 1;
+ goto L_Ok3;
+
+L_dark_blue_fail:
+ mes "[Rauk the Alchemist]";
+ mes "\"I will need all of the ingredients to make dark blue dye for you.\"";
+ mes "\"I need 100 cobalt leaves, 50 mauve leaves, one pearl, and 10,000 GP.\"";
+ next;
+ goto L_intermediate;
+
+L_d_dark_blue:
+ mes "[Rauk the Alchemist]";
+ mes "\"Dark blue dye is one of the trickiest ones. You need concentrated extract from 100 leaves of cobalt and 50 mauve leaves for proper binding.";
+ mes "For the right shimmer, a pearl is indispensible, and the most expensive part is a rare kind of ayanamian sapphire dust that I have to charge 10,000 GP for.\"";
+ next;
+ goto L_intermediate;
+
+L_Purple:
+ if (countitem("CobaltHerb") < 100)
+ goto L_Purple_fail;
+ if (countitem("AlizarinHerb") < 100)
+ goto L_Purple_fail;
+ if (countitem("MauveHerb") < 20)
+ goto L_Purple_fail;
+ if (countitem("Pearl") < 1)
+ goto L_Purple_fail;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("CobaltHerb") > 100
+ && countitem("AlizarinHerb") > 100
+ && countitem("MauveHerb") > 20
+ && countitem("Pearl") > 1)
+ goto L_TooMany;
+ if (Zeny < 40000)
+ goto L_Purple_fail;
+ delitem "CobaltHerb", 100;
+ delitem "AlizarinHerb", 100;
+ delitem "MauveHerb", 20;
+ delitem "Pearl", 1;
+ Zeny = Zeny - 40000;
+ getitem "PurpleDye", 1;
+ goto L_Ok3;
+
+L_Purple_fail:
+ mes "[Rauk the Alchemist]";
+ mes "\"No... I don't think that you have enough ingredients for this. Let me check my notes.\"";
+ mes "\"What I need are 100 cobalt leaves, 100 alizarin leaves, 20 mauve leaves, one pearl, and 40,000 GP.\"";
+ next;
+ goto L_intermediate;
+
+L_d_purple:
+ mes "[Rauk the Alchemist]";
+ mes "\"Hm, Purple dye... proper Tritan Purple is hard to make. Fortunately, the correct recipe has survived... but some ingredients are quite costly.";
+ mes "I can't even tell you why, unfortunately, since this is a bit of an alchemistic secret, and I really don't want to argue this out with people who can turn my nose into a rhubarb.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"Still, I can make it for you, out of 100 cobalt leaves, 100 alizarin leaves, 20 mauve leaves, one pearl, and 40,000 GP. Some other ingredients are covered by the GP.\"";
+ next;
+ goto L_intermediate;
+
+L_black:
+ if (countitem("CobaltHerb") < 40)
+ goto L_black_fail;
+ if (countitem("AlizarinHerb") < 40)
+ goto L_black_fail;
+ if (countitem("GambogeHerb") < 40)
+ goto L_black_fail;
+ if (countitem("MauveHerb") < 40)
+ goto L_black_fail;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("CobaltHerb") > 40
+ && countitem("AlizarinHerb") > 40
+ && countitem("GambogeHerb") > 40
+ && countitem("MauveHerb") > 40)
+ goto L_TooMany;
+ if (Zeny < 20000)
+ goto L_black_fail;
+ delitem "CobaltHerb", 40;
+ delitem "AlizarinHerb", 40;
+ delitem "GambogeHerb", 40;
+ delitem "MauveHerb", 40;
+ Zeny = Zeny - 20000;
+ getitem "BlackDye", 1;
+ goto L_Ok3;
+
+L_black_fail:
+ mes "[Rauk the Alchemist]";
+ mes "\"I am sorry, but you don't have all the items I need to make black dye. I need fourty leaves of alizarin, cobalt, gamboge and mauve each, and 20,000 GP.\"";
+ next;
+ goto L_intermediate;
+
+L_d_black:
+ mes "[Rauk the Alchemist]";
+ mes "\"Black? Ah! such a wonderful choice of color. It's my favorite! Well, if you too want something black, I would be delighted to make you some black dye.";
+ mes "Just bring me 40 leaves each of cobalt, alizarin, gamboge and mauve.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"Oh, and 20,000 GP for the charcoal and diamond dust mixture you need to keep the mauve smell out.\"";
+ next;
+ goto L_intermediate;
+
+L_dark_green:
+ if (BaseLevel < 30)
+ goto L_d_no_green;
+ if (QUEST_clothdyer_knowsdye != @QUEST_HAS_SOLVED_DYE_PUZZLE)
+ goto L_d_dark_green;
+ if (countitem("CobaltHerb") < 10)
+ goto L_dark_green_fail;
+ if (countitem("GambogeHerb") < 10)
+ goto L_dark_green_fail;
+ if (countitem("MauveHerb") < 10)
+ goto L_dark_green_fail;
+ if (countitem("MaggotSlime") < 1)
+ goto L_dark_green_fail;
+ if (Zeny < 1000)
+ goto L_dark_green_fail;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("CobaltHerb") > 10
+ && countitem("GambogeHerb") > 10
+ && countitem("MauveHerb") > 10
+ && countitem("MaggotSlime") > 1)
+ goto L_TooMany;
+ delitem "CobaltHerb", 10;
+ delitem "MauveHerb", 10;
+ delitem "GambogeHerb", 10;
+ delitem "MaggotSlime", 1;
+ Zeny = Zeny - 1000;
+ getitem "DarkGreenDye", 1;
+ goto L_Ok3;
+
+L_dark_green_fail:
+ mes "[Rauk the Alchemist]";
+ mes "Rauk frowns as he examines the items you hand him.";
+ mes "\"No, this will not do. I need ten gamboge leaves, ten cobalt leaves, ten mauve leaves, slime from one maggot, and 1000 GP.\"";
+ next;
+ goto L_intermediate;
+
+L_d_dark_green:
+ mes "[Rauk the Alchemist]";
+ if (QUEST_clothdyer_knowsdye != @QUEST_HAS_SOLVED_DYE_PUZZLE)
+ goto L_d_dark_green_quest;
+ mes "\"Since we have figured out how much maggot slime we need for you, all you have to bring me are 1000 GP, one maggot slime, and ten leaves each of mauve, cobalt, and gamboge.\"";
+ next;
+ goto L_intermediate;
+
+L_d_dark_green_quest:
+ mes "\"Ah, dark green... dark green dye is actually simple to make, except for one tiny little problem: dark green clothes fade very quickly when they touch human skin. By far the best way to fixate the color is argentum powder, mixed with dark green dye essence extracted from maggot slime.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"But just how much maggot slime goes into the fixative and how much into the rest of the mixture varies completely for every individual. We will have to figure out just how many thousandth ounces it is for you before I can make dark green dye for you.\"";
+ next;
+ if (QUEST_clothdyer_knowsdye == @QUEST_CAN_GET_DYE_HERE)
+ QUEST_clothdyer_knowsdye = (rand(1000) + @QUEST_GUESS_BASE);
+ goto L_d_dark_green_q_main;
+
+L_d_dark_green_q_main:
+ menu
+ "Uh... no thanks.", L_intermediate,
+ "So nobody else can wear clothes I dye?", L_dark_green_q_wear,
+ "OK, what should I do?", L_VerdeEscuro_qexp,
+ "Let's figure it out!", L_VerdeEscuro_qguess;
+
+L_dark_green_q_wear:
+ mes "[Rauk the Alchemist]";
+ mes "\"The color stabilises after a week or so.";
+ mes "Others can wear the clothes you have dyed – just make sure that you wear those clothes for a week before passing them on.\"";
+ next;
+ goto L_d_dark_green_q_main;
+
+L_VerdeEscuro_qexp2:
+ mes "[Rauk the Alchemist]";
+ mes "Rauk blinks.";
+ mes "\"Very well. It works like this: you give me a maggot slime and tell me how many thousandth parts go into one part of the dye potion.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"Then we try whether that was the right ratio. I will tell you if you guessed right, but if you were wrong, I will tell you whether you guessed too high or too low.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"With enough slimes and enough tries we should be able to figure out just how much you need.\"";
+ next;
+ menu
+ "Er... can you explain that again?", L_VerdeEscuro_qexp2,
+ "Let's do it!", L_VerdeEscuro_qguess,
+ "I don't have time for this.", L_intermediate;
+
+L_VerdeEscuro_qexp:
+ mes "[Rauk the Alchemist]";
+ mes "\"We have to measure the balance between your light and your dark bile – two of your humors – and use that as the maggot slime concentration.\"";
+ mes "\"This will probably take several tries; for each try we need maggot slime from one maggot.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"Each time you tell me how many thousandth parts of one ounce of the concentrate you want to use in the fixative. I will stir the mixture appropriately and put the rest of the slime into the base mixture. We then put the two together, and you dip your finger in.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"If the mixture is too dark, then that means that we put too much maggot slime into the fixative. If it discolours, we put in too little. But if it retains its color, we are done.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "Rauk smiles.";
+ mes "\"But don't worry, I will happily do all this for free – I rather enjoy these little games.\"";
+ next;
+ menu
+ "Er... can you explain that again?", L_VerdeEscuro_qexp,
+ "Errr... what?", L_VerdeEscuro_qexp2,
+ "Let's do it!", L_VerdeEscuro_qguess,
+ "I don't have time for this.", L_intermediate;
+
+L_VerdeEscuro_qguess:
+ if (countitem("MaggotSlime") < 1)
+ goto L_VerdeEscuro_noslim;
+ delitem "MaggotSlime", 1;
+
+ mes "[Rauk the Alchemist]";
+ mes "Rauk fills your maggot slime into a small bottle and picks a glass bottle from within his robe.";
+ mes "\"Now we need to figure out just how many thousandths you need. First, tell me how many tenths of an ounce you want to put in.\"";
+ next;
+ menu
+ "none", L_MenuItems1,
+ "1 tenth", L_MenuItems1,
+ "2 tenths", L_MenuItems1,
+ "3 tenths", L_MenuItems1,
+ "4 tenths", L_MenuItems1,
+ "5 tenths", L_MenuItems1,
+ "6 tenths", L_MenuItems1,
+ "7 tenths", L_MenuItems1,
+ "8 tenths", L_MenuItems1,
+ "9 tenths", L_MenuItems1;
+
+L_MenuItems1:
+ @menu = @menu - 1;
+ @guess_accumulator = @menu * 100;
+
+ mes "[Rauk the Alchemist]";
+ if (@menu)
+ mes "Rauk pours a good-sized portion of maggot slime from the small bottle into the glass bottle.";
+ mes "\"We now have " + @guess_accumulator + " thousandths of an ounce. How many hundredths of an ounce should I add?\"";
+ next;
+ menu
+ "none", L_MenuItems2,
+ "1 hundredth", L_MenuItems2,
+ "2 hundredths", L_MenuItems2,
+ "3 hundredths", L_MenuItems2,
+ "4 hundredths", L_MenuItems2,
+ "5 hundredths", L_MenuItems2,
+ "6 hundredths", L_MenuItems2,
+ "7 hundredths", L_MenuItems2,
+ "8 hundredths", L_MenuItems2,
+ "9 hundredths", L_MenuItems2;
+
+L_MenuItems2:
+ @menu = @menu - 1;
+ @guess_accumulator = @guess_accumulator + (@menu * 10);
+
+ mes "[Rauk the Alchemist]";
+ if (@menu)
+ mes "Rauk pours a portion of maggot slime from the small bottle into the glass bottle.";
+ mes "\"These are now " + @guess_accumulator + " thousandths of an ounce. How many thousands more?\"";
+ next;
+ menu
+ "none", L_MenuItems3,
+ "1 thousandth", L_MenuItems3,
+ "2 thousandths", L_MenuItems3,
+ "3 thousandths", L_MenuItems3,
+ "4 thousandths", L_MenuItems3,
+ "5 thousandths", L_MenuItems3,
+ "6 thousandths", L_MenuItems3,
+ "7 thousandths", L_MenuItems3,
+ "8 thousandths", L_MenuItems3,
+ "9 thousandths", L_MenuItems3;
+
+L_MenuItems3:
+ @menu = @menu - 1;
+ @guess_accumulator = @guess_accumulator + @menu;
+
+ mes "[Rauk the Alchemist]";
+ if (@menu)
+ mes "Rauk pours a tiny amount of maggot slime from the small bottle into the glass bottle.";
+ mes "Rauk mixes some more ingredients into the bottles, stirs them, heats one of them and mixes the results together.";
+ next;
+
+ mes "[Rauk the Alchemist]";
+ mes "\"Please put your finger in.\"";
+ mes "Hesitantly. you stick your finger into the resulting brew. The mixture feels warm and smooth to the touch.";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "You pull your finger out again.";
+
+ if (@guess_accumulator + @QUEST_GUESS_BASE > QUEST_clothdyer_knowsdye)
+ goto L_VerdeEscuro_muito;
+
+ if (@guess_accumulator + @QUEST_GUESS_BASE < QUEST_clothdyer_knowsdye)
+ goto L_dark_green_q_little;
+
+ // otherwise correct guess
+
+ mes "Nothing seems to be happening with the mixture. Rauk's eyes lighten up.";
+ mes "\"This is it! You need precisely " + @guess_accumulator + " thousandts. Let me write this down...\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "Rauk is beaming.";
+ mes "\"I can now make dark green dye for you. All I need will be slime from one maggot, ten gamboge leaves, ten cobalt leaves, ten mauve leaves, and 1000 GP for other ingredients.\"";
+ mes "[You gain 20,000 experience points]";
+ getexp 20000, 0;
+ QUEST_clothdyer_knowsdye = @QUEST_HAS_SOLVED_DYE_PUZZLE;
+ next;
+ goto L_intermediate;
+
+L_VerdeEscuro_muito:
+ mes "After only a second, the mixture begins to blacken. Rauk frowns.";
+ mes "\"That was too much... you need fewer than " + @guess_accumulator + " thousandths, I think.";
+ goto L_dark_green_q_again;
+
+L_dark_green_q_little:
+ mes "Almost instantaneously, the mixture loses its colour and turns transparent. Rauk sighs.";
+ mes "\"That was too little. Next time, try more than " + @guess_accumulator + " thousandths.";
+ goto L_dark_green_q_again;
+
+L_dark_green_q_again:
+ mes "\"Should we try again?\"";
+ next;
+ menu
+ "Yes!", L_VerdeEscuro_qguess,
+ "No, I've had enough.", L_Abort;
+
+L_VerdeEscuro_noslim:
+ mes "[Rauk the Alchemist]";
+ mes "\"Oh, you don't have any maggot slime? That's unfortunate; I am out of it myself. Still it should be easy enough to find, just bring me one and we can continue testing.\"";
+ next;
+ goto L_intermediate;
+
+L_monster_oil:
+ mes "[Rauk the Alchemist]";
+ mes "Rauk locks his eyes with you and continues in more serious tone.";
+ mes "\"I know how to create it, but you won't get it from me. It's far too dangerous; even the best alchemist may need multiple attempts and will risk blowing up! I can give you a recipe though, if you still are wanton.\"";
+ next;
+ menu
+ "Yes, tell me!", L_Next3,
+ "No, that sounds too dangerous.", L_Abort;
+
+L_Next3:
+ mes "[Rauk the Alchemist]";
+ mes "You will need a pearl, a pair of snake skins, two piles of volcanic ash, three black scorpion stingers – and a golden scorpion stinger. In addition you must have plenty of herbs to stabilise the concoction; mauve, alizarin, cobalt and gamboge will do just fine.";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"Take the pearl, skins, black stingers, ash, and cook briefly in a cauldron. Next add the mauve/alizarin/cobalt/gamboge as needed to stabilise into a black brew. Lastly, add the golden scorpion stinger and let boil briefly. And it's done.\"";
+ next;
+ mes "[Rauk the Alchemist]";
+ mes "\"Good luck not blowing up!\"";
+ @Q_status = @Q_status | @SETZER_KNOWS_STINGER;
+ callsub L_Update_Var;
+ close;
+
+L_Abort:
+ close;
+
+L_Update_Var:
+ set QUEST_Forestbow_state,
+ (QUEST_Forestbow_state & ~(@Q_MASK)
+ | (@Q_status << @Q_SHIFT));
+ return;
+
+L_TooMany:
+ mes "[Rauk the Alchemist]";
+ mes "You don't have room for this.";
+ close;
+}
diff --git a/npc/011-1/auldsbel.txt b/npc/011-1/auldsbel.txt
new file mode 100644
index 00000000..01abe364
--- /dev/null
+++ b/npc/011-1/auldsbel.txt
@@ -0,0 +1,1291 @@
+
+011-1,50,68,0 script Auldsbel#_M NPC168,{
+ @mexp = MAGIC_EXP;
+
+ @Q_STATUS_INITIAL = 0;
+ @Q_STATUS_POSTINTRO = 1;
+ set @Q_STATUS_INITIATION, 2; // quest for being able to cast `create mouboo figurine'
+ set @Q_STATUS_STUDENT, 3; // accepted as student
+ set @Q_STATUS_STUDENT0, 4; // accepted as student
+ @Q_STATUS_STUDENT1 = 5;
+ @Q_STATUS_STUDENT2 = 6;
+ @Q_STATUS_STUDENT3 = 7;
+ @Q_STATUS_STUDENT4 = 8;
+ @Q_STATUS_STUDENT5 = 9;
+
+
+ set @wants_sulphur, (QUEST_MAGIC & (NIBBLE_6_MASK | NIBBLE_7_MASK)) // war quest
+ || (((QUEST_MAGIC2 & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT) >= 4); // Elanore's heal-Kadiya quest
+ @wants_ironpowder = (((QUEST_MAGIC & (NIBBLE_6_MASK | NIBBLE_7_MASK)) >> NIBBLE_6_SHIFT) >= 7);
+
+ @Q_MASK = NIBBLE_0_MASK | NIBBLE_1_MASK;
+ @Q_SHIFT = NIBBLE_0_SHIFT;
+
+ @Q_status = (QUEST_MAGIC & @Q_MASK) >> @Q_SHIFT;
+
+ @Q_main_status = @Q_status & 31;
+ @Q_component_quest = @Q_status >> 5;
+
+ @has_magic = getskilllv(SKILL_MAGIC);
+
+ if (@Q_main_status >= @Q_STATUS_POSTINTRO)
+ goto L_short_intro;
+
+ mes "[Robed Man]";
+ mes "You notice a middle-aged man in expensive-looking robes.";
+ mes "\"Ah, splendid, you finally came!\"";
+ mes "He motions you to come closer.";
+ next;
+ mes "[Robed Man]";
+ mes "The man is visibly excited.";
+ mes "\"Here, I found a silk cocoon. Now if you can just give me the obsidian salt, we can see whether it works!\"";
+ next;
+ menu
+ "Whether what works?", L_Intro_explain,
+ "What are you talking about?", L_Intro_explain,
+ "I don't have any obsidian salt.", L_Intro_nopowder,
+ "Do I know you?", L_Intro_identity,
+ "Goodbye.", L_close;
+
+L_Intro_explain:
+ mes "[Robed Man]";
+ mes "He frowns.";
+ mes "\"The transmutation experiment, of course! You can't have forgotten already...?\"";
+ next;
+ goto L_Intro_identity;
+
+L_Intro_nopowder:
+ mes "[Robed Man]";
+ mes "\"What!? You traveled all this way without any obsidian...\"";
+ next;
+ goto L_Intro_identity;
+
+L_Intro_identity:
+ mes "[Robed Man]";
+ mes "He eyes you more carefully.";
+ mes "\"Wait. You're not Padric.\"";
+ next;
+ @xmsg$ = "Right... my name is " + strcharinfo(0) + ".";
+ if (strcharinfo(0) == "Padric")
+ @xmsg$ = "Actually, I am, but I don't know you...?";
+ menu
+ @xmsg$, L_Intro_wrongperson,
+ "You're not very good with faces, are you?", L_Intro_nogood,
+ "Who are you?", L_Intro_who_are_you,
+ "Goodbye.", L_close;
+
+L_Intro_wrongperson:
+ mes "[Robed Man]";
+ mes "He laughs.";
+ mes "\"Ah, I knew it... you're not the first one today, either. I should apologize, I am horrible with faces. Well, if you don't mind, please hurry along, I should go back to my experiments.\"";
+ next;
+ goto L_Intro_primary_menu;
+
+L_Intro_primary_menu:
+ menu
+ "Who are you?", L_Intro_who_are_you,
+ "Goodbye.", L_close;
+
+L_Intro_nogood:
+ mes "[Robed Man]";
+ mes "He laughs.";
+ mes "\"Yes, you could say that. Well, I shall get back to my experiments, then; I think I shall manage something that requires no obsidian salt instead.\"";
+ next;
+ menu
+ "Who are you?", L_Intro_who_are_you,
+ "What is obsidian salt, anyway?", L_Intro_obsidian_salt,
+ "Goodbye.", L_close;
+
+L_Intro_obsidian_salt:
+ mes "[Robed Man]";
+ mes "\"Oh, obsidian salt is a catalyst... or rather a theoretical catalyst. We know that it has to have an application somewhere, and I do have the strong suspicion that it may be linked to natural transmogrification...\"";
+ next;
+ goto L_Intro_primary_menu;
+
+L_Intro_who_are_you:
+ mes "[Robed Man]";
+ mes "\"Oh, oh my... of course you wouldn't know me, being from the countryside and all.\"";
+ mes "He laughs.";
+ mes "\"Well, my young friend, I am none other than Auldsbel the Graying, of the Council of Transmuters!\"";
+ next;
+
+ @Q_main_status = @Q_STATUS_POSTINTRO;
+ callsub S_Update_Var;
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_AULDSBEL;
+
+ mesn l("Auldsbel the Wizard");
+ mes "\"That means that I'm a wizard, in case you were wondering.\"";
+ next;
+ goto L_Main_menu;
+
+L_short_intro:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Welcome back, Padric!\"";
+ next;
+ goto L_Main_menu;
+
+L_Main_menu:
+ if (@has_magic)
+ goto L_Main_menu_magic;
+
+ menu
+ "How does this 'magic' work?", L_about_magic,
+ "I want to become a wizard!", L_learn_magic,
+ "Where are you from?", L_about_auldsbel,
+ "Do you need help with your experiments?", L_Quest,
+ "What do you know about...", L_Question,
+ "Goodbye.", L_close;
+
+L_Main_menu_magic:
+ if (@wants_sulphur && @wants_ironpowder)
+ menu
+ "How does magic work?", L_about_magic,
+ "Can you teach me a spell?", L_learn_spell,
+ "Where are you from?", L_about_auldsbel,
+ "Do you need help with your experiments?", L_Quest,
+ "What do you know about...", L_Question,
+ "Can you make sulphur powder?", L_Sulphur,
+ "Can you make iron powder?", L_Ironpowder,
+ "Goodbye.", L_close;
+ if (@wants_sulphur && !@wants_ironpowder)
+ menu
+ "How does magic work?", L_about_magic,
+ "Can you teach me a spell?", L_learn_spell,
+ "Where are you from?", L_about_auldsbel,
+ "Do you need help with your experiments?", L_Quest,
+ "What do you know about...", L_Question,
+ "Can you make sulphur powder?", L_Sulphur,
+ "Goodbye.", L_close;
+ menu
+ "How does magic work?", L_about_magic,
+ "Can you teach me a spell?", L_learn_spell,
+ "Where are you from?", L_about_auldsbel,
+ "Do you need help with your experiments?", L_Quest,
+ "What do you know about...", L_Question,
+ "Goodbye.", L_close;
+
+L_Ironpowder:
+ mesn l("Auldsbel the Wizard");
+ mes "\"No, I do not know the spell for this. I expect that it shouldn't be too hard an invocation, but I'm too busy to work it out.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"I know that they used to make iron ore around here, though, many years ago. Perhaps the secret is still hidden somewhere?\"";
+ next;
+ goto L_Main_menu;
+
+L_Sulphur:
+ mesn l("Auldsbel the Wizard");
+ @Cost = 400 - (@Q_component_quest * 30);
+ mes "\"Sulphur powder? Ah, so we have picked up a little offensive magic, haven't we? Good thinking, good thinking. And yes, of course I can transmute volcanic ashes into sulphur powder at a ratio of 1:20, for " + @Cost + " GP.\"";
+ next;
+ if (@Q_main_status >= @Q_STATUS_STUDENT)
+ menu
+ "No, thank you.", L_close,
+ "I will see what I can find.", L_close,
+ "Can you teach me how to make it myself?", L_Sul_t_s,
+ "Here you are.", L_Sulphur_buy;
+ menu
+ "No, thank you.", L_close,
+ "I will see what I can find.", L_close,
+ "Here you are.", L_Sulphur_buy;
+
+L_Sulphur_buy:
+ if (Zeny < @Cost)
+ goto L_Sulphur_noZeny;
+ if (countitem("PileOfAsh") < 1)
+ goto L_Sulphur_noash;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("SulphurPowder") > 1
+ && countitem("PileOfAsh") == 0)
+ goto L_Sulphur_noroom;
+
+ Zeny = Zeny - @Cost;
+ delitem "PileOfAsh", 1;
+ getitem SulphurPowder, 20;
+ mesn l("Auldsbel the Wizard");
+ mes "\"I shall transmute it later. Here, have five half-ounces from my own stock.\"";
+ next;
+ goto L_Main_menu;
+
+L_Sulphur_noZeny:
+ mesn l("Auldsbel the Wizard");
+ mes "\"No GP, no service.\"";
+ next;
+ goto L_Main_menu;
+
+L_Sulphur_noash:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Without volcanic ash, I can't give you any sulphur powder. Try hunting some fire goblins, or somesuch.\"";
+ next;
+ goto L_Main_menu;
+
+L_Sulphur_noroom:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Hmm, you really managed to squeeze something into every little place you had that we could have stored the powder in... you might want to return once you have resolved this matter.\"";
+ next;
+ goto L_Main_menu;
+
+L_Sul_t_s:
+ if (@Q_component_quest <= 4)
+ goto L_Sul_t_s_no;
+ mesn l("Auldsbel the Wizard");
+ mesq l("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;
+ mesn l("Auldsbel the Wizard");
+ mesq l("That invocation is '%s'.", b("Gole"));
+ learnskill SKILL_GOLE;
+ next;
+ mesn l("Auldsbel the Wizard");
+ mesq l("You may find that you can transmute the powder more effectively after a while; that is perfectly natural.");
+ next;
+ goto L_Main_menu;
+
+L_Sul_t_s_no:
+ mesn l("Auldsbel the Wizard");
+ mesq l("Hmm... how about this: you help me with a few of my experiments, and I tell you?");
+ next;
+ menu
+ "Very well, I will help you.", L_Quest,
+ "No.", L_Next;
+
+L_Next:
+ mesn l("Auldsbel the Wizard");
+ mesq l("Then I fear that I shall not reveal the spell to you either.");
+ next;
+ goto L_Main_menu;
+
+L_about_magic:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Magic is a universal force that comes from within; only few individuals have the power to channel and manipulate it. Most magic users resort to spells – prefabricated invocations – to access and control their magical power.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Most spells are claimed by one of the five schools of magic. To properly use them, a magic user need not only have sufficient prowess in magic overall, but also in the specifics of that particular school.\"";
+ next;
+ goto L_a_m_minimenu;
+
+L_a_m_minimenu:
+ menu
+ "What are the five schools?", L_a_m_schools,
+ "How can I advance in magic?", L_a_m_advance,
+ "How do spells work?", L_a_m_spells,
+ "Where can I learn spells?", L_a_m_learn,
+ "Never mind.", L_Main_menu;
+
+L_a_m_schools:
+ mesn l("Auldsbel the Wizard");
+ mes "\"With few exceptions, all spells belong to one of the five schools of magic: Transmutation, War, Astral, Life, and Nature.\"";
+ next;
+ goto L_a_s_minimenu;
+
+L_a_s_minimenu:
+ menu
+ "What's Transmutation magic?", L_about_transmutation,
+ "What's War magic?", L_about_war,
+ "What's Astral magic?", L_about_astral,
+ "What's Life magic?", L_about_life,
+ "What's Nature magic?", L_about_nature,
+ "Are there other spells?", L_about_other_spells,
+ "Thank you.", L_a_m_minimenu;
+
+L_about_transmutation:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Transmutation magic deals with forming matter into a new shape. Some advanced transmutation magic can also expose special properties of the material in question.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "He smiles.";
+ mes "\"Transmutation magic is the engine of human civilization. By allowing us to shape buildings, tools, and other items according to the power of our imagination, it gives us mastery over nature.\"";
+ next;
+ goto L_a_s_minimenu;
+
+L_about_astral:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Astral magic comprises a family of spells that connect the caster to the Astral World. This connection can be used to pull the caster 'through'-- effectively teleporting them – or to 'pull others through'-- summoning creatures.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"There are also some more direct uses of powers of the Astral World; mainly spells that affect other spells.\"";
+ next;
+ goto L_a_s_minimenu;
+
+L_about_war:
+ mesn l("Auldsbel the Wizard");
+ mes "\"War magic deals with the inevitable necessity of struggle against other creatures, and sometimes even against other humans. War magic exclusively focuses on dealing damage and destruction.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"If you use War magic, you better have a Transmuter around for the aftermath, to clear up your collateral damage.\"";
+ next;
+ goto L_a_s_minimenu;
+
+L_about_life:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Life magic deals with healing. Not much of a surprise there.\"";
+ next;
+ goto L_a_s_minimenu;
+
+L_about_nature:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Nature magic is a rather subtle (and, in my eyes, rather weak) kind of magic that deals with manipulating nature as it is. Think of it as Transmutation magic without being able to actually shape things the way you want.\"";
+ next;
+ goto L_a_s_minimenu;
+
+L_about_other_spells:
+ mesn l("Auldsbel the Wizard");
+ mesq l("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 '%s' spell.", b("monsterinfo"));
+ if (getskilllv(SKILL_MAGIC) > 1)
+ learnskill SKILL_MONSTERINFO;
+ next;
+ goto L_a_s_minimenu;
+
+L_a_m_advance:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Advancing in your magical powers must come from two sources: from within and from a person who can guide you in whichever school of magic you wish to advance.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"For advancing in your general magic power, you must practice magical spells. Make sure to vary them; you will learn little if you cast the same spell over and over. Also, spells that consume no components seem not to be very instructive in practice.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Once you have gathered enough spellcasting experience, you should be able to advance to the next level of magic. If you received your magic from a sponsor, you may have to seek out the sponsor again to advance.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Similarly, to advance in a particular school of magic, you should seek out someone sufficiently competent in that school. Each school has a different rite for advancing its students, so make sure to talk to the right person.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"I myself am a Transmutation Wizard. Of course I know some spells from the other schools, but my focus is on Transmutation. Theoretically speaking, I can advance you in this school.\"";
+ next;
+ goto L_a_m_minimenu;
+
+L_a_m_learn:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Finding and learning new spells is of course important in a magic user's quest towards becoming a full-fledged wizard.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Some wizards will be willing to share their knowledge, usually for a price. But they are not the only sources of magical spells: many magical books contain spells, and you can occasionally find them written down in the most unusual of places.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Some are even hiding as part of folklore or gossip. Of course, for those it can sometimes be hard to determine just what their prerequisites are...\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"If you decide to hunt for spells, make sure to keep a journal with you. Some spell invocations may only cross your path once in your lifetime; you must not allow them to get away!\"";
+ next;
+ goto L_a_m_minimenu;
+
+L_a_m_spells:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Magical spells are shortcuts, true magic bound to a word. No-one today remembers how they were created at the beginning of time, though many have tried to find it out, and failed...\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"These magical words are the spells' invocations. Spoken by someone who can't use magic, or by someone who doesn't satisfy the prerequisites, the word stands just for itself.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"But when spoken by a competent magic user, the word may unleash its effect – consuming any components it may require, draining the caster's mana, changing the world around it.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Some spells require catalysts on top of components, others vary in power depending on whom they are cast on or under what conditions. However, all spells are affected by the caster's astral power.\"";
+ next;
+ goto L_a_sp_minimenu;
+
+L_a_sp_minimenu:
+ menu
+ "What is this 'astral power'?", L_about_astral_power,
+ "What is a catalyst?", L_about_catalysts,
+ "What is a component?", L_about_components,
+ "What other prerequisites are there?", L_a_oth_prereq,
+ "Where can I learn spells?", L_a_m_learn,
+ "How often can I cast spells?", L_about_speed,
+ "Never mind.", L_a_m_minimenu;
+
+L_about_astral_power:
+ mesn l("Auldsbel the Wizard");
+ mes "\"A person's astral power is determined by several factors: overall experience, intelligence, and any and all equipment the person may be wearing at a given time.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Greater astral power means more powerful spells. Since equipment can greatly decrease astral power, most magic users tend to be careful about what they wear – it takes a while to recover astral power even after armour is unequipped.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"The worst offenders are metal items, particularly shields and body armour. Helmets and gloves get in the way, too. Still, a few special or enchanted items may even increase magical power.\"";
+ next;
+ goto L_a_sp_minimenu;
+
+L_about_catalysts:
+ mesn l("Auldsbel the Wizard");
+ mes "\"A catalyst is a material prerequisite to a spell that is not consumed as part of the spell. For example, the Transmuter's Tablet is required to properly perform many of the more powerful transmutation spells, but it is never consumed.\"";
+ next;
+ goto L_a_sp_minimenu;
+
+L_about_components:
+ mesn l("Auldsbel the Wizard");
+ mes "\"A material component is an item that is consumed as part of the spells magic. For example, when transmuting wood into arrows, you must consume a raw log to shape the arrows out of it.\"";
+ next;
+ goto L_a_sp_minimenu;
+
+L_a_oth_prereq:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Some spells have additional requirements – they can only be cast underground, or when you are standing very close to the person you are casting them on, or only when you are wearing a particular enchanted item. Spells are quirky, so read their descriptions carefully – if you do find a description.\"";
+ next;
+ goto L_a_sp_minimenu;
+
+L_about_speed:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Most spells are effective immediately, unless they require some complex astral connection – summoning or teleporting can take a while to take effect, for example. Still, after casting a spell you usually need a moment to recover before casting the next.\"";
+ next;
+ goto L_a_sp_minimenu;
+
+L_about_auldsbel:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Well, there is no harm in giving you the general picture, I suppose.\"";
+ mes "He sighs, as if he had been forced to repeat something one time too many.";
+ mes "\"I am from the Council of Transmuters, the head organ of organized Transmutation magic in the known world.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"The council oversees recruitment, education, accreditation, and, if necessary, disciplining of Transmuters.";
+ mes "It ensures that Transmuter conduct is according to its statutes and acts as representative and point of contact towards other entities.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Of all the schools of magic, the School of Transmutation is the most organised by far, and held in high esteem by rulers all across the world. Of course this is not only due to the outstanding and rigid structure of the school, but also because of the exceptional services that its members provide.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"The Council, presently overseen by Lord Transmogrifier Pontorias the Plaid (May His Shape Reflect His Soul Forever), consists of fourty-nine members and is situated in the citadel of Dorngard, in the northern mountains near the Crimson Cascade.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"The Council is sovereign over three hundred acres of land and nearby farming communities and has been ever since Yorick the Younger shaped Dorngard out of a mountain by sheer power of will, to build a home for the school his father had founded.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"The Council has held peaceful relations with nearby realms for almost two centuries now and is widely regarded as a reliable partner in shaping civilization to allow it to evolve towards its next stage.\"";
+ next;
+ menu
+ "All right, but what about you?.", L_about_auldsbel_2,
+ "Never mind.", L_Main_menu;
+
+L_about_auldsbel_2:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Oh, myself? I am just vacationing in the area. Very relaxed and peaceful place, the Hurnscald area. And plenty of splendid specimens for experimentation.\"";
+ next;
+ goto L_Main_menu;
+
+L_learn_magic:
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel laughs heartily.";
+ mes "\"Hah, if only it were so easy! No, my young friend, I fear that 'learning magic' here is not an option. Either you are born with it, or without.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Sure, there are a few entities that may grant you magic – Ether Spirits or Mana Seeds or Great Dragons – but those are the stuff of legends, so I suggest that you don't waste your life trying to find one of them.\"";
+ next;
+ goto L_Main_menu;
+
+L_Question:
+ callfunc "MagicTalkOptionsSetup";
+ @ignore = @QQ_AULDSBEL;
+ callfunc "MagicTalkMenu";
+
+ if (@c == 0)
+ goto L_Main_menu;
+ if (@c == @QQ_ELANORE)
+ goto L_Q_elanore;
+ if (@c == @QQ_MANASEED)
+ goto L_Q_manaseed;
+ if (@c == @QQ_MANAPOTION)
+ goto L_make_mana_potion;
+ if (@c == @QQ_WYARA)
+ goto L_Q_wyara;
+ if (@c == @QQ_SAGATHA)
+ goto L_Q_sagatha;
+ if (@c == @QQ_IMP)
+ goto L_Q_imp;
+ if (@c == @QQ_OLDWIZ)
+ goto L_Q_old_wizard;
+ if (@c == @QQ_ASTRALSOUL)
+ goto L_Q_astralsoul;
+
+ mesn l("Auldsbel the Wizard");
+ mes "\"Let us talk about something else.\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_astralsoul:
+ if (!(getskilllv(SKILL_ASTRAL_SOUL)))
+ goto L_Q_astralsoul_L;
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Oh that is a really useful focus. It will help you doing magic of all kinds.\"";
+ next;
+ mes "\"...uhm...\"";
+ next;
+ mes "\"Didn't I teach you the ability to focus on magic, did I?\"";
+ goto L_Main_menu;
+
+L_Q_astralsoul_L:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Oh that is a really useful focus. It will help you doing magic of all kinds.\"";
+ next;
+ mes "\"I can try to teach you this ability.\"";
+ next;
+ mes "\"But I will need some very expensive magical substances to focus your brain onto magic.\"";
+ next;
+ mes "\"It is about... erm, 11300 GP. Do you have so much money?\"";
+ menu
+ "Here you are", L_Q_astralsoul_L1,
+ "I will get it.", L_Main_menu;
+
+L_Q_astralsoul_L1:
+ if (Zeny < 11300)
+ goto L_Q_astralsoul_nz;
+ Zeny = Zeny - 11300;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Okay, listen:\"";
+ next;
+ mes "\"Some parts of your brain is still unused. These parts will now get the ability to get focused to magic.\"";
+ next;
+ mes "\"To do so, think of a magic spell!\"";
+ next;
+ mes "Auldsbel mumbles some invocations";
+ next;
+ @SUP_lvl = 1;
+ @SUP_id = SKILL_ASTRAL_SOUL;
+ @SUP_name$ = "Astral Soul";
+ @SUP_xp = 2500;
+ callfunc "SkillUp";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Now go and try to find someone who can actually activate that focus.\"";
+ next;
+ mes "\"You have the powers to focus on magic, but you need to get magic focused now.\"";
+ goto L_Main_menu;
+
+L_Q_astralsoul_nz:
+ mesn l("Auldsbel the Wizard");
+ mes "\"When learning powerful stuff, you should try not to make so many jokes.\"";
+ next;
+ mes "\"Come back when you have the money.\"";
+ goto L_Main_menu;
+
+L_Q_old_wizard:
+ mesn l("Auldsbel the Wizard");
+ mes "\"I'm still not sure what exactly to make of him. At first appearance, he seems like a senile old man, but there can be no doubt that he has – or at least had, at some point – a very deep understanding of magic.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"I have not had the opportunity to talk to him too much, though.\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_imp:
+ mesn l("Auldsbel the Wizard");
+ mes "\"There are many different kinds of spirits in the world. Some are good-natured, others evil; some are weak, others very powerful. I don't know the particular one you have encountered, though I urge caution.\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_elanore:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Ah, Elanore. A kind little woman. Also a very proficient healer, from what I have been told, though we have interacted little. If you are interested in Life magic, you might want to talk to her.\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_wyara:
+ mesn l("Auldsbel the Wizard");
+ mes "\"The village witch? Not exactly the brightest person, but she has managed to figure out how to brew potions. I doubt that she can do any real magic, though.\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_sagatha:
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel frowns.";
+ mes "\"That witch, hmm? She's a well-known trouble-maker, and quite a clever one at that; she once prevented us from cutting down a forest near Dorngaard that the villages wanted to use for farming, using some ingenious magic.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"That woman has spent too much time alone in the forests... I have the strong suspicion that she is more loyal towards her animals than towards us humans! I recommend that you stay away from her, if you value your well-being.\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_manaseed_rumour:
+ mes "\"A mana seed? Around here? Nah, they've been pulling your leg. Those things are extremely rare, after all.\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_manaseed:
+ mesn l("Auldsbel the Wizard");
+ if (@has_magic)
+ goto L_Q_manaseed_withmagic;
+ if (!(MAGIC_FLAGS & MFLAG_KNOWS_MANASEED)) // rumour only?
+ goto L_Q_manaseed_rumour;
+ if (MAGIC_FLAGS & MFLAG_DRANK_POTION)
+ goto L_Q_manaseed_prepared;
+ if (MAGIC_FLAGS & MFLAG_TOUCHED_MANASEED)
+ goto L_Q_ms_tou;
+ mes "\"You have found an actual Mana Seed? That's impossible! Well, very unlikely... Then again, some others have told me similar rumours. I find it hard to believe that...\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Well, if it's true, then try touching it. That should do you no harm, but if you are very, very lucky, it just might grant you some minuscule amount of magical power.\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_ms_tou:
+ if (MAGIC_FLAGS & MFLAG_DRANK_POTION)
+ goto L_Q_manaseed_prepared;
+ mes "\"So you touched the Mana Seed, and its power flowed right through you? You are lucky – it is willing to share – but you are also unlucky, in that you lack the discipline and control needed to contain this power.\"";
+ next;
+ if (MAGIC_FLAGS & MFLAG_KNOWS_MANAPOTION)
+ goto L_Q_ms_tou_short;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Legend has it that you can substitute for such control by imbibing a Mana Potion. I am not sure whether that legend is true, but for you it might be worth trying it out.\"";
+ next;
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_MANAPOTION;
+ goto L_Q_ms_tou_short;
+
+L_Q_ms_tou_short:
+ menu
+ "Where can I get a Mana Potion?", L_where_mana_potion,
+ "Can you make a Mana Potion?", L_make_mana_potion,
+ "Thank you.", L_Main_menu;
+
+L_where_mana_potion:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Well, quite a few alchemists should be able to brew one for you. Or maybe the village witch, even, though I personally would recommend seeing an alchemist.\"";
+ next;
+ goto L_Q_ms_tou_short;
+
+L_make_mana_potion:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Well, I can transmute some components into a Mana Potion for you. Let's see... I will need one pearl, 10,000 GP, about twenty Mauve leaves, and some Gamboge ones... ten should do, I think. Oh, and a bottle of water, of course.\"";
+ next;
+ menu
+ "Here you are.", L_Next1,
+ "I will look for those items.", L_Main_menu,
+ "I'm not interested.", L_Q_ms_tou_short;
+
+L_Next1:
+ if (Zeny < 10000)
+ goto L_make_mp_miss;
+ if (countitem("GambogeHerb") < 10)
+ goto L_make_mp_miss;
+ if (countitem("MauveHerb") < 20)
+ goto L_make_mp_miss;
+ if (countitem("Pearl") < 1)
+ goto L_make_mp_miss;
+ if (countitem("BottleOfWater") < 1)
+ goto L_make_mp_miss;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("GambogeHerb") > 10
+ && countitem("MauveHerb") > 20
+ && countitem("Pearl") > 1
+ && countitem("BottleOfWater") > 1
+ && countitem("ManaPotion") < 1)
+ goto L_mana_potion_toomuch;
+ Zeny = Zeny - 10000;
+ delitem "GambogeHerb", 10;
+ delitem "MauveHerb", 20;
+ delitem "Pearl", 1;
+ delitem "BottleOfWater", 1;
+ getitem "ManaPotion", 1;
+
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel pockets your GP and the pearl, then stuffs the leaves into the bottle. Holding the bottle between his hands, he focuses briefly. The water and leaves flash bright red, then the leaves dissolve.";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "The wizard pours the resultant mixture into a different bottle. \"It will lose its power quickly if left in a glass bottle\", he explains.";
+ mes "He hands you the final result, which feels surprisingly heavy.";
+ next;
+ menu
+ "Thank you!", L_Main_menu,
+ "What about the pearl and GP?", L_Next2;
+
+L_Next2:
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel raises his eyebrows in surprise.";
+ mes "\"Those were payment. You don't expect me to work for free, now do you?\"";
+ next;
+ goto L_Main_menu;
+
+L_mana_potion_toomuch:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Burdened as you are, I doubt you could carry it. Get rid of some of your old things first, will you?\"";
+ next;
+ goto L_Main_menu;
+
+L_make_mp_miss:
+ mesn l("Auldsbel the Wizard");
+ mes "\"No, I need one pearl, 10,000 GP, 20 Mauve leaves, 10 Gamboge leaves, and one bottle of water.\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_manaseed_prepared:
+ mes "\"So you found a Mana Seed and prepared yourself by drinking a mana potion? I recommend that you visit the seed again and see if that actually works...\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_manaseed_withmagic:
+ if (MAGIC_FLAGS & MFLAG_MANASEED_MAXEDOUT)
+ goto L_Q_manaseed_maxedout;
+ mes "\"I still find it hard to believe that you have found an actual Mana Seed here, in the middle of nowhere... Well, I suggest that you keep visiting it. As your control over magic grows, it may grant you additional power.\"";
+ next;
+ goto L_Main_menu;
+
+L_Q_manaseed_maxedout:
+ mes "\"So the mana seed isn't giving you any more power? You might want to try again later; normally those seeds grow in power, over time.\"";
+ next;
+ goto L_Main_menu;
+
+L_Quest:
+ if (@Q_component_quest == 0)
+ goto L_c_quest_0;
+ if (@Q_component_quest == 1)
+ goto L_c_quest_1;
+ if (@Q_component_quest == 2)
+ goto L_c_quest_2;
+ if (@Q_component_quest == 3)
+ goto L_c_quest_3;
+ if (@Q_component_quest == 4)
+ goto L_c_quest_4;
+ if (@Q_component_quest == 5)
+ goto L_c_quest_5;
+ mesn l("Auldsbel the Wizard");
+ mes "\"You have been very helpful, but at this point I have everything I need. Except perhaps for a Wumpus Egg, though I have no idea where you could find one... If you ever come across one, I will give you a special reward for it, though.\"";
+ next;
+ goto L_Main_menu;
+
+L_c_quest_0:
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel is visibly delighted.";
+ mes "\"Ah, indeed, indeed! I can often use help with my experiments, and you just happen to be arriving at a particularly opportune time. See, I found this...\"";
+ mes "He pulls something from his pocket and shows it to you.";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"It's a silk cocoon. This area has been virtually infested with silkworms, from what I have seen. This is splendid! I will try to... do something very special with this one. But for that I will need twenty Mauve leaves.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"There are plenty of Mauve plants around, so I'm sure that you won't have a hard time finding the leaves.\"";
+ next;
+ menu
+ "I have them here.", L_Next3,
+ "Sure, I will look for them.", L_Main_menu;
+
+L_Next3:
+ if (countitem ("MauveHerb") < 20)
+ goto L_c_quest_missing;
+ delitem "MauveHerb", 20;
+ Zeny = Zeny + 2500;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Well done, my young friend! Here is 2,500 GP to compensate you for your efforts.\"";
+ mes "[You gain 250 experience points]";
+ getexp 250, 0;
+ @Q_component_quest = 1;
+ callsub S_Update_Var;
+ next;
+ goto L_Main_menu;
+
+L_c_quest_1:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Good, good... I am trying to come up with a way to best use the Mauve leaves you brought me, but it seems that I will need further components. I am not sure about the exact composition yet, but I will need a few potions.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Please be a good helper and get me an iron potion, a concentration potion, and three small and three medium healing potions.\"";
+ next;
+ menu
+ "Here you are.", L_Next4,
+ "I'm not your 'good helper'!", L_Main_menu,
+ "I'll see what I can do.", L_Main_menu;
+
+L_Next4:
+ if (countitem ("SmallHealingPotion") < 3)
+ goto L_c_quest_missing;
+ if (countitem ("MediumHealingPotion") < 3)
+ goto L_c_quest_missing;
+ if (countitem ("IronPotion") < 1)
+ goto L_c_quest_missing;
+ if (countitem ("ConcentrationPotion") < 1)
+ goto L_c_quest_missing;
+ delitem "SmallHealingPotion", 3;
+ delitem "MediumHealingPotion", 3;
+ delitem "IronPotion", 1;
+ delitem "ConcentrationPotion", 1;
+ Zeny = Zeny + 2500;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Ah, excellent, excellent! These are precisely what I needed. Here is another 2,500 GP to compensate you for your efforts.\"";
+ mes "[You gain 500 experience points]";
+ getexp 500, 0;
+ @Q_component_quest = 2;
+ callsub S_Update_Var;
+ next;
+ goto L_Main_menu;
+
+L_c_quest_2:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Ah! Excellent! Yes, yes, indeed I need help. I have managed to transmute the components you brought me into a liquid that I believe to be a demetamorphosis stock, but it seems that the details still need some fine-tuning, and I am out of silk cocoons...\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"I would like to run the next batch of experiments on a larger scale, though. Would you be so kind as to fetch me one hundred silk cocoons, please?\"";
+ next;
+ menu
+ "One hundred cocoons, here you are.", L_Next5,
+ "That's a lot; I'll see what I can do.", L_Main_menu;
+
+L_Next5:
+ if (countitem ("SilkCocoon") < 100)
+ goto L_c_quest_missing;
+ delitem "SilkCocoon", 100;
+ Zeny = Zeny + 5000;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Splendid, splendid! Here is 5,000 GP for you.\"";
+ mes "Auldsbel attempts to cram the cocoons into his pockets, with little success. Finally he gives up and takes them into his hut.";
+ mes "[You gain 2,000 experience points]";
+ getexp 2000, 0;
+ @Q_component_quest = 3;
+ callsub S_Update_Var;
+ next;
+ goto L_Main_menu;
+
+L_c_quest_3:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Yes... I'm actually not certain that my demetamorphosis stock will not drain the life out of these little creatures. Perhaps an alchemical revitalization tincture would be called for. Fortunately this one is easy, I can make it myself.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"I'm still not sure how to integrate it into the spell... but leave that to me. Can you get me twenty-five red scorpion stingers and twenty-five lumps of maggot slime? Those should be just what I need.\"";
+ next;
+ menu
+ "Here are your stingers and slimes.", L_Next6,
+ "I will get back to you once I have them.", L_Main_menu;
+
+L_Next6:
+ if (countitem ("RedScorpionStinger") < 25)
+ goto L_c_quest_missing;
+ if (countitem ("MaggotSlime") < 25)
+ goto L_c_quest_missing;
+ delitem "RedScorpionStinger", 25;
+ delitem "MaggotSlime", 25;
+ Zeny = Zeny + 5000;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Good helper! Another 5,000 GP for you.\"";
+ mes "\"I believe that I have figured out one possible way to integrate the tincture into the spell... I will let you know how that goes.\"";
+ mes "[You gain 10,000 experience points]";
+ getexp 10000, 0;
+ @Q_component_quest = 4;
+ callsub S_Update_Var;
+ next;
+ goto L_Main_menu;
+
+L_c_quest_4:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Hmm, yes... See, the thing is that transmuting living beings is not normally something that transmutation magic can do. It seems that the beings' life force must be overcome to transmute them, but that in turn kills them.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"But I was wondering whether creatures that already can auto-transmute – or metamorphose, as some people call it – might not allow themselves to be subjected to magical transmutation more easily... Still, all of my demetamorphosis attempts so far have failed.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"I am thinking of injecting the life force of another creature, perhaps using some astral channeling. Snakes sound most promising, as they have a similar physical shape but a strong life force.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Could you get me twenty regular, cave, and mountain snake tongues, please? So a total of sixty tongues. This is where most of their life force is concentrated, incidentally.\"";
+ next;
+ menu
+ "Here are your tongues.", L_Next7,
+ "I will hunt some snakes for you.", L_Main_menu;
+
+L_Next7:
+ if (countitem ("SnakeTongue") < 20)
+ goto L_c_quest_missing;
+ if (countitem ("CaveSnakeTongue") < 20)
+ goto L_c_quest_missing;
+ if (countitem ("MountainSnakeTongue") < 20)
+ goto L_c_quest_missing;
+ delitem "SnakeTongue", 20;
+ delitem "CaveSnakeTongue", 20;
+ delitem "MountainSnakeTongue", 20;
+ Zeny = Zeny + 8000;
+ mesn l("Auldsbel the Wizard");
+ mes "\"8,000 GP should cover your efforts, I think.\"";
+ mes "\"Now let's see if this works...\"";
+ mes "[You gain 40,000 experience points]";
+ getexp 40000, 0;
+ @Q_component_quest = 5;
+ callsub S_Update_Var;
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel focuses on the bundle of snake tongues, which begins to assume a bright red colour, then start to glow. Yellow sparks drop to the ground, as Auldsbel rolls the tongues into a ball.";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "He tosses in a cocoon, then squeezes everything together. A bright red flash blinds you momentarily.";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "As Auldsbel opens his hands, there is nothing there.";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "He frowns. \"Their life force was still not strong enough. Hmm.\"";
+ next;
+ goto L_Main_menu;
+
+L_c_quest_5:
+ mesn l("Auldsbel the Wizard");
+ mes "\"I do have another assignment for you, but this one will be tricky. I will need fifty grass snake tongues. I believe that this may be just enough life force to return the silkworm back to its original shape.\"";
+ next;
+ menu
+ "Here they are.", L_Next8,
+ "That's quite a challenge.", L_Main_menu;
+
+L_Next8:
+ if (countitem ("GrassSnakeTongue") < 50)
+ goto L_c_quest_missing;
+ delitem "GrassSnakeTongue", 50;
+ Zeny = Zeny + 10000;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Excellent! Here is 10,000 GP for you, and now let's see how this goes.\"";
+ mes "[You gain 100,000 experience points]";
+ getexp 100000, 0;
+ @Q_component_quest = 6;
+ callsub S_Update_Var;
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel rolls the snake tongues into a ball again, whilst chanting some words that you fail to discern. As the ball begins to glow, he tosses in a silkworm cocoon.";
+ mes "He then presses his hands together; you are blinded by a blue flash.";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "The wizard steps back in horror.";
+ mes "\"Oh my... I should have known. I have stepped into Astral spell territory here. This is bad...\"";
+ mes "He mumbles a brief spell invocation.";
+ mes "\"I suggest that you run.\"";
+ next;
+ misceffect sfx_magic_transmute;
+ monster "this", 50, 68, "Grass Snake", 1034, 4, "Auldsbel#_M::OnSnakeDeath";
+ close;
+
+OnSnakeDeath:
+ BOSS_POINTS = BOSS_POINTS + 5;
+ message strcharinfo(0), "You gain 5 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+L_c_quest_missing:
+ mesn l("Auldsbel the Wizard");
+ mes "\"No, you are missing some items. Come back later when you have everything!\"";
+ next;
+ goto L_Main_menu;
+
+L_learn_spell:
+ if (@Q_main_status == @Q_STATUS_INITIATION)
+ goto L_initiation;
+ if (@Q_main_status == @Q_STATUS_STUDENT)
+ goto L_stu_start;
+ if (@Q_main_status == @Q_STATUS_STUDENT0)
+ goto L_stu_0;
+ if (@Q_main_status == @Q_STATUS_STUDENT1)
+ goto L_stu_1;
+ if (@Q_main_status == @Q_STATUS_STUDENT2)
+ goto L_stu_2;
+ if (@Q_main_status == @Q_STATUS_STUDENT3)
+ goto L_stu_3;
+ if (@Q_main_status == @Q_STATUS_STUDENT4)
+ goto L_stu_4;
+ if (@Q_main_status == @Q_STATUS_STUDENT5)
+ goto L_stu_5;
+
+ mesn l("Auldsbel the Wizard");
+ mes "\"Wellll.... you do seem to have some magical abilities. But do you possess the talent and diligence needed for a true wizard?\"";
+ mes "He raises an eyebrow at you, then grins.";
+ mes "\"Only one way to find out! Let me teach you a first spell.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ 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;
+ mesn l("Auldsbel the Wizard");
+ mes l("You can turn the log into a wooden figurine by imagining the creature whose shape you want in your head and saying `%s' followed by the last syllable of the name of the creature you want to shape it into.", b("Parum"));
+ next;
+ mesn l("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.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Oh, actually, make sure to write that down. You should keep track of all spells and spell fragments, really. I always keep a notebook handy, in fact.\"";
+ next;
+ learnskill SKILL_PARUM;
+ @Q_main_status = @Q_STATUS_INITIATION;
+ callsub S_Update_Var;
+ goto L_Main_menu;
+
+L_repeat_spell:
+ mesn l("Auldsbel the Wizard");
+ mesq l("The invocation is `%s' followed by the last syllable of the name of the creature you want to shape the log into.", b("Parum"));
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"But keep two things in mind: First, you must KNOW what the creature looks like – so a Skrytlurk 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.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mesq l("And make sure to keep notes of your spells! Don't rely only on your skill tab (F5).");
+ next;
+ goto L_Main_menu;
+
+L_initiation:
+ mesn l("Auldsbel the Wizard");
+ mesq l("So, have you managed to transmute something?");
+ next;
+ if (countitem(MoubooFigurine))
+ menu
+ "Not yet.", L_Main_menu,
+ "How about this mouboo figurine?", L_initiation_check;
+ menu
+ "Not yet.", L_Main_menu,
+ "What was the spell again?", L_repeat_spell;
+
+L_initiation_fail:
+ mesn l("Auldsbel the Wizard");
+ mes "\"No, no, no. This is no good – too many imperfections.\"";
+ mes "He throws it away.";
+ mes "\"Keep practicing – and make sure to vary the spells you cast a little; that will make it easier to learn.\"";
+ next;
+ goto L_Main_menu;
+
+L_initiation_check:
+ if (!(countitem("MoubooFigurine")))
+ goto L_Main_menu;
+ delitem "MoubooFigurine", 1;
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel inspects your figurine.";
+ next;
+ if (@mexp < 40)
+ goto L_initiation_fail;
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel nods.";
+ mes "\"This looks good.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "He pockets the figurine.";
+ mes "\"Very well, then. I shall accept you as my student.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel presses his index and middle finger against your forehead.";
+ mes "\"Accept my blessing!\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "You feel new powers flowing into your body!";
+ @Q_main_status = @Q_STATUS_STUDENT;
+ callsub S_Update_Var;
+ @SUP_id = SKILL_MAGIC_TRANSMUTE;
+ @SUP_name$ = "Transmutation Magic";
+ @SUP_xp = 5000;
+ @SUP_lvl = 2;
+ callfunc "SkillUp";
+ next;
+ goto L_Main_menu;
+
+L_stu_start:
+ if (@mexp < 200) goto L_Notready;
+ mesn l("Auldsbel the Wizard");
+ mesq l("Next, I shall teach you a higher-level transmutation spell.");
+ if (getskilllv(SKILL_MAGIC) < 2) {
+ mesq l("Thinking well, you will not be able to use it yet; you will first have to gain a greater understanding of magic overall.");
+ close;
+ }
+ next;
+ mesn l("Auldsbel the Wizard");
+ mesq l("Bring me ten bug legs, and I will reveal its invocation to you.");
+ next;
+ menu
+ "Here you are.", L_Next9,
+ "I'll be back with them.", L_Main_menu;
+
+L_Next9:
+ if (countitem(BugLeg) < 10)
+ goto L_c_quest_missing;
+ delitem BugLeg, 10;
+ getexp 1000, 0;
+ learnskill SKILL_PATVILOREE;
+ @Q_main_status = @Q_STATUS_STUDENT0;
+ callsub S_Update_Var;
+ mesn l("Auldsbel the Wizard");
+ mes "He picks up the bug legs.";
+ mes "\"Good. These will come in handy later...\"";
+ mes "He grins.";
+ mes "[1000 experience points]";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mesq l("Now, listen carefully: to make a short tank top out of three pieces of cloth, you must use the invocation '%s'.", b("Patviloree"));
+ next;
+ mesn l("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.\"";
+ next;
+ goto L_Main_menu;
+
+L_Notready:
+ mesn l("Auldsbel the Wizard");
+ mes "\"You still need more practice with spellcasting; I won't give you another spell until you are ready.\"";
+ next;
+ goto L_Main_menu;
+
+L_stu_0:
+ if (@mexp < 350)
+ goto L_Notready;
+ mesn l("Auldsbel the Wizard");
+ mes "\"The next transmutation spell is a little harder than the last one I taught you, but you should be able to manage.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Bring me twenty mauve leaves, and I will reveal its invocation.\"";
+ next;
+ menu
+ "Here you are.", L_Next10,
+ "I'll be back with them.", L_Main_menu;
+
+L_Next10:
+ if (countitem("MauveHerb") < 20)
+ goto L_c_quest_missing;
+ delitem "MauveHerb", 20;
+ getexp 1000, 0;
+ learnskill SKILL_PATLOREE;
+ @Q_main_status = @Q_STATUS_STUDENT1;
+ callsub S_Update_Var;
+ mesn l("Auldsbel the Wizard");
+ mes "He pockets your mauve leaves.";
+ mes "\"Those should go very well with the salmon.\"";
+ mes "[1000 experience points]";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mesq l("The next spell I have will make a normal tank top out of four pieces of cloth. The invocation is '%s', make sure to write this down.", b("Patloree"));
+ next;
+ goto L_Main_menu;
+
+L_stu_1:
+ if (@mexp < 425)
+ goto L_Notready;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Up next is the transmutation spell for regular shirts.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"For this, I would like ten scorpion stingers.\"";
+ next;
+ menu
+ "Here you are.", L_Next11,
+ "I'll be back with them.", L_Main_menu;
+
+L_Next11:
+ if (countitem("ScorpionStinger") < 10)
+ goto L_c_quest_missing;
+ delitem "ScorpionStinger", 10;
+ getexp 1000, 0;
+ learnskill SKILL_PATMUPLOO;
+ @Q_main_status = @Q_STATUS_STUDENT2;
+ callsub S_Update_Var;
+ mesn l("Auldsbel the Wizard");
+ mes "He carefully takes the stingers.";
+ mes "\"You are being quite helpful. If my experiments go well, I will make sure to acknowledge you in a footnote somewhere.\"";
+ mes "[1000 experience points]";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mesq l("To make a shirt, use the invocation '%s'. This will require five pieces of cloth.", b("Patmuploo"));
+ next;
+ goto L_Main_menu;
+
+L_stu_2:
+ if (@mexp < 500)
+ goto L_Notready;
+ mesn l("Auldsbel the Wizard");
+ mes "\"You may find the next spell particularly useful.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Bring me twenty wooden logs, and I will teach you.\"";
+ next;
+ menu
+ "Here you are.", L_Next12,
+ "I'll be back with them.", L_Main_menu;
+
+L_Next12:
+ if (countitem(RawLog) < 20)
+ goto L_c_quest_missing;
+ delitem RawLog, 20;
+ getexp 1000, 0;
+ learnskill SKILL_KULARZUFRILL;
+ @Q_main_status = @Q_STATUS_STUDENT3;
+ callsub S_Update_Var;
+ mesn l("Auldsbel the Wizard");
+ mesc l("Auldsbel places the logs next to his hut.");
+ mesq l("I'm hoping to animate them into the shape of one of those odd log heads.");
+ mes "[1000 experience points]";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mesq l("This spell makes arrows out of a single wooden log. Its invocation is '%s'.", b("Kularzufrill"));
+ next;
+ goto L_Main_menu;
+
+L_stu_3:
+ if (getskilllv(SKILL_MAGIC) < 3)
+ goto L_mag_skill_ins;
+ mesn l("Auldsbel the Wizard");
+ mes "\"I believe that you may be ready for the next level of transmutation magic! Let me teach you one last spell that you can handle before your promotion, and if you can cast this one, I will advance you.\"";
+ next;
+ goto L_stu_3_repeat;
+
+L_stu_3_repeat:
+ mesn l("Auldsbel the Wizard");
+ 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;
+ mesn l("Auldsbel the Wizard");
+ mes "\"It is a tricky spell, but if it works out, you will transform the bottle into a concentration potion.\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "\"Hmm. That reminds me – there was a similar spell, but I forgot what it was... anyway, try using this, and bring me the potion when you are done.\"";
+ next;
+ @Q_main_status = @Q_STATUS_STUDENT4;
+ callsub S_Update_Var;
+ goto L_Main_menu;
+
+L_stu_4:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Did you manage to transmute a concentration potion?\"";
+ next;
+ menu
+ "What was the invocation again?", L_stu_3_repeat,
+ "No, still working on it...", L_Main_menu,
+ "Yes.", L_Next13;
+
+L_Next13:
+ if (countitem("ConcentrationPotion") < 1)
+ goto L_stu_4_no_potion;
+ if (!(MAGIC_FLAGS & MFLAG_MADE_CONC_POTION))
+ goto L_stu_4_wrong_potion;
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel examines your potion and nods.";
+ mes "\"Good work! You are ready for a promotion!\"";
+ next;
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbel presses his index and middle finger against your forehead.";
+ mes "\"Accept my blessing!\"";
+ next;
+ @Q_main_status = @Q_STATUS_STUDENT5;
+ callsub S_Update_Var;
+ mesn l("Auldsbel the Wizard");
+ mes "You feel new powers flowing into your body!";
+ @SUP_id = SKILL_MAGIC_TRANSMUTE;
+ @SUP_name$ = "Transmutation Magic";
+ @SUP_xp = 30000;
+ @SUP_lvl = 3;
+ callfunc "SkillUp";
+ next;
+ goto L_Main_menu;
+
+L_stu_4_wrong_potion:
+ mesn l("Auldsbel the Wizard");
+ mes "Auldsbell examines your potion, then shakes his head.";
+ mes "\"This doesn't look quite right, though I can't quite point at what the problem is. You will have to continue trying.\"";
+ next;
+ goto L_Main_menu;
+
+L_stu_4_no_potion:
+ mesn l("Auldsbel the Wizard");
+ mes "\"You seem to be rather lacking the concentration potion you need to justify your claim, my dear fellow.\"";
+ next;
+ goto L_Main_menu;
+
+L_stu_5:
+ mesn l("Auldsbel the Wizard");
+ mes "\"Hmm. Come back some other time, please; I still haven't figured out what to teach you next.\"";
+ close;
+
+L_mag_skill_ins:
+ mesn l("Auldsbel the Wizard");
+ mes "\"No, not at this time. You will have to advance in your overall magic skill before I can teach you more.\"";
+ next;
+ goto L_Main_menu;
+
+L_close:
+ close;
+
+S_Update_Var:
+ @Q_status = @Q_main_status | (@Q_component_quest << 5);
+ set QUEST_MAGIC,
+ (QUEST_MAGIC & ~(@Q_MASK)
+ | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/011-1/mapflags.txt b/npc/011-1/mapflags.txt
new file mode 100644
index 00000000..c36799bc
--- /dev/null
+++ b/npc/011-1/mapflags.txt
@@ -0,0 +1 @@
+//011-1 mapflag resave 011-1,103,34
diff --git a/npc/011-1/oscar.txt b/npc/011-1/oscar.txt
new file mode 100644
index 00000000..7e5f9481
--- /dev/null
+++ b/npc/011-1/oscar.txt
@@ -0,0 +1,486 @@
+
+
+
+
+function script HalloweenQuestWaterPumpkins {
+ if (Quest_Halloween != 5 || $@HalloweenQuest_PumpkinHunter$ != "")
+ goto L_Return;
+ $@HalloweenQuest_PumpkinHunter$ = strcharinfo(0);
+ donpcevent "Oscar::OnCommandSpg";
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+011-1,94,38,0 script Oscar NPC142,{
+ // Check we are at the good time of the year
+ if (!(gettime(6) == 11 && (gettime(5) >= 4 && gettime(5) <= 30))) goto L_NoEvent;
+ // Check halloween quest has been done or not.
+ @halloween_year = (Annual_Quest & BYTE_0_MASK) >> BYTE_0_SHIFT;
+ if (@halloween_year < (gettime(7) - 2000)) goto L_AdjustYear;
+ goto L_Init;
+
+L_AdjustYear:
+ Quest_Halloween = 0;
+ @halloween_year = gettime(7) - 2000;
+ callsub S_Update_Annual_Quest;
+ goto L_Init;
+
+L_NoEvent:
+ mes "[Oscar]";
+ mes "\"Welcome here!";
+ mes "I'm the owner of this farm. I'm growing fruits around here as you can see.\"";
+ next;
+ mes "\"Some of my fruits are for sale in my shop right here.";
+ mes "Don't hesitate to drop by. They are cheap!\"";
+ close;
+
+L_Init:
+ if (@halloween_year == (gettime(7) - 2000) + 1) goto L_QuestAlreadyDone;
+ if (Quest_Halloween == 0) goto L_Introduce;
+ if (Quest_Halloween == 1 || Quest_Halloween == 2) goto L_CheckSeeds;
+ if (Quest_Halloween == 3) goto L_HelpGrowSeeds;
+ if (Quest_Halloween == 4) goto L_HelpFillWaters;
+ if (Quest_Halloween == 5 && $@HalloweenQuest_PumpkinHunter$ == "") goto L_HelpWaterPatches;
+ if (Quest_Halloween == 5 && $@HalloweenQuest_PumpkinHunter$ == strcharinfo(0)) goto L_HelpCleanPumpkins;
+ if (Quest_Halloween == 5 && $@HalloweenQuest_PumpkinHunter$ != "") goto L_WateringBusy;
+ if (Quest_Halloween == 6) goto L_GetReward;
+ if (Quest_Halloween == 10) goto L_GetSlap;
+ goto L_End;
+
+L_Introduce:
+ mes "[Oscar]";
+ mes "\"Heya!\"";
+ next;
+ mes "\"I just came back from a long trip... Really tiring, but so interesting.\"";
+ menu
+ "Oh? Where did you go?", L_Next,
+ "Well... I believe.", L_End;
+
+L_Next:
+ mes "[Oscar]";
+ mes "\"Well, I travelled to the economic center of this continent.";
+ mes "It's north-east of here. Quite far I must say.\"";
+ next;
+ mes "\"But it was worth it really.";
+ mes "I went there to see ways to improve my little plantation here.";
+ mes "Oh well, sell some of my fruits too, see some of my fellow farmers. Classic business.\"";
+ next;
+ mes "\"Until a few days ago, they were holding a large party to celebrate Halloween.";
+ mes "Very nice really... And in particular, I saw these strange veggies they call pumpkins.\"";
+ next;
+ mes "\"They taste really good you see, but ahah, they weren't really for eating at that moment!";
+ mes "Anyway, I wondered if I could grow some here. Until now I only grow apples and oranges.\"";
+ menu
+ "That's an interesting idea!", L_Next1,
+ "Really, I hate pumpkins.", L_End;
+
+L_Next1:
+ mes "[Oscar]";
+ mes "\"However, I couldn't get any seeds, but I heard rumors in that city, saying we could find pumpkins in the forests north-east of here.";
+ mes "Most likely there are pumpkin seeds laying around them.\"";
+ next;
+ mes "\"They also mentioned something strange about them, but hey, who cares! Just rumors!\"";
+ next;
+
+ if (BaseLevel < 45)
+ goto L_TooYoung;
+
+ mes "\"Do you think you can get some for me?\"";
+ menu
+ "Sure. Leave it to me!", L_Next2,
+ "Well, I don't have time for that right now.", L_End;
+
+L_Next2:
+ mes "[Oscar]";
+ mes "\"Thanks so much " + strcharinfo(0) + "!";
+ mes "I can't wait to try them!\"";
+ Quest_Halloween = 1;
+ goto L_End;
+
+L_TooYoung:
+ mes "\"Ahm... That may be a little dangerous for you though. I don't want to send a kid in the deep forest.\"";
+ goto L_End;
+
+L_End:
+ @halloween_year = 0;
+ close;
+
+L_CheckSeeds:
+ if (countitem("PumpkinSeeds") < $@halloween_num_seeds)
+ goto L_NotEnoughSeeds;
+ delitem "PumpkinSeeds", $@halloween_num_seeds;
+ Quest_Halloween = 3;
+ mes "[Oscar]";
+ mes "\"Yes you found them! I can start to make them grow now!";
+ mes "Thank you so much " + strcharinfo(0) + "!\"";
+ goto L_End;
+
+L_NotEnoughSeeds:
+ mes "[Oscar]";
+ mes "\"Oh, it looks like you didn't find enough seeds yet...\"";
+ goto L_End;
+
+L_HelpGrowSeeds:
+ // Wait 20 seconds before triggering the next step.
+ if (@halloween_seeds_timer == 0)
+ @halloween_seeds_timer = gettimetick(2);
+ if ((gettimetick(2) - @halloween_seeds_timer) < 5)
+ goto L_WaitGrowSeeds;
+ mes "[Oscar]";
+ mes "\"Oh, you are back!\"";
+ next;
+ mes "You notice Oscar looks quite disappointed.";
+ next;
+ mes "[Oscar]";
+ mes "\"You see I could use some more help from you.";
+ mes "My supplies of water are quite low because of the long trip I made.";
+ mes "And I've been watering the pumpkin patches, but unfortunately I'm already out of water before I can see anything growing.\"";
+ next;
+ mes "\"If you could help me fill these " + $@halloween_num_water_bottles + " bottles with water, that would be very kind of you!\"";
+
+ @nature_magic = getskilllv(SKILL_MAGIC_NATURE);
+ if (@nature_magic > 1)
+ goto L_ProposeUseKaflosh;
+ @nature_magic = 0;
+ menu
+ "Yeah sure!", L_Next3,
+ "That sounds boring to do. No thanks.", L_End;
+
+L_Next3:
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("EmptyBottle") == 0)
+ goto L_InventoryFull;
+ @inventorylist_count = 0;
+ Quest_Halloween = 4;
+ goto L_GetEmptyBottles;
+
+L_ProposeUseKaflosh:
+ @nature_magic = 0;
+ menu
+ "Yeah sure!", L_Next4,
+ "Maybe I can help you water them with magic!", L_WaterWithKaflosh,
+ "That sounds boring to do. No thanks.", L_End;
+
+L_Next4:
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("EmptyBottle") == 0)
+ goto L_InventoryFull;
+ Quest_Halloween = 4;
+ goto L_GetEmptyBottles;
+
+L_GetEmptyBottles:
+ mes "[Oscar]";
+ mes "\"Ok, here are the " + $@halloween_num_water_bottles + " empty bottles.\"";
+ next;
+ mes "\"Oh and while you fill these bottles, why not bring some friends here as well?";
+ mes "Let's not be reckless. Maybe these rumors about the pumpkins are true.";
+ mes "Oh, unless you consider yourself strong enough to take care of this alone!\"";
+ getitem "EmptyBottle", $@halloween_num_water_bottles;
+ goto L_End;
+
+L_WaitGrowSeeds:
+ mes "[Oscar]";
+ mes "\"Thanks again " + strcharinfo(0) + "!";
+ mes "I'm planting these seeds right now.\"";
+ next;
+ mes "\"Stay around if you want to see what it looks like!";
+ mes "Amazing I tell you, amazing!\"";
+ goto L_End;
+
+L_HelpFillWaters:
+ mes "[Oscar]";
+ mes "\"Hey, you again!\"";
+ next;
+ if ($@HalloweenQuest_PumpkinHunter$ != "")
+ goto L_WateringBusy;
+ mes "\"So do you have the " + $@halloween_num_water_bottles + " bottles filled with fresh water?\"";
+ menu
+ "Yes! Fresh and clear water.", L_Next5,
+ "Oh, not yet. I'm on my way.", L_End;
+
+L_Next5:
+ if (countitem("BottleOfWater") < $@halloween_num_water_bottles)
+ goto L_NotEnoughWaters;
+
+ // make an additional check here, since the player had a dialog pause in the above menu.
+ if ($@HalloweenQuest_PumpkinHunter$ != "")
+ goto L_WateringBusy;
+ delitem "BottleOfWater", $@halloween_num_water_bottles;
+
+ mes "[Oscar]";
+ mes "\"Many thanks! I wonder what I would have done without you!";
+ mes "I'll water the patches right away. Watch this!\"";
+ Quest_Halloween = 5;
+ $@HalloweenQuest_PumpkinHunter$ = strcharinfo(0);
+ callsub S_StartPumpkinsSpawn;
+ goto L_End;
+
+L_WaterWithKaflosh:
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("BottleOfWater") == 0)
+ goto L_InventoryFull;
+ mes "[Oscar]";
+ mes "\"Oh, I see!";
+ next;
+ mes "\"So, I'm waiting you show me your skills!";
+ mes "Water the pumpkin patches right here with your awesome magic!\"";
+ next;
+ mes "\"Here is one bottle of water to do it.\"";
+ next;
+ mes "\"By the way, I told you about the rumors concerning these pumpkins.";
+ mes "Why not bring some friends here? Oh, unless you consider yourself strong enough!\"";
+ Quest_Halloween = 5;
+ getitem "BottleOfWater", 1;
+ goto L_End;
+
+L_HelpWaterPatches:
+ // We check again here that the player has magic skills
+ // This case happens when the player has logged off
+ // during the infestation phase.
+ @nature_magic = getskilllv(SKILL_MAGIC_NATURE);
+ if (!(@nature_magic > 1))
+ goto L_HelpFillWaters;
+ @nature_magic = 0;
+ mes "[Oscar]";
+ mes "\"Come on, water the pumpkin patches right here with your awesome magic!";
+ mes "For sure you will be more efficient than me!\"";
+ goto L_End;
+
+L_WateringBusy:
+ mes "[Oscar]";
+ mes "\"Sorry. I'm really busy at the moment.";
+ mes "May you come back later? Thank you, thank you...";
+ mes "Sorry I have to take care of this now!\"";
+ goto L_End;
+
+L_HelpCleanPumpkins:
+ mes "[Oscar]";
+ mes "\"Help me clean all these pumpkins! It's a disaster!\"";
+ goto L_End;
+
+L_NotEnoughWaters:
+ mes "[Oscar]";
+ mes "\"That's not enough bottles to water all these pumpkin patches.";
+ mes "Please bring me more.\"";
+ goto L_End;
+
+S_Update_Annual_Quest:
+ Annual_Quest = (Annual_Quest & ~(BYTE_0_MASK) | (@halloween_year << BYTE_0_SHIFT));
+ return;
+
+OnCommandSpg:
+ callsub S_StartPumpkinsSpawn;
+ end;
+
+S_StartPumpkinsSpawn:
+ $@HalloweenQuest_PumpkinsCount = $@halloween_num_pumpkins;
+ $@HalloweenQuest_PumpkinsState = 0;
+ initnpctimer;
+ return;
+
+L_QuestAlreadyDone:
+ mes "[Oscar]";
+ mes "\"I'm relieved all this mess is sorted out now.";
+ mes "That was interesting, but really, fruits are more quiet!\"";
+ goto L_End;
+
+OnInit:
+ $@halloween_num_seeds = 12;
+ $@halloween_num_water_bottles = 15;
+ $@halloween_num_pumpkins = $@halloween_num_seeds * 4;
+ end;
+
+OnTimer1000:
+ goto L_TimerFunction;
+
+OnTimer2000:
+ goto L_TimerFunction;
+
+OnTimer3000:
+ goto L_TimerFunction;
+
+L_TimerFunction:
+ if ($@HalloweenQuest_PumpkinsState != 1)
+ end;
+ callsub S_CheckPlayer;
+ $@HalloweenQuest_PumpkinsTimer = $@HalloweenQuest_PumpkinsTimer + 1;
+ if (mobcount("011-1", "Oscar::OnPD") <= 0 &&
+ mobcount("011-1", "Oscar::OnPDP") <= 0 &&
+ $@HalloweenQuest_PumpkinsCount <= 0)
+ goto L_AllPumpkinsDead;
+ // A quick "cheer up"
+ if ($@HalloweenQuest_PumpkinsTimer == 300)
+ npctalk strnpcinfo(0), "Hurry up " + $@HalloweenQuest_PumpkinHunter$ + "! My farm is being ruined!";
+ // 7 mins max
+ if ($@HalloweenQuest_PumpkinsTimer > 420)
+ goto L_PumpkinsRuined;
+
+ if (getnpctimer(0) >= 2900)
+ goto L_TrySpawnPumpkin;
+ end;
+
+L_TrySpawnPumpkin:
+ if ($@HalloweenQuest_PumpkinsCount > 0)
+ areamonster "011-1", 97, 40, 101, 44, "", 1063, 1, "Oscar::OnPD";
+ setnpctimer 0;
+ end;
+
+OnTimer2500:
+ if ($@HalloweenQuest_PumpkinsState != 0)
+ end;
+ areamonster "011-1", 97, 40, 101, 44, "", 1063, 2, "Oscar::OnPD";
+ end;
+
+OnTimer6000:
+ if ($@HalloweenQuest_PumpkinsState != 0)
+ end;
+ emotion EMOTE_AFRAID;
+ npctalk strnpcinfo(0), "Oh no, these pumpkins look strange and infested with bugs! Help me get rid of them " + $@HalloweenQuest_PumpkinHunter$ + "!";
+ $@HalloweenQuest_PumpkinsState = 1;
+ setnpctimer 0;
+ end;
+
+OnPD:
+ if (strcharinfo(0) != $@HalloweenQuest_PumpkinHunter$)
+ goto L_KillBadHunter;
+ $@HalloweenQuest_PumpkinsCount = $@HalloweenQuest_PumpkinsCount - 1;
+ if (@discover_poisonous_pumpkin_again == 0)
+ message strcharinfo(0), "Oh no! These pumpkins are poisonous as well!";
+ @discover_poisonous_pumpkin_again = 1;
+ // Small damages
+ misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
+ heal -10, 0;
+ sc_start SC_POISON, 1, 3;
+ // Spawn mobs or get items
+ @halloween_rand = rand(0,100);
+ // Seeds reward
+ if (@halloween_rand < 10)
+ getitem "PumpkinSeeds", 1;
+ // Pumpkin helmet reward
+ if (@halloween_rand >= 10 && @halloween_rand < 17)
+ getitem "PumpkinHelmet", 1;
+ // huntsman spider x1
+ if (@halloween_rand < (15*BaseLevel)/100)
+ areamonster "011-1", 97, 40, 101, 44, "", 1083, 1, "Oscar::OnPDP";
+ // Or spider x1
+ if (@halloween_rand >= (15*BaseLevel)/100 && @halloween_rand < (75*BaseLevel)/100)
+ areamonster "011-1", 97, 40, 101, 44, "", 1012, 1, "Oscar::OnPDP";
+ // Or archant x2
+ if (@halloween_rand >= (75*BaseLevel)/100)
+ areamonster "011-1", 97, 40, 101, 44, "", 1060, 2, "Oscar::OnPDP";
+
+ @halloween_rand = 0;
+ end;
+
+OnPDP:
+ end;
+
+L_KillBadHunter:
+ misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
+ heal -Hp, 0;
+ end;
+
+L_PumpkinsRuined:
+ npctalk strnpcinfo(0), "No! " + $@HalloweenQuest_PumpkinHunter$ + " how could you let that happen? All my farm is a mess now! All my trees are infested with bugs!";
+ goto L_Fail;
+
+L_AllPumpkinsDead:
+ goto L_Success;
+
+S_CheckPlayer:
+ if (attachrid(getcharid(3, $@HalloweenQuest_PumpkinHunter$)) == 0)
+ goto L_PlayerOff;
+ if (ispcdead())
+ goto L_PlayerDead;
+ if (isin("011-1",20,5,130,110) == 0)
+ goto L_PlayerLeft;
+ detachrid;
+ return;
+
+L_PlayerOff:
+ npctalk strnpcinfo(0), "What? Where is " + $@HalloweenQuest_PumpkinHunter$ + "? Someone, help me!";
+ goto L_Fail;
+
+L_PlayerLeft:
+ npctalk strnpcinfo(0), "What the!! " + $@HalloweenQuest_PumpkinHunter$ + " left me alone with all this! Someone, help me!";
+ goto L_Fail;
+
+L_PlayerDead:
+ npctalk strnpcinfo(0), "Oh no I can't believe it! " + $@HalloweenQuest_PumpkinHunter$ + " just died! Someone, help me!";
+ goto L_Fail;
+
+L_Fail:
+ // If the player is logged off, since we check every second that the player
+ // is online, we can consider it's an accident, so we will allow to redo the quest
+ // Otherwise, it's a "valid" fail.
+ if (attachrid(getcharid(3, $@HalloweenQuest_PumpkinHunter$)))
+ Quest_Halloween = 10;
+ goto L_Clean;
+
+L_Success:
+ // Make this check again or the server will crash.
+ if (attachrid(getcharid(3, $@HalloweenQuest_PumpkinHunter$)) == 0)
+ goto L_PlayerOff;
+ Quest_Halloween = 6;
+ emotion EMOTE_GRIN;
+ npctalk strnpcinfo(0), "Hurray, " + $@HalloweenQuest_PumpkinHunter$ + " you did it! Thank you thank you! Come here!";
+ goto L_Clean;
+
+L_Clean:
+ killmonster "011-1", "Oscar::OnPD";
+ killmonster "011-1", "Oscar::OnPDP";
+ $@HalloweenQuest_PumpkinHunter$ = "";
+ $@HalloweenQuest_PumpkinsCount = 0;
+ $@HalloweenQuest_PumpkinsState = 0;
+ $@HalloweenQuest_PumpkinsTimer = 0;
+ stopnpctimer;
+ detachrid;
+ end;
+
+L_GetReward:
+ mes "[Oscar]";
+ mes "\"" + strcharinfo(0) + ", you were wonderful!";
+ mes "My farm is safe thanks to you!\"";
+ next;
+ mes "\"Look, when I went to this city a few days ago, I could find this magnificient fruit.";
+ mes "I believe not many exist in the world, but hey, this one is for you!\"";
+
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("GoldenDeliciousApple") == 0)
+ goto L_InventoryFull;
+ @inventorylist_count = 0;
+ getitem "GoldenDeliciousApple", 1;
+ @halloween_year = gettime(7) - 2000 + 1;
+ Quest_Halloween = 0;
+ callsub S_Update_Annual_Quest;
+ goto L_End;
+
+L_GetSlap:
+ mes "[Oscar]";
+ mes "\"Ah! There you are "+strcharinfo(0)+"!";
+ next;
+ mes "\"As you can see, my farm is safe now.";
+ mes "I can't really say it's thanks to you though!\"";
+ next;
+ mes "\"Well, I won't be a bad guy.";
+ mes "Take this for your trouble and farewell!\"";
+
+ getinventorylist;
+ if (@inventorylist_count == 100 && countitem("CandyPumpkin") == 0)
+ goto L_InventoryFull;
+ @inventorylist_count = 0;
+ getitem "CandyPumpkin", 5;
+ @halloween_year = gettime(7) - 2000 + 1;
+ Quest_Halloween = 0;
+ callsub S_Update_Annual_Quest;
+ goto L_End;
+
+L_InventoryFull:
+ @inventorylist_count = 0;
+ next;
+ mes "\"Ah, but you cannot carry anything else!";
+ mes "Make some room first.\"";
+ goto L_End;
+}
diff --git a/npc/011-1/shops.txt b/npc/011-1/shops.txt
new file mode 100644
index 00000000..8fd551b4
--- /dev/null
+++ b/npc/011-1/shops.txt
@@ -0,0 +1,18 @@
+// The Mana World Script
+// (C) Jesusalva, 2021
+// Licensed under GPLv2 or later
+
+011-1,80,33,0 script Fruit Store NPC400,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem GreenApple;
+ sellitem RedApple;
+ sellitem Orange;
+ .distance = 5;
+ end;
+}
+
diff --git a/npc/011-3/_import.txt b/npc/011-3/_import.txt
new file mode 100644
index 00000000..1a659519
--- /dev/null
+++ b/npc/011-3/_import.txt
@@ -0,0 +1,6 @@
+// Map 011-3: Hermit's Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/011-3/_mobs.txt",
+"npc/011-3/_warps.txt",
+"npc/011-3/hermit.txt",
+"npc/011-3/mapflags.txt",
diff --git a/npc/011-3/_mobs.txt b/npc/011-3/_mobs.txt
new file mode 100644
index 00000000..c3607aac
--- /dev/null
+++ b/npc/011-3/_mobs.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 011-3: Hermit's Cave mobs
+011-3,0,0,0,0 monster Bat 1017,10,0,0
+011-3,0,0,0,0 monster Silkworm 1035,3,60000,30000
diff --git a/npc/011-3/_warps.txt b/npc/011-3/_warps.txt
new file mode 100644
index 00000000..4e047d0c
--- /dev/null
+++ b/npc/011-3/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 011-3: Hermit's Cave warps
+011-3,46,24,0 warp #011-3_46_24 0,0,011-4,98,30
diff --git a/npc/011-3/hermit.txt b/npc/011-3/hermit.txt
new file mode 100644
index 00000000..8ea9017b
--- /dev/null
+++ b/npc/011-3/hermit.txt
@@ -0,0 +1,64 @@
+
+011-3,45,33,0 script Arkim NPC116,{
+ mes "[Arkim the Hermit]";
+ mes "\"Do you want to go back outside?\"";
+ if (@knowhermitstory == 1) goto L_Short_Menu;
+ menu
+ "Yes, please!", L_Sure,
+ "Not yet.", L_close,
+ "Actually... Why do you live here?", L_Interested;
+
+L_Short_Menu:
+ menu
+ "Yes, please!", L_Sure,
+ "Not yet.", L_close,
+ "What was that deal you were offering?", L_Quest;
+
+L_Sure:
+ warp "011-1", 60, 95;
+ close;
+
+L_Interested:
+ mes "[Arkim the Hermit]";
+ mes "\"Oh my, never really thought about it!\"";
+ next;
+ mes "[Arkim the Hermit]";
+ mes "\"I guess mostly I enjoy experimenting with the bats here.\"";
+ menu
+ "I see...", L_close,
+ "What type of experimenting?", L_Experiment;
+
+L_Experiment:
+ mes "[Arkim the Hermit]";
+ mes "\"Never really thought about it either...\"";
+ next;
+ mes "You watch as the hermit's old, lazy eyes open wide, and the old man comes alive with energy.";
+ next;
+ mes "[Arkim the Hermit]";
+ mes "\"I GUESS I REALLY LIKE CUTTING THEM UP TO SEE HOW THEY WORK!! HAHAHA!\"";
+ menu
+ "YOU'RE CRAZY!", L_close,
+ "Right... me too! Can I help?", L_Quest;
+
+L_close:
+ close;
+
+L_Quest:
+ @knowhermitstory = 1;
+
+ @dq_level = 20;
+ @dq_cost = 4;
+ @dq_count = 3;
+ @dq_name$ = "BatWing";
+ @dq_friendly_name$ = "bat wings";
+ @dq_money = 600;
+ @dq_exp = 100;
+
+ callfunc "DailyQuest";
+
+ next;
+
+ mes "[Arkim the Hermit]";
+ mes "\"And remember: never lend your toothbrush to a slime!\"";
+ close;
+}
diff --git a/npc/011-3/mapflags.txt b/npc/011-3/mapflags.txt
new file mode 100644
index 00000000..2b696f6d
--- /dev/null
+++ b/npc/011-3/mapflags.txt
@@ -0,0 +1 @@
+//011-3 mapflag resave 011-1,103,34
diff --git a/npc/011-4/_import.txt b/npc/011-4/_import.txt
new file mode 100644
index 00000000..fbb867b2
--- /dev/null
+++ b/npc/011-4/_import.txt
@@ -0,0 +1,6 @@
+// Map 011-4: Lake Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/011-4/_mobs.txt",
+"npc/011-4/_warps.txt",
+"npc/011-4/bl_barrier.txt",
+"npc/011-4/mapflags.txt",
diff --git a/npc/011-4/_mobs.txt b/npc/011-4/_mobs.txt
new file mode 100644
index 00000000..0d63b610
--- /dev/null
+++ b/npc/011-4/_mobs.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 011-4: Lake Cave mobs
+011-4,77,50,19,19 monster Spiky Mushroom 1019,1,100000,30000
+011-4,118,134,19,19 monster Cave Snake 1021,1,100000,30000
+011-4,0,0,0,0 monster Cave Snake 1021,40,0,0
+011-4,0,0,0,0 monster Spiky Mushroom 1019,15,0,0
+011-4,85,98,28,37 monster Cave Maggot 1056,10,100000,30000
+011-4,88,41,55,17 monster Cave Maggot 1056,10,100000,30000
+011-4,0,0,0,0 monster Bat 1017,20,180000,40000
diff --git a/npc/011-4/_warps.txt b/npc/011-4/_warps.txt
new file mode 100644
index 00000000..0aa49d72
--- /dev/null
+++ b/npc/011-4/_warps.txt
@@ -0,0 +1,13 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 011-4: Lake Cave warps
+011-4,98,28,0 warp #011-4_98_28 0,0,011-3,46,25
+011-4,154,106,0 warp #011-4_154_106 0,0,009-3,20,56
+011-4,64,55,0 warp #011-4_64_55 0,0,011-6,47,184
+011-4,41,77,0 warp #011-4_41_77 0,0,011-6,24,205
+011-4,114,40,0 warp #011-4_114_40 0,0,011-6,97,168
+011-4,130,52,0 warp #011-4_130_52 0,0,011-6,114,183
+011-4,139,81,0 warp #011-4_139_81 0,0,011-6,123,212
+011-4,111,95,0 warp #011-4_111_95 0,0,011-6,95,226
+011-4,87,106,0 warp #011-4_87_106 0,0,011-6,68,234
+011-4,57,25,0 warp #011-4_57_25 1,0,011-6,186,181
+011-4,70,138,0 warp #011-4_70_138 0,0,011-6,266,181
diff --git a/npc/011-4/bl_barrier.txt b/npc/011-4/bl_barrier.txt
new file mode 100644
index 00000000..6c76151f
--- /dev/null
+++ b/npc/011-4/bl_barrier.txt
@@ -0,0 +1,24 @@
+
+011-4,136,141,0 script #BL_Barrier NPC45,0,0,{
+ @state = ((QUEST_Hurnscald & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT);
+
+ if (@state >= 6) goto L_Cave_Abandoned;
+ if (@state >= 4) goto L_Lord_Barrier_Open;
+
+ message strcharinfo(0), "This entrance appears to be locked.";
+ goto L_End;
+
+L_Cave_Abandoned:
+ message strcharinfo(0), "This place looks like it was abandoned.";
+ warp "011-6",251,275;
+ goto L_End;
+
+L_Lord_Barrier_Open:
+ message strcharinfo(0), "You insert the silver arrow key and unlock the entrance.";
+ warp "011-6",251,275;
+ goto L_End;
+
+L_End:
+ @state = 0;
+ end;
+}
diff --git a/npc/011-4/mapflags.txt b/npc/011-4/mapflags.txt
new file mode 100644
index 00000000..b9eb6c70
--- /dev/null
+++ b/npc/011-4/mapflags.txt
@@ -0,0 +1 @@
+//011-4 mapflag resave 011-1,103,34
diff --git a/npc/011-6/_import.txt b/npc/011-6/_import.txt
new file mode 100644
index 00000000..f8211577
--- /dev/null
+++ b/npc/011-6/_import.txt
@@ -0,0 +1,8 @@
+// Map 011-6: Bandit Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/011-6/_mobs.txt",
+"npc/011-6/_warps.txt",
+"npc/011-6/barrier.txt",
+"npc/011-6/bryant.txt",
+"npc/011-6/crastur.txt",
+"npc/011-6/mapflags.txt",
diff --git a/npc/011-6/_mobs.txt b/npc/011-6/_mobs.txt
new file mode 100644
index 00000000..21079b11
--- /dev/null
+++ b/npc/011-6/_mobs.txt
@@ -0,0 +1,49 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 011-6: Bandit Cave mobs
+011-6,152,72,141,63 monster Silkworm 1035,9,30000,100000
+011-6,263,38,15,17 monster Bandit 1064,1,30000,30000
+011-6,262,114,19,19 monster Bandit 1064,1,30000,30000
+011-6,132,119,8,10 monster Bandit 1064,1,30000,30000
+011-6,170,66,8,10 monster Bandit 1064,1,30000,30000
+011-6,67,70,8,10 monster Bandit 1064,1,30000,30000
+011-6,196,107,8,10 monster Bandit 1064,1,30000,30000
+011-6,196,29,8,10 monster Bandit 1064,1,30000,30000
+011-6,36,37,8,10 monster Bandit 1064,1,30000,30000
+011-6,112,40,22,24 monster Bandit 1064,2,30000,60000
+011-6,31,99,8,10 monster Bandit 1064,1,30000,30000
+011-6,223,250,61,32 monster Bat 1017,5,30000,100000
+011-6,224,175,59,12 monster Bat 1017,3,30000,100000
+011-6,257,77,2,63 monster Bat 1017,6,30000,100000
+011-6,192,77,2,63 monster Bat 1017,9,30000,100000
+011-6,167,110,43,6 monster Bat 1017,9,30000,100000
+011-6,75,70,52,48 monster Bat 1017,23,30000,100000
+011-6,78,195,64,48 monster Bat 1017,9,30000,100000
+011-6,168,109,18,18 monster Spiky Mushroom 1019,5,30000,100000
+011-6,199,76,18,18 monster Spiky Mushroom 1019,5,30000,100000
+011-6,88,163,14,13 monster Spiky Mushroom 1019,5,30000,100000
+011-6,48,113,17,9 monster Spiky Mushroom 1019,5,30000,100000
+011-6,177,94,10,14 monster Evil Mushroom 1013,4,30000,100000
+011-6,194,49,10,14 monster Evil Mushroom 1013,2,30000,100000
+011-6,51,115,23,12 monster Evil Mushroom 1013,2,30000,100000
+011-6,63,169,6,8 monster Evil Mushroom 1013,2,30000,100000
+011-6,100,226,14,7 monster Spiky Mushroom 1019,3,30000,100000
+011-6,260,44,26,8 monster Spiky Mushroom 1019,3,30000,100000
+011-6,272,48,10,14 monster Evil Mushroom 1013,2,30000,100000
+011-6,95,78,15,12 monster Yellow Slime 1007,5,30000,100000
+011-6,59,36,9,12 monster Yellow Slime 1007,5,30000,100000
+011-6,26,69,9,12 monster Yellow Slime 1007,5,30000,100000
+011-6,61,101,7,5 monster Yellow Slime 1007,3,30000,100000
+011-6,50,61,4,6 monster Yellow Slime 1007,3,30000,100000
+011-6,128,39,4,6 monster Yellow Slime 1007,3,30000,100000
+011-6,41,178,4,6 monster Yellow Slime 1007,1,30000,100000
+011-6,70,229,4,6 monster Yellow Slime 1007,1,30000,100000
+011-6,20,204,4,6 monster Yellow Slime 1007,1,30000,100000
+011-6,114,190,4,6 monster Yellow Slime 1007,4,30000,100000
+011-6,137,205,4,6 monster Yellow Slime 1007,2,30000,100000
+011-6,79,220,14,7 monster Cave Snake 1021,3,30000,100000
+011-6,115,210,14,7 monster Cave Snake 1021,3,30000,100000
+011-6,41,193,15,15 monster Cave Snake 1021,3,30000,100000
+011-6,70,143,15,15 monster Cave Snake 1021,3,30000,100000
+011-6,97,183,14,7 monster Cave Snake 1021,3,30000,100000
+011-6,172,252,4,6 monster Cave Maggot 1056,4,30000,100000
+011-6,263,236,8,2 monster Cave Maggot 1056,3,30000,100000
diff --git a/npc/011-6/_warps.txt b/npc/011-6/_warps.txt
new file mode 100644
index 00000000..72c7f747
--- /dev/null
+++ b/npc/011-6/_warps.txt
@@ -0,0 +1,24 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 011-6: Bandit Cave warps
+011-6,51,75,0 warp #011-6_51_75 0,0,011-6,260,127
+011-6,61,71,0 warp #011-6_61_71 0,0,011-6,270,124
+011-6,270,125,0 warp #011-6_270_125 0,0,011-6,61,72
+011-6,260,128,0 warp #011-6_260_128 0,0,011-6,51,76
+011-6,145,118,0 warp #011-6_145_118 0,0,011-6,47,119
+011-6,196,26,0 warp #011-6_196_26 0,0,011-6,261,46
+011-6,261,47,0 warp #011-6_261_47 0,0,011-6,196,27
+011-6,271,52,0 warp #011-6_271_52 0,0,011-6,98,31
+011-6,98,30,0 warp #011-6_98_30 0,0,011-6,271,51
+011-6,47,120,0 warp #011-6_47_120 0,0,011-6,145,117
+011-6,49,101,0 warp #011-6_49_101 0,0,011-1,38,37
+011-6,24,206,0 warp #011-6_24_206 0,0,011-4,41,78
+011-6,47,185,0 warp #011-6_47_185 0,0,011-4,64,56
+011-6,97,169,0 warp #011-6_97_169 0,0,011-4,114,41
+011-6,113,182,0 warp #011-6_113_182 0,0,011-4,131,53
+011-6,122,211,0 warp #011-6_122_211 0,0,011-4,140,82
+011-6,94,225,0 warp #011-6_94_225 0,0,011-4,112,96
+011-6,68,235,0 warp #011-6_68_235 0,0,011-4,87,107
+011-6,251,278,0 warp #011-6_251_278 0,0,011-4,111,122
+011-6,186,182,0 warp #011-6_186_182 1,0,011-4,57,26
+011-6,266,182,0 warp #011-6_266_182 0,0,011-4,70,139
+011-6,174,256,0 warp #011-6_174_256 0,0,011-6,264,237
diff --git a/npc/011-6/barrier.txt b/npc/011-6/barrier.txt
new file mode 100644
index 00000000..8de20cc9
--- /dev/null
+++ b/npc/011-6/barrier.txt
@@ -0,0 +1,15 @@
+011-6,264,236,0 script #BL_Barrier2 NPC45,0,0,{
+ @state = ((QUEST_Hurnscald & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT);
+
+ if (@state >= 6) goto L_Lord_Hideout_Open;
+ message strcharinfo(0), "You have a feeling that you should not enter this place now.";
+ goto L_End;
+
+L_Lord_Hideout_Open:
+ warp "011-6",174,255;
+ goto L_End;
+
+L_End:
+ @state = 0;
+ end;
+}
diff --git a/npc/011-6/bryant.txt b/npc/011-6/bryant.txt
new file mode 100644
index 00000000..c2de975f
--- /dev/null
+++ b/npc/011-6/bryant.txt
@@ -0,0 +1,73 @@
+
+011-6,27,200,0 script Bryant NPC126,{
+ @state = ((QUEST_Hurnscald & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT);
+
+ if (@state >= 5) goto L_Bryant_Quiet;
+ if (@state == 4) goto L_Bryant_Waits;
+ if (@state == 3) goto L_Bryant_Summon;
+
+ mes "[Bryant]";
+ mes "\"I'm looking everywhere for the bandit leader. I can't seem to find him.\"";
+ goto L_close;
+
+L_Bryant_Summon:
+ mes "[Bryant]";
+ mes "\"I ran into that bandit lord and he got me good. I'm going to stay here for a while and heal. He dropped this key. Take it. You might be able to handle him better than I could.\"";
+ next;
+ mes "Bryant gives you a key, shaped to look like a small silver arrow.";
+ next;
+ mes "\"I believe I saw him run into a cave south and east of here. There is a red carpet in front of the cave entrance. Be careful and good luck.\"";
+ @state = 4;
+ callsub S_Update_Var;
+ monster "011-6",260,250,"BanditLord",1065,1, "Bryant::OnBanditLordDead";
+ goto L_close;
+
+OnBanditLordDead:
+ message strcharinfo(0), "You killed the bandit lord.";
+ @state = ((QUEST_Hurnscald & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT);
+ if (@state != 4)
+ goto L_End;
+ @state = 5;
+ callsub S_Update_Var;
+ BOSS_POINTS = BOSS_POINTS + 20;
+ message strcharinfo(0), "You gain 20 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ goto L_End;
+
+L_End:
+ @state = 0;
+ end;
+
+L_Bryant_Waits:
+ mes "[Bryant]";
+ mes "\"I think the bandit lord is still around. I fear this could be dangerous for the people of Hurnscald. When you went to the cave with the red carpet in front of it, did you find him and kill him?\"";
+ menu
+ "No.", L_Bryant_No,
+ "Yes.", L_Bryant_Yes;
+
+L_Bryant_No:
+ mes "[Bryant]";
+ mes "\"Well, maybe he ran off. I'm pretty sure he should be there now.\"";
+ killmonster "011-6", "Bryant::OnBanditLordDead";
+ monster "011-6",260,250,"BanditLord",1065,1, "Bryant::OnBanditLordDead";
+ goto L_close;
+
+L_Bryant_Yes:
+ mes "[Bryant]";
+ mes "\"I don't think you killed him. Please try to find and kill him. He should be in the cave south and east of here with the red carpet in front of it.\"";
+ killmonster "011-6", "Bryant::OnBanditLordDead";
+ monster "011-6",260,250,"BanditLord",1065,1, "Bryant::OnBanditLordDead";
+ goto L_close;
+
+L_Bryant_Quiet:
+ mes "[Bryant]";
+ mes "\"Glad that bandit leader got what was coming to him.\"";
+ goto L_close;
+
+L_close:
+ @state = 0;
+ close;
+
+S_Update_Var:
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_0_MASK) | (@state << NIBBLE_0_SHIFT));
+ return;
+}
diff --git a/npc/011-6/crastur.txt b/npc/011-6/crastur.txt
new file mode 100644
index 00000000..5042d0e5
--- /dev/null
+++ b/npc/011-6/crastur.txt
@@ -0,0 +1,220 @@
+011-6,172,250,0 script Crastur the Ugly NPC418,{
+ @spants_state = ((QUEST_WG_state & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT);
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+ if (@spants_state < 3) goto L_Regular;
+ if (@spants_state == 3) goto L_Ask;
+ if (@spants_state == 4 || @spants_state == 5 || @spants_state == 6) goto L_Ask_Again;
+ goto L_Main;
+
+
+L_Ask:
+ mes "[Crastur]";
+ mes "";
+ mes "\"Well, well, well\"";
+ next;
+ mes "[Crastur]";
+ mes "";
+ mes "\"Just look who arrived here\"";
+ emotion EMOTE_EVIL, strcharinfo(0);
+ next;
+ mes "[Crastur]";
+ mes "";
+ mes "\"If this isn't the person that cleared my way to success\"";
+ menu
+ "\"Who? Me?\"", L_Unsure,
+ "\"Yes I killed the Bandit Lord, but not to make room for more scumbags\"", L_Insult,
+ "\"I heard you know a lot\"", L_Ask_Cont,
+ "\"Ugh, no. I have to leave now. Bye.\"", L_close;
+
+L_Ask_Again:
+ mes "[Crastur]";
+ mes "";
+ mes "\"Hello again\"";
+ mes "\"Did you do your part of the deal yet?\"";
+ menu
+ "\"No, I wanted to know if you can tell me anything about me\"", L_Personal,
+ "\"Probably not, what was that again?\"", L_Pirate_Proof,
+ "\"Yes, check this Bandana I brought.\"", L_Bandana,
+ "\"No Idea, Bye.\"", L_close;
+
+L_Ask_Cont:
+ mes "[Crastur]";
+ mes "";
+ mes "\"Yes I do, for a price.\"";
+ menu
+ "Explain Hetchels story", L_Jibber,
+ "Interesting", L_Main;
+
+L_Jibber:
+ mes "You begin to tell Crastur about Hetchel and her Problems";
+ next;
+ mes "Crastur interrupts you";
+ mes "[Crastur]";
+ mes "";
+ mes "\"I do not care about petty problems, get to the point!\"";
+ @spants_state = 4;
+ callsub S_Update_Spants;
+ menu
+ "\"Hetchel needs the Plans for Cotton Trousers Stolen from Lora Tay\"", L_Jibber_Cont,
+ "\"Don't talk to me like that\" (Leave)", L_close;
+
+L_Jibber_Cont:
+ mes "[Crastur]";
+ mes "";
+ mes "\"this can be done quickly\"";
+ next;
+ mes "Crastur pauses and checks his papers";
+ mes "\"...\"";
+ next;
+ mes "[Crastur]";
+ mes "";
+ mes "\"The issue here is\"";
+ mes "\"you have literally nothing that is of any value to me\"";
+ next;
+ mes "[Crastur]";
+ mes "";
+ mes "\"Although... Since you claim to be a hero and everything...\"";
+ mes "\"I do have a problem with those pirates in Tulimshar. They are ruining my Business\"";
+ next;
+ mes "[Crastur]";
+ mes "";
+ mes "\"Bring me proof that you killed all of the pirates!\"";
+ next;
+ @spants_state = 5;
+ callsub S_Update_Spants;
+ menu
+ "\"I have it right here\"", L_Bandana,
+ "\"What kind of proof?\"", L_Pirate_Proof;
+
+
+L_Pirate_Proof:
+ mes "[Crastur]";
+ mes "";
+ mes "\"It is for sure the Pirates give their souls for the rescue of their booty.\"";
+ mes "\"Bring me something unique from their treasure and I will give you those plans in return.\"";
+ menu
+ "\"I have it with me.\"", L_Bandana,
+ "\"I will try my best.\"", L_close;
+
+L_Bandana:
+ getinventorylist;
+ if (countitem("Bandana") < 1) goto L_No_Item;
+ if (@spants_state != 6) goto L_Wrong_Item;
+ mes "Crasturs gazes at the bandana in your hand. He scratches his right arm, then he nods";
+ mes "[Crastur]";
+ mes "";
+ mes "\"I am a man of honour, I always pay my debt\"";
+ next;
+ mes "[Crastur]";
+ mes "";
+ mes "\"Here, I couldnt get the original Sheet but this copy should do well enough\"";
+ next;
+ mes "\"Crastur hands you a page ripped out of his Almanach that has dotted lines in green and red Ink all over it";
+ next;
+ mes "You put the plans into a hidden pocket";
+ @spants_state = 7;
+ callsub S_Update_Spants;
+ goto L_close;
+
+L_No_Item:
+ mes "[Crastur]";
+ mes "";
+ mes "\"What Bandana are we talking about? - Next time you come to me, bring your stuff.\"";
+ goto L_close;
+
+L_Wrong_Item:
+ mes "Crastur takes a look at the bandana.";
+ next;
+ mes "[Crastur]";
+ mes "THIS IS NOT FROM THE PIRATES FROM TULIMSHAR, it is a cheap scam.";
+ emotion EMOTE_PERTURBED, strcharinfo(0);
+ mes "As far as you can tell through his mask he seems very mad";
+ goto L_Insult;
+
+L_Regular:
+ mes "[Crastur]";
+ mes "";
+ mes "\"Well, well, well\"";
+ next;
+ mes "[Crastur]";
+ mes "";
+ mes "\"Just look who arrived here\"";
+ next;
+ mes "[Crastur]";
+ mes "";
+ mes "\"If this isn't the person that cleared my way to success\"";
+ menu
+ "\"Who? Me?\"", L_Unsure,
+ "\"Yes I killed the Bandit Lord, but not to make room for more scumbags\"", L_Insult,
+ "\"Ugh, no. I have to leave now. Bye.\"", L_close;
+
+L_Insult:
+ npctalk strnpcinfo(0), "Crastur : Die " + strcharinfo(0) + "!";
+ heal -10000, 0;
+ emotion EMOTE_VICIOUS;
+ mes "[Crastur]";
+ mes "";
+ mes "\"Oh I am so sorry, my Dagger must have slipped\"";
+ goto L_close;
+
+L_Unsure:
+ mes "[Crastur]";
+ mes "";
+ mes "\"Yes I hid in a corner while you killed my former master\"";
+ mes "\"When he left I claimed command over Argaeses Rats, Caves and Dungeons.\"";
+ mes "\"Do not underestimate me, I do know a lot more than you might guess\"";
+ goto L_Main;
+
+L_Main:
+ if((@inspector >= 1 && @inspector <= 7) || @inspector == 9) goto L_Main_Inspector;
+ menu
+ "\"What things do you know about me?\"", L_Personal,
+ "\"Bye\"", L_close;
+
+L_Main_Inspector:
+ menu
+ "\"What things do you know about me?\"", L_Personal,
+ "\"Do you know anything about the Robberies in Hurnscald?\"", L_Hurnscald,
+ "\"Bye\"", L_close;
+
+L_Personal:
+ mes "";
+ mes "Crastur digs in a pile of old paper";
+ next;
+ mes "[Crastur]";
+ mes "";
+ mes "\"Ah. Here it is:\"";
+ mes "\"Today you have accomplished tasks that are worth " + DailyQuestPoints + " Hours in the Northern Mines\"";
+ next;
+ if (BOSS_POINTS < 1000) goto L_Worm;
+ emotion EMOTE_DEAD, strcharinfo(0);
+ mes "[Crastur]";
+ mes "";
+ mes "\"Also you seem to be quite a hero, it appears you have a record in the Almanach\"";
+ mes "Crastur turns a giant book upside down";
+ mes "\"According to this you have gained " + BOSS_POINTS / 1000 + "thousand Points in the eternal charts already.\"";
+ mes "Crastur shudders";
+ goto L_close;
+
+L_Worm:
+ emotion EMOTE_SUSPICIOUS, strcharinfo(0);
+ mes "[Crastur]";
+ mes "\"Other than that you have not done anything notable for the mana world.\"";
+ goto L_close;
+
+L_Hurnscald:
+ emotion EMOTE_FACEPALM, strcharinfo(0);
+ mes "Crastur makes a barking sound that probably was meant as a laugh.";
+ mes "[Crastur]";
+ mes "";
+ mes "\"I am sorry but it is not in my best interest to talk about my business with you.\"";
+ goto L_close;
+
+S_Update_Spants:
+ QUEST_WG_state = (QUEST_WG_state & ~(NIBBLE_2_MASK) | (@spants_state << NIBBLE_2_SHIFT));
+ return;
+
+L_close:
+ @spants_state = 0;
+ close;
+}
diff --git a/npc/011-6/mapflags.txt b/npc/011-6/mapflags.txt
new file mode 100644
index 00000000..6ff6bebe
--- /dev/null
+++ b/npc/011-6/mapflags.txt
@@ -0,0 +1 @@
+//011-6 mapflag resave 011-1,103,34
diff --git a/npc/012-1/_import.txt b/npc/012-1/_import.txt
new file mode 100644
index 00000000..bc85c0c4
--- /dev/null
+++ b/npc/012-1/_import.txt
@@ -0,0 +1,9 @@
+// Map 012-1: Woodland Hills
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/012-1/_mobs.txt",
+"npc/012-1/_warps.txt",
+"npc/012-1/amrak.txt",
+"npc/012-1/flowerpentagram2.txt",
+"npc/012-1/injured-mouboo.txt",
+"npc/012-1/mapflags.txt",
+"npc/012-1/shops.txt",
diff --git a/npc/012-1/_mobs.txt b/npc/012-1/_mobs.txt
new file mode 100644
index 00000000..96d6fef8
--- /dev/null
+++ b/npc/012-1/_mobs.txt
@@ -0,0 +1,13 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 012-1: Woodland Hills mobs
+012-1,0,0,0,0 monster Pink Flower 1014,13,0,100
+012-1,0,0,0,0 monster Spiky Mushroom 1019,25,0,10
+012-1,0,0,0,0 monster Mouboo 1028,20,0,10
+012-1,0,0,0,0 monster Mauve Plant 1029,5,2700000,1800000
+012-1,0,0,0,0 monster Cobalt Plant 1030,2,2700000,1800000
+012-1,0,0,0,0 monster Gamboge Plant 1031,2,2700000,1800000
+012-1,0,0,0,0 monster Alizarin Plant 1032,2,2700000,1800000
+012-1,0,0,0,0 monster Silkworm 1035,5,60000,30000
+012-1,0,0,0,0 monster Clover Patch 1037,2,0,1000
+012-1,0,0,0,0 monster Squirrel 1038,25,30,20
+012-1,0,0,0,0 monster Butterfly 1055,20,30,20
diff --git a/npc/012-1/_warps.txt b/npc/012-1/_warps.txt
new file mode 100644
index 00000000..3c7492c9
--- /dev/null
+++ b/npc/012-1/_warps.txt
@@ -0,0 +1,13 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 012-1: Woodland Hills warps
+012-1,51,39,0 warp #012-1_51_39 0,0,012-3,380,52
+012-1,147,67,0 warp #012-1_147_67 0,0,012-3,484,115
+012-1,41,48,0 warp #012-1_41_48 0,0,012-3,363,87
+012-1,44,88,0 warp #012-1_44_88 0,0,012-3,365,196
+012-1,92,104,0 warp #012-1_92_104 0,0,012-3,280,120
+012-1,98,99,0 warp #012-1_98_99 0,0,012-3,47,90
+012-1,109,92,0 warp #012-1_109_92 0,0,012-3,90,82
+012-1,123,90,0 warp #012-1_123_90 0,0,012-3,48,165
+012-1,150,61,0 warp #012-1_150_61 0,3,013-1,21,75
+012-1,132,174,0 warp #012-1_132_174 1,0,011-1,73,15
+012-1,65,126,0 warp #012-1_65_126 0,0,012-3,186,150
diff --git a/npc/012-1/amrak.txt b/npc/012-1/amrak.txt
new file mode 100644
index 00000000..a088a512
--- /dev/null
+++ b/npc/012-1/amrak.txt
@@ -0,0 +1,9 @@
+
+012-1,137,104,0 script Amrak NPC103,{
+ mes "[Amrak]";
+ mes "\"I'm studying this waterfall. The water seems to flow from it like magic.\"";
+ next;
+ mes "[Amrak]";
+ mes "\"Unfortunately, I've had trouble getting up there. The monsters in these caves scare me.\"";
+ close;
+}
diff --git a/npc/012-1/flowerpentagram2.txt b/npc/012-1/flowerpentagram2.txt
new file mode 100644
index 00000000..b7f6f99b
--- /dev/null
+++ b/npc/012-1/flowerpentagram2.txt
@@ -0,0 +1,90 @@
+
+012-1,143,70,0 script #FlowerPentagram2 NPC400,{
+ if (OrumQuest >= 31) goto L_PlacedFifthFlower;
+
+ if (OrumQuest > 20) goto L_PlacedSecondFlower;
+ if (OrumQuest == 20) goto L_SecondFlower;
+
+ message strcharinfo(0), "There is something odd about this place.";
+ end;
+
+L_SecondFlower:
+ mes "Orum described this place. You have to place the second magical flower here.";
+ menu
+ "Place the flower.", L_Next,
+ "Leave.", L_close;
+
+L_Next:
+ if (isin("012-1", 142, 69, 144, 71))
+ goto L_Place;
+
+ mes "This isn't working, you're too far away.";
+ goto L_close;
+
+L_Place:
+ set @localMonsterCount,
+ mobcount("012-1", "#FlowerPentagram2::OnSquirrelDeath") +
+ mobcount("012-1", "#FlowerPentagram2::OnMushroomDeath") +
+ mobcount("012-1", "#FlowerPentagram2::OnScorpionDeath") +
+ mobcount("012-1", "#FlowerPentagram2::OnRScorpionDeath");
+ if (@localMonsterCount > 2)
+ goto L_MonstersAlive;
+
+ if (countitem("PurpleSummonFlower") < 1)
+ goto L_NoFlower;
+ delitem "PurpleSummonFlower", 1;
+ mes "Remembering what happened the last time, you take a careful look around. Everything's calm. You proceed to place the second flower.";
+ mes "Sensing a certain tension build up around you, you can't help but feel alarmed.";
+ OrumQuest = 21;
+ close2;
+ areamonster "012-1", 140, 64, 146, 73, "", 1105, 2, "#FlowerPentagram2::OnSquirrelDeath";
+ areamonster "012-1", 140, 64, 146, 73, "", 1106, 2, "#FlowerPentagram2::OnMushroomDeath";
+ areamonster "012-1", 140, 64, 146, 73, "", 1003, 2, "#FlowerPentagram2::OnScorpionDeath";
+ areamonster "012-1", 140, 64, 146, 73, "", 1004, 2, "#FlowerPentagram2::OnRScorpionDeath";
+ @value = 15;
+ callfunc "QuestSagathaAnnoy";
+ @value = 0;
+ end;
+
+OnSquirrelDeath:
+ fix_mobkill(1105);
+ end;
+
+OnMushroomDeath:
+ fix_mobkill(1106);
+ end;
+
+OnScorpionDeath:
+ fix_mobkill(1003);
+ end;
+
+OnRScorpionDeath:
+ fix_mobkill(1004);
+ end;
+
+L_MonstersAlive:
+ mes "As you get closer to the place, you feel an unnerving presence.";
+ mes "This place has recently been used to summon something! And the beings are still nearby!";
+ next;
+ mes "You should get rid of them before attempting the summoning yourself.";
+ goto L_close;
+
+L_NoFlower:
+ mes "You look into your pocket, but the flower isn't there. Where did you put it?";
+ mes "If you can't find it, you should talk to Orum again.";
+ goto L_close;
+
+L_PlacedSecondFlower:
+ mes "You placed the second of Orum's magical flowers on this spot.";
+ mes "You can still feel the magical power shimmering around this place, waiting to be unleashed.";
+ goto L_close;
+
+L_PlacedFifthFlower:
+ mes "This is where you placed the second of Orum's magical flowers.";
+ mes "However, now that the summoning spell has been cast, everything is back to normal here.";
+ goto L_close;
+
+L_close:
+ @localMonsterCount = 0;
+ close;
+}
diff --git a/npc/012-1/injured-mouboo.txt b/npc/012-1/injured-mouboo.txt
new file mode 100644
index 00000000..167e91d8
--- /dev/null
+++ b/npc/012-1/injured-mouboo.txt
@@ -0,0 +1,226 @@
+
+function script QuestMoubooHeal {
+ @Q_MASK = NIBBLE_2_MASK;
+ @Q_SHIFT = NIBBLE_2_SHIFT;
+
+ @Q_status = (QUEST_MAGIC & @Q_MASK) >> @Q_SHIFT;
+ @Q_status_upper = @Q_status & 12;
+ @Q_status = @Q_status & 3;
+
+ @STATE_INITIAL = 0;
+ @STATE_HEALED_MOUBOO = 3;
+
+ if (@Q_status != @STATE_INITIAL)
+ goto L_Nothing;
+
+ @Q_status = @STATE_HEALED_MOUBOO;
+ callsub S_Update_Var;
+ mes "[Injured Mouboo]";
+ mes "A soft white glow surrounds the mouboo's leg, which slowly shifts back into place.";
+ mes "As the glow subsides, the mouboo gets up, carefully, and takes a few steps. It seems to be fully healed!";
+ mes "[5000 experience points]";
+ getexp 5000, 0;
+ next;
+ mes "[Injured Mouboo]";
+ mes "Visibly happy, the mouboo lies down on the ground and snuggles with a black piece of cloth it had been lying on.";
+ mes "The healing process must have been exhausting, for it is asleep in an instant.";
+ next;
+ @value = 15;
+ callfunc "QuestSagathaHappy";
+ close2;
+ return;
+
+L_Nothing:
+ mes "Your spell has no effect.";
+ close2;
+ return;
+
+S_Update_Var:
+ @Q_wr_status = @Q_status | @Q_status_upper;
+ set QUEST_MAGIC,
+ (QUEST_MAGIC & ~(@Q_MASK)
+ | (@Q_wr_status << @Q_SHIFT));
+ return;
+}
+
+012-1,57,153,0 script Mouboo NPC171,{
+ @Q_MASK = NIBBLE_2_MASK;
+ @Q_SHIFT = NIBBLE_2_SHIFT;
+
+ @Q_status = (QUEST_MAGIC & @Q_MASK) >> @Q_SHIFT;
+ @Q_status_upper = @Q_status & 12;
+ @Q_status = @Q_status & 3;
+
+ @STATE_INITIAL = 0;
+ @STATE_KILLED_MOUBOO = 1;
+ @STATE_TOOK_KILL_REWARD = 2;
+ @STATE_HEALED_MOUBOO = 3;
+
+ if (@Q_status == @STATE_KILLED_MOUBOO)
+ goto L_Dead;
+ if (@Q_status == @STATE_TOOK_KILL_REWARD)
+ goto L_took_reward;
+ if (@Q_status == @STATE_HEALED_MOUBOO)
+ goto L_healed;
+
+ mes "[Injured Mouboo]";
+ mes "You notice a mouboo lying on the ground, groaning, as if in pain.";
+ next;
+ goto L_Menu;
+
+L_Menu:
+ menu
+ "Examine the mouboo", L_examine,
+ "Give the mouboo something", L_Give,
+ "Kill the mouboo", L_Kill,
+ "Leave", L_close;
+
+L_examine:
+ mes "[Injured Mouboo]";
+ mes "Looking closer, you notice that the mouboo's left hind leg is bent at a very unnatural angle – that seems to be the cause for its pain.";
+ next;
+ mes "[Injured Mouboo]";
+ mes "You also notice that the mouboo is lying on top of what appears to be a black turtleneck sweater.";
+ mes "Do you want to pick up the sweater?";
+ next;
+ menu
+ "Yes.", L_pickup_alive,
+ "No.", L_Menu;
+
+L_pickup_alive:
+ mes "[Injured Mouboo]";
+ mes "The Mouboo groans and pushes your hand away. It seems to be rather fond of the sweater.";
+ next;
+ goto L_Menu;
+
+L_Give:
+ @items_nr = 12;
+ setarray @items$, "CactusDrink", "CactusPotion", "ChocolateBar", "Milk", "OrangeCupcake", "RedApple", "Beer", "BottleOfWater", "TinyHealingPotion", "SmallHealingPotion", "MediumHealingPotion", "LargeHealingPotion";
+ setarray @itemnames$, "Cactus Drink", "Cactus Potion", "Chocolate Bar", "Milk", "Orange Cupcake", "Red Apple", "Beer", "Bottle of Water", "Tiny Healing Potion", "Small Healing Potion", "Medium Healing Potion", "Large Healing Potion";
+ setarray @itemeat, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0;
+
+ setarray @menuitems$, "", "", "", "", "", "", "", "", "", "", "", "", "";
+ @choices_nr = 0;
+ setarray @menuNames$, "", "", "", "", "", "", "", "", "", "", "", "", "";
+ setarray @choice_eat, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
+
+ @n = 0;
+ @ct = 0;
+ goto L_nloop;
+
+L_nloop:
+ @k$ = @items$[@n];
+ if (countitem(@k$) == 0)
+ goto L_nloop_skip;
+
+ @menuitems$[@ct] = @itemnames$[@n];
+ @menuNames$[@ct] = @k$;
+ @choice_eat[@ct] = @itemeat[@n];
+ @ct = @ct + 1;
+ goto L_nloop_skip;
+
+L_nloop_skip:
+ @n = @n+1;
+ if (@n < @items_nr)
+ goto L_nloop;
+
+ @menuitems$[@ct] = "Nevermind";
+
+ menu
+ @menuitems$[0], L_MenuItems,
+ @menuitems$[1], L_MenuItems,
+ @menuitems$[2], L_MenuItems,
+ @menuitems$[3], L_MenuItems,
+ @menuitems$[4], L_MenuItems,
+ @menuitems$[5], L_MenuItems,
+ @menuitems$[6], L_MenuItems,
+ @menuitems$[7], L_MenuItems,
+ @menuitems$[8], L_MenuItems,
+ @menuitems$[9], L_MenuItems,
+ @menuitems$[10], L_MenuItems,
+ @menuitems$[11], L_MenuItems,
+ @menuitems$[12], L_MenuItems;
+
+L_MenuItems:
+ @menu = @menu - 1;
+ if (@menu == @ct)
+ goto L_Menu;
+ @choice$ = @menuNames$[@menu];
+ @verb$ = "drinks";
+ if (@choice_eat[@menu])
+ @verb$ = "eats";
+ if (@choice$ != "" && countitem(@choice$))
+ goto L_consume;
+ goto L_Menu;
+
+L_consume:
+ mes "[Injured Mouboo]";
+ mes "The mouboo " + @verb$ + " your " + getitemlink(@choice$) + ".";
+ delitem @choice$, 1;
+ next;
+ if (@choice$ == "LargeHealingPotion")
+ goto L_do_heal;
+ mes "[Injured Mouboo]";
+ mes "Unfortunately, it seems to have had no effect.";
+ next;
+ goto L_Menu;
+
+L_do_heal:
+ callfunc "QuestMoubooHeal";
+ end;
+
+L_Kill:
+ mes "[Injured Mouboo]";
+ if (BaseLevel > 44)
+ goto L_Kill_success;
+ mes "The mouboo deflects your attack and counterattacks!";
+ mes "It misses you only barely.";
+ mes "Injured though it may be, this mouboo is still more than a match for you!";
+ next;
+ goto L_Menu;
+
+L_Kill_success:
+ mes "After some wrestling, the mouboo succumbs to your attacks.";
+ mes "[100 experience points]";
+ getexp 100, 0;
+ @Q_status = @STATE_KILLED_MOUBOO;
+ callsub S_Update_Var;
+ next;
+ goto L_Dead;
+
+L_Dead:
+ mes "[Dead Mouboo]";
+ mes "The dead mouboo is lying on top of a black T-neck sweater.";
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Nopickup;
+ getitem "BlackTurtleneck", 1;
+ mes "You pull out the sweater and stuff it into your backpack.";
+ @Q_status = @STATE_TOOK_KILL_REWARD;
+ callsub S_Update_Var;
+ close;
+
+L_took_reward:
+ mes "[Dead Mouboo]";
+ mes "You see a dead mouboo.";
+ close;
+
+L_Nopickup:
+ mes "Unfortunately, you can't carry any more.";
+ close;
+
+L_healed:
+ mes "[Mouboo]";
+ mes "The mouboo is sleeping soundly, smiling in its dreams.";
+ close;
+
+L_close:
+ close;
+
+S_Update_Var:
+ @Q_wr_status = @Q_status | @Q_status_upper;
+ set QUEST_MAGIC,
+ (QUEST_MAGIC & ~(@Q_MASK)
+ | (@Q_wr_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/012-1/mapflags.txt b/npc/012-1/mapflags.txt
new file mode 100644
index 00000000..8cbd7e72
--- /dev/null
+++ b/npc/012-1/mapflags.txt
@@ -0,0 +1 @@
+//012-1 mapflag resave 012-1,88,141
diff --git a/npc/012-1/shops.txt b/npc/012-1/shops.txt
new file mode 100644
index 00000000..aa411c97
--- /dev/null
+++ b/npc/012-1/shops.txt
@@ -0,0 +1,95 @@
+
+012-1,36,99,0 script #FlowerShop NPC32767,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem RedRose;
+ sellitem PinkRose;
+ sellitem YellowRose;
+ sellitem WhiteRose;
+ sellitem OrangeRose;
+ sellitem DarkRedRose;
+ sellitem RedTulip;
+ sellitem PinkTulip;
+ sellitem YellowTulip;
+ sellitem WhiteTulip;
+ sellitem OrangeTulip;
+ .distance = 5;
+ end;
+}
+
+012-1,36,99,0 script Blossom NPC163,{
+ mes "[Blossom]";
+ mes "\"Hello, would you like to buy some flowers?\"";
+ menu
+ "Sure.", L_Shop,
+ "Not right now.", L_close,
+ "Can I trade this Rose Hat for a differently colored one?", L_RoseHat;
+
+L_Shop:
+ close2;
+ shop "#FlowerShop";
+
+L_RoseHat:
+ @base_id = 897;
+ mes "[Blossom]";
+ mes "\"Certainly, which color do you have?\"";
+ menu
+ "A red one.", L_MenuItems,
+ "A white one.", L_MenuItems,
+ "A pink one.", L_MenuItems,
+ "A yellow one.", L_MenuItems,
+ "An orange one.", L_MenuItems,
+ "A blue one.", L_MenuItems;
+
+L_MenuItems:
+ @have_id = @base_id + @menu - 1;
+
+ mes "[Blossom]";
+ mes "\"And which color would you like?\"";
+ menu
+ "A red one.", L_MenuItems1,
+ "A white one.", L_MenuItems1,
+ "A pink one.", L_MenuItems1,
+ "A yellow one.", L_MenuItems1,
+ "An orange one.", L_MenuItems1,
+ "A blue one.", L_MenuItems1;
+
+L_MenuItems1:
+ @receive_id = @base_id + @menu - 1;
+
+ if (@have_id == @receive_id)
+ goto L_SameColor;
+ if (countitem(@have_id) < 1)
+ goto L_NoItem;
+ delitem @have_id, 1;
+ getitem @receive_id, 1;
+ mes "[Blossom]";
+ mes "\"Here it is.\"";
+ goto L_close;
+
+L_NoItem:
+ mes "[Blossom]";
+ mes "\"Oh, you don't have a Rose Hat in that color.";
+ mes "Did you mean a different color?\"";
+ menu
+ "Yes, I meant a different color.", L_RoseHat,
+ "No, I changed my mind.", L_close;
+
+L_SameColor:
+ mes "[Blossom]";
+ mes "\"Oh, you already have a hat in that color.";
+ mes "Did you want something else?\"";
+ menu
+ "Yes, let me pick a different color.", L_RoseHat,
+ "No, I changed my mind.", L_close;
+
+L_close:
+ @base_id = 0;
+ @have_id = 0;
+ @receive_id = 0;
+ close;
+}
diff --git a/npc/012-3/_import.txt b/npc/012-3/_import.txt
new file mode 100644
index 00000000..14dac983
--- /dev/null
+++ b/npc/012-3/_import.txt
@@ -0,0 +1,9 @@
+// Map 012-3: Moggun Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/012-3/_mobs.txt",
+"npc/012-3/_warps.txt",
+"npc/012-3/beheader.txt",
+"npc/012-3/mana-seed.txt",
+"npc/012-3/mapflags.txt",
+"npc/012-3/traveler.txt",
+"npc/012-3/warningsigns.txt",
diff --git a/npc/012-3/_mobs.txt b/npc/012-3/_mobs.txt
new file mode 100644
index 00000000..00650e6a
--- /dev/null
+++ b/npc/012-3/_mobs.txt
@@ -0,0 +1,18 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 012-3: Moggun Cave mobs
+012-3,458,75,9,3 monster Moggun 1061,5,100000,30000
+012-3,452,55,9,3 monster Moggun 1061,5,100000,30000
+012-3,422,41,9,3 monster Moggun 1061,5,100000,30000
+012-3,357,49,4,8 monster Moggun 1061,5,100000,30000
+012-3,373,111,8,9 monster Moggun 1061,10,100000,30000
+012-3,456,91,9,3 monster Moggun 1061,5,100000,30000
+012-3,398,148,8,3 monster Moggun 1061,5,100000,30000
+012-3,419,88,4,8 monster Moggun 1061,5,100000,30000
+012-3,392,162,8,3 monster Moggun 1061,5,100000,30000
+012-3,440,127,4,8 monster Moggun 1061,5,100000,30000
+012-3,340,110,4,8 monster Moggun 1061,5,100000,30000
+012-3,279,148,8,9 monster Moggun 1061,10,100000,30000
+012-3,198,62,8,9 monster Moggun 1061,10,100000,30000
+012-3,175,116,8,9 monster Moggun 1061,10,100000,30000
+012-3,10,10,0,0 monster Bat 1017,100,0,0
+012-3,10,10,0,0 monster Cave Snake 1021,75,0,0
diff --git a/npc/012-3/_warps.txt b/npc/012-3/_warps.txt
new file mode 100644
index 00000000..34bbf648
--- /dev/null
+++ b/npc/012-3/_warps.txt
@@ -0,0 +1,12 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 012-3: Moggun Cave warps
+012-3,47,92,0 warp #012-3_47_92 0,0,012-1,98,100
+012-3,90,84,0 warp #012-3_90_84 0,0,012-1,109,93
+012-3,48,167,0 warp #012-3_48_167 0,0,012-1,123,91
+012-3,280,122,0 warp #012-3_280_122 0,0,012-1,92,105
+012-3,186,148,0 warp #012-3_186_148 0,0,012-1,65,128
+012-3,365,198,0 warp #012-3_365_198 0,0,012-1,44,89
+012-3,380,54,0 warp #012-3_380_54 0,0,012-1,51,40
+012-3,363,89,0 warp #012-3_363_89 0,0,012-1,41,49
+012-3,483,116,0 warp #012-3_483_116 0,0,012-1,146,67
+012-3,458,71,0 warp #012-3_458_71 0,0,012-4,193,57
diff --git a/npc/012-3/beheader.txt b/npc/012-3/beheader.txt
new file mode 100644
index 00000000..dd5207ee
--- /dev/null
+++ b/npc/012-3/beheader.txt
@@ -0,0 +1,187 @@
+
+012-3,460,76,0 script The Beheader NPC429,{
+ if (FLAGS & FLAG_BEHEADER_MASK) goto L_Complete;
+ mes "[The Beheader]";
+ mes "\"I am The Beheader, known for beheading Terranites.\"";
+ next;
+ mes "[The Beheader]";
+ mes "\"Unfortunately, even with this disguise they could recognize and avoid me. I'll need a new one...\"";
+ next;
+ menu
+ "I'm sorry to hear that.", L_close,
+ "Uh... Try wearing a mask?", L_Mask,
+ "Can I behead Terranites on my own?", L_Beheader,
+ "You monster!", L_close;
+
+L_Mask:
+ mes "";
+ mes "[The Beheader]";
+ mes "\"A mask, ohh! Not a bad idea. I might even have a better idea! If only...\"";
+ next;
+ mes "[The Beheader]";
+ mes "\"Hey, how about we do this deal: You bring me a [@@766|@@] and I'll give you one of my finest [@@5209|@@]. It has even been polished and might be useful in combat for you.\"";
+ next;
+ menu
+ "Maybe later, pal.", L_close,
+ "Sorry, I'm keeping my helmet.", L_Confirm,
+ "Take it, I thought it was ugly anyway...", L_Exchange;
+
+L_Exchange:
+ mes "";
+ if (countitem("TerraniteHelmet") < 1)
+ goto L_Nope;
+
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Nope;
+
+ delitem "TerraniteHelmet", 1;
+ getitem "TerraniteHead", 1;
+ getexp 100000, 0;
+ FLAGS = FLAGS | FLAG_BEHEADER_MASK;
+ mes "[The Beheader]";
+ mes "\"Muahaha, I'll let you know how it went later.\"";
+ close;
+
+L_Confirm:
+ mes "";
+ mes "[The Beheader]";
+ mes "\"What, really? A Terranite Head is waaay cooler than the helmet. And to be honest, you will never be able to obtain a head as cool as the one I am offering you.\"";
+ next;
+ mes "[The Beheader]";
+ mes "\"You may regret in not making this deal with me! I ask you to reconsider.\"";
+ mes "##9Note: Refusing to exchange is permanent and you'll never be able to obtain a [@@5209|@@] with this char, unless you win one at an event. Please be sure you really want this.##0";
+ next;
+ menu
+ "...I'll think on this more thoroughly.", L_close,
+ "Sorry, I'm keeping my helmet.", L_ReallyGiveUp;
+
+L_ReallyGiveUp:
+ mes "";
+ if (countitem("TerraniteHelmet") < 1)
+ goto L_Nope;
+ getexp 100000, 0;
+ FLAGS = FLAGS | FLAG_BEHEADER_MASK;
+ mes "[The Beheader]";
+ mes "\"Meeeh, I'll try to get someone else to do it for me, then! Hmpf.\"";
+ close;
+
+L_Complete:
+ mes "[The Beheader]";
+ mes "\"I am The Beheader, known for beheading Terranites.\"";
+ next;
+ mes "[The Beheader]";
+ mes "\"Come back later, my [@@576|@@] is itching to strike on something.\"";
+ next;
+ menu
+ "Okay, good bye.", L_close,
+ "How much later?", L_Later,
+ "Can I behead Terranites on my own?", L_Beheader;
+
+L_Later:
+ mes "";
+ mes "[The Beheader]";
+ mes "\"Time passes so quickly. It would seem that later is now. I wonder if now is then, then. Hmmmm...\"";
+ if (!(FLAGS & FLAG_GOT_BEHEADER_SWORD)) goto L_MaybeBeheader;
+ // NOTE: Room for future expansion if needed.
+ // Previous text: "Some February, I don't know. If you want to help, go to Hurnscald square, look for the noisy person with an AFK Cap which is always sitting with their kitty, and tell them to start working. That might just do the trick."
+ // The "noisy person w/ an AFK Cap and a kytty" is Jesusalva (script author)
+ close;
+
+L_MaybeBeheader:
+ next;
+ menu
+ "Okay, good bye.", L_close,
+ "Can I behead Terranites on my own?", L_Beheader;
+
+L_Beheader:
+ if (FLAGS & FLAG_GOT_BEHEADER_SWORD) goto L_Again;
+ if (TERRAC == 1501) goto L_Finish;
+ if (TERRAC > 0) goto L_Status;
+ mes "";
+ mes "[The Beheader]";
+ mes "\"You obviously know nothing about Terranite Anatomy, hahaha!\"";
+ next;
+ mes "[The Beheader]";
+ mes "\"You don't even have the proper tools. Nah, I bet you wouldn't know how to use them even if you had, hahaha!\"";
+ next;
+ mes "[The Beheader]";
+ mes "\"Sorry, this is just funny! Most people of your age already realized that it takes a life of dedication and skill honing to be able to scavenge anything from a monster.\"";
+
+ // Quest requirement check (not really needed, is old code)
+ if (BaseLevel < 60) goto L_close;
+ next;
+ mes "[The Beheader]";
+ mes "\"Maybe we can make a deal. I can give you the proper tools but not the proper training, so don't expect much; But I'm interested in seeing how you'll fail at my hands... I'm an old man and seeing young people like you running around doing meaningless tasks is fun.\"";
+ next;
+ //mes "\"So. Hmm. Lemme think. What I wanted again? *suffers from AFK-induced amnesia and becomes a huge TODO sign*\"";
+ menu
+ "Very well. Give me your task.", L_Accept,
+ "I knew it, you are as crazy as Arkim!", L_close;
+
+L_Accept:
+ mes "";
+ mes "[The Beheader]";
+ mes "So... Hmm, lemme think... Ah, I know! Thou shall ##Bkill me 1500 [@@m1062|@@]##b. Why? Because that's pointless, and you want a weapon you won't be able to use, so a pointless task for a pointless reward! Now get going!";
+ TERRAC = 1;
+ close;
+
+L_Status:
+ mes "";
+ mes "[The Beheader]";
+ mes "\"Get going, running in circles and amusing me, you only killed "+(TERRAC-1)+"/1500 [@@m1062|@@] until now.\"";
+ close;
+
+L_Again:
+ mes "";
+ mes "[The Beheader]";
+ mes "\"Again, it takes a life of dedication and skill honing to be able to scavenge anything from a monster.\"";
+ next;
+ mes "[The Beheader]";
+ mes "\"You must imagine where the Hyoid bone would be in a Terranite and make a clear cut with a [@@576|@@], but as you are currently, that will not be possible. Maybe in the future you may find a monster anatomy professor.\"";
+ mes "##9(Development note: TMWA Engine does not support altering monster drops depending on the weapon. However, Evol2 engine does, and TMW rEvolt probably will have this feature.)##0";
+ close;
+
+L_Finish:
+ mes "";
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Nope;
+
+ mes "[The Beheader]";
+ mes "\"I'm always impressed at how the young folks never give up on their dreams. Well, listen carefully:\"";
+ next;
+
+ mes "[The Beheader]";
+ mes "\"To behead a Terranite, you need a clear cut at the Hyoid Bone, otherwise you won't be able to behead them even with the proper weapon. I took a decade training and even so I rarely manage to get a clear cut.\"";
+ next;
+ mes "[The Beheader]";
+ mes "\"Uh? No man, Terranites doesn't have neck bones. Ever saw a Terranite turning its neck to face you?? I said that because we Talpans have and it was the only reference I could think of for you.\"";
+ next;
+ mes "[The Beheader]";
+ mes "\"Well, I guess you'll need an anatomy professor to teach you the specifics to get a Terranite Head... Uh, and of course, you might want to learn how to polish them. You know. For the bonuses.\"";
+ next;
+
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Nope;
+
+ getitem "Beheader", 1;
+ getexp 750000, 0;
+ FLAGS = FLAGS | FLAG_GOT_BEHEADER_SWORD;
+ TERRAC = 0;
+
+ mes "[The Beheader]";
+ mes "\"Anyway, a deal is a deal and here is your [@@576|@@]. I hope you can actually make good use of it!\"";
+ mes "##9(Development note: TMWA Engine does not support altering monster drops depending on the weapon. However, Evol2 engine does, and TMW rEvolt probably will have this feature.)##0";
+ close;
+
+L_Nope:
+ mes "[The Beheader]";
+ mes "\"Stop trolling me, or I might consider putting your head on my collection.\"";
+ close;
+
+L_close:
+ close;
+}
+
diff --git a/npc/012-3/mana-seed.txt b/npc/012-3/mana-seed.txt
new file mode 100644
index 00000000..405b8038
--- /dev/null
+++ b/npc/012-3/mana-seed.txt
@@ -0,0 +1,227 @@
+012-3,72,139,0 script Forest Mana Seed#_M NPC166,{
+ setarray @exp_bonus,
+ 0,
+ 1000, // level 1
+ 10000,
+ 100000,
+ 400000,
+ 2000000; // level 5
+
+ setarray @min_level,
+ 0,
+ 10,
+ 30,
+ 50,
+ 65,
+ 80; // level 5
+
+ @visions_nr = 12;
+ setarray @visions$,
+ "You feel soft, fluffy fur brushing against your skin and are filled with happiness. Somehow, the word `" + b("joyplim") + "' comes to mind...",
+ "You see a dark underground temple; you are kneeling, praying for the safety of the planet. You smile as a friend joins you in the dark – but suddenly a shadow falls over you from above, and a stabbing pain...",
+ "It is midnight; you are in an underground cavern deep inside the desert ruins. Slowly, as if half-asleep, you wander up the spiral pathway, towards the ancient vase at its center. As you reach out to touch it...",
+ "The old castle smells of mildew and swamp gas. It has not been used in centuries, but you were here before, when the world was young. You turn to face your companions – but something is wrong with all three; an ancient force has possessed them...",
+ "As you put the horn to your lips, you feel winds flowing, gathering, condensing in your chest. Soon, you can no longer contain it; the storm unleashes through your mouth, into a deafening fanfare. The black dome around you begins to crack...",
+ "You are alone inside your head, confined by the laughing man's circlet. Powerless, you witness how your hands shoot out flame after flame, incinerating innocents for that man's experiments...",
+ "The village may be in ruins, but it must have been where you grew up. The engravings on the walls – images of powerful beasts – look strangely familiar, and you can make out writing, words about you, wishes and prayers for you... You are at home...",
+ "Deep underneath the city, the rocky cavern maze turns into an opulent palace. This must be where the beast of the many eyes resides. Nervously you grip the wand; will the power to repel it be sufficient to defeat it and its magic?",
+ "At the bottom of the abyss, infinity opens before you. You have proven yourself worthy, and the ancient finally reveals its wisdom...",
+ "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...";
+
+ @max_magic = 2;
+
+ @has_magic = getskilllv(SKILL_MAGIC);
+ @drank_potion = MAGIC_FLAGS & MFLAG_DRANK_POTION;
+ @knows_seed = MAGIC_FLAGS & MFLAG_KNOWS_MANASEED;
+
+ // Set up SkillUp function
+ @SUP_id = SKILL_MAGIC;
+ @SUP_name$ = "Magic";
+
+ if (@has_magic)
+ goto L_Magic_start;
+ if (@knows_seed)
+ goto L_quick_nomagic;
+
+ // first time here
+
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_MANASEED;
+
+ mes "[Mana Seed]";
+ mes "You see a glowing orb, swimming in the water like a sea rose.";
+ mes "An unearthly glow is emanating from within, lighting up the water and filling the cave with an eerie light.";
+ next;
+ mes "[Mana Seed]";
+ if (@drank_potion)
+ mes "Slowly, the tingling sensation you felt before begins to spread through your body again.";
+ mes "What would you like to do?";
+ next;
+ goto L_Nomagic_mainmenu;
+
+L_quick_nomagic:
+ mes "[Mana Seed]";
+ mes "Again you stand before the orb.";
+ if (@drank_potion)
+ mes "Slowly, the tingling sensation you felt before begins to spread through your body again.";
+ mes "What would you like to do?";
+ next;
+ goto L_Nomagic_mainmenu;
+
+L_Nomagic_mainmenu:
+ menu
+ "Examine it more closely", L_Nomagic_examine,
+ "Take it with you", L_Nomagic_touch,
+ "Touch it", L_Nomagic_touch,
+ "Throw a rock at it", L_Nomagic_throwrock,
+ "Destroy it", L_Nomagic_destroy,
+ "Leave it alone", L_End;
+
+L_Nomagic_examine:
+ mes "[Mana Seed]";
+ mes "The orb seems to be perfectly round and emitting a steady glow. It appears to be floating in the water.";
+ next;
+ goto L_Nomagic_mainmenu;
+
+L_Nomagic_throwrock:
+ mes "[Mana Seed]";
+ mes "Your rock makes hardly a sound as it strikes the orb and glances off into the water, leaving neither scratch nor impression.";
+ mes "The orb budges slightly, but then floats back into its old position, as if it were tethered into place.";
+ next;
+ goto L_Nomagic_mainmenu;
+
+L_Nomagic_touch:
+ mes "[Mana Seed]";
+ if (@drank_potion)
+ goto L_Magic_level_1;
+ mes "As you touch the orb, you feel a terrible force within, separated from you by only the thinnest of membranes – like a tempest, all packed up in one tiny waterskin.";
+ next;
+ mes "[Mana Seed]";
+ mes "For one instant you feel that force rushing past your hands, through your body, as if you had unleashed this tempest upon yourself. Unable to contain the power, you stumble backwards, away from the orb.";
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_TOUCHED_MANASEED;
+ next;
+ goto L_Nomagic_mainmenu;
+
+L_Magic_level_1:
+ if (getskilllv(SKILL_MAGIC))
+ goto L_End; // shouldn't be happening
+ mes "Again you feel the tempest rushing through the Mana Seed's membrane, into your body. You only manage to hold on to it for an instant and find yourself forced to pull your hands away again quickly.";
+ next;
+ mes "[Mana Seed]";
+ mes "But this time something is different – that tingling sensation is back, and stronger than before. It is spreading through your body, head to toes, and you feel yourself brimming with energy.";
+ next;
+ mes "[Mana Seed]";
+ mes "It is a light-headed feeling, and you find yourself forced to sit down for a few seconds to recover.";
+ mes "Something is different. A new power has grown within you and is waiting to be understood.";
+ @SUP_xp = 1000;
+ @SUP_lvl = 1;
+ callfunc "SkillUp";
+ next;
+ goto L_End;
+
+L_Nomagic_destroy:
+ mes "[Mana Seed]";
+ mes "Try as you might, the orb seems impervious to all forms of attack you can fathom. You are forced to abandon your efforts.";
+ next;
+ goto L_Nomagic_mainmenu;
+
+L_Magic_start:
+ mes "[Mana Seed]";
+ mes "The Mana Seed is still in the same place as during your last visit, spreading its light throughout the cavern.";
+ mes "What would you like to do?";
+ next;
+ goto L_Magic_mainmenu;
+
+L_Magic_mainmenu:
+ menu
+ "Touch it", L_Magic_touch,
+ "Destroy it", L_Magic_destroy,
+ "Leave it alone", L_End;
+
+L_Magic_touch:
+ mes "[Mana Seed]";
+ mes "You touch the Mana Seed again.";
+ if (getskilllv(SKILL_MAGIC) >= @max_magic)
+ goto L_Magic_maxed_out;
+ if (abizit() >= 10)
+ goto L_Magic_levelup;
+ setarray .@messages$,
+ "The orb's energy effortlessly rushes through you, ignoring your feeble attempts at containing it. You will need considerably more practice with your magical skills before you can hope to contain it.",
+ "You only barely manage to hang on to some strands of the orb's energy, but not enough to contain it. You still need noticeably more practice with your magical skills.",
+ "The orb's powers are still no match for you; you will need more practice to contain more of its powers.",
+ "You feel close to being able to contain the orb's powers. Still, some more practice is needed.",
+ "The orb's energy only barely evades your attempts at containing it. Soon you will be able to extract more power from it.";
+ .@index=abizit()/2;
+ mes .@messages$[.@index];
+ next;
+ goto L_Magic_mainmenu;
+
+L_Magic_levelup:
+ @BaseLevel_needed = @min_level[getskilllv(SKILL_MAGIC) + 1];
+ if (BaseLevel < @BaseLevel_needed)
+ goto L_ins_BaseLevel;
+ mes "Its energy permeates you, surrounds you. You are suddenly uncertain if it is you who is containing the orb's powers or if it is the orb who is seeking out yours.";
+ next;
+ mes "[Mana Seed]";
+ mes "The Seed's tempest is calming beneath your hands, and its energies resonate with yours.";
+ next;
+ mes "[Mana Seed]";
+ mes "A feeling of harmony is spreading through your body, and the tingling sensation is back, within and without.";
+ next;
+ mes "[Mana Seed]";
+ mes "As the tingling increases, you feel light-headed, weightless.";
+ mes "Everything fades...";
+ next;
+ mes "Both the tingling and the sense of harmony have vanished, making room for darkness. You can't feel the Mana Seed anymore...";
+ next;
+ mes "... you can't feel anything.";
+ next;
+ mes "You are floating...";
+ next;
+ mes "The darkness is no longer complete. You begin to make out stars in the distance, circling each other, dancing a cosmic dance.";
+ next;
+ mes "Images rush past you, shadows of thoughts and dreams. Some touch you, filling you with powerful emotions – despair, ecstasy; sometimes loss, sometimes hope; hate, love.";
+ next;
+ mes "Someone else's thoughts pass through your mind...";
+ next;
+ @nr = rand(@visions_nr);
+ if (@nr == 0)
+ learnskill SKILL_JOYPLIM;
+ mes @visions$[@nr];
+ next;
+ mes "The image fades.";
+ next;
+ mes "[Mana Seed]";
+ mes "You awaken, lying on the ground.";
+ next;
+ mes "[Mana Seed]";
+ mes "Something has changed... you feel more confident in your magical abilities.";
+ @SUP_xp = @exp_bonus[1 + getskilllv(SKILL_MAGIC)];
+ @SUP_lvl = 1 + getskilllv(SKILL_MAGIC);
+ callfunc "SkillUp";
+ heal 0, 10000;
+ next;
+ goto L_End;
+
+L_Magic_maxed_out:
+ mes "Strangely, you feel nothing, as if its membrane had closed towards you.";
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_MANASEED_MAXEDOUT;
+ next;
+ goto L_Magic_mainmenu;
+
+L_ins_BaseLevel:
+ mes "Its energies rush through you. You fight to keep them under control, to contain them in your body. Alas, your body is too frail – you have to let go.";
+ mes "Frustrated, you give up. You have the skill needed to control this power, but you will have to grow up some more before your body can handle it.";
+ next;
+ goto L_Magic_mainmenu;
+
+L_Magic_destroy:
+ mes "[Mana Seed]";
+ mes "Try as you might, you cannot find a way, magical or physical, to destroy the seed. Frustrated, you give up.";
+ next;
+ goto L_Magic_mainmenu;
+
+L_End:
+ close;
+}
diff --git a/npc/012-3/mapflags.txt b/npc/012-3/mapflags.txt
new file mode 100644
index 00000000..4934669d
--- /dev/null
+++ b/npc/012-3/mapflags.txt
@@ -0,0 +1 @@
+//012-3 mapflag resave 012-1,88,141
diff --git a/npc/012-3/traveler.txt b/npc/012-3/traveler.txt
new file mode 100644
index 00000000..50793fa7
--- /dev/null
+++ b/npc/012-3/traveler.txt
@@ -0,0 +1,7 @@
+
+012-3,449,71,0 script Meridith the Traveler NPC103,{
+ @npcname$ = "Meridith";
+ @NpcTravelBit = $@terranite_cave_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/012-3/warningsigns.txt b/npc/012-3/warningsigns.txt
new file mode 100644
index 00000000..082ed2a5
--- /dev/null
+++ b/npc/012-3/warningsigns.txt
@@ -0,0 +1,16 @@
+
+012-3,455,70,0 script sign#pvp-1 NPC187,{
+ mes "You are about to enter a dangerous area!";
+ next;
+ mes "This area has a great distance to town. So the protection spell of the town is not active in that cave!";
+ mes "That is why other players are able to attack you.";
+ close;
+}
+
+012-3,461,70,0 script sign#pvp-2 NPC186,{
+ mes "You are about to enter a dangerous area!";
+ next;
+ mes "This area has a great distance to town. So the protection spell of the town is not active in that cave!";
+ mes "That is why other players are able to attack you.";
+ close;
+}
diff --git a/npc/012-4/_import.txt b/npc/012-4/_import.txt
new file mode 100644
index 00000000..d3fb8065
--- /dev/null
+++ b/npc/012-4/_import.txt
@@ -0,0 +1,6 @@
+// Map 012-4: Terranite Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/012-4/_mobs.txt",
+"npc/012-4/_warps.txt",
+"npc/012-4/mapflags.txt",
+"npc/012-4/pvpflag.txt",
diff --git a/npc/012-4/_mobs.txt b/npc/012-4/_mobs.txt
new file mode 100644
index 00000000..7ddd9354
--- /dev/null
+++ b/npc/012-4/_mobs.txt
@@ -0,0 +1,66 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 012-4: Terranite Cave mobs
+012-4,217,45,6,1 monster Moggun 1061,3,100000,30000
+012-4,223,30,6,1 monster Moggun 1061,3,100000,30000
+012-4,239,48,6,1 monster Moggun 1061,3,100000,30000
+012-4,197,39,3,4 monster Moggun 1061,3,100000,30000
+012-4,210,35,3,4 monster Bat 1017,5,100000,30000
+012-4,241,38,3,4 monster Bat 1017,5,100000,30000
+012-4,237,59,3,4 monster Bat 1017,5,100000,30000
+012-4,226,73,3,4 monster Bat 1017,5,100000,30000
+012-4,209,94,4,2 monster Bat 1017,5,100000,30000
+012-4,263,29,3,4 monster Bat 1017,5,100000,30000
+012-4,274,48,3,4 monster Bat 1017,5,100000,30000
+012-4,267,70,3,4 monster Bat 1017,5,100000,30000
+012-4,259,79,3,4 monster Bat 1017,5,100000,30000
+012-4,274,79,3,4 monster Bat 1017,5,100000,30000
+012-4,268,91,12,7 monster Moggun 1061,10,100000,30000
+012-4,209,146,34,27 monster Spider 1012,50,100000,30000
+012-4,254,163,9,23 monster Yellow Slime 1007,10,100000,30000
+012-4,167,175,8,11 monster Yellow Slime 1007,10,100000,30000
+012-4,148,176,8,11 monster Red Slime 1008,20,100000,30000
+012-4,131,88,8,11 monster Red Slime 1008,15,100000,30000
+012-4,140,131,8,11 monster Yellow Slime 1007,10,100000,30000
+012-4,42,128,8,4 monster Yellow Slime 1007,10,100000,30000
+012-4,64,62,12,15 monster Spider 1012,20,100000,30000
+012-4,69,89,8,10 monster Yellow Slime 1007,10,100000,30000
+012-4,34,45,8,16 monster Terranite 1062,3,100000,30000
+012-4,64,36,12,8 monster Skeleton 1043,3,100000,30000
+012-4,100,115,12,8 monster Skeleton 1043,3,100000,30000
+012-4,90,137,8,11 monster Yellow Slime 1007,10,100000,30000
+012-4,59,113,7,8 monster Lady Skeleton 1044,3,100000,30000
+012-4,42,176,7,6 monster Terranite 1062,3,100000,30000
+012-4,120,177,12,8 monster Lady Skeleton 1044,3,100000,30000
+012-4,287,180,12,8 monster Lady Skeleton 1044,3,100000,30000
+012-4,340,175,12,8 monster Skeleton 1043,3,100000,30000
+012-4,390,156,34,27 monster Spider 1012,40,100000,30000
+012-4,358,37,10,11 monster Terranite 1062,3,100000,30000
+012-4,481,110,9,12 monster Terranite 1062,3,100000,30000
+012-4,435,114,12,8 monster Skeleton 1043,3,100000,30000
+012-4,477,82,12,8 monster Lady Skeleton 1044,3,100000,30000
+012-4,354,106,9,23 monster Yellow Slime 1007,10,100000,30000
+012-4,342,139,8,11 monster Red Slime 1008,15,100000,30000
+012-4,389,81,16,7 monster Red Slime 1008,20,100000,30000
+012-4,409,35,3,4 monster Bat 1017,5,100000,30000
+012-4,413,73,3,4 monster Bat 1017,5,100000,30000
+012-4,395,63,3,4 monster Bat 1017,5,100000,30000
+012-4,314,182,3,4 monster Bat 1017,5,100000,30000
+012-4,409,121,3,4 monster Bat 1017,5,100000,30000
+012-4,456,99,3,4 monster Bat 1017,5,100000,30000
+012-4,133,153,4,2 monster Bat 1017,5,100000,30000
+012-4,153,98,4,2 monster Bat 1017,5,100000,30000
+012-4,126,65,4,2 monster Bat 1017,5,100000,30000
+012-4,81,180,4,2 monster Bat 1017,5,100000,30000
+012-4,61,159,4,2 monster Bat 1017,5,100000,30000
+012-4,271,157,3,4 monster Bat 1017,5,100000,30000
+012-4,270,182,3,4 monster Bat 1017,5,100000,30000
+012-4,322,141,8,11 monster Red Slime 1008,20,100000,30000
+012-4,451,111,3,4 monster Bat 1017,5,100000,30000
+012-4,422,50,5,16 monster Spider 1012,10,100000,30000
+012-4,380,40,7,11 monster Spider 1012,10,100000,30000
+012-4,124,49,4,12 monster Terranite 1062,1,100000,30000
+012-4,80,110,4,2 monster Bat 1017,5,100000,30000
+012-4,42,142,10,5 monster Skeleton 1043,3,100000,30000
+012-4,41,159,5,10 monster Spider 1012,20,100000,30000
+012-4,95,180,4,2 monster Bat 1017,5,100000,30000
+012-4,91,180,11,5 monster Spider 1012,20,100000,30000
diff --git a/npc/012-4/_warps.txt b/npc/012-4/_warps.txt
new file mode 100644
index 00000000..c5d2fed3
--- /dev/null
+++ b/npc/012-4/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 012-4: Terranite Cave warps
+012-4,193,58,0 warp #012-4_193_58 0,0,012-3,448,62
+012-4,363,26,0 warp #012-4_363_26 0,0,012-4,474,187
+012-4,474,188,0 warp #012-4_474_188 0,0,012-4,363,27
diff --git a/npc/012-4/mapflags.txt b/npc/012-4/mapflags.txt
new file mode 100644
index 00000000..d776c7f5
--- /dev/null
+++ b/npc/012-4/mapflags.txt
@@ -0,0 +1 @@
+//012-4 mapflag resave 012-1,143,70
diff --git a/npc/012-4/pvpflag.txt b/npc/012-4/pvpflag.txt
new file mode 100644
index 00000000..254c0d1c
--- /dev/null
+++ b/npc/012-4/pvpflag.txt
@@ -0,0 +1 @@
+012-4 mapflag pvp
diff --git a/npc/013-1/_import.txt b/npc/013-1/_import.txt
new file mode 100644
index 00000000..9306f811
--- /dev/null
+++ b/npc/013-1/_import.txt
@@ -0,0 +1,8 @@
+// Map 013-1: Woodland Hills
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/013-1/_mobs.txt",
+"npc/013-1/_warps.txt",
+"npc/013-1/flowerpentagram.txt",
+"npc/013-1/mapflags.txt",
+"npc/013-1/sagatha.txt",
+"npc/013-1/traveler.txt",
diff --git a/npc/013-1/_mobs.txt b/npc/013-1/_mobs.txt
new file mode 100644
index 00000000..462e9d72
--- /dev/null
+++ b/npc/013-1/_mobs.txt
@@ -0,0 +1,17 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 013-1: Woodland Hills mobs
+013-1,0,0,0,0 monster Pink Flower 1014,13,0,100
+013-1,0,0,0,0 monster Spiky Mushroom 1019,12,0,100
+013-1,0,0,0,0 monster Mouboo 1028,5,0,100
+013-1,0,0,0,0 monster Mauve Plant 1029,1,270,180
+013-1,0,0,0,0 monster Mauve Plant 1029,4,2700000,1800000
+013-1,0,0,0,0 monster Cobalt Plant 1030,1,270,180
+013-1,0,0,0,0 monster Cobalt Plant 1030,2,2700000,1800000
+013-1,0,0,0,0 monster Gamboge Plant 1031,1,270,180
+013-1,0,0,0,0 monster Gamboge Plant 1031,2,2700000,1800000
+013-1,0,0,0,0 monster Alizarin Plant 1032,1,270,180
+013-1,0,0,0,0 monster Alizarin Plant 1032,2,2700000,1800000
+013-1,0,0,0,0 monster Silkworm 1035,4,60000,30000
+013-1,0,0,0,0 monster Clover Patch 1037,2,0,1000
+013-1,0,0,0,0 monster Squirrel 1038,25,30,20
+013-1,0,0,0,0 monster Butterfly 1055,10,30,20
diff --git a/npc/013-1/_warps.txt b/npc/013-1/_warps.txt
new file mode 100644
index 00000000..a112a79f
--- /dev/null
+++ b/npc/013-1/_warps.txt
@@ -0,0 +1,7 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 013-1: Woodland Hills warps
+013-1,125,104,0 warp #013-1_125_104 0,0,013-3,34,64
+013-1,20,76,0 warp #013-1_20_76 0,3,012-1,149,60
+013-1,46,20,0 warp #013-1_46_20 3,0,017-1,46,104
+013-1,42,90,0 warp #013-1_42_90 0,0,013-2,63,41
+013-1,136,52,0 warp #013-1_136_52 0,3,055-1,25,52
diff --git a/npc/013-1/flowerpentagram.txt b/npc/013-1/flowerpentagram.txt
new file mode 100644
index 00000000..1a2e8f85
--- /dev/null
+++ b/npc/013-1/flowerpentagram.txt
@@ -0,0 +1,93 @@
+013-1,1,1,0 script #FlowerPentagram NPC32767,{
+end;
+
+OnSummon:
+ // This is just annoying
+ //announce "Sagatha:* What kind of a foolish trick is this? Who dares to create such calamity in my forest?", 0;
+
+ callsub S_CleanUp;
+ // area closely to sagatha
+ areamonster "013-1", 119, 21, 134, 36, "", 1105, 3, "#FlowerPentagram::OnSquirrelDeath";
+ areamonster "013-1", 119, 21, 134, 36, "", 1106, 2, "#FlowerPentagram::OnMushroomDeath";
+ areamonster "013-1", 119, 21, 134, 36, "", 1107, 3, "#FlowerPentagram::OnBlueparDeath";
+ areamonster "013-1", 119, 21, 134, 36, "", 1104, 2, "#FlowerPentagram::OnMoubooDeath";
+ areamonster "013-1", 119, 21, 134, 36, "", 1003, 10, "#FlowerPentagram::OnScorpionDeath";
+ areamonster "013-1", 119, 21, 134, 36, "", 1004, 7, "#FlowerPentagram::OnRScorpionDeath";
+ areamonster "013-1", 119, 21, 134, 36, "", 1057, 5, "#FlowerPentagram::OnAScorpionDeath";
+ areamonster "013-1", 119, 21, 134, 36, "", 1009, 3, "#FlowerPentagram::OnBScorpionDeath";
+ // wider area around sagatha
+ areamonster "013-1", 68, 25, 133, 73, "", 1105, 3, "#FlowerPentagram::OnSquirrelDeath";
+ areamonster "013-1", 68, 25, 133, 73, "", 1106, 3, "#FlowerPentagram::OnMushroomDeath";
+ areamonster "013-1", 68, 25, 133, 73, "", 1107, 5, "#FlowerPentagram::OnBlueparDeath";
+ areamonster "013-1", 68, 25, 133, 73, "", 1104, 2, "#FlowerPentagram::OnMoubooDeath";
+ areamonster "013-1", 68, 25, 133, 73, "", 1003, 6, "#FlowerPentagram::OnScorpionDeath";
+ areamonster "013-1", 68, 25, 133, 73, "", 1004, 5, "#FlowerPentagram::OnRScorpionDeath";
+ areamonster "013-1", 68, 25, 133, 73, "", 1057, 4, "#FlowerPentagram::OnAScorpionDeath";
+ areamonster "013-1", 68, 25, 133, 73, "", 1009, 2, "#FlowerPentagram::OnBScorpionDeath";
+ // almost the entire map
+ areamonster "013-1", 24, 22, 136, 100, "", 1105, 4, "#FlowerPentagram::OnSquirrelDeath";
+ areamonster "013-1", 24, 22, 136, 100, "", 1106, 3, "#FlowerPentagram::OnMushroomDeath";
+ areamonster "013-1", 24, 22, 136, 100, "", 1107, 5, "#FlowerPentagram::OnBlueparDeath";
+ areamonster "013-1", 24, 22, 136, 100, "", 1104, 3, "#FlowerPentagram::OnMoubooDeath";
+ areamonster "013-1", 24, 22, 136, 100, "", 1003, 5, "#FlowerPentagram::OnScorpionDeath";
+ areamonster "013-1", 24, 22, 136, 100, "", 1004, 4, "#FlowerPentagram::OnRScorpionDeath";
+ areamonster "013-1", 24, 22, 136, 100, "", 1057, 3, "#FlowerPentagram::OnAScorpionDeath";
+ areamonster "013-1", 24, 22, 136, 100, "", 1009, 1, "#FlowerPentagram::OnBScorpionDeath";
+ end;
+
+OnSquirrelDeath:
+ fix_mobkill(1105);
+ end;
+
+OnMushroomDeath:
+ fix_mobkill(1106);
+ end;
+
+OnBlueparDeath:
+ fix_mobkill(1107);
+ end;
+
+OnMoubooDeath:
+ fix_mobkill(1104);
+ end;
+
+OnScorpionDeath:
+ fix_mobkill(1003);
+ end;
+
+OnRScorpionDeath:
+ fix_mobkill(1004);
+ end;
+
+OnAScorpionDeath:
+ fix_mobkill(1057);
+ end;
+
+OnBScorpionDeath:
+ fix_mobkill(1009);
+ end;
+
+S_CleanUp:
+ killmonster "013-1", "#FlowerPentagram::OnSquirrelDeath";
+ killmonster "013-1", "#FlowerPentagram::OnMushroomDeath";
+ killmonster "013-1", "#FlowerPentagram::OnBlueparDeath";
+ killmonster "013-1", "#FlowerPentagram::OnMoubooDeath";
+ killmonster "013-1", "#FlowerPentagram::OnScorpionDeath";
+ killmonster "013-1", "#FlowerPentagram::OnRScorpionDeath";
+ killmonster "013-1", "#FlowerPentagram::OnAScorpionDeath";
+ killmonster "013-1", "#FlowerPentagram::OnBScorpionDeath";
+ return;
+}
+
+function script FlowerPentagramCount {
+ set $@Flower_Pentagram_Mobcount,
+ mobcount("013-1", "#FlowerPentagram::OnSquirrelDeath") +
+ mobcount("013-1", "#FlowerPentagram::OnMushroomDeath") +
+ mobcount("013-1", "#FlowerPentagram::OnBlueparDeath") +
+ mobcount("013-1", "#FlowerPentagram::OnMoubooDeath") +
+ mobcount("013-1", "#FlowerPentagram::OnScorpionDeath") +
+ mobcount("013-1", "#FlowerPentagram::OnRScorpionDeath") +
+ mobcount("013-1", "#FlowerPentagram::OnAScorpionDeath") +
+ mobcount("013-1", "#FlowerPentagram::OnBScorpionDeath");
+ return;
+}
diff --git a/npc/013-1/mapflags.txt b/npc/013-1/mapflags.txt
new file mode 100644
index 00000000..de751e3d
--- /dev/null
+++ b/npc/013-1/mapflags.txt
@@ -0,0 +1 @@
+//013-1 mapflag resave 013-1,126,99
diff --git a/npc/013-1/sagatha.txt b/npc/013-1/sagatha.txt
new file mode 100644
index 00000000..01171c14
--- /dev/null
+++ b/npc/013-1/sagatha.txt
@@ -0,0 +1,403 @@
+// (C) The Mana World Developers
+
+function script SagathaStatus {
+ if (isequippedcnt(MoubooHead, FluffyHat))
+ QuestSagathaAnnoy(15);
+
+ @mexp = MAGIC_EXP;
+ @has_magic = getskilllv(SKILL_MAGIC);
+ @evil = 0;
+ @good = 0;
+ @unhappy = (QUEST_MAGIC & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT;
+ @mouboo = ((QUEST_MAGIC & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT) & 3;
+
+ if (@mouboo == 3)
+ @good = @good + 1;
+ if (@mouboo == 2)
+ @evil = 1;
+ if (@mouboo == 1)
+ @evil = 1;
+
+ if (MAGIC_FLAGS & MFLAG_DID_CUTTREE)
+ @evil = 1;
+
+ @druid = (((QUEST_MAGIC & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT) & 12) >> 2;
+ if (@druid == 3)
+ @good = @good + 1;
+ return;
+}
+
+013-1,131,24,0 script Sagatha#_M NPC167,{
+ SagathaStatus();
+
+ @Q_MASK = NIBBLE_4_MASK | NIBBLE_5_MASK;
+ @Q_SHIFT = NIBBLE_4_SHIFT;
+
+ @STATUS_INITIAL = 0;
+ set @STATUS_STUDENT, 1; // N14
+ @STATUS_STUDENT_N10 = 2;
+ @STATUS_STUDENT_A10 = 3;
+ @STATUS_STUDENT_A11 = 4;
+ @STATUS_STUDENT_A12 = 5;
+ @STATUS_STUDENT_N11 = 6;
+ @STATUS_STUDENT_LEVEL_3 = 7;
+
+ @Q_status = (QUEST_MAGIC & @Q_MASK) >> @Q_SHIFT;
+
+ if (MAGIC_FLAGS & MFLAG_KNOWS_SAGATHA)
+ .n$=l("Sagatha the Witch");
+ else
+ .@n$=l("Witch");
+ // Header
+ mesn .@n$;
+ // if fluffyhat
+ if (isequipped(FluffyHat))
+ goto L_hat_attack;
+ if (@evil)
+ goto L_evil;
+ if (@unhappy > 10)
+ goto L_unhappy;
+ if (MAGIC_FLAGS & MFLAG_KNOWS_SAGATHA)
+ goto L_wb;
+
+ mesc l("Before you stands a beautiful woman, dressed in dark purple robes and wearing a witch's hat.");
+
+ mesc l("She looks at you suspiciously.");
+ next;
+ menu
+ "Who are you?", L_Next,
+ "What's your name?", L_Intro_name,
+ "Hello! My name is " + strcharinfo(0) + ".", L_Intro_givename,
+ "Goodbye.", L_close;
+
+L_Next:
+ mesn .@n$;
+ mes "\"I am what you humans call a witch. I am a human who has chosen all living creatures as what you call family.\"";
+ next;
+ menu
+ "No, I mean... what's your name?", L_Intro_name,
+ "Hello! My name is " + strcharinfo(0) + ".", L_Intro_givename,
+ "Uh.... goodbye.", L_close;
+
+L_hat_attack:
+ mes "The witch seems to be trembling with disgust as she stares at your headgear.";
+ mes "\"Do you think that is funny?\" she snarls.";
+ next;
+ mesn .@n$;
+ mes "\"You have no idea what that poor creature felt!\"";
+ mes "She snaps her fingers.";
+ mes "\"Let me show you...\"";
+ misceffect sfx_magic_war, strcharinfo(0);
+ misceffect sfx_magic_war;
+ heal -300, 0;
+ close;
+
+L_Intro_name:
+ mesn .@n$;
+ mesq l("They call me Sagatha.");
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_SAGATHA;
+ next;
+ goto L_Main;
+
+L_Intro_givename:
+ mesn .@n$;
+ mesq l("Ah.");
+ next;
+ menu
+ "What's yours?", L_Intro_name,
+ "Uhm... bye.", L_close;
+
+L_evil:
+ mesc l("The witch's eyes flare up in anger as she notices you, and she turns away from you.");
+ mesc l("Whatever the reason, she doesn't seem to like you.");
+ close;
+
+L_unhappy:
+ mesc l("The witch glares at you in anger.");
+ mes "\"I wonder if you can still sleep after killing those innocent forest creatures!";
+ mes "I am sure that they will come back to haunt you in your dreams!\"";
+ close;
+
+L_wb:
+ if (@good > 1)
+ mes "Sagatha nods as she notices you.";
+ if (@good == 1)
+ mes "Sagatha raises an eyebrow as you address her.";
+ if (@good == 0)
+ mes "Sagatha glances at you, suspicion evident in her eyes.";
+ next;
+ goto L_Main;
+
+L_Main:
+ if (@Q_status)
+ menu
+ "Can you explain magic to me?", L_explain_magic,
+ "Can you teach me more magic?", L_Teach,
+ "What do you know about...", L_Question,
+ "Goodbye.", L_close;
+ menu
+ "Can you explain magic to me?", L_explain_magic,
+ "Can you teach me magic?", L_Teach_Initial,
+ "What do you know about...", L_Question,
+ "Goodbye.", L_close;
+
+L_Teach_Initial:
+ if (@good < 2)
+ goto L_initial_nogood;
+ if (getskilllv(SKILL_MAGIC_NATURE) < 2)
+ goto L_initial_nonature;
+ mesn .@n$;
+ mes "She nods.";
+ mes "\"For now, yes. But you will have to prove that you really care about more than yourself.\"";
+ next;
+ mesn .@n$;
+ mes "She snaps her fingers, and without warning you begin to acutely sense the magical energies around you, for a brief instant!";
+ @Q_status = @STATUS_STUDENT;
+ callsub S_Update_Var;
+ @SUP_xp = 5000;
+ @SUP_lvl = 2;
+ callsub S_up_astral;
+ next;
+ mesn .@n$;
+ mes "\"In the future, I will teach you nature and astral magic. For the other schools there are better teachers around.\"";
+ if (getskilllv(SKILL_MAGIC) < 2)
+ mes "\"Your skill in magic won't be great enough to use some of the spells yet, so keep practicing and visiting the mana seed until it is.\"";
+ next;
+ goto L_Main;
+
+L_initial_nogood:
+ mesn .@n$;
+ mes "\"I don't take strangers as students.\"";
+ next;
+ goto L_Main;
+
+L_initial_nonature:
+ mesn .@n$;
+ mes "\"I might, but you don't even understand the basics of nature magic.\"";
+ next;
+ goto L_Main;
+
+L_explain_magic:
+ mesn .@n$;
+ mes "\"No.\"";
+ next;
+ goto L_Main;
+
+L_Teach:
+ if (@Q_status == @STATUS_STUDENT)
+ goto L_Teach_N14;
+ if (@Q_status == @STATUS_STUDENT_N10)
+ goto L_Teach_N10;
+ if (@Q_status == @STATUS_STUDENT_A10)
+ goto L_Teach_A10;
+ if (@Q_status == @STATUS_STUDENT_A11)
+ goto L_Teach_A11;
+ if (@Q_status == @STATUS_STUDENT_A12)
+ goto L_Teach_A12;
+ if (@Q_status == @STATUS_STUDENT_N11)
+ goto L_Teach_N11;
+
+ mesn .@n$;
+ mes "\"Not yet. You have to ask the mana seed to give you more power.\"";
+ next;
+ goto L_Main;
+
+L_practice:
+ mes "[1000 experience points]";
+ @Q_status = @Q_status + 1;
+ callsub S_Update_Var;
+ getexp 1000,0;
+ next;
+ mesn .@n$;
+ mes "\"Now go and practice.\"";
+ next;
+ goto L_Main;
+
+L_Teach_N14:
+ if (@mexp < 125 || getskilllv(SKILL_MAGIC) < 1)
+ goto L_Teach_noexp;
+ mesn .@n$;
+ mesq l("Some forest creatures sometimes overgrow their fur or hide. That makes them uncomfortable.");
+ next;
+ mesn .@n$;
+ mesq l("You can help them with shearing magic. Press your hands together and say '%s'. Then touch them with your hands, and brush off any excess.", b("Chipchip"));
+ learnskill SKILL_CHIPCHIP;
+ next;
+ mesn .@n$;
+ mesq l("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.");
+ goto L_practice;
+
+L_Teach_N10:
+ if (@mexp < 150 || getskilllv(SKILL_MAGIC) < 2)
+ goto L_Teach_noexp;
+ mesn .@n$;
+ mesq l("Next, a nature spell. Take a cocoon shell. Hold it in your hand. Feel its lightness.");
+ next;
+ mesn .@n$;
+ mesq l("Internalize this feeling, and if your backpack was pressing on you you should no longer feel it now. We call it %s and it is a passive spell.", b("Plugh"));
+ learnskill ALL_INCCARRY;
+ goto L_practice;
+
+L_Teach_A10:
+ if (@mexp < 180 || getskilllv(SKILL_MAGIC) < 2)
+ goto L_Teach_noexp;
+ mesn .@n$;
+ mesq l("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;
+ mesn .@n$;
+ mesq l("Then say %s and let the mushroom's power take over. It only works on yourself, party or guild allies.", b("asorm"));
+ learnskill SKILL_ASORM;
+ goto L_practice;
+
+L_Teach_A11:
+ if (@mexp < 200 || getskilllv(SKILL_MAGIC) < 2)
+ goto L_Teach_noexp;
+ mesn .@n$;
+ mesq l("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: '%s'. Then press the root to the ground.", b("Kalrenk"));
+ learnskill SKILL_KALRENK;
+ next;
+ mesn .@n$;
+ mesq l("Spiky mushrooms often grow too many spikes, so you can shear the spikes off of some.");
+ next;
+ goto L_practice;
+
+L_Teach_A12:
+ if (@mexp < 220 || getskilllv(SKILL_MAGIC) < 2)
+ goto L_Teach_noexp;
+ mesn .@n$;
+ mesq l("You can call fluffies, too. But for them you must call out '%s' instead, with white fluffy fur instead of a spike. And don't forget the root.", b("Kalakarenk"));
+ learnskill SKILL_KALAKARENK;
+ goto L_practice;
+
+L_Teach_N11:
+ if (@mexp < 250 || getskilllv(SKILL_MAGIC) < 2)
+ goto L_Teach_noexp;
+ mesn .@n$;
+ mesq l("You can harden your skin with a hard spike. Hold it in your hands and speak '%s', then draw its hardness into your skin, or the skin of someone's else.", b("betsanc"));
+ learnskill SKILL_BETSANC;
+ next;
+ mesn .@n$;
+ mesq l("Keep in mind this spell only works on yourself or party/guild companions. It will reduce your attack speed so keep this in mind.");
+ goto L_practice;
+
+L_Teach_noexp:
+ mesn .@n$;
+ mesq l("You must practice more first.");
+ next;
+ goto L_Main;
+
+L_Question:
+ callfunc "MagicTalkOptionsSetup";
+ @ignore = @QQ_SAGATHA;
+ callfunc "MagicTalkMenu";
+
+ if (@c == 0)
+ goto L_Main;
+ if (@c == @QQ_ELANORE)
+ goto L_Q_elanore;
+ if (@c == @QQ_MANASEED)
+ goto L_Q_manaseed;
+ if (@c == @QQ_MANAPOTION)
+ goto L_Q_manapotion;
+ if (@c == @QQ_WYARA)
+ goto L_Q_wyara;
+ if (@c == @QQ_AULDSBEL)
+ goto L_Q_auldsbel;
+ if (@c == @QQ_IMP)
+ goto L_Q_imp;
+ if (@c == @QQ_OLDWIZ)
+ goto L_Q_old_wizard;
+ if (@c == @QQ_ASTRALSOUL)
+ goto L_Q_astralsoul;
+
+ mesn .@n$;
+ mes "\"That doesn't concern you.\"";
+ next;
+ goto L_Main;
+
+L_Q_astralsoul:
+ mesn .@n$;
+ mes "\"Yes, there is a way to improve your magic.\"";
+ next;
+ mes "\"Did you ever hear about focusing?\"";
+ next;
+ mes "\"It is a mental ability, which improves you at a certain focused skill.\"";
+ next;
+ mes "\"Yes, I am focused on nature magic, but I cannot teach focusing. That is another realm of magic. Just a few people can really focus your brain to a specific art of magic.\"";
+ next;
+ mes "\"Maybe you should ask some other people experienced in magic.\"";
+ next;
+ goto L_Main;
+
+L_Q_old_wizard:
+ mesn .@n$;
+ mes "\"A kind and wise wizard.\"";
+ next;
+ goto L_Main;
+
+L_Q_imp:
+ mesn .@n$;
+ mes "\"He is an evil and cruel one. He lies and cheats and will try to take advantage of you. Stay away from him.\"";
+ next;
+ goto L_Main;
+
+L_Q_elanore:
+ mesn .@n$;
+ mes "\"Elanore is the Tulimshar town healer.\"";
+ next;
+ goto L_Main;
+
+L_Q_manaseed:
+ mesn .@n$;
+ if (!@has_magic && (MAGIC_FLAGS & MFLAG_TOUCHED_MANASEED))
+ goto L_Q_manaseed_unabsorbed;
+ if (@has_magic)
+ goto L_Q_manaseed_m;
+ mes "\"There is a mana seed around here, but I don't see how this concerns you.\"";
+ next;
+ goto L_Main;
+
+L_Q_manaseed_unabsorbed:
+ mes "\"If the mana seed didn't pass its magic to you, you clearly aren't attuned to magic.\"";
+ next;
+ goto L_Main;
+
+L_Q_manaseed_m:
+ mes "\"You were lucky that the mana seed gave you its magic. I hope that you will use this power for something good now.\"";
+ next;
+ goto L_Main;
+
+L_Q_manapotion:
+ mesn .@n$;
+ mes "\"I won't make one without a cauldron, that would be wasteful. And I'm not going to start carrying a cauldron around.\"";
+ next;
+ goto L_Main;
+
+L_Q_wyara:
+ mesn .@n$;
+ mes "\"Wyara decided to live with humans, in Hurnscald. She tries to make the world a better place in her own way. Please be kind to her, she is a very good person.\"";
+ next;
+ goto L_Main;
+
+L_Q_auldsbel:
+ mesn .@n$;
+ mes "She frowns.";
+ mes "\"He's a transmutation wizard, member of the northern council. Reasonably competent wizard, too.\"";
+ next;
+ goto L_Main;
+
+L_close:
+ close;
+
+S_up_astral:
+ @SUP_id = SKILL_MAGIC_ASTRAL;
+ @SUP_name$ = "Astral Magic";
+ callfunc "SkillUp";
+ return;
+
+S_Update_Var:
+ set QUEST_MAGIC,
+ (QUEST_MAGIC & ~(@Q_MASK)
+ | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/013-1/traveler.txt b/npc/013-1/traveler.txt
new file mode 100644
index 00000000..565a1063
--- /dev/null
+++ b/npc/013-1/traveler.txt
@@ -0,0 +1,6 @@
+013-1,120,90,0 script Faris the Traveler NPC103,{
+ @npcname$ = "Faris";
+ @NpcTravelBit = $@magic_house_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/013-2/_import.txt b/npc/013-2/_import.txt
new file mode 100644
index 00000000..63b87c91
--- /dev/null
+++ b/npc/013-2/_import.txt
@@ -0,0 +1,7 @@
+// Map 013-2: Magic House
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/013-2/_warps.txt",
+"npc/013-2/apprentice.txt",
+"npc/013-2/mapflags.txt",
+"npc/013-2/notes.txt",
+"npc/013-2/wizard.txt",
diff --git a/npc/013-2/_warps.txt b/npc/013-2/_warps.txt
new file mode 100644
index 00000000..c649c3b5
--- /dev/null
+++ b/npc/013-2/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 013-2: Magic House warps
+013-2,63,42,0 warp #013-2_63_42 0,0,013-1,42,91
+013-2,67,36,0 warp #013-2_67_36 0,0,013-2,21,40
+013-2,21,41,0 warp #013-2_21_41 0,0,013-2,67,37
diff --git a/npc/013-2/apprentice.txt b/npc/013-2/apprentice.txt
new file mode 100644
index 00000000..9c17e99c
--- /dev/null
+++ b/npc/013-2/apprentice.txt
@@ -0,0 +1,98 @@
+013-2,25,37,0 script Fabius NPC115,{
+ mes "[Fabius]";
+ mes "\"Hey! Wanna have a drink or something? High quality, low cost. A poor fella like me needs a bit of extra cash, ye know.\"";
+ next;
+ menu
+ "Yes please!", L_Yes,
+ "No thanks.", L_No,
+ "No way, I thought it was for free!", L_Not_Free;
+
+L_Yes:
+ mes "[Fabius]";
+ mes "\"So what would ya like, then?\"";
+ next;
+ menu
+ "A beer", L_Beer,
+ "A milk", L_Milk,
+ "Nevermind", L_No;
+
+L_No:
+ mes "[Fabius]";
+ mes "\"Suit yourself.\"";
+ next;
+ goto L_Finish;
+
+L_Not_Free:
+ mes "[Fabius]";
+ mes "\"Oh, you stupid git! ... But hey, let me tell ya something...\"";
+ next;
+ mes "[Fabius]";
+ mes "\"There's notes flying around in the room up there. Did ya try reading some?\"";
+ close;
+
+L_Beer:
+ mes "[Fabius]";
+ mes "\"That'll be 175 GP.\"";
+ next;
+ menu
+ "Here you are", L_Beer_yes,
+ "No thanks", L_Beer_no;
+
+L_Beer_yes:
+ if (Zeny < 175)
+ goto L_Low_money;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("Beer") == 0)
+ goto L_TooMany;
+ getitem "Beer", 1;
+ Zeny = Zeny - 175;
+ goto L_Finish;
+
+L_Beer_no:
+ mes "[Fabius]";
+ mes "\"No beer, no civilization!\"";
+ next;
+ goto L_Finish;
+
+L_Milk:
+ mes "[Fabius]";
+ mes "\"That'll be 300 GP.\"";
+ next;
+ menu
+ "Here you are", L_Milk_yes,
+ "No thanks", L_Milk_no;
+
+L_Milk_yes:
+ if (Zeny < 300)
+ goto L_Low_money;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("Milk") == 0)
+ goto L_TooMany;
+ getitem "Milk", 1;
+ Zeny = Zeny - 300;
+ goto L_Finish;
+
+L_Milk_no:
+ mes "[Fabius]";
+ mes "\"Oh alright. Milk is a deadly poison anyway...\"";
+ next;
+ goto L_Finish;
+
+L_Low_money:
+ mes "[Fabius]";
+ mes "\"Aw, you don't have enough gold on you!\"";
+ next;
+ goto L_Finish;
+
+L_Finish:
+ mes "[Fabius]";
+ mes "\"By the way, have you seen those flying notes and the mirror in the room next door? They're WAY COOL! Try reading some of the notes!\"";
+ close;
+
+L_TooMany:
+ mes "[Fabius]";
+ mes "\"You don't have room for it.\"";
+ close;
+}
diff --git a/npc/013-2/mapflags.txt b/npc/013-2/mapflags.txt
new file mode 100644
index 00000000..42e54a1e
--- /dev/null
+++ b/npc/013-2/mapflags.txt
@@ -0,0 +1 @@
+//013-2 mapflag resave 013-1,126,99
diff --git a/npc/013-2/notes.txt b/npc/013-2/notes.txt
new file mode 100644
index 00000000..8c2cf9fa
--- /dev/null
+++ b/npc/013-2/notes.txt
@@ -0,0 +1,204 @@
+
+013-2,23,32,0 script Motto#wiz NPC400,{
+ mes "Mid pleasures and palaces though we may roam,";
+ mes "Be it ever so humble, there's no place like home.";
+ close;
+}
+
+013-2,30,32,0 script Note#wiz NPC400,{
+ mes "Please do not open.";
+ close;
+}
+
+013-2,38,20,0 script Saying#wiz NPC400,{
+ mes "The early bird catcheth the worm.";
+ if (!getvaultid()) close; // Close this mirror lake
+ if (get_nibble(##03_TMWQUEST, 0) < 2) close; // Not yet authorized
+ mesc l("Should we recite this backward to travel to a different world? If yes, thinking on what?");
+ select
+ l("Leave it be."),
+ rif(get_nibble(##03_TMWQUEST, 0) >= 2, l("Think on Mouboos and Cindy problems"));
+ mes "";
+ switch (@menu) {
+ case 2: MirrorLakeSendTo(MLP_MOUBOOTAUR, 0); break;
+ }
+ close;
+}
+
+013-2,27,21,0 script Mirror#wiz NPC400,{
+ mes "You say: \"Mirror mirror on the wall, who has the nicest haircut of them all?\"";
+ next;
+ mes "\"Oh fair adventurer, your hair indeed looks nice. But wouldn't it look much better, after I have rolled my dice?\"";
+ next;
+ mes "Your looks suddenly change...";
+ next;
+ @fixedMirror = 1;
+ callfunc "useMirror";
+ close;
+}
+
+013-2,25,23,0 script Spell#wiz1 NPC400,{
+ mes "You read: \"I see trees of green, red roses too. I see them bloom for me and you. And I think to myself: \'What a wonderful world\'\"";
+ next;
+ mes "You think: \"Huh?\"";
+ next;
+ mes "The spell fulfills its inevitable purpose...";
+ next;
+ @dest = rand(BaseLevel);
+ if (@dest < 10)
+ goto L_PlaceOne;
+ if ((@dest >= 10) && (@dest <= 50))
+ goto L_PlaceTwo;
+ goto L_PlaceThree;
+
+L_PlaceOne:
+ warp "013-1",128,28;
+ goto L_close;
+
+L_PlaceTwo:
+ warp "016-1",62,89;
+ goto L_close;
+
+L_PlaceThree:
+ warp "014-1",33,35;
+ goto L_close;
+
+L_close:
+ @dest = 0;
+ close;
+}
+
+013-2,27,24,0 script Spell#wiz2 NPC400,{
+ mes "You read: \"You must not fear, for it is the mind-killer. That and sharp pointy things.\"";
+ next;
+ mes "You feel the floor disappear below your feet...";
+ next;
+ callfunc "MiriamCheat";
+ @dest = rand(BaseLevel);
+ if (@dest < 10)
+ goto L_PlaceOne;
+ if ((@dest >= 10) && (@dest <= 50))
+ goto L_PlaceTwo;
+ goto L_PlaceThree;
+
+L_PlaceOne:
+ warp "006-1",83,60;
+ goto L_close;
+
+L_PlaceTwo:
+ warp "006-1",77,22;
+ goto L_close;
+
+L_PlaceThree:
+ warp "006-1",33,93;
+ goto L_close;
+
+L_close:
+ @dest = 0;
+ close;
+}
+
+013-2,25,27,0 script Spell#wiz3 NPC400,{
+ mes "You read: \"Snow-white flakes and eminent frost - I'll go there, whatever the cost!\"";
+ next;
+ mes "You feel yourself getting lighter...";
+ next;
+ @dest = rand(BaseLevel);
+ if (@dest < 10)
+ goto L_FriendlyPlace;
+ if ((@dest >= 10) && (@dest <= 50))
+ goto L_DeepCave;
+ goto L_Cave;
+
+L_FriendlyPlace:
+ warp "019-3",102,77;
+ goto L_close;
+
+L_DeepCave:
+ warp "031-3",135,163;
+ goto L_close;
+
+L_Cave:
+ warp "031-3",37,213;
+ goto L_close;
+
+L_close:
+ @dest = 0;
+ close;
+}
+
+013-2,27,27,0 script Spell#wiz4 NPC400,{
+ mes "You read: \"People and cosiness, lively and fun - that's where I've gone!\"";
+ next;
+ mes "The world around you slowly dissolves...";
+ next;
+ @dest = rand(BaseLevel);
+ if (@dest < 10)
+ goto L_PlaceOne;
+ if ((@dest >= 10) && (@dest <= 50))
+ goto L_PlaceTwo;
+ goto L_PlaceThree;
+
+L_PlaceOne:
+ warp "030-2",88,24;
+ goto L_close;
+
+L_PlaceTwo:
+ warp "001-2",30,29;
+ goto L_close;
+
+L_PlaceThree:
+ warp "010-2",34,42;
+ goto L_close;
+
+L_close:
+ @dest = 0;
+ close;
+}
+
+013-2,26,28,0 script Spell#wiz5 NPC400,{
+ mes "You read: \"Darkness and legs, eight of them each - I'd rather not go there, but now it's too late...\"";
+ next;
+ mes "For a moment everything turns black...";
+ next;
+ @dest = rand(BaseLevel);
+ if (@dest < 10)
+ goto L_PlaceOne;
+ if ((@dest >= 10) && (@dest <= 50))
+ goto L_PlaceTwo;
+ goto L_PlaceThree;
+
+L_PlaceOne:
+ warp "012-4",431,36;
+ goto L_close;
+
+L_PlaceTwo:
+ warp "013-3",134,54;
+ goto L_close;
+
+L_PlaceThree:
+ warp "013-3",178,67;
+ goto L_close;
+
+L_close:
+ @dest = 0;
+ close;
+}
+
+013-2,21,29,0 script Spell#wiz6 NPC400,{
+ mes "You read: \"Heart stops pumping, breath begone - life is stopping, death has come!\"";
+ next;
+ mes "You're losing control of your body... everything turns black... while slipping to the floor, you hear a faraway scream... suddenly, you see THE LIGHT!";
+ next;
+ heal -Hp, 0;
+ close;
+}
+
+013-2,28,29,0 script Spell#wiz7 NPC400,{
+ mes "You read: \"Cotton, steel, leather and wool - have I ever seen a greater fool?\"";
+ next;
+ mes "You suddenly feel naked; you ARE naked!";
+ next;
+ nude;
+ close;
+}
diff --git a/npc/013-2/wizard.txt b/npc/013-2/wizard.txt
new file mode 100644
index 00000000..5bef35a4
--- /dev/null
+++ b/npc/013-2/wizard.txt
@@ -0,0 +1,218 @@
+013-2,66,39,0 script Old Wizard#_W NPC116,{
+ @has_magic = getskilllv(SKILL_MAGIC);
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_KNOWS_OLD_WIZARD;
+
+ @run = ((QUEST_NorthTulimshar & TWOBIT_8_MASK) >> TWOBIT_8_SHIFT);
+ if ((@run == 2) && (QL_KYLIAN == 13))
+ goto L_Deliver;
+ goto L_Start;
+
+L_Deliver:
+ menu
+ "I have a delivery for you", L_Delivery;
+
+L_Delivery:
+ mesn;
+ mes "\"Good now I can get to work on some stronger brew..\"";
+ QL_KYLIAN = 14;
+ goto L_close;
+
+L_Start:
+ mesn;
+ mes "\"Welcome, dear wanderer! Come into my humble home. Take a rest, eat and drink.\"";
+ next;
+ menu
+ "Thanks, that's very kind of you!", L_Thanks,
+ "Can you teach me magic?", L_TeachRude,
+ rif(get_nibble(##03_TMWQUEST, 0), l("Actually, have you ever heard of Yeti's kidnapping little girls?")), L_VaultQuest,
+ "Oh, shut up!", L_ShutUp;
+
+L_TeachRude:
+ mesn;
+ mes "\"I certainly could, but I already have an apprentice.\"";
+ goto L_close;
+
+L_ShutUp:
+ mesn;
+ mes "\"That attitude isn't going to get you very far, my dear.\"";
+ goto L_close;
+
+L_Thanks:
+ mesn;
+ mes "\"Behind this door, my apprentice will serve you.\"";
+ next;
+ if (@has_magic)
+ menu
+ "Alright.", L_Agree,
+ "I am studying magic, can you help?", L_NewStudent,
+ "Your apprentice? ... No thanks.", L_Decline;
+ menu
+ "Alright.", L_Agree,
+ "Your apprentice? ... No thanks.", L_Decline;
+
+L_Decline:
+ mesn;
+ mes "\"Goodbye, then!\"";
+ goto L_close;
+
+L_NewStudent:
+ mesn;
+ mes "\"Studying is always an excellent use of one's mind! I fear that I can't offer too much assistance to you, however. But if you are interested, I could perhaps teach you a simple spell?\"";
+ next;
+
+ // check if the player has the knowledge of any skill
+ if (getskilllv(SKILL_POOL) && (getskilllv(SKILL_MAGIC_ASTRAL) < 1) || (getskilllv(SKILL_ASTRAL_SOUL) == 0))
+ menu
+ "That would be very kind of you!", L_TeachSpell,
+ "Actually I am looking for someone teaching me some more magic skills.", L_AstralSoul,
+ "No, but thank you!", L_Decline;
+ menu
+ "That would be very kind of you!", L_TeachSpell,
+ "No, but thank you!", L_Decline;
+
+L_TeachSpell:
+ mesn;
+ 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;
+ mesn;
+ 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;
+ mesn;
+ mes "\"You can also cast it on others, of course. Just speak their name after you pronounce the invocation.\"";
+ next;
+ mesn;
+ mes "\"You may find it useful for getting a little peace and quiet at times, but it can also get in the way of friends trying to find you, so use it with care.\"";
+ next;
+ if (getskilllv(SKILL_MAGIC_ASTRAL) >= 2)
+ goto L_close;
+ mesn;
+ mes "\"I'm not sure if you are experienced enough to cast it yet, though. You may need to first learn astral magic.\"";
+ goto L_close;
+
+L_AstralSoul:
+ mesn;
+ mes "\"Oh yes, there are lots of ways to improve your magic. Skills -some people say mental focus for that- are another way to improve your magic. Of course learning more and more spells is also a need for good mages.\"";
+ next;
+ mes "\"I can teach you the ability to focus on magical stuff.\"";
+ next;
+ mes "\"To do so, I am in need of a pearl and about 100 acorns.\"";
+ menu
+ "Here we go.", L_Next,
+ "Ok be right back. I'll get them", L_Decline;
+
+L_Next:
+ if (countitem("Pearl") < 1 || countitem("Acorn") < 100) goto L_NotEnough;
+ delitem "Pearl", 1;
+ delitem "Acorn", 100;
+ mesn;
+ mes "\"Okay, listen:\"";
+ next;
+ mes "\"Some parts of your brain is still unused. These parts will now get the ability to get focused to magic.\"";
+ next;
+ mes "\"To do so, think of a magic spell!\"";
+ next;
+ mes "The old wizard mumbles some invocations";
+ next;
+ @SUP_lvl = 1;
+ @SUP_id = SKILL_ASTRAL_SOUL;
+ @SUP_name$ = "Astral Soul";
+ @SUP_xp = 2500;
+ callfunc "SkillUp";
+ mes "\"Now go and try to find someone who can actually activate that focus.\"";
+ next;
+ mes "\"You have the powers to focus on magic, but you need to get magic focused now.\"";
+ goto L_close;
+
+L_NotEnough:
+ mesn;
+ mes "\"Please learn to count.\"";
+ next;
+ mes "\"When you are done with that, come back again.\"";
+ goto L_close;
+
+L_Agree:
+ mesn;
+ mes "\"Beware the flying notes though, some of them are really dangerous. I haven't been able to persuade them to get back into their book. And avoid the mirror, it's been acting strange lately.\"";
+ next;
+ mes "\"Oh, and please don't take my apprentice too seriously. He still has a lot to learn.\"";
+ goto L_close;
+
+L_VaultQuest:
+ .@q = get_nibble(##03_TMWQUEST, 0);
+ mes "";
+ mesc l("%s raises an eyebrow at you.", strnpcinfo(1));
+ if (.@q == 1) {
+ mesn;
+ mesq l("Are you being serious?");
+ next;
+ //if (askyesno() == ASK_NO) close;
+ mesn;
+ mesq l("Have you at least asked Celestia about it? She is very knowledgeable about Yetis.");
+ next;
+ select
+ l("Who is Celestia?"),
+ l("Yes I did."),
+ l("No I didn't, I'll ask her.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ mesn;
+ mesq l("Ah, Celestia... She is a good woman who lives in Hurnscald. Go find her, come back to me after.");
+ close;
+ case 3:
+ close;
+ }
+ mesn;
+ mesq l("And what did she say?");
+ next;
+ mesc l("You explain to the wizard about the situation.");
+ next;
+ mesn;
+ mesq l("If she said Yetis doesn't do it, then they doesn't do it... In this world, at least.");
+ if (!getvaultid()) close; // Duplicate code, for double safety
+ next;
+ select
+ l("\"this world\"?");
+ mes "";
+ mesn;
+ mesq l("Oh yes, there are worlds like this one where you can find even Yetis involved in politics. Really impressing.");
+ next;
+ set_nibble(##03_TMWQUEST, 0, 2);
+ .@q = 2;
+ }
+ if (.@q == 2) {
+ mesn;
+ mesq l("It was a long time since the last time I visited a different world... But you're young. Maybe you can do it. However, keep it a secret.");
+ next;
+ mesn;
+ mesq l("So, lemme think. There was this world, \"Moubootaur Lake\" or something, don't recall how they call themselves."); // Typo on purpose
+ next;
+ mesn;
+ mesq l("You could ask the %s of that world about it. Come back to me if she doesn't know anything, and I'll think on another world.", b("Celestia"));
+ next;
+ mesn;
+ mesq l("Now, %s. The worlds are all different. The one you're going to may be similar but is far from a carbon copy of this one.", b(l("pay attention")));
+ next;
+ mesn;
+ mesq l("That world's Celestia is %s but not necessarily on the same house, or with the exact same name, nor with the exact same clothes.", b(l("likely on the same town")));
+ next;
+ mesn;
+ mesq l("Now, if my memory serves me right, after visiting that world, you'll appear near a lake. %s, and then %s.",
+ b(l("Go south until you see a big road")),
+ b(l("Head east until you see the town")));
+ next;
+ mesn;
+ mesq l("If you know a native citizen of the world, all the better. Worlds tend to impose their own rules, after all.");
+ next;
+ mesn;
+ mesq col(l("*cough cough*"), 9)+" "+l("Anyway, I don't teach this spell to everyone. Near my bed is a saying. Recite it backwards, think on the world you want to go, and let it be.");
+ next;
+ }
+ mesn;
+ mesq l("Good luck, and come back to me if you need help.");
+ close;
+
+L_close:
+ @has_magic = 0;
+ close;
+}
diff --git a/npc/013-3/_import.txt b/npc/013-3/_import.txt
new file mode 100644
index 00000000..7f84dcbc
--- /dev/null
+++ b/npc/013-3/_import.txt
@@ -0,0 +1,9 @@
+// Map 013-3: Woodland Hills Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/013-3/_mobs.txt",
+"npc/013-3/_warps.txt",
+"npc/013-3/barrier.txt",
+"npc/013-3/mapflags.txt",
+"npc/013-3/mask_chest.txt",
+"npc/013-3/misc.txt",
+"npc/013-3/sword_chest.txt",
diff --git a/npc/013-3/_mobs.txt b/npc/013-3/_mobs.txt
new file mode 100644
index 00000000..4a0e2ac0
--- /dev/null
+++ b/npc/013-3/_mobs.txt
@@ -0,0 +1,30 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 013-3: Woodland Hills Cave mobs
+013-3,28,89,8,26 monster Cave Snake 1021,10,120000,60000
+013-3,61,22,1,1 monster Fire Skull 1023,1,120000,60000
+013-3,81,22,1,1 monster Poison Skull 1024,1,120000,60000
+013-3,109,31,3,11 monster Black Scorpion 1009,20,50000,25000
+013-3,119,84,13,19 monster Spider 1012,20,120000,40000
+013-3,176,23,2,3 monster Spider 1012,10,100000,40000
+013-3,82,75,1,1 monster Fire Skull 1023,1,180000,60000
+013-3,142,37,1,1 monster Poison Skull 1024,1,180000,60000
+013-3,79,134,10,8 monster Black Scorpion 1009,5,80000,40000
+013-3,71,169,19,8 monster Black Scorpion 1009,5,80000,40000
+013-3,64,85,4,10 monster Black Scorpion 1009,10,80000,40000
+013-3,81,92,1,10 monster Black Scorpion 1009,10,80000,40000
+013-3,163,84,16,18 monster Snake 1010,30,120000,50000
+013-3,162,85,16,18 monster Spider 1012,30,120000,50000
+013-3,172,77,9,12 monster Black Scorpion 1009,15,120000,50000
+013-3,145,36,10,7 monster Red Slime 1008,25,80000,40000
+013-3,167,37,11,5 monster Snake 1010,20,120000,40000
+013-3,165,25,8,5 monster Black Scorpion 1009,15,120000,40000
+013-3,71,39,1,1 monster Snake 1010,2,40000,20000
+013-3,159,102,1,2 monster Yellow Slime 1007,2,80000,40000
+013-3,67,22,1,1 monster Maggot 1002,2,40000,20000
+013-3,75,22,1,1 monster Maggot 1002,2,40000,20000
+013-3,76,39,3,2 monster Black Scorpion 1009,8,40000,20000
+013-3,65,39,3,2 monster Red Slime 1008,8,40000,20000
+013-3,62,33,1,0 monster Poison Skull 1024,1,120000,60000
+013-3,80,33,1,0 monster Fire Skull 1023,1,120000,60000
+013-3,75,46,1,0 monster Poison Skull 1024,1,120000,60000
+013-3,67,46,1,0 monster Fire Skull 1023,1,120000,60000
diff --git a/npc/013-3/_warps.txt b/npc/013-3/_warps.txt
new file mode 100644
index 00000000..7d484e57
--- /dev/null
+++ b/npc/013-3/_warps.txt
@@ -0,0 +1,28 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 013-3: Woodland Hills Cave warps
+013-3,34,63,0 warp #013-3_34_63 0,0,013-1,125,103
+013-3,36,96,0 warp #013-3_36_96 0,0,013-3,79,126
+013-3,79,125,0 warp #013-3_79_125 0,0,013-3,35,96
+013-3,22,115,0 warp #013-3_22_115 0,0,018-1,115,41
+013-3,139,45,0 warp #013-3_139_45 0,0,018-1,127,37
+013-3,61,179,0 warp #013-3_61_179 0,0,018-1,134,46
+013-3,69,143,0 warp #013-3_69_143 0,0,018-3,50,89
+013-3,81,103,0 warp #013-3_81_103 0,0,018-1,147,41
+013-3,177,91,0 warp #013-3_177_91 0,0,018-1,177,21
+013-3,178,44,0 warp #013-3_178_44 0,0,018-3,97,70
+013-3,169,45,0 warp #013-3_169_45 0,0,018-3,27,55
+013-3,152,28,0 warp #013-3_152_28 0,0,018-3,134,62
+013-3,123,104,0 warp #013-3_123_104 0,0,018-3,172,22
+013-3,147,104,0 warp #013-3_147_104 0,0,018-3,177,22
+013-3,158,66,0 warp #013-3_158_66 0,0,018-3,27,90
+013-3,75,51,0 warp #013-3_75_51 0,0,013-3,109,65
+013-3,109,64,0 warp #013-3_109_64 0,0,013-3,75,50
+013-3,67,51,0 warp #013-3_67_51 0,0,018-3,90,51
+013-3,71,20,0 warp #013-3_71_20 0,0,013-3,28,39
+013-3,28,41,0 warp #013-3_28_41 0,0,013-3,71,21
+013-3,71,42,0 warp #013-3_71_42 0,0,013-3,109,21
+013-3,109,20,0 warp #013-3_109_20 0,0,013-3,71,41
+013-3,111,42,0 warp #013-3_111_42 0,0,018-3,71,123
+013-3,62,100,0 warp #013-3_62_100 0,0,018-3,174,86
+013-3,68,97,0 warp #013-3_68_97 0,0,018-3,102,70
+013-3,160,103,0 warp #013-3_160_103 0,0,009-3,117,20
diff --git a/npc/013-3/barrier.txt b/npc/013-3/barrier.txt
new file mode 100644
index 00000000..aa8a1918
--- /dev/null
+++ b/npc/013-3/barrier.txt
@@ -0,0 +1,27 @@
+
+013-3,71,21,0 script #DemonMineBarrier1#_M NPC32767,1,0,{
+ @state = ((QUEST_Hurnscald & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT);
+
+ if (@state >= 2) goto L_End;
+ if (@state == 1 && countitem("Soul") >= 1) goto L_Has_Soul;
+
+ message strcharinfo(0), "Barrier : ##3A barrier around the opening pushes you back as you approach.";
+
+ warp "013-3", 71, 25;
+ goto L_End;
+
+L_Has_Soul:
+ message strcharinfo(0), "Barrier : ##3The barrier around the opening allows you passage.";
+ @state = 2;
+ callsub S_Update_Mask;
+ delitem "Soul", 1;
+ goto L_End;
+
+L_End:
+ @state = 0;
+ end;
+
+S_Update_Mask:
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_2_MASK)) | (@state << NIBBLE_2_SHIFT);
+ return;
+}
diff --git a/npc/013-3/mapflags.txt b/npc/013-3/mapflags.txt
new file mode 100644
index 00000000..dd1cb4be
--- /dev/null
+++ b/npc/013-3/mapflags.txt
@@ -0,0 +1 @@
+//013-3 mapflag resave 013-1,126,99
diff --git a/npc/013-3/mask_chest.txt b/npc/013-3/mask_chest.txt
new file mode 100644
index 00000000..7b1edee2
--- /dev/null
+++ b/npc/013-3/mask_chest.txt
@@ -0,0 +1,218 @@
+
+013-3,28,27,0 script Chest#DemonMask NPC111,{
+ @state = ((QUEST_Hurnscald & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT);
+
+ if (@state < 2) goto L_NaoDeviaAcontecer;
+ if (@state == 3) goto L_Finished;
+
+ if (countitem("MaggotSlime") == 0)
+ goto L_No_maggot_slime;
+ if (countitem("SmallMushroom") == 0)
+ goto L_No_mushroom;
+ if (countitem("PinkPetal") == 0)
+ goto L_No_pink_petal;
+ if (countitem("Pearl") == 0)
+ goto L_No_pearl;
+ if (countitem("HardSpike") == 0)
+ goto L_No_hard_spike;
+ if (countitem("RawLog") == 0)
+ goto L_No_raw_log;
+ if (countitem("PinkAntenna") == 0)
+ goto L_No_pink_antenna;
+ if (countitem("SnakeTongue") == 0
+ || countitem("MountainSnakeTongue") == 0
+ || countitem("GrassSnakeTongue") == 0
+ || countitem("CaveSnakeTongue") == 0)
+ goto L_No_tongues;
+ if (countitem("TreasureKey") == 0)
+ goto L_No_treasure_key;
+ if (countitem("PileOfAsh") == 0)
+ goto L_No_Ash;
+ if (countitem("MauveHerb") == 0
+ || countitem("CobaltHerb") == 0
+ || countitem("GambogeHerb") == 0
+ || countitem("AlizarinHerb") == 0)
+ goto L_No_herbs;
+ if (countitem("BugLeg") == 0)
+ goto L_No_bug_leg;
+ if (countitem("CaveSnakeLamp") == 0)
+ goto L_No_lamp;
+ if (countitem("IronOre") == 0)
+ goto L_No_iron_ore;
+ if (countitem("ScorpionStinger") == 0
+ || countitem("RedScorpionStinger") == 0
+ || countitem("BlackScorpionStinger") == 0)
+ goto L_No_stingers;
+ if (countitem("SilkCocoon") == 0)
+ goto L_No_silk;
+ if (countitem("WhiteFur") == 0)
+ goto L_No_Fur;
+ if (countitem("DarkCrystal") == 0)
+ goto L_No_dark_crystal;
+ if (countitem("BottleOfWater") == 0)
+ goto L_No_Water;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("MaggotSlime") > 1
+ && countitem("BugLeg") > 1
+ && countitem("SilkCocoon") > 1
+ && countitem("SmallMushroom") > 1
+ && countitem("PinkPetal") > 1
+ && countitem("Pearl") > 1
+ && countitem("HardSpike") > 1
+ && countitem("RawLog") > 1
+ && countitem("PinkAntenna") > 1
+ && countitem("DarkCrystal") > 1
+ && countitem("IronOre") > 1
+ && countitem("ScorpionStinger") > 1
+ && countitem("RedScorpionStinger") > 1
+ && countitem("BlackScorpionStinger") > 1
+ && countitem("SnakeTongue") > 1
+ && countitem("MountainSnakeTongue") > 1
+ && countitem("GrassSnakeTongue") > 1
+ && countitem("CaveSnakeTongue") > 1
+ && countitem("MauveHerb") > 1
+ && countitem("CobaltHerb") > 1
+ && countitem("GambogeHerb") > 1
+ && countitem("AlizarinHerb") > 1
+ && countitem("TreasureKey") > 1
+ && countitem("CaveSnakeLamp") > 1
+ && countitem("PileOfAsh") > 1
+ && countitem("WhiteFur") > 1
+ && countitem("BottleOfWater") > 1)
+ goto L_TooMany;
+
+ delitem "MaggotSlime", 1;
+ delitem "BugLeg", 1;
+ delitem "SilkCocoon", 1;
+ delitem "SmallMushroom", 1;
+ delitem "PinkPetal", 1;
+ delitem "Pearl", 1;
+ delitem "HardSpike", 1;
+ delitem "RawLog", 1;
+ delitem "PinkAntenna", 1;
+ delitem "DarkCrystal", 1;
+ delitem "IronOre", 1;
+ delitem "ScorpionStinger", 1;
+ delitem "RedScorpionStinger", 1;
+ delitem "BlackScorpionStinger", 1;
+ delitem "SnakeTongue", 1;
+ delitem "MountainSnakeTongue", 1;
+ delitem "GrassSnakeTongue", 1;
+ delitem "CaveSnakeTongue", 1;
+ delitem "MauveHerb", 1;
+ delitem "CobaltHerb", 1;
+ delitem "GambogeHerb", 1;
+ delitem "AlizarinHerb", 1;
+ delitem "TreasureKey", 1;
+ delitem "CaveSnakeLamp", 1;
+ delitem "WhiteFur", 1;
+ delitem "PileOfAsh", 1;
+ delitem "BottleOfWater", 1;
+
+ mes "You managed to perform the ritual and open the chest.";
+ getitem "DemonMask", 1;
+ mes "You found a demon mask inside.";
+ @state = 3;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_No_maggot_slime:
+ mes "You do not have any maggot slime.";
+ goto L_close;
+
+L_No_mushroom:
+ mes "You do not have a mushroom, neither big, nor small.";
+ goto L_close;
+
+L_No_pink_petal:
+ mes "You can't seem to find that pink petal you had.";
+ goto L_close;
+
+L_No_pearl:
+ mes "You do not have a pearl, let alone one from the sea.";
+ goto L_close;
+
+L_No_hard_spike:
+ mes "You weren't able to find a hard spike in the stuff you brought.";
+ goto L_close;
+
+L_No_raw_log:
+ mes "You don't have any wood.";
+ goto L_close;
+
+L_No_pink_antenna:
+ mes "You aren't carrying any antenna.";
+ goto L_close;
+
+L_No_tongues:
+ mes "You don't have four different snake tongues.";
+ goto L_close;
+
+L_No_treasure_key:
+ mes "No treasure chest key, no opening ritual.";
+ goto L_close;
+
+L_No_Ash:
+ mes "You still need a pile of ash.";
+ goto L_close;
+
+L_No_herbs:
+ mes "Four different herbs are needed to get this thing open.";
+ goto L_close;
+
+L_No_bug_leg:
+ mes "You do not have part of a bug on you. That is rather odd considering what you went through to get here.";
+ goto L_close;
+
+L_No_lamp:
+ mes "You do not have a lamp. Yet, somehow, you were able to get this far into this dark cave.";
+ goto L_close;
+
+L_No_iron_ore:
+ mes "\"Rock and metal, as one.\" You don't seem to have anything that fits the bill.";
+ goto L_close;
+
+L_No_stingers:
+ mes "Three scorpion deaths are still missing.";
+ goto L_close;
+
+L_No_silk:
+ mes "You could not find the womb for a butterfly among your stuff.";
+ goto L_close;
+
+L_No_Fur:
+ mes "You wonder how you can carry the \"gentle caress of a creature without blemish.\" But you need it to get this thing open.";
+ goto L_close;
+
+L_No_dark_crystal:
+ mes "A piece of darkness is missing.";
+ goto L_close;
+
+L_No_Water:
+ mes "Just one bottle of water and you can start the ritual.";
+ goto L_close;
+
+L_NaoDeviaAcontecer:
+ warp "013-3", 71, 25;
+ // You need to go through the barrier to get to the chest, so this shouldn't happen. So just warp them like the barrier does.
+ goto L_close;
+
+L_Finished:
+ mes "[Chest]";
+ mes "You already opened this chest.";
+ goto L_close;
+
+L_TooMany:
+ mes "[Chest]";
+ mes "You don't have room for what ever is inside. Maybe you should try again later.";
+ goto L_close;
+
+L_close:
+ @state = 0;
+ close;
+
+S_Update_Mask:
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_2_MASK)) | (@state << NIBBLE_2_SHIFT);
+ return;
+}
diff --git a/npc/013-3/misc.txt b/npc/013-3/misc.txt
new file mode 100644
index 00000000..a955ff44
--- /dev/null
+++ b/npc/013-3/misc.txt
@@ -0,0 +1,5 @@
+
+013-3,127,68,0 script Chest#boring NPC111,{
+ mes "You can't see any way to open this chest.";
+ close;
+}
diff --git a/npc/013-3/sword_chest.txt b/npc/013-3/sword_chest.txt
new file mode 100644
index 00000000..d3ab3ded
--- /dev/null
+++ b/npc/013-3/sword_chest.txt
@@ -0,0 +1,42 @@
+
+013-3,177,22,0 script Chest#sword NPC111,{
+ if (FLAGS & FLAG_HURNSMINE_CHEST) goto L_Finished;
+
+ mes "[Chest]";
+ mes "Would you try to open it?";
+ next;
+ menu
+ "Yes.", L_Yes,
+ "No.", L_close;
+
+L_Yes:
+ if(countitem("TreasureKey") < 10)
+ goto L_Not_Enough;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("TreasureKey") > 10)
+ goto L_TooMany;
+ delitem "TreasureKey", 10;
+ getitem "ShortSword", 1;
+ mes "[Chest]";
+ mes "You opened it and found a short sword!";
+ FLAGS = FLAGS | FLAG_HURNSMINE_CHEST;
+ close;
+
+L_Not_Enough:
+ mes "It seems that this is not the right key...";
+ close;
+
+L_Finished:
+ mes "[Chest]";
+ mes "You already opened this chest.";
+ close;
+
+L_TooMany:
+ mes "[Chest]";
+ mes "You don't have room for what ever is inside. Maybe you should try again later.";
+ close;
+
+L_close:
+ close;
+}
diff --git a/npc/014-1/_import.txt b/npc/014-1/_import.txt
new file mode 100644
index 00000000..56b06b49
--- /dev/null
+++ b/npc/014-1/_import.txt
@@ -0,0 +1,6 @@
+// Map 014-1: Woodland
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/014-1/_mobs.txt",
+"npc/014-1/_warps.txt",
+"npc/014-1/mapflags.txt",
+"npc/014-1/wedding-officiator.txt",
diff --git a/npc/014-1/_mobs.txt b/npc/014-1/_mobs.txt
new file mode 100644
index 00000000..cd4bc0b0
--- /dev/null
+++ b/npc/014-1/_mobs.txt
@@ -0,0 +1,18 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 014-1: Woodland mobs
+014-1,0,0,0,0 monster Evil Mushroom 1013,20,0,0
+014-1,0,0,0,0 monster Pink Flower 1014,25,0,0
+014-1,0,0,0,0 monster Spiky Mushroom 1019,15,0,0
+014-1,0,0,0,0 monster Mouboo 1028,5,0,10
+014-1,0,0,0,0 monster Mauve Plant 1029,1,270,180
+014-1,0,0,0,0 monster Mauve Plant 1029,5,2700000,1800000
+014-1,0,0,0,0 monster Cobalt Plant 1030,1,270,180
+014-1,0,0,0,0 monster Cobalt Plant 1030,2,2700000,1800000
+014-1,0,0,0,0 monster Gamboge Plant 1031,1,270,180
+014-1,0,0,0,0 monster Gamboge Plant 1031,2,2700000,1800000
+014-1,0,0,0,0 monster Alizarin Plant 1032,1,270,180
+014-1,0,0,0,0 monster Alizarin Plant 1032,2,2700000,1800000
+014-1,0,0,0,0 monster Silkworm 1035,4,6000,3000
+014-1,0,0,0,0 monster Clover Patch 1037,2,0,1000
+014-1,0,0,0,0 monster Squirrel 1038,25,30,20
+014-1,0,0,0,0 monster Butterfly 1055,10,30,20
diff --git a/npc/014-1/_warps.txt b/npc/014-1/_warps.txt
new file mode 100644
index 00000000..1c740ae8
--- /dev/null
+++ b/npc/014-1/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 014-1: Woodland warps
+014-1,109,91,0 warp #014-1_109_91 0,2,011-1,31,61
+014-1,93,58,0 warp #014-1_93_58 0,0,014-3,57,172
+014-1,76,38,0 warp #014-1_76_38 0,0,014-3,35,33
diff --git a/npc/014-1/mapflags.txt b/npc/014-1/mapflags.txt
new file mode 100644
index 00000000..78fa67f9
--- /dev/null
+++ b/npc/014-1/mapflags.txt
@@ -0,0 +1 @@
+//014-1 mapflag resave 014-1,89,102
diff --git a/npc/014-1/wedding-officiator.txt b/npc/014-1/wedding-officiator.txt
new file mode 100644
index 00000000..2c0ac5e2
--- /dev/null
+++ b/npc/014-1/wedding-officiator.txt
@@ -0,0 +1,26 @@
+
+014-1,31,31,0 script Wedding Officiator NPC164,{
+ mes "[Wedding Officiator]";
+ mes "A young lady in a long, green dress is overseeing the park. As she notices you looking at her, she gives you a broad and happy smile.";
+ mes "\"Hi there! I'm Wendy, here for all your marriage needs!\"";
+ next;
+ goto L_Main;
+
+L_Main:
+ menu
+ "What exactly do you do?", L_explain_self,
+ "Goodbye.", L_End;
+
+L_explain_self:
+ mes "[Wedding Officiator]";
+ mes "\"I'm responsible for marriage and divorce proceedings. Every married couple must be registered, so I keep a looong list of couples and send that to the magistrates every now and then.\"";
+ next;
+ mes "[Wedding Officiator]";
+ mes "\"So if you have a sweetheart and the two of you are getting along particularly well, and you think that you are ready to make that big final step – well, then come here and talk to me!\"";
+ next;
+ goto L_Main;
+
+L_End:
+ close;
+
+}
diff --git a/npc/014-3/_import.txt b/npc/014-3/_import.txt
new file mode 100644
index 00000000..ebdc9a2f
--- /dev/null
+++ b/npc/014-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 014-3: Woodland Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/014-3/_mobs.txt",
+"npc/014-3/_warps.txt",
+"npc/014-3/mapflags.txt",
diff --git a/npc/014-3/_mobs.txt b/npc/014-3/_mobs.txt
new file mode 100644
index 00000000..b61b1647
--- /dev/null
+++ b/npc/014-3/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 014-3: Woodland Cave mobs
+014-3,0,0,0,0 monster Bat 1017,50,0,0
diff --git a/npc/014-3/_warps.txt b/npc/014-3/_warps.txt
new file mode 100644
index 00000000..ae2b6a5a
--- /dev/null
+++ b/npc/014-3/_warps.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 014-3: Woodland Cave warps
+014-3,35,32,0 warp #014-3_35_32 0,0,014-1,76,39
+014-3,57,173,0 warp #014-3_57_173 1,0,014-1,93,59
+014-3,91,108,0 warp #014-3_91_108 0,0,014-3,103,53
+014-3,103,54,0 warp #014-3_103_54 0,0,014-3,91,109
diff --git a/npc/014-3/mapflags.txt b/npc/014-3/mapflags.txt
new file mode 100644
index 00000000..8acaa581
--- /dev/null
+++ b/npc/014-3/mapflags.txt
@@ -0,0 +1 @@
+//014-3 mapflag resave 014-1,89,102
diff --git a/npc/015-1/_import.txt b/npc/015-1/_import.txt
new file mode 100644
index 00000000..80ef8601
--- /dev/null
+++ b/npc/015-1/_import.txt
@@ -0,0 +1,8 @@
+// Map 015-1: Woodland
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/015-1/_mobs.txt",
+"npc/015-1/_warps.txt",
+"npc/015-1/alice.txt",
+"npc/015-1/barrier.txt",
+"npc/015-1/mapflags.txt",
+"npc/015-1/sword.txt",
diff --git a/npc/015-1/_mobs.txt b/npc/015-1/_mobs.txt
new file mode 100644
index 00000000..047641e0
--- /dev/null
+++ b/npc/015-1/_mobs.txt
@@ -0,0 +1,12 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 015-1: Woodland mobs
+015-1,0,0,0,0 monster Clover Patch 1037,2,100000,1000
+015-1,0,0,0,0 monster Butterfly 1055,10,30,20
+015-1,0,0,0,0 monster Squirrel 1038,30,20,10
+015-1,0,0,0,0 monster Log Head 1025,40,0,0
+015-1,0,0,0,0 monster Spiky Mushroom 1019,20,0,0
+015-1,0,0,0,0 monster Pink Flower 1014,20,0,0
+015-1,0,0,0,0 monster Gamboge Plant 1031,5,0,0
+015-1,0,0,0,0 monster Alizarin Plant 1032,5,0,0
+015-1,0,0,0,0 monster Silkworm 1035,7,15000,7000
+015-1,0,0,0,0 monster Mauve Plant 1029,4,270000,180000
diff --git a/npc/015-1/_warps.txt b/npc/015-1/_warps.txt
new file mode 100644
index 00000000..f03dba7c
--- /dev/null
+++ b/npc/015-1/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 015-1: Woodland warps
+015-1,93,55,0 warp #015-1_93_55 0,1,010-1,17,54
+015-1,59,31,0 warp #015-1_59_31 0,0,015-3,31,42
+015-1,59,101,0 warp #015-1_59_101 3,0,025-1,89,20
diff --git a/npc/015-1/alice.txt b/npc/015-1/alice.txt
new file mode 100644
index 00000000..bf5c1a92
--- /dev/null
+++ b/npc/015-1/alice.txt
@@ -0,0 +1,94 @@
+
+015-1,52,53,0 script Alice NPC106,{
+ @cat = ((Katze & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT);
+ @Hiss = ((Katze & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT);
+
+ mes "[Alice]";
+ mes "\"Greeting, fellow wanderer.";
+ mes "Are you collecting herbs, too?\"";
+ next;
+ if (@Hiss == 2 && @cat < 4)
+ menu
+ "Yes, sure.", L_findmany,
+ "Herbs?", L_herbs,
+ "Nope, just enjoying the scenery.", L_close,
+ "I saw the cat, but it doesn't like me.", L_cat;
+ if (@Hiss == 1)
+ menu
+ "Yes, sure.", L_findmany,
+ "Herbs?", L_herbs,
+ "Nope, just enjoying the scenery.", L_close,
+ "There is a monster in that cave!", L_Cave;
+ menu
+ "Yes, sure.", L_findmany,
+ "Herbs?", L_herbs,
+ "Nope, just enjoying the scenery.", L_close;
+
+L_findmany:
+ mes "[Alice]";
+ mes "\"And? Did you already find a lot?\"";
+ next;
+ menu
+ "Yes, I already got plenty of them.", L_plenty,
+ "No, I am out of luck.", L_Next;
+
+L_Next:
+ mes "[Alice]";
+ mes "\"Oooh, how sad. Let me give you a little tip:";
+ mes "Herbs are often growing in places where they can't be spotted that easily. Don't forget to look behind the trees, too.\"";
+ goto L_close;
+
+L_plenty:
+ mes "[Alice]";
+ mes "\"That's great.";
+ mes "When you are not that good at brewing you should consider letting someone else brew them for you.";
+ mes "Good brewers get much better healing potions from them.";
+ mes "The most important characteristic of a good brewer is intelligence.\"";
+ goto L_close;
+
+L_herbs:
+ mes "[Alice]";
+ mes "\"Yes, some powerful magic herbs started to grow around here and a mile to the southeast.";
+ mes "Caul in Hurnscald found a way to brew magical healing potions from them, and I have heard a rumor that they may also be good for making colors.";
+ mes "Now everyone is running around in the woods to harvest the herbs.\"";
+ goto L_close;
+
+L_Cave:
+ mes "[Alice]";
+ mes "\"Haha, that is no monster! It's just a sweet little cat.\"";
+ next;
+ menu
+ "But it wanted to kill me!", L_Next1,
+ "A cat!? I'll go and kill it!", L_Next1;
+
+L_Next1:
+ mes "[Alice]";
+ mes "\"No no, I'm sure it was only frightened. It gets upset when you've got clothes or weapons on you.\"";
+ next;
+ menu
+ "Ok, let's try it without clothes then", L_Next2,
+ "What a stupid cat!", L_Next2;
+
+L_Next2:
+ mes "[Alice]";
+ mes "\"Please don't do her any harm. See you later!\"";
+ goto L_close;
+
+L_cat:
+ mes "[Alice]";
+ mes "\"You would have to tame her first. Maybe she's thirsty or hungry. Cats also tend to get bored without something to play with. Good luck!\"";
+ next;
+ menu
+ "Thank you so much!", L_close,
+ "Are you crazy? Taming a cat?", L_Next3;
+
+L_Next3:
+ mes "[Alice]";
+ mes "\"Well, it's up to you.\"";
+ goto L_close;
+
+L_close:
+ @cat = 0;
+ @Hiss = 0;
+ close;
+}
diff --git a/npc/015-1/barrier.txt b/npc/015-1/barrier.txt
new file mode 100644
index 00000000..4c26ebd2
--- /dev/null
+++ b/npc/015-1/barrier.txt
@@ -0,0 +1,5 @@
+
+015-1,59,32,0 script #CatOutsideBarrier NPC32767,1,1,{
+ @catNeedsAlone = 0;
+ end;
+}
diff --git a/npc/015-1/mapflags.txt b/npc/015-1/mapflags.txt
new file mode 100644
index 00000000..0ef2a5ff
--- /dev/null
+++ b/npc/015-1/mapflags.txt
@@ -0,0 +1,2 @@
+//015-1 mapflag resave 010-1,27,97
+015-1 mapflag zone outside
diff --git a/npc/015-1/sword.txt b/npc/015-1/sword.txt
new file mode 100644
index 00000000..d829793a
--- /dev/null
+++ b/npc/015-1/sword.txt
@@ -0,0 +1,331 @@
+015-1,97,97,0 script #MagicSword#_M NPC400,{
+ if (getskilllv(SKILL_MAGIC))
+ goto L_message;
+ mes l("It appears to be an ordinary sword.");
+ close;
+
+L_message:
+ @Q_MASK = (NIBBLE_6_MASK | NIBBLE_7_MASK);
+ @Q_SHIFT = NIBBLE_6_SHIFT;
+ @Q_status = (QUEST_MAGIC & @Q_MASK) >> @Q_SHIFT;
+
+ // Set up SkillUp function
+ @SUP_id = SKILL_MAGIC_WAR;
+ @SUP_name$ = "War Magic";
+
+ @STATUS_INITIAL = 0;
+ @STATUS_LEARNED_FLAREDART = 1;
+ @STATUS_LEARNED_MAGICBLADE = 2;
+ @STATUS_LEVEL2 = 3;
+ @STATUS_W11 = 4;
+ @STATUS_W12 = 5;
+ @STATUS_W11_12 = 6;
+ @STATUS_L2_ALLSPELLS = 7;
+
+ if (@Q_status == @STATUS_INITIAL) goto L_Initial;
+ if (@Q_status == @STATUS_LEARNED_FLAREDART) goto L_FlareStage;
+ if (@Q_status == @STATUS_LEARNED_MAGICBLADE) goto L_MagicBladeStage;
+ if (@Q_status == @STATUS_LEVEL2) goto L_L2_W12;
+ if (@Q_status == @STATUS_W11) goto L_L2_W12;
+ if (@Q_status == @STATUS_W12) goto L_L2_almost_done;
+ if (@Q_status == @STATUS_W11_12) goto L_L2_W10;
+
+ mesn l("Mystic Sword");
+ mesq l("I have taught thee all I can teach for now.");
+ close;
+
+L_Initial:
+ mesn l("Mystic Sword");
+ mes l("At this point, the river deepens, slowing down to a leisurely pace. In its center you notice an unusual stone, waves breaking around it.");
+ mes l("Sticking out of the rock is a sword hilt.");
+ next;
+ mesn l("Mystic Sword");
+ mesc l("Suddenly, you hear a strange, metallic voice in your head, the voice of a woman.");
+ mesq l("A blissful day to thee, mortal!");
+ next;
+ mesn l("Mystic Sword");
+ mesq l("What is it is that brings thee to this place?");
+ next;
+ menu
+ "Who are you?", L_Noq,
+ "Nothing in particular.", L_Initial_nothing,
+ "I was just exploring...", L_Initial_nothing,
+ "I am trying to learn magic!", L_Initial_learn;
+
+L_Noq:
+ mesn l("Mystic Sword");
+ mesc l("The voice sounds slightly amused.");
+ mesq l("How sad to hear how manners have degenerated in recent centuries. Farewell for now, dear mortal.");
+ close;
+
+L_Initial_nothing:
+ mesn l("Mystic Sword");
+ mesq l("Then I wish thee well in thy travels, wanderer!");
+ close;
+
+L_Initial_learn:
+ mesn l("Mystic Sword");
+ mes "\"Magic? Unless I am very mistaken thou already possessest some magic. Yet perhaps I can grant thee some slight aid by providing a magical invocation?\"";
+ next;
+ mesn l("Mystic Sword");
+ mes "\"Alas, my nature is not quite conductive for spells of healing or protection, though I can bestow upon thee the powers for a rather more martial kind of power.\"";
+ next;
+ menu
+ "I am not interested in that.", L_Farewell,
+ "It might be good for me to learn that.", L_Next,
+ "I am quite interested.", L_Next;
+
+L_Next:
+ mesn l("Mystic Sword");
+ mes "\"Why is it that thou seekest this power?\"";
+ next;
+ menu
+ "Never mind.", L_Farewell,
+ "To become stronger!", L_Initial_selfish,
+ "To kill!", L_Initial_selfish,
+ "I don't know yet...", L_Initial_dontknow,
+ "To protect the ones I love!", L_Initial_protect;
+
+L_Initial_selfish:
+ mesn l("Mystic Sword");
+ mes "\"Please return when thou art taking thy quest for magic a little more seriously.\"";
+ close;
+
+L_Initial_dontknow:
+ mesn l("Mystic Sword");
+ mes "\"A fair and honest thought at so early a point in thine quest.\"";
+ goto L_Initial_ok;
+
+L_Initial_protect:
+ mesn l("Mystic Sword");
+ mes "\"Quite a high and laundable goal thou hast chosen for thyself! I do hope that thou canst live up to it.\"";
+ goto L_Initial_ok;
+
+L_Initial_ok:
+ mes "\"Hark, then, mortal! For I shall bestow upon thee the secret of the flare dart spell!\"";
+ next;
+ mesn l("Mystic Sword");
+ 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;
+ mesn l("Mystic Sword");
+ mes "\"For the flare dart spell throw a handful of sulphur powder up into the air, and say, '" + b("flar") + "'.\"";
+ learnskill SKILL_FLAR;
+ @Q_status = @STATUS_LEARNED_FLAREDART;
+ callsub S_Update_Var;
+ next;
+ mesn l("Mystic Sword");
+ mes "\"From then on, thou canst shoot fiery missiles from thy fingers, for a limited time.\"";
+ next;
+ mesn l("Mystic Sword");
+ mes "\"Use it wisely, mortal!.\"";
+ next;
+ goto L_Farewell;
+
+L_FlareStage:
+ menu
+ "Uhm... Hello, Sword?", L_FlareStage_hello,
+ "Can you teach me more magic?", L_FlareStage_impolite,
+ "Where can I get sulphur powder?", L_FlareStage_impolite;
+
+L_FlareStage_impolite:
+ mesn l("Mystic Sword");
+ mes "You hear a metallic chime in your head. After a second, you come to the conclusion that it was probably the sword sighing.";
+ mes "\"Greetings to thee, too, mortal, and farewell until thou hast learned some proper manners.\"";
+ close;
+
+L_FlareStage_hello:
+ mesn l("Mystic Sword");
+ mes "\"Well met once more, mortal! What brings thee here?\"";
+ next;
+ menu
+ "Can you teach me more magic?", L_FlareStage_moremagic,
+ "Where can I find sulphur powder?", L_FlareStage_sulphur,
+ "Farewell!", L_Farewell;
+
+L_FlareStage_moremagic:
+ mesn l("Mystic Sword");
+ mes "\"I can indeed! But first I must see if thou art worthy. Find my brother, and talk to him! If thou canst find him, he shall teach thee another spell.\"";
+ next;
+ goto L_Farewell;
+
+L_FlareStage_sulphur:
+ mesn l("Mystic Sword");
+ mesq l("I do not know, though I suggest to seek out a local alchemist, if there is any.");
+ next;
+ goto L_Farewell;
+
+L_MagicBladeStage:
+ mesn l("Mystic Sword");
+ mes "\"Welcome back! Thou hast now learned two basic spells of War magic.\"";
+ next;
+ mesn l("Mystic Sword");
+ mes "\"Dost thou wish to continue thy pursuits of this school of magic?\"";
+ next;
+ menu
+ "No.", L_Farewell,
+ "Yes.", L_Levelup2_yes;
+
+L_Levelup2_yes:
+ mesn l("Mystic Sword");
+ mesq l("Beware of what thou wishest for, mortal...");
+ next;
+
+ if (!MPQUEST)
+ goto L_Lvl2_must_reg;
+ if (MPQUEST && (Mobpt < 1000))
+ goto L_Lvl2_must_practice;
+
+ mesn l("Mystic Sword");
+ mesq l("Thou hast collected %s Monster Points. For one thousand of them, I shall admit thee to the school of war magic.", fnum(Mobpt));
+ next;
+ menu
+ "OK!", L_Next1,
+ "No... never mind.", L_Farewell;
+
+L_Next1:
+ Mobpt = Mobpt - 1000;
+
+ mesn l("Mystic Sword");
+ mes "The sword begins to chant in your head!";
+ mes "\"Lords of Thunder, Fire, Rage!\"";
+ mes "\"Grant thy powers to this mage,\"";
+ mes "\"Rising with thy dreadful roar,\"";
+ mes "\"Answer to their call to War!\"";
+ next;
+ mesn l("Mystic Sword");
+ mes "Your heart starts pounding, and suddenly you can hear the sound of drums in your head.";
+ mes "You smell something metallic...";
+ next;
+ mesn l("Mystic Sword");
+ mes "The sensation and the noises vanish as quickly as they came.";
+
+ @Q_status = @STATUS_LEVEL2;
+ callsub S_Update_Var;
+
+ @SUP_xp = 5000;
+ @SUP_lvl = 2;
+ callfunc "SkillUp";
+ next;
+
+ mesn l("Mystic Sword");
+ mes "\"Thou hast now taken thy first true step down the path of war magic.\"";
+ if (getskilllv(SKILL_MAGIC) < 2)
+ mes "\"When thou returnest, I shall teach thee another spell, but beware: thou must increase thy overall grasp of magic before thou canst wield it!\"";
+ next;
+ goto L_Farewell;
+
+L_Lvl2_must_reg:
+ mesn l("Mystic Sword");
+ mes "\"To learn further magic, thou must advance in the school of war magic. I shall grant thee this advance if thou provest thy worthiness as a warrior.\"";
+ next;
+ mesn l("Mystic Sword");
+ mes "\"Travel to the city of Tulimshar, and talk to Aidan. Then, collect one thousand Monster Points and return to me.\"";
+ next;
+ goto L_Farewell;
+
+L_Lvl2_must_practice:
+ mesn l("Mystic Sword");
+ mes "\"To advance thy magical powers, I must admit thee to the school of war magic. Prove to me that thou art a worthy warrior by collecting one thousand Monster Points, and return.\"";
+ next;
+ goto L_Farewell;
+
+L_L2_W12:
+ mesn l("Mystic Sword");
+ mes "\"Welcome back, traveler! Hast thou returned to advance in thy quest for magic?\"";
+ next;
+ menu
+ "No.", L_Farewell,
+ "Yes.", L_Next2;
+
+L_Next2:
+ mesn l("Mystic Sword");
+ if (getskilllv(SKILL_MAGIC) < 2) {
+ mesq l("But alas, thou need more magical power for that.");
+ next;
+ goto L_Farewell;
+ }
+ mes "\"Very well. I shall teach thee another spell, if thou provest thy progress by sacrificing another five thousand monster points.\"";
+ next;
+ menu
+ "No, I don't want that.", L_Farewell,
+ "So be it.", L_Next3;
+
+L_Next3:
+ if (Mobpt < 5000)
+ goto L_lacking_mobpoints;
+ mesn l("Mystic Sword");
+ mes "\"Indeed thou art worthy. The next spell I shall teach thee will enchant thy knuckles to turn them into powerful weapons; the component is a mere beer.\"";
+ mes "[1000 experience points]";
+ Mobpt = Mobpt - 5000;
+ getexp 1000, 0;
+ @Q_status = @Q_status + 2;
+ callsub S_Update_Var;
+ next;
+ mesn l("Mystic Sword");
+ mesq l("Speak '%s' 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.", b("Upmarmu"));
+ learnskill SKILL_UPMARMU;
+ close;
+
+L_L2_almost_done:
+ mesn l("Mystic Sword");
+ mes "\"Greetings once more, traveler! I have another spell I wish to teach thee, but first thou must learn my brother's arrow spell.\"";
+ close;
+
+L_L2_W10:
+ mesn l("Mystic Sword");
+ mes "\"Welcome back!\"";
+ next;
+ mesn l("Mystic Sword");
+ mes "\"I shall now teach thee the final spell of this level of war magic. For further spells thou wilt have to increase thy magical powers more.\"";
+ next;
+ mesn l("Mystic Sword");
+ mes "\"For this spell, I ask that thou bringest a lump of iron ore. Thou must also sacrifice ten thousand monster points.\"";
+ next;
+ menu
+ "OK.", L_Next4,
+ "No way.", L_Farewell;
+
+L_Next4:
+ if (countitem("IronOre") < 1)
+ goto L_No_ore;
+ if (MPQUEST && (Mobpt < 10000))
+ goto L_lacking_mobpoints;
+
+ mesn l("Mystic Sword");
+ mes "\"Raise up the ore, mortal!\"";
+ mes "As you do so, the ore begins to crumble, leaving only iron powder behind.";
+ mes "[1000 experience points]";
+ Mobpt = Mobpt - 10000;
+ getexp 1000, 0;
+ delitem "IronOre", 1;
+ getitem "IronPowder", 5;
+ @Q_status = @STATUS_L2_ALLSPELLS;
+ callsub S_Update_Var;
+ next;
+ mesn l("Mystic Sword");
+ mesq l("This powder thou shalst need to cast the lightning spell. Throw it up into the air and shout '%s', and smite thine enemies with lightning.", b("Ingrav"));
+ learnskill SKILL_INGRAV;
+ next;
+ goto L_Farewell;
+
+L_No_ore:
+ mesn l("Mystic Sword");
+ mes "\"Thou dost appear to lack ore. We cannot continue; please fare well and return swiftly!\"";
+ close;
+
+L_Farewell:
+ mesn l("Mystic Sword");
+ mes "\"Then I bid thee farewell for now!\"";
+ close;
+
+L_lacking_mobpoints:
+ mesn l("Mystic Sword");
+ mes "\"Thou dost not have enough monster points to prove thy worthiness. Return when thou hast slain more monsters!\"";
+ close;
+
+S_Update_Var:
+ set QUEST_MAGIC,
+ (QUEST_MAGIC & ~(@Q_MASK)
+ | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/015-3/_import.txt b/npc/015-3/_import.txt
new file mode 100644
index 00000000..fedbd433
--- /dev/null
+++ b/npc/015-3/_import.txt
@@ -0,0 +1,8 @@
+// Map 015-3: Cat's Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/015-3/_mobs.txt",
+"npc/015-3/_warps.txt",
+"npc/015-3/barrier.txt",
+"npc/015-3/katze.txt",
+"npc/015-3/mapflags.txt",
+"npc/015-3/pot.txt",
diff --git a/npc/015-3/_mobs.txt b/npc/015-3/_mobs.txt
new file mode 100644
index 00000000..487d124b
--- /dev/null
+++ b/npc/015-3/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 015-3: Cat's Cave mobs
+015-3,22,25,1,2 monster Bat 1017,2,100000,30000
+015-3,29,31,1,1 monster Maggot 1002,2,100000,30000
+015-3,23,19,0,0 monster Maggot 1002,1,100000,30000
+015-3,40,19,0,0 monster Spider 1012,1,100000,30000
diff --git a/npc/015-3/_warps.txt b/npc/015-3/_warps.txt
new file mode 100644
index 00000000..a9ba28a6
--- /dev/null
+++ b/npc/015-3/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 015-3: Cat's Cave warps
+015-3,31,43,0 warp #015-3_31_43 0,0,015-1,59,32
diff --git a/npc/015-3/barrier.txt b/npc/015-3/barrier.txt
new file mode 100644
index 00000000..320025f6
--- /dev/null
+++ b/npc/015-3/barrier.txt
@@ -0,0 +1,38 @@
+
+015-3,31,42,0 script #CatCaveBarrier NPC45,1,1,{
+ @Hiss = ((Katze & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT);
+ if (getequipid(equip_head) != 1217
+ && (getequipid(equip_head) > 0
+ || getequipid(equip_shield) > 0
+ || getequipid(equip_hand1) > 0
+ || getequipid(equip_hand2) > 0
+ || getequipid(equip_gloves) > 0
+ || getequipid(equip_shoes) > 0
+ || getequipid(equip_misc1) > 0
+ || getequipid(equip_misc2) > 0
+ || getequipid(equip_torso) > 0
+ || getequipid(equip_legs) > 0))
+ goto L_Not_Naked;
+
+ if (@Hiss != 2)
+ mes "\"Hissss...\"";
+ @Hiss = 2;
+ callsub S_Update_Hiss;
+ goto L_close;
+
+L_Not_Naked:
+ warp "015-1", 60, 32;
+ @Hiss = 1;
+ callsub S_Update_Hiss;
+ mes "\"GRAAUWL! Hissss...\"";
+ mes "Scared of what you hear, you flee back outside.";
+ goto L_close;
+
+L_close:
+ @Hiss = 0;
+ close;
+
+S_Update_Hiss:
+ Katze = (Katze & ~(NIBBLE_1_MASK)) | (@Hiss << NIBBLE_1_SHIFT);
+ return;
+}
diff --git a/npc/015-3/katze.txt b/npc/015-3/katze.txt
new file mode 100644
index 00000000..0647abc6
--- /dev/null
+++ b/npc/015-3/katze.txt
@@ -0,0 +1,185 @@
+
+015-3,32,25,0 script Katze NPC172,{
+ @cat = ((Katze & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT);
+
+ if (@cat == 1 && @catNeedsAlone == 0) goto L_NeedsFood;
+ if (@cat == 1) goto L_NeedsFood;
+ if (@cat == 2 && @catNeedsAlone == 0) goto L_NeedsFur;
+ if (@cat == 2) goto L_NeedsFur;
+ if (@cat == 3) goto L_NeedsWood;
+ if (@cat == 4 && @catNeedsAlone == 0) goto L_NeedsStuff;
+ if (@cat == 4) goto L_PreNeedsStuff;
+ if (@cat == 5) goto L_NeedsStuff2;
+ if (@cat == 6 && @catNeedsAlone == 0) goto L_GainEars;
+ if (@cat == 6) goto L_PreGainEars;
+ if (@cat == 7) goto L_Finished;
+ goto L_NeedsMilk;
+
+L_NeedsMilk:
+ mes "[Katze]";
+ mes "\"Meow.\"";
+ next;
+ menu "Throw a stone at the cat.", L_ThrowStone,
+ "Leave the cat alone.", L_close;
+
+L_ThrowStone:
+ @cat = 0;
+ callsub S_Update_Katze;
+ heal ((MaxHp/100) * -30), 0;
+ warp "015-1", 60, 32;
+ mes "\"GRAAUWL! Hissss...\"";
+ mes "Yikes, the cat attacked you! Your whole body is scratched. Maybe throwing a stone wasn't such a great idea...";
+ goto L_close;
+
+L_NeedsFood:
+ mes "[Katze]";
+ mes "\"Meow, prrrr...\"";
+ next;
+ menu
+ "Throw a stone at the cat.", L_ThrowStone,
+ "Leave the cat alone.", L_close;
+
+L_NeedsFur:
+ mes "[Katze]";
+ mes "\"Prrr. Meow, prrr...\"";
+ next;
+ if (countitem("WhiteFur") > 0)
+ menu
+ "Make funny movements with the fur near the ground.", L_MoveFur,
+ "Throw a stone at the cat.", L_ThrowStone,
+ "Leave the cat alone.", L_close;
+ if (countitem("WhiteFur") == 0)
+ menu
+ "Throw a stone at the cat.", L_ThrowStone,
+ "Leave the cat alone.", L_close;
+ goto L_close;
+
+L_MoveFur:
+ delitem "WhiteFur", 1;
+ @cat = 3;
+ callsub S_Update_Katze;
+ mes "The cat jumps at the fur! You quickly let go of it. The cat happily returns to its spot, carrying the fur in its mouth.";
+ next;
+ mes "The cat drops the fur and looks at you with half opened eyes. Suddenly she starts talking, and says: \"That was very kind of you.\" She seems to be smiling.";
+ goto L_close;
+
+L_NeedsWood:
+ mes "[Katze]";
+ mes "\"Prrrr, now I'd like something to sharpen my claws on.\"";
+ next;
+
+ if (countitem("RawLog") > 0)
+ menu
+ "Want this piece of wood?", L_GiveWood,
+ "Ok, see you later.", L_close;
+ goto L_close;
+
+L_GiveWood:
+ mes "[Katze]";
+ mes "\"Sure! Please put it next to the pot.\"";
+ goto L_close;
+
+L_PreNeedsStuff:
+ mes "The cat is still eyeing the piece of wood. She probably needs to be left alone for a bit again.";
+ goto L_close;
+
+L_NeedsStuff:
+ @cat = 5;
+ callsub S_Update_Katze;
+ mes "[Katze]";
+ mes "\"You've been really kind to me. I can make you something nice, but I will need";
+ mes "2 Snake Skins,";
+ mes "2 Snake Tongues,";
+ mes "2 Maggot Slimes,";
+ mes "2 White Furs,";
+ mes "2 Hard Spikes and";
+ mes "2 Tiny Healing Potions.\"";
+ goto L_close;
+
+L_NeedsStuff2:
+ mes "[Katze]";
+ mes "\"Did you bring what I asked you for?\"";
+ next;
+ menu
+ "Look here.", L_CatChecksStuff,
+ "What do you need again?", L_WhatsNeeded,
+ "No, I haven't got everything yet.", L_close;
+
+L_WhatsNeeded:
+ mes "[Katze]";
+ mes "\"Actually, you should have remembered yourself.\"";
+ next;
+ menu
+ "Please tell me.", L_Please,
+ "Never mind.", L_close;
+
+L_Please:
+ mes "[Katze]";
+ mes "\"Alright... [the cat glares at you] it was";
+ mes "2 Snake Skins,";
+ mes "2 Snake Tongues,";
+ mes "2 Maggot Slimes,";
+ mes "2 White Furs,";
+ mes "2 Hard Spikes and";
+ mes "2 Tiny Healing Potions.\"";
+ goto L_close;
+
+L_CatChecksStuff:
+ if (countitem("SnakeSkin") > 1
+ && countitem("SnakeTongue") > 1
+ && countitem("MaggotSlime") > 1
+ && countitem("WhiteFur") > 1
+ && countitem("HardSpike") > 1
+ && countitem("TinyHealingPotion") > 1)
+ goto L_GiveStuff;
+ mes "[Katze]";
+ mes "\"You don't seem to have everything yet. Come back later when you do.\"";
+ goto L_close;
+
+L_GiveStuff:
+ delitem "SnakeSkin", 2;
+ delitem "SnakeTongue", 2;
+ delitem "MaggotSlime", 2;
+ delitem "WhiteFur", 2;
+ delitem "HardSpike", 2;
+ delitem "TinyHealingPotion", 2;
+ @cat = 6;
+ callsub S_Update_Katze;
+ @catNeedsAlone = 1;
+ mes "[Katze]";
+ mes "\"Nicely done! Now leave me alone for a while, I need some time to prepare your present.\"";
+ goto L_close;
+
+L_PreGainEars:
+ mes "[Katze]";
+ mes "\"Please leave me alone for a while, so I can prepare your present.\"";
+ goto L_close;
+
+L_GainEars:
+ getitem "CatEars", 1;
+ @xpval = 5000;
+ getexp @xpval, 0;
+ @cat = 7;
+ callsub S_Update_Katze;
+ mes "[Katze]";
+ mes "\"Look what I made for you! It makes you look a bit like me! Maybe it will give you a feeling of what it is like to be a cat.\"";
+ mes "The cat winks at you.";
+ mes "[You gain " + @xpval + " experience points]";
+ goto L_close;
+
+L_Finished:
+ mes "[Katze]";
+ if (getequipid(equip_head) == 1217) // Cat ears
+ mes "\"Meow, fellow cat.\"";
+ if (getequipid(equip_head) != 1217)
+ mes "\"Meow. Lost your ears?\"";
+ goto L_close;
+
+L_close:
+ @cat = 0;
+ close;
+
+S_Update_Katze:
+ Katze = (Katze & ~(NIBBLE_0_MASK)) | (@cat << NIBBLE_0_SHIFT);
+ return;
+}
diff --git a/npc/015-3/mapflags.txt b/npc/015-3/mapflags.txt
new file mode 100644
index 00000000..8d10f78e
--- /dev/null
+++ b/npc/015-3/mapflags.txt
@@ -0,0 +1,3 @@
+015-3 mapflag nosave 015-1,59,32
+//015-3 mapflag resave 010-1,27,97
+015-3 mapflag zone MMO
diff --git a/npc/015-3/pot.txt b/npc/015-3/pot.txt
new file mode 100644
index 00000000..4516c13f
--- /dev/null
+++ b/npc/015-3/pot.txt
@@ -0,0 +1,122 @@
+
+015-3,37,29,0 script Pot NPC400,{
+ @cat = ((Katze & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT);
+
+ if (@cat > 0)
+ mes "It's that old pot again.";
+ if (@cat == 0)
+ mes "It's a pot.";
+ next;
+
+ if (@cat == 1 && @catNeedsAlone == 0)
+ goto L_NeedsFood;
+ if (@cat == 1)
+ goto L_HasMilk;
+ if (@cat == 2 && @catNeedsAlone == 0)
+ goto L_NeedsFur;
+ if (@cat == 2)
+ goto L_HasFood;
+ if (@cat == 3)
+ goto L_NeedsWood;
+ if (@cat == 4 && @catNeedsAlone == 1)
+ goto L_HasWood;
+ if (@cat >= 4)
+ goto L_close;
+ goto L_NeedsMilk;
+
+L_NeedsMilk:
+ if (countitem("Milk") > 0)
+ menu
+ "Pour in some milk.", L_GiveMilk,
+ "Leave it alone.", L_close;
+ goto L_close;
+
+L_GiveMilk:
+ delitem "Milk", 1;
+ @cat = 1;
+ callsub S_Update_Katze;
+ @catNeedsAlone = 1;
+ goto L_close;
+
+L_HasMilk:
+ mes "There is milk in it.";
+ goto L_close;
+
+L_NeedsFood:
+ mes "The milk is gone!";
+ next;
+
+ if (countitem("ChickenLeg") > 0 && countitem("Steak") > 0)
+ menu
+ "Put in a chicken leg.", L_GiveChicken,
+ "Put in a steak.", L_GiveSteak,
+ "Leave it alone.", L_close;
+ if (countitem("ChickenLeg") > 0 && countitem("Steak") == 0)
+ menu
+ "Put in a chicken leg.", L_GiveChicken,
+ "Leave it alone.", L_close;
+ if (countitem("ChickenLeg") == 0 && countitem("Steak") > 0)
+ menu
+ "Put in a steak.", L_GiveSteak,
+ "Leave it alone.", L_close;
+ goto L_close;
+
+L_GiveChicken:
+ delitem "ChickenLeg", 1;
+ @cat = 2;
+ callsub S_Update_Katze;
+ @catNeedsAlone = 1;
+ goto L_close;
+
+L_GiveSteak:
+ delitem "Steak", 1;
+ @cat = 2;
+ callsub S_Update_Katze;
+ @catNeedsAlone = 1;
+ goto L_close;
+
+L_HasFood:
+ mes "There is some food in it.";
+ goto L_close;
+
+L_NeedsFur:
+ mes "And it's empty!";
+ next;
+
+ if (countitem("WhiteFur") > 0)
+ menu
+ "Put a white fur next to the pot.", L_GiveFur,
+ "Leave it alone.", L_close;
+ goto L_close;
+
+L_GiveFur:
+ mes "You put down the fur, but the cat doesn't seem to take any notice. Maybe there's something else you could do. You pick the fur up again.";
+ goto L_close;
+
+L_NeedsWood:
+ if (countitem("RawLog") > 0)
+ menu
+ "Put a wooden log next to the pot.", L_GiveWood,
+ "Leave it alone.", L_close;
+ goto L_close;
+
+L_GiveWood:
+ delitem "RawLog", 1;
+ @cat = 4;
+ callsub S_Update_Katze;
+ @catNeedsAlone = 1;
+ mes "You put the wooden log next to the pot. The cat eyes it suspiciously, but remains on her spot.";
+ goto L_close;
+
+L_HasWood:
+ mes "A wooden log is patiently lying next to it.";
+ goto L_close;
+
+L_close:
+ @cat = 0;
+ close;
+
+S_Update_Katze:
+ Katze = (Katze & ~(NIBBLE_0_MASK)) | (@cat << NIBBLE_0_SHIFT);
+ return;
+}
diff --git a/npc/016-1/_import.txt b/npc/016-1/_import.txt
new file mode 100644
index 00000000..3e88e048
--- /dev/null
+++ b/npc/016-1/_import.txt
@@ -0,0 +1,7 @@
+// Map 016-1: Woodland
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/016-1/_mobs.txt",
+"npc/016-1/_warps.txt",
+"npc/016-1/gwendolyn.txt",
+"npc/016-1/mapflags.txt",
+"npc/016-1/rossy.txt",
diff --git a/npc/016-1/_mobs.txt b/npc/016-1/_mobs.txt
new file mode 100644
index 00000000..feace23e
--- /dev/null
+++ b/npc/016-1/_mobs.txt
@@ -0,0 +1,11 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 016-1: Woodland mobs
+016-1,0,0,0,0 monster Clover Patch 1037,2,100000,30000
+016-1,0,0,0,0 monster Butterfly 1055,10,30,20
+016-1,0,0,0,0 monster Squirrel 1038,30,20,10
+016-1,0,0,0,0 monster Mouboo 1028,5,0,0
+016-1,0,0,0,0 monster Mauve Plant 1029,3,0,0
+016-1,0,0,0,0 monster Mauve Plant 1029,4,270000,180000
+016-1,0,0,0,0 monster Cobalt Plant 1030,3,0,0
+016-1,0,0,0,0 monster Mauve Plant 1029,4,270000,180000
+016-1,0,0,0,0 monster Silkworm 1035,7,150000,7000
diff --git a/npc/016-1/_warps.txt b/npc/016-1/_warps.txt
new file mode 100644
index 00000000..7ef2878d
--- /dev/null
+++ b/npc/016-1/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 016-1: Woodland warps
+016-1,56,18,0 warp #016-1_56_18 2,0,010-1,56,104
+016-1,20,53,0 warp #016-1_20_53 0,2,025-1,129,58
diff --git a/npc/016-1/gwendolyn.txt b/npc/016-1/gwendolyn.txt
new file mode 100644
index 00000000..ae2da9d7
--- /dev/null
+++ b/npc/016-1/gwendolyn.txt
@@ -0,0 +1,539 @@
+// TMW2 Script
+// Author:
+// TMW Org.
+// Edited by:
+// Jesusalva
+// Description:
+// Archery Trainer
+
+016-1,91,54,0 script Gwendolyn NPC182,{
+ //.@q=getq();
+
+ .@Q_hawkseye_MASK = NIBBLE_6_MASK;
+ .@Q_hawkseye_SHIFT = NIBBLE_6_SHIFT;
+
+ .@Q_hawkseye = (QUEST_Forestbow_state & .@Q_hawkseye_MASK) >> .@Q_hawkseye_SHIFT;
+
+ .@Q_Forestbow_MASK = NIBBLE_0_MASK;
+ .@Q_Forestbow_SHIFT = NIBBLE_0_SHIFT;
+
+ .@FORESTBOW = ((QUEST_Forestbow_state) & .@Q_Forestbow_MASK) >> .@Q_Forestbow_SHIFT;
+
+ if (.@Q_hawkseye == 6) goto L_state6;
+ if (.@Q_hawkseye == 5) goto L_state5;
+ if (.@Q_hawkseye == 4) goto L_state4;
+ if (.@Q_hawkseye == 3) goto L_state3;
+ if (.@Q_hawkseye == 2) goto L_state2;
+ if (.@Q_hawkseye == 1) goto L_state1;
+
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Hello, and welcome to my reopened School of Archery. My name is Gwendolyn Bowmaker; I'm the granddaughter of the famous Gwendolyn Bowmaker.\"";
+ next;
+ mes "\"As you surely know, she was the greatest archer this world had ever seen and opened this School of Archery together with her husband Simon Bowmaker. He was able to make the most well-balanced and the finest bows.\"";
+ next;
+ mes "\"I am now back from my training journey and want to continue with my family's tradition, to teach the Way of Archery.\"";
+ next;
+ mes "\"Are you interested in becoming a student of Archery?\"";
+ next;
+ menu
+ "I want to become an archer!",L_fee,
+ "I'm not interested right now.",L_No_student;
+
+L_fee:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Wonderful! The school's fee is " + .SCHOOLFEE + ".\"";
+ next;
+ menu
+ "That's a lot, but I think it will be worth it.",L_Next,
+ "I'm not sure I want to spend that much.",L_No_student;
+
+L_Next:
+ if (Zeny < .SCHOOLFEE)
+ goto L_No_Money;
+
+ Zeny = Zeny - .SCHOOLFEE;
+ .@Q_hawkseye = 2;
+ callsub S_Update_Var;
+
+ mesn "Gwendolyn Bowmaker";
+ mes "\"The first thing you need is, obviously, a bow. You should not use any you come across, but a high quality one. I think it would be best to go to Alan in Hurnscald. He is my cousin, and knows how to make Forest Bows of exquisite quality. \"";
+
+ if (countitem("ForestBow") < 1)
+ goto L_close;
+ next;
+ menu
+ "I already have a Forest Bow.",L_state2;
+
+L_state2:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Let me see your bow.\"";
+ next;
+
+ if (countitem("ForestBow") < 1)
+ goto L_No_bow;
+ if (.@FORESTBOW < 5)
+ goto L_bow_bought;
+
+ .@Q_hawkseye = 3;
+ callsub S_Update_Var;
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Very well, this looks fine. It is time for your first lesson. \"";
+ next;
+ goto L_lesson;
+
+L_lesson:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"The advantage of fighting with a ranged weapon is that you can stay out of the enemy's range. So there is no need to spend training on your resistibility.\"";
+ next;
+ mes "\"But remember: this makes you much more vulnerable, so watch your step and don't stumble into your enemy's attack.\"";
+ next;
+ mes "\"Also your strength doesn't matter much. You might be able to shoot a little harder, but not so much as to make it important.\"";
+ next;
+ mes "\"The most important thing to improve is your dexterity. When you use a bow, it is your dexterity that determines if you are able to hit your enemy where it hurts most.\"";
+ next;
+ mes "\"Also worth mentioning is how to improve your ability to shoot fast. You need to be agile to grab a new arrow from your quiver and aim for the next shot before your enemy has recovered from your last.\"";
+ next;
+ goto L_state3;
+
+L_state3:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"To demonstrate that you understood what I'm trying to teach you, you should go and fight against some snakes. To prove me your results, bring me " + .CAVE_EGGS_AMOUNT + " cave snake eggs, " + .SNAKE_EGGS_AMOUNT + " snake eggs, " + .MOUNTAIN_EGGS_AMOUNT + " mountain snake eggs and " + .GRASS_EGGS_AMOUNT + " grass snake eggs.\"";
+ next;
+ menu
+ "Can you please repeat your lesson?",L_lesson,
+ "I will go and hunt some snakes.",L_close,
+ "I have what you want.",L_Next1;
+
+L_Next1:
+ if (countitem("CaveSnakeEgg") < .CAVE_EGGS_AMOUNT
+ ||countitem("SnakeEgg") < .SNAKE_EGGS_AMOUNT
+ ||countitem("MountainSnakeEgg") < .MOUNTAIN_EGGS_AMOUNT
+ ||countitem("GrassSnakeEgg") < .GRASS_EGGS_AMOUNT)
+ goto L_Not_enough_eggs;
+
+ delitem "CaveSnakeEgg", .CAVE_EGGS_AMOUNT;
+ delitem "SnakeEgg", .SNAKE_EGGS_AMOUNT;
+ delitem "MountainSnakeEgg", .MOUNTAIN_EGGS_AMOUNT;
+ delitem "GrassSnakeEgg", .GRASS_EGGS_AMOUNT;
+
+ getexp .QUEST_EGG_EXP, 0;
+
+ .@Q_hawkseye = 4;
+ callsub S_Update_Var;
+
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Very well. That will make a great meal.\"";
+ next;
+ goto L_state4;
+
+L_state4:
+ if (BaseLevel < .BASELEVEL_GAME)
+ goto L_Not_Ready;
+ if (!(getskilllv(SKILL_POOL)))
+ goto L_Not_Ready;
+ mes "Gwendolyn takes an analyzing look at you. Then she nods.";
+ next;
+
+ .@Q_hawkseye = 5;
+ callsub S_Update_Var;
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Ok. You have made great progress. I think you are ready for further tasks.\"";
+ next;
+ goto L_Game_explain;
+
+L_Game_explain:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"As you might have noticed, it depends on many circumstances if your arrow finds its target. Your shot may be too powerful or too weak, so the arrow goes far beyond your target or hits the ground before it reaches its destination.\"";
+ next;
+ mes "\"The greater the distance to your target is, the more important is the strength and direction of the wind. Even if you are exploring a cave, there might be air flow caused by the corners in the cave.\"";
+ next;
+ mes "\"Ok, you can see that target over there? I will tell you how strong the wind blows and from which direction. Then you will try to hit the target by moving right or left and decide how powerful you want to shoot.\"";
+ next;
+ goto L_state5;
+
+L_state5:
+ // needed for the minigame:
+ set .@wdX, 0; // wind direction x-coordinate, rand
+ set .@wdY, 0; // wind direction y-coordinate, rand
+ // set .@wp, 0; // windpower
+ set .@spX, 0; // start position x-coordinate, player decision
+ // set .@spY, 0; // start position y-coordinate, const
+ set .@sp, 0; // shotpower, player decision
+ //set .@targetX, 0; // target position, const
+ //set .@targetY, 20; // target position, const
+ set .@pointX, 0; // point the player hits, x-coordinate
+ set .@pointY, 0; // point the player hits, y-coordinate
+ .@wdIndex = 0;
+ //
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Show me what you can!\"";
+ next;
+ menu
+ "Can you please explain the task again?",L_Game_explain,
+ "I'm ready, let's start!",L_Game,
+ "I'm sorry, I will come back later.",L_close;
+
+L_Game:
+ if (countitem("ForestBow") < 1)
+ goto L_No_bow;
+ if (countitem("Arrow") < 1)
+ goto L_No_arrows;
+ delitem "Arrow", 1;
+ mes "You go to the training field and stand exactly on the same level with the target. The target is located about 43 feet north of you.You take one arrow and look at Gwendolyn.";
+ next;
+
+ // possibility for wdX and wdY to become zero is reduced, so windless status is less often
+ .@wdX = rand(9) - 4;
+ if (.@wdX != 2 && .@wdX !=-2) set .@wdX, rand(9) - 4;
+ if (.@wdX == 0) set .@wdX, rand(9) - 4;
+
+ .@wdY = rand(9) - 4;
+ if (.@wdY != 2 && .@wdY !=-2) set .@wdY, rand(9) - 4;
+ if (.@wdY == 0) set .@wdY, rand(9) - 4;
+
+ // wind direction array, where the wind blows to:
+ // 123
+ // 456
+ // 789
+ //here is where the wind comes from, that's why it is the opposite.
+ setarray .@wd$,"error1, please report", "southeast", "south", "southwest", "east", "error2, please report", "west", "northeast", "north", "northwest" ;
+ .@paramX = .@wdX;
+ .@paramY = .@wdY;
+ callsub S_getDirection;
+ .@wdIndex = .@returnIndex;
+
+ .@wp_sq = (.@wdX * .@wdX) + (.@wdY * .@wdY);
+
+ if (.@wp_sq == 0)
+ goto L_wp0;
+ if (.@wp_sq < 3)
+ goto L_wp1;
+ if (.@wp_sq < 9)
+ goto L_wp2;
+ if (.@wp_sq < 19)
+ goto L_wp3;
+ goto L_wp4;
+
+
+L_wp0:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"You're lucky. It is windless now.\"";
+ next;
+ goto L_choose_start_pos;
+
+L_wp1:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"There is a slight breeze coming from "+ .@wd$[.@wdIndex] + ".\"";
+ next;
+ goto L_choose_start_pos;
+
+L_wp2:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"The wind is blowing from "+ .@wd$[.@wdIndex] + ".\"";
+ next;
+ goto L_choose_start_pos;
+
+L_wp3:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Right now, there is a strong wind blowing from " + .@wd$[.@wdIndex] + ".\"";
+ next;
+ goto L_choose_start_pos;
+
+L_wp4:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Here we have a squall from "+ .@wd$[.@wdIndex] + ".\"";
+ next;
+ goto L_choose_start_pos;
+
+L_choose_start_pos:
+ mes "Do you want to go to the left, the right or stay where you are?";
+ next;
+ menu
+ "I want to move left.",L_step_left,
+ "I go right.",L_step_right,
+ "I stay.",L_step_no,
+ "I will try it later.",L_close;
+
+L_step_no:
+ .@spX = 0;
+ mes "You stay where you are..";
+ next;
+ goto L_choose_shotpower;
+
+L_step_left:
+ mes "How many steps?";
+ next;
+ menu
+ "1",L_step_left1,
+ "2",L_step_left2,
+ "3",L_step_left3,
+ "4",L_step_left4;
+
+L_step_left1:
+ .@spX = -1;
+ mes "You take one step to the left.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_left2:
+ .@spX = -2;
+ mes "You take two steps to the left.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_left3:
+ .@spX = -3;
+ mes "You take three steps to the left.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_left4:
+ .@spX = -4;
+ mes "You take four steps to the left.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_right:
+ mes "How many steps?";
+ next;
+ menu
+ "1",L_step_right1,
+ "2",L_step_right2,
+ "3",L_step_right3,
+ "4",L_step_right4;
+
+L_step_right1:
+ .@spX = 1;
+ mes "You take one step to the right.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_right2:
+ .@spX = 2;
+ mes "You take two steps to the right.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_right3:
+ .@spX = 3;
+ mes "You take three steps to the right.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_right4:
+ .@spX = 4;
+ mes "You take four steps to the right.";
+ next;
+ goto L_choose_shotpower;
+
+L_choose_shotpower:
+ mes "How powerfully do you want to shoot?";
+ next;
+ menu
+ "very weak shot",L_MenuItems,
+ "rather weak shot",L_MenuItems,
+ "weak shot",L_MenuItems,
+ "somewhat weak shot",L_MenuItems,
+ "medium shot",L_MenuItems,
+ "somewhat powerful shot",L_MenuItems,
+ "powerful shot",L_MenuItems,
+ "rather powerful shot",L_MenuItems,
+ "very powerful shot",L_MenuItems;
+
+L_MenuItems:
+ // we have 9 menu entries, so scale .@menu, which is in range 1-9, to a scale in -4 to +4
+ .@sp = .@menu - 5;
+ // calculate where you hit. You range is in [-8, 8] in X and Y as well
+ .@pointX = .@wdX + .@spX;
+ .@pointY = .@wdY + .@sp;
+
+ if( .@pointX==0 && .@pointY==0 )
+ goto L_target_hit;
+
+ //set .@targethit to these numbers:
+ //1,2,3 for left above, above, right above,
+ //4,5,6 for left, hit, right
+ //7,8,9 for lower left, below, lower right;
+ setarray .@target_direction$, "error3, please report", "left above", "above", "right above","left","error4, please report","right","lower left","below","lower right";
+
+ .@paramX = .@pointX;
+ .@paramY = .@pointY;
+ callsub S_getDirection;
+ .@targethit = .@returnIndex;
+
+ //now check how close
+ //get the distance squared:
+ // so it is in range 0 - 64:
+ // 0 is hit
+ // < 5 is very close
+ // <17 is close
+ // rest is a quite fucking shot
+ .@target_dist_sq = (.@pointX * .@pointX) + (.@pointY*.@pointY);
+
+ if (.@target_dist_sq < 5)
+ goto L_target_veryclose;
+ if (.@target_dist_sq < 17)
+ goto L_target_close;
+
+ //here are bad shots:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"D'oh, what a terrible shot!\"";
+ next;
+ mes "\"Do you even know what a bow is?\"";
+ next;
+ mes "\"That was far "+.@target_direction$[.@targethit]+".\"";
+ next;
+ goto L_Game;
+
+L_target_close:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"That was "+.@target_direction$[.@targethit]+".\"";
+ next;
+ mes "\"I suggest some training.\"";
+ next;
+ goto L_Game;
+
+L_target_veryclose:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"That was quite close. Impressive!\"";
+ next;
+ mes "\"It was a little "+.@target_direction$[.@targethit]+".\"";
+ next;
+ mes "\"But you did not hit... have another try.\"";
+ next;
+ //like a coin toss: 2 possibilites, the same chance for both:
+ //if(0 == rand(2)) goto L_Game;
+ mes "\"Hurry up, before the wind changes.\"";
+ next;
+ goto L_choose_start_pos;
+L_target_hit:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Wonderful! That was great! Directly hit the bull's eye!\"";
+ next;
+ mes "\"Seems like you did it!\"";
+ next;
+ mes "\"Let me inspect it...\" She walks to the target.";
+ next;
+ if( rand(500) > (2*readparam(bDex) + readparam(bAgi)))
+ goto L_target_nohit;
+ .@Q_hawkseye = 6;
+ callsub S_Update_Var;
+
+ updateskill SKILL_MALLARDS_EYE, 1;
+ getexp .QUEST_HAWK_EXP, 0;
+
+ mes "\"You proved that you are worthy to call yourself a graduate of the School of Archery.\"";
+ next;
+ mes "\"But remember, there is always something new to learn. And you should not let your training down in order to keep and improve your abilities.\"";
+ goto L_close;
+
+L_target_nohit:
+ mes "\"Ohh! Half a fingerbreadth aside.\"";
+ next;
+ mes "\"That is quite impressive, but you can perform better with more training.\"";
+ next;
+ goto L_Game;
+
+L_state6:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"You really have a reason to be proud.\"";
+ goto L_close;
+
+L_state1:
+ mes "[Gwendoly Bowmaker]";
+ mes "\"Welcome back. Did you decide to follow the Way of Archery?\"";
+ next;
+ menu
+ "I want to become an archer!",L_fee,
+ "I am not interested.",L_No_student;
+
+L_No_student:
+ mes "\"That's a pity. Well, if you change your mind, come back any time.\"";
+ .@Q_hawkseye = 1;
+ callsub S_Update_Var;
+ goto L_close;
+
+L_No_Money:
+ mes "\"I am sorry, but it seems that you don't have enough money. Come back when you have reorganized your finances.\"";
+ .@Q_hawkseye = 1;
+ callsub S_Update_Var;
+ goto L_close;
+
+L_No_bow:
+ mes "\"As an archer, you should always carry your bow with you. Go and get it.\"";
+ goto L_close;
+
+L_bow_bought:
+ mes "\"You just bought it? You won't learn anything from that. To understand the nature of this bow, you have to collect the needed material by yourself. Only this way will you get a feeling of what it means to use such a weapon. \"";
+ next;
+ mes "\"The best thing would be to let you make the bow by yourself. But I guess, that would go to far. And it would take ages to get a high quality bow.\"";
+ next;
+ mes "\"Ok, go to Alan and come back with a bow made out of the logs you collected.\"";
+ goto L_close;
+
+L_Not_enough_eggs:
+ mes "\"Maybe I should also give you a lesson in how to count? You haven't enough.\"";
+ goto L_close;
+
+L_Not_Ready:
+ mes "\"I am pleased about your progrees, but you are not ready for the next step yet. Go and do some more training, before you come back. Remember also: It is wise to speak with people you meet on your journey, there is always something new to learn.\"";
+ goto L_close;
+
+L_No_arrows:
+ mes "Gwendolyn sighs and shake her head.";
+ next;
+ mes "\"Another lecture: Take always enough arrows with you. Go and come back when you are equipped adequately.\"";
+ goto L_close;
+
+L_close:
+ close;
+
+S_Update_Var:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(.@Q_hawkseye_MASK) | (.@Q_hawkseye << .@Q_hawkseye_SHIFT));
+ return;
+
+S_getDirection:
+ // get .@paramX .@paramY as parameters
+ // returns an index where these parameters are in relation to origin
+ // 123
+ // 456 whereas 5 is the origin. (3,6,9 there is paramX>0); (1,2,3 there is paramY>0)
+ // 789
+ //first check the quadrants and after check more precisely
+ if(.@paramX>0 && .@paramY>0) set .@returnIndex, 3;
+ if(.@paramX>0 && .@paramY<0) set .@returnIndex, 9;
+ if(.@paramX<0 && .@paramY>0) set .@returnIndex, 1;
+ if(.@paramX<0 && .@paramY<0) set .@returnIndex, 7;
+
+ //straight left
+ if ( (.@paramX < 0) && (.@paramY >= .@paramX/2) && (-.@paramY >= .@paramX/2) ) set .@returnIndex, 4;
+
+ //straight right
+ if ( (.@paramX > 0) && (.@paramY <= .@paramX/2) && (-.@paramY <= .@paramX/2) ) set .@returnIndex, 6;
+
+ //straight above
+ if ( (.@paramY > 0) && (.@paramX <= .@paramY/2) && (-.@paramX <= .@paramY/2) ) set .@returnIndex, 2;
+
+ //straight below
+ if ( (.@paramY < 0) && (.@paramX >= .@paramY/2) && (-.@paramX >= .@paramY/2) ) set .@returnIndex, 8;
+
+ //check the origin, because the origin is found by the "straight" lines as well. (should not, but is.. maybe a bug?)
+ if( .@paramX==0 && .@paramY==0 ) set .@returnIndex, 5;
+ return;
+
+OnInit:
+ // schoolfee in gp
+ .SCHOOLFEE = 25000;
+ // how many eggs do you need of each kind?
+ .CAVE_EGGS_AMOUNT = 18;
+ .SNAKE_EGGS_AMOUNT = 15;
+ .MOUNTAIN_EGGS_AMOUNT = 5;
+ .GRASS_EGGS_AMOUNT = 2;
+ // experience for eggs
+ .QUEST_EGG_EXP = 10000;
+ // The needed level for the minigame:
+ .BASELEVEL_GAME = 50;
+ // experience gained for hitting the bullseye:
+ .QUEST_HAWK_EXP = 10000;
+
+ end;
+}
diff --git a/npc/016-1/mapflags.txt b/npc/016-1/mapflags.txt
new file mode 100644
index 00000000..a7757f70
--- /dev/null
+++ b/npc/016-1/mapflags.txt
@@ -0,0 +1,2 @@
+//016-1 mapflag resave 010-1,27,97
+016-1 mapflag zone outside
diff --git a/npc/016-1/rossy.txt b/npc/016-1/rossy.txt
new file mode 100644
index 00000000..78b0bacb
--- /dev/null
+++ b/npc/016-1/rossy.txt
@@ -0,0 +1,288 @@
+
+016-1,32,44,0 script Rossy NPC114,{
+ @child_number = 6;
+ callfunc "XmasList";
+
+ @Cherry_Amount = 10;
+ @Cherry_EXP = 2000;
+
+ @CactusDrink_Amount = 24;
+ @MaggotSlime_Amount = 32;
+ @GambodgeHerb_Amount = 50;
+ @AlizarinHerb_Amount = 43;
+ @BugLeg_Amount = 30;
+ @Potion_EXP = 3000;
+
+ @RedRose_Amount = 15;
+ @RedTulip_Amount = 15;
+ @Flower_EXP = 2500;
+
+ @Finish_EXP = 5000;
+ @Finish_Money = 5000;
+
+ if (FLAGS & FLAG_ROSSI_COMPLETED) goto L_FinalEnd;
+ if (Rossy_Quest == 17 || Rossy_Quest == 18) goto L_End;
+
+ if (Rossy_Quest >= 14 && Rossy_Quest <= 16) goto L_Julia;
+ if (Rossy_Quest >= 13) goto L_Best;
+ if (Rossy_Quest >= 11) goto L_Allergic;
+ if (Rossy_Quest >= 8 && Rossy_Quest < 11) goto L_Donet;
+ if (Rossy_Quest == 7) goto L_BT;
+ if (Rossy_Quest == 6) goto L_Check2;
+ if (Rossy_Quest == 5) goto L_Let;
+ if (Rossy_Quest == 4 || Rossy_Quest == 5) goto L_Cherry_Done;
+ if (Rossy_Quest == 3) goto L_Check;
+ if (Rossy_Quest == 2) goto L_Mother;
+
+ mes "A young girl looks at you in tears.";
+ if (Rossy_Quest < 1)
+ close;
+ next;
+ menu
+ "Hey there.... Why are you crying? Are you hurt?", L_Next,
+ "Sorry kid, I don't have time to play with children.", L_No;
+
+L_Next:
+ mes "[Young Girl]";
+ mes "\"No. I'm crying because I lost all my fruits. My sister and I were collecting some near Dimond's Cove, but then I stumbled on a giant snail and it attacked us!";
+ next;
+ mes "But we were lucky, because the snail is really slow and we ran away from it. Julia ran to the left and I ran to the right. The snail got pretty confused, because we are identical twins. The problem is that I dropped the basket full of fruits on the ground and that evil snail ate them all! And now I can't find Julia to help me collect more fruits.\"";
+ next;
+ menu
+ "Did you say \"Julia?\" I talked to your mother; she's very worried about you!", L_SheWorried;
+
+L_SheWorried:
+ mes "[Rossy]";
+ mes "\"Really? But she let us play in the woods. There's no reason to be worried – unless....\"";
+ next;
+ mes "Rossy suddenly gets a strange look on her face, mumbling something about Julia.";
+ next;
+ mes "[Rossy]";
+ mes "\"Could you do me a favor? Please, tell my mother that we're alright. There's ... well ... there's no reason to worry about us.\"";
+ next;
+ menu
+ "Very well, if you say so....", L_SaySo,
+ "Sorry, but I really don't have time for this.", L_No;
+
+L_SaySo:
+ mes "[Rossy]";
+ mes "\"Thank you very much!\"";
+ Rossy_Quest = 2;
+ close;
+
+L_No:
+ close;
+
+L_Mother:
+ mes "[Rossy]";
+ mes "\"Please, tell my mother we are fine. If you feel like helping, come back after you talk to my mother. Maybe you could help us find some fruits.\"";
+ close;
+
+L_Get_Cherry:
+ mes "[Young Girl]";
+ mes "\"No, you don't have " + @Cherry_Amount + " cherries. I know how to count. I hope you get them soon.\"";
+ close;
+
+L_Check:
+ mes "[Rossy]";
+ mes "\"Hey, that is nice of you to come back. I was thinking about giving a basket full of cherries to my mother, to make her happy, you know. But we'd need at least " + @Cherry_Amount + " cherries, and it would take ages for me to get so many by myself!\"";
+ next;
+ menu
+ "That is no problem for me. Just wait and I will come back with the cherries.", L_No,
+ "Hey, I have some cherries in my backpack!", L_HaveSomeCherries,
+ "You should get them yourself.", L_No;
+
+L_HaveSomeCherries:
+ if(countitem("Cherry") < @Cherry_Amount)
+ goto L_Get_Cherry;
+ mes "[Rossy]";
+ Rossy_Quest = 4;
+ getexp @Cherry_EXP, 0;
+ mes "\"I can't believe it! You got all the cherries needed! Please give them to my mother. Tell her that it is a gift from me and Julia and that there's no reason to worry about us.\"";
+ next;
+ mes "Rossy mumbles to herself.";
+ mes "[Rossy]";
+ mes "\"I hope....\"";
+ next;
+ mes "[Rossy]";
+ mes "\"Oh, and after you give the cherries to my mother, please come back here. Err, if you have some free time, of course.\"";
+ close;
+
+L_Cherry_Done:
+ mes "[Rossy]";
+ mes "\"Please, try to distract my mother. I don't want her to be worried about us. While you do this, I will try to find Julia.\"";
+ close;
+
+L_Let:
+ mes "[Rossy]";
+ mes "\"Hello "+ strcharinfo(0) +", nice to see you again. Hey, what are you hiding behind your back? Is that a ... letter?\"";
+ next;
+ menu
+ "Your mother asked me to hand you this letter. She told me it was from your teacher.", L_Let2,
+ "Not at all. I need to go now, see you next time.", L_No;
+
+L_Let2:
+ mes "The little girl grabs the piece of paper and reads it quickly. Her face turns pale.";
+ menu
+ "What does it say?", L_PaperSays;
+
+L_PaperSays:
+ mes "[Rossy]";
+ mes "\"Oh no, I completely forgot! My magic school exam! I need to make a potion and give it to my teacher today! But I haven't found Julia yet and I don't even have any of the ingredients required. Could you get them for me, please?\"";
+ next;
+ Rossy_Quest = 6;
+ mes "\"I need " + @CactusDrink_Amount + " Cactus Drinks, " + @MaggotSlime_Amount + " Maggot Slimes, " + @GambodgeHerb_Amount + " Gamboge Herbs, " + @AlizarinHerb_Amount + " Alizarin Herbs and " + @BugLeg_Amount + " Bug Legs.\"";
+ next;
+ mes "\"Please come back to see me when you have the ingredients. I know the recipe by heart.\"";
+ close;
+
+L_NE:
+ mes "[Rossy]";
+ mes "\"Please bring me " + @CactusDrink_Amount + " Cactus Drinks, " + @MaggotSlime_Amount + " Maggot Slimes, " + @GambodgeHerb_Amount + " Gamboge Herbs, " + @AlizarinHerb_Amount + " Alizarin Herbs and " + @BugLeg_Amount + " Bug Legs.\"";
+ next;
+ mes "\"Please hurry!\"";
+ close;
+
+L_Check2:
+ if(countitem("CactusDrink") < @CactusDrink_Amount)
+ goto L_NE;
+ if(countitem("MaggotSlime") < @MaggotSlime_Amount)
+ goto L_NE;
+ if(countitem("GambogeHerb") < @GambodgeHerb_Amount)
+ goto L_NE;
+ if(countitem("AlizarinHerb") < @AlizarinHerb_Amount)
+ goto L_NE;
+ if(countitem("BugLeg") < @BugLeg_Amount)
+ goto L_NE;
+ delitem "CactusDrink", @CactusDrink_Amount;
+ delitem "MaggotSlime", @MaggotSlime_Amount;
+ delitem "GambogeHerb", @GambodgeHerb_Amount;
+ delitem "AlizarinHerb", @AlizarinHerb_Amount;
+ delitem "BugLeg", @BugLeg_Amount;
+ mes "Rossy takes all the ingredients and places them on the ground. She starts to mix some herbs with the cactus drinks and appears to cast some spells. She seems to know what she is doing.";
+ next;
+ mes "[Rossy]";
+ mes "\"Oh, thank you "+ strcharinfo(0) +"! It is done. If you don't mind, please give this potion to my teacher.\"";
+ Rossy_Quest = 7;
+ getexp @Potion_EXP, 0;
+ message strcharinfo(0), "Rossy hands you the potion, holding the bottle very carefully.";
+ next;
+ mes "\"My teacher's name is David. He is a very young magician and lives near the magic school in the north of Tulimshar.\"";
+ next;
+ mes "\"Please, give it to him as soon as you can!\"";
+ close;
+
+L_BT:
+ mes "[Rossy]";
+ mes "\"Great. Now if you could just give it to my teacher. His name is David. He is a very young magician and lives near the magic school in the north of Tulimshar.\"";
+ next;
+ mes "\"You should take the ferry, that'll be faster than swimming!\"";
+ close;
+
+L_Donet:
+ if (Rossy_Quest == 10
+ && countitem("RedRose") >= @RedRose_Amount)
+ goto L_RG;
+ menu
+ "David took your potion and he tested it in front of me. It worked perfectly!", L_DavidPotion;
+
+L_DavidPotion:
+ mes "[Rossy]";
+ mes "\"YPhew! That was close: I almost forgot about my exam. Please, tell my mother about my success for me. I'm sure she'll be pleased.\"";
+ close;
+
+L_RG:
+ if (countitem("RedRose") < @RedRose_Amount)
+ goto L_No;
+ delitem "RedRose", @RedRose_Amount;
+ menu
+ "Your mother was so happy that she asked me to bring you these flowers.", L_MotherFlowers;
+
+L_MotherFlowers:
+ mes "[Rossy]";
+ mes "\"How nice!\"";
+ next;
+ mes "Rossy takes the flowers from your hands and suddenly throws them on the ground. She begins sneezing.";
+ Rossy_Quest = 11;
+ menu
+ "I presume you don't like roses, right?", L_LikeRoses;
+
+L_LikeRoses:
+ mes "[Rossy]";
+ mes "\"I am allergic to roses, my mother should already know that!\"";
+ close;
+
+L_Allergic:
+ mes "Rossy sneezes a lot.";
+ if (Rossy_Quest == 12
+ && countitem("RedTulip") >= @RedTulip_Amount)
+ goto L_Sorry;
+ close;
+
+L_Sorry:
+ menu
+ "Your mother is sorry about the roses. Here are some beautiful red tulips instead.", L_See;
+
+L_See:
+ mes "[Rossy]";
+ if (countitem("RedTulip") < @RedTulip_Amount)
+ goto L_No;
+ delitem "RedTulip", @RedTulip_Amount;
+ Rossy_Quest = 13;
+ mes "\"That's better! Go and tell my mother that she is the nicest mother in the world.\"";
+ next;
+ mes "\"Now I should really find my sister. Come back later.\"";
+ getexp @Flower_EXP, 0;
+ close;
+
+L_Best:
+ mes "[Rossy]";
+ mes "\"Thank you "+ strcharinfo(0) +", you helped me so much!\"";
+ next;
+ menu
+ "Did you find your sister? I am starting to get worried too.", L_FindMySister;
+
+L_FindMySister:
+ mes "\"I think I have an idea where she might be. Come back in a few minutes, I will tell you if she is ok.\"";
+ Rossy_Quest = 14;
+ close;
+
+L_Julia:
+ mes "[Rossy]";
+ mes "\"I saw Julia! She was running away from something and entered a cave not far from here. I heard her scream. Please can you enter the cave and save her? I'm so scared!\"";
+ close;
+
+L_End:
+ mes "[Rossy]";
+ mes "\"Oh no! Julia ... why would you go to that scary place? ... Have you seen her yet?\"";
+ menu
+ "She'll be back soon, trust me. I saved her.", L_Found,
+ "I didn't see her yet, sorry.", L_No;
+
+L_Found:
+ mes "[Rossy]";
+ if (Rossy_Quest == 17)
+ Rossy_Quest = 18;
+ if (Rossy_Quest == 18)
+ Rossy_Quest = 19;
+ mes "\"Oh, "+ strcharinfo(0) +", thank you very much! Take this, you deserve it!\"";
+ next;
+ mes "Rossy hands you a huge bag full of coins.";
+ getexp @Finish_EXP, 0;
+ Zeny = Zeny + @Finish_Money;
+ if (Rossy_Quest == 19)
+ goto L_Clear;
+ close;
+
+L_Clear:
+ Rossy_Quest = 0;
+ cavefights = 0;
+ FLAGS = FLAGS | FLAG_ROSSI_COMPLETED;
+ close;
+
+L_FinalEnd:
+ mes "[Rossy]";
+ mes "\"Julia and I are playing hide and seek right now. It is fun in the forest!\"";
+ mes "The young girl laughs quietly.";
+ close;
+}
diff --git a/npc/016-2/_import.txt b/npc/016-2/_import.txt
new file mode 100644
index 00000000..3f51b8b6
--- /dev/null
+++ b/npc/016-2/_import.txt
@@ -0,0 +1,3 @@
+// Map 016-2: Gwendolyn's
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/016-2/_warps.txt",
diff --git a/npc/016-2/_warps.txt b/npc/016-2/_warps.txt
new file mode 100644
index 00000000..5a9243ae
--- /dev/null
+++ b/npc/016-2/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 016-2: Gwendolyn's warps
+016-2,28,32,0 warp #016-2_28_32 0,0,016-1,84,54
+016-2,26,22,0 warp #016-2_26_22 0,0,016-1,84,49
diff --git a/npc/017-1/_import.txt b/npc/017-1/_import.txt
new file mode 100644
index 00000000..6cf3b9c6
--- /dev/null
+++ b/npc/017-1/_import.txt
@@ -0,0 +1,7 @@
+// Map 017-1: Woodland Hills
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/017-1/_mobs.txt",
+"npc/017-1/_warps.txt",
+"npc/017-1/flowerpentagram1.txt",
+"npc/017-1/flowerpentagram5.txt",
+"npc/017-1/mapflags.txt",
diff --git a/npc/017-1/_mobs.txt b/npc/017-1/_mobs.txt
new file mode 100644
index 00000000..2bbf232a
--- /dev/null
+++ b/npc/017-1/_mobs.txt
@@ -0,0 +1,20 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 017-1: Woodland Hills mobs
+017-1,0,0,0,0 monster Clover Patch 1037,2,0,1000
+017-1,99,30,1,0 monster Clover Patch 1037,1,150000,50000
+017-1,29,29,9,6 monster Gamboge Plant 1031,1,0,25000
+017-1,91,25,38,4 monster Log Head 1025,3,5000,60000
+017-1,31,48,9,6 monster Log Head 1025,3,5000,60000
+017-1,0,0,0,0 monster Butterfly 1055,10,30,20
+017-1,0,0,0,0 monster Bat 1017,5,0,0
+017-1,0,0,0,0 monster Fire Goblin 1011,5,0,0
+017-1,0,0,0,0 monster Mouboo 1028,5,0,0
+017-1,0,0,0,0 monster Pink Flower 1014,5,0,0
+017-1,0,0,0,0 monster Spiky Mushroom 1019,5,0,0
+017-1,0,0,0,0 monster Evil Mushroom 1013,10,0,0
+017-1,0,0,0,0 monster Alizarin Plant 1032,3,0,0
+017-1,0,0,0,0 monster Gamboge Plant 1031,3,0,0
+017-1,0,0,0,0 monster Cobalt Plant 1030,3,0,0
+017-1,0,0,0,0 monster Mauve Plant 1029,5,0,0
+017-1,0,0,0,0 monster Silkworm 1035,10,0,0
+017-1,0,0,0,0 monster Squirrel 1038,30,20,10
diff --git a/npc/017-1/_warps.txt b/npc/017-1/_warps.txt
new file mode 100644
index 00000000..8353e0ee
--- /dev/null
+++ b/npc/017-1/_warps.txt
@@ -0,0 +1,10 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 017-1: Woodland Hills warps
+017-1,46,105,0 warp #017-1_46_105 3,0,013-1,45,21
+017-1,43,32,0 warp #017-1_43_32 0,0,017-2,26,30
+017-1,76,31,0 warp #017-1_76_31 0,0,017-3,69,68
+017-1,98,20,0 warp #017-1_98_20 0,0,017-3,83,52
+017-1,97,31,0 warp #017-1_97_31 0,0,017-3,76,65
+017-1,168,90,0 warp #017-1_168_90 0,0,056-2,34,30
+017-1,188,104,0 warp #017-1_188_104 0,0,055-1,74,21
+017-1,182,16,0 warp #017-1_182_16 2,0,045-1,25,178
diff --git a/npc/017-1/flowerpentagram1.txt b/npc/017-1/flowerpentagram1.txt
new file mode 100644
index 00000000..c16c20c1
--- /dev/null
+++ b/npc/017-1/flowerpentagram1.txt
@@ -0,0 +1,77 @@
+
+017-1,95,42,0 script #FlowerPentagram1 NPC400,{
+ if (OrumQuest >= 31) goto L_PlacedFifthFlower;
+
+ if (OrumQuest > 17) goto L_PlacedFirstFlower;
+ if (OrumQuest == 17) goto L_FirstFlower;
+
+ message strcharinfo(0), "Something is odd about this place.";
+ end;
+
+L_FirstFlower:
+ mes "This looks like the place Orum described.";
+ menu
+ "Place the flower.", L_Next,
+ "Leave.", L_close;
+
+L_Next:
+ if (isin("017-1", 94, 41, 96, 43))
+ goto L_Place;
+
+ mes "You're too far away.";
+ goto L_close;
+
+L_Place:
+ set @localMonsterCount,
+ mobcount("017-1", "#FlowerPentagram1::OnSquirrelDeath") +
+ mobcount("017-1", "#FlowerPentagram1::OnScorpionDeath");
+ if (@localMonsterCount > 2)
+ goto L_MonstersAlive;
+
+ if (countitem("OrangeSummonFlower") < 1)
+ goto L_NoFlower;
+ delitem "OrangeSummonFlower", 1;
+ mes "You carefully place the magic flower on the marked spot. You feel some tension in the air around you.";
+ OrumQuest = 18;
+ close2;
+ areamonster "017-1", 91, 37, 101, 46, "", 1105, 2, "#FlowerPentagram1::OnSquirrelDeath";
+ areamonster "017-1", 91, 37, 101, 46, "", 1003, 3, "#FlowerPentagram1::OnScorpionDeath";
+ @value = 15;
+ callfunc "QuestSagathaAnnoy";
+ @value = 0;
+ end;
+
+OnSquirrelDeath:
+ fix_mobkill(1105);
+ end;
+
+OnScorpionDeath:
+ fix_mobkill(1003);
+ end;
+
+L_MonstersAlive:
+ mes "As you get closer to the place, you feel an unnerving presence.";
+ mes "This place has recently been used to summon something! And the beings are still nearby!";
+ next;
+ mes "You should get rid of them before attempting the summoning yourself.";
+ goto L_close;
+
+L_NoFlower:
+ mes "You don't have the flower with you. Where did you put it?";
+ mes "If you can't find it, you should talk to Orum again.";
+ goto L_close;
+
+L_PlacedFirstFlower:
+ mes "You placed the first of Orum's magical flowers on this spot.";
+ mes "You can still feel the magical power shimmering around this place, waiting to be unleashed.";
+ goto L_close;
+
+L_PlacedFifthFlower:
+ mes "This is where you placed the first of Orum's magical flowers.";
+ mes "However, now that the summoning spell has been cast, everything is back to normal here.";
+ goto L_close;
+
+L_close:
+ @localMonsterCount = 0;
+ close;
+}
diff --git a/npc/017-1/flowerpentagram5.txt b/npc/017-1/flowerpentagram5.txt
new file mode 100644
index 00000000..22395d06
--- /dev/null
+++ b/npc/017-1/flowerpentagram5.txt
@@ -0,0 +1,128 @@
+
+017-1,176,59,0 script #FlowerPentagram5 NPC400,{
+ if (OrumQuest >= 31) goto L_PlacedFifthFlower;
+
+ if (OrumQuest == 30) goto L_FifthFlower;
+
+ message strcharinfo(0), "Something is odd about this place.";
+ end;
+
+L_FifthFlower:
+ mes "This has to be the spot for the last magical flower. When you place it, the pentagram will be completed.";
+ menu
+ "Place the flower.", L_PlaceTheFlower,
+ "Leave.", L_close;
+
+L_PlaceTheFlower:
+ if (isin("017-1", 175, 58, 177, 60))
+ goto L_Place;
+
+ mes "This isn't working, you're too far away.";
+ goto L_close;
+
+L_Place:
+ set @localMonsterCount,
+ mobcount("013-1", "#FlowerPentagram5::OnSquirrelDeath") +
+ mobcount("013-1", "#FlowerPentagram5::OnMushroomDeath") +
+ mobcount("013-1", "#FlowerPentagram5::OnBlueparDeath") +
+ mobcount("013-1", "#FlowerPentagram5::OnMoubooDeath") +
+ mobcount("013-1", "#FlowerPentagram5::OnScorpionDeath") +
+ mobcount("013-1", "#FlowerPentagram5::OnRScorpionDeath") +
+ mobcount("013-1", "#FlowerPentagram5::OnAScorpionDeath") +
+ mobcount("013-1", "#FlowerPentagram5::OnBScorpionDeath");
+ if (@localMonsterCount > 4)
+ goto L_MonstersAlive;
+
+ mes "Nervous about what's going to happen, you take the last of the flowers and put it into its place.";
+ next;
+ mes "Tension builds up around you, much stronger than before. You can feel it compressing your head, and a liquid warmth spreads under your nose, leaving a metallic taste on your lips.";
+ heal -5, 0;
+ next;
+ callfunc "FlowerPentagramCount";
+ if (($@Flower_Pentagram_Time > gettimetick(2) - 3600) && ($@Flower_Pentagram_Mobcount > 15))
+ goto L_TooEarly;
+ $@Flower_Pentagram_Time = gettimetick(2);
+ if (countitem("RedSummonFlower") < 1)
+ goto L_NoFlower;
+ delitem "RedSummonFlower", 1;
+
+ mes "The pressure builds to the point where you don't think you can endure it any longer; the fabric that binds your consciousness together seemingly unravels.";
+ OrumQuest = 31;
+ close2;
+ areamonster "017-1", 170, 55, 190, 75, "", 1105, 3, "#FlowerPentagram5::OnSquirrelDeath";
+ areamonster "017-1", 170, 55, 190, 75, "", 1106, 2, "#FlowerPentagram5::OnMushroomDeath";
+ areamonster "017-1", 170, 55, 190, 75, "", 1107, 3, "#FlowerPentagram5::OnBlueparDeath";
+ areamonster "017-1", 170, 55, 190, 75, "", 1104, 2, "#FlowerPentagram5::OnMoubooDeath";
+ areamonster "017-1", 170, 55, 190, 75, "", 1003, 3, "#FlowerPentagram5::OnScorpionDeath";
+ areamonster "017-1", 170, 55, 190, 75, "", 1004, 2, "#FlowerPentagram5::OnRScorpionDeath";
+ areamonster "017-1", 170, 55, 190, 75, "", 1057, 2, "#FlowerPentagram5::OnAScorpionDeath";
+ areamonster "017-1", 170, 55, 190, 75, "", 1009, 2, "#FlowerPentagram5::OnBScorpionDeath";
+ @value = 15;
+ callfunc "QuestSagathaAnnoy";
+ @value = 0;
+ donpcevent "#FlowerPentagram::OnSummon";
+ end;
+
+OnSquirrelDeath:
+ fix_mobkill(1105);
+ end;
+
+OnMushroomDeath:
+ fix_mobkill(1106);
+ end;
+
+OnBlueparDeath:
+ fix_mobkill(1107);
+ end;
+
+OnMoubooDeath:
+ fix_mobkill(1104);
+ end;
+
+OnScorpionDeath:
+ fix_mobkill(1003);
+ end;
+
+OnRScorpionDeath:
+ fix_mobkill(1004);
+ end;
+
+OnAScorpionDeath:
+ fix_mobkill(1057);
+ end;
+
+OnBScorpionDeath:
+ fix_mobkill(1009);
+ end;
+
+L_TooEarly:
+ mes "Suddenly, everything calms down again and the tension vanishes. You find yourself confused about what's going on.";
+ next;
+ mes "You pick up the flower again.";
+ next;
+ mes "Looking at the place more closely, it seems another summoning has happened just before, leaving the pathway between this world and the astral plane drained and exhausted.";
+ next;
+ mes "You should wait a while until it recharges, or go and search for the creatures that were summoned.";
+ goto L_close;
+
+L_MonstersAlive:
+ mes "As you get closer to the place, you feel an unnerving presence.";
+ mes "This place has recently been used to summon something! And the beings are still nearby!";
+ next;
+ mes "You should get rid of them before attempting the summoning yourself.";
+ goto L_close;
+
+L_NoFlower:
+ mes "You reach into your pocket, but you can't find the flower! You're so close to completing your task.";
+ mes "How could you lose the last flower? If you can't get it back, you have to tell Orum.";
+ goto L_close;
+
+L_PlacedFifthFlower:
+ mes "This is where you placed the last of Orum's magical flowers.";
+ mes "However, now that the summoning spell has been cast, everything is back to normal here.";
+ goto L_close;
+
+L_close:
+ @localMonsterCount = 0;
+ close;
+}
diff --git a/npc/017-1/mapflags.txt b/npc/017-1/mapflags.txt
new file mode 100644
index 00000000..d36d3dfe
--- /dev/null
+++ b/npc/017-1/mapflags.txt
@@ -0,0 +1 @@
+//017-1 mapflag resave 017-1,107,70
diff --git a/npc/017-2/_import.txt b/npc/017-2/_import.txt
new file mode 100644
index 00000000..e0c4d10e
--- /dev/null
+++ b/npc/017-2/_import.txt
@@ -0,0 +1,4 @@
+// Map 017-2: Theater
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/017-2/_warps.txt",
+"npc/017-2/mapflags.txt",
diff --git a/npc/017-2/_warps.txt b/npc/017-2/_warps.txt
new file mode 100644
index 00000000..bf8d2046
--- /dev/null
+++ b/npc/017-2/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 017-2: Theater warps
+017-2,26,31,0 warp #017-2_26_31 0,0,017-1,43,33
+017-2,26,21,0 warp #017-2_26_21 0,0,017-9,26,27
diff --git a/npc/017-2/mapflags.txt b/npc/017-2/mapflags.txt
new file mode 100644
index 00000000..200b35f1
--- /dev/null
+++ b/npc/017-2/mapflags.txt
@@ -0,0 +1 @@
+//017-2 mapflag resave 017-1,107,70
diff --git a/npc/017-3/_import.txt b/npc/017-3/_import.txt
new file mode 100644
index 00000000..4d7f2c9e
--- /dev/null
+++ b/npc/017-3/_import.txt
@@ -0,0 +1,4 @@
+// Map 017-3: Woodland Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/017-3/_warps.txt",
+"npc/017-3/mapflags.txt",
diff --git a/npc/017-3/_warps.txt b/npc/017-3/_warps.txt
new file mode 100644
index 00000000..53eac672
--- /dev/null
+++ b/npc/017-3/_warps.txt
@@ -0,0 +1,11 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 017-3: Woodland Cave warps
+017-3,69,69,0 warp #017-3_69_69 0,0,017-1,76,32
+017-3,83,53,0 warp #017-3_83_53 0,0,017-1,98,21
+017-3,76,64,0 warp #017-3_76_64 0,0,017-1,98,30
+017-3,63,26,0 warp #017-3_63_26 0,0,017-4,52,24
+017-3,29,48,0 warp #017-3_29_48 0,0,017-4,30,48
+017-3,69,52,0 warp #017-3_69_52 0,0,017-4,91,27
+017-3,58,60,0 warp #017-3_58_60 0,0,017-4,83,40
+017-3,32,70,0 warp #017-3_32_70 1,0,017-4,123,27
+017-3,82,77,0 warp #017-3_82_77 2,0,017-4,166,27
diff --git a/npc/017-3/mapflags.txt b/npc/017-3/mapflags.txt
new file mode 100644
index 00000000..5fa1558b
--- /dev/null
+++ b/npc/017-3/mapflags.txt
@@ -0,0 +1 @@
+//017-3 mapflag resave 017-1,107,70
diff --git a/npc/017-4/_import.txt b/npc/017-4/_import.txt
new file mode 100644
index 00000000..42524ecf
--- /dev/null
+++ b/npc/017-4/_import.txt
@@ -0,0 +1,7 @@
+// Map 017-4: Hideout
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/017-4/_warps.txt",
+"npc/017-4/guardingspirit.txt",
+"npc/017-4/mapflags.txt",
+"npc/017-4/orum.txt",
+"npc/017-4/waric.txt",
diff --git a/npc/017-4/_warps.txt b/npc/017-4/_warps.txt
new file mode 100644
index 00000000..28023c3d
--- /dev/null
+++ b/npc/017-4/_warps.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 017-4: Hideout warps
+017-4,201,25,0 warp #017-4_201_25 0,0,017-4,173,46
+017-4,91,26,0 warp #017-4_91_26 0,0,017-3,69,51
+017-4,123,26,0 warp #017-4_123_26 0,0,017-3,32,69
+017-4,166,26,0 warp #017-4_166_26 0,0,017-3,82,76
+017-4,30,47,0 warp #017-4_30_47 0,0,017-3,29,47
+017-4,52,25,0 warp #017-4_52_25 0,0,017-3,63,27
+017-4,83,41,0 warp #017-4_83_41 0,0,017-3,58,61
diff --git a/npc/017-4/guardingspirit.txt b/npc/017-4/guardingspirit.txt
new file mode 100644
index 00000000..0e5cb6b9
--- /dev/null
+++ b/npc/017-4/guardingspirit.txt
@@ -0,0 +1,95 @@
+
+017-4,173,47,0 script #Guarding Spirit#_M NPC204,0,0,{
+ goto L_Talk;
+
+L_Talk:
+ if (OrumQuest == 35)
+ goto L_Block;
+ if (OrumQuest < 14)
+ goto L_Block;
+ if (OrumQuest > 14)
+ goto L_Chat;
+
+ mes "[Guarding Spirit]";
+ mes "\"Hold there! My master does not wish to be disturbed! I cannot let you enter.\"";
+ menu
+ "Who is your master?", L_Master,
+ "But I have important things I need to discuss with your master!", L_Helped,
+ "Oh, so he's finally back?", L_Back,
+ "Okay, okay.", L_close;
+
+L_Back:
+ mes "[Guarding Spirit]";
+ mes "\"Yes, he was gone for quite a while. When he arrived home, he had a rather frightening looking guy with him.\"";
+ next;
+ mes "\"Ahem, I mean, yes Mortal. He came back to his residence and does not wish to interact with those below his status. Leave!\"";
+ goto L_close;
+
+L_Master:
+ mes "[Guarding Spirit]";
+ mes "\"He is a powerful wizard. He can force the very elements to obey his will! He regularly communes with demons and higher beings from the astral plane, such as myself.\"";
+ next;
+ mes "\"Mankind knows his name as 'Orum'.\"";
+ menu
+ "Hey, I helped him out some while ago!", L_Helped,
+ "Orum? That guy who feels weary due to some transmutation spells?", L_Disrespectful,
+ "Then I better respect his wish and leave!", L_close;
+
+L_Disrespectful:
+ mes "[Guarding Spirit]";
+ mes "\"What are you saying? Who are you to mock my Master?! You will regret that!\"";
+ Hp = 1 + Hp/5;
+ goto L_close;
+
+L_Helped:
+ mes "[Guarding Spirit]";
+ mes "\"Really? That sounds implausible to me.\"";
+ next;
+ mes "\"Why would my master mess around with such a puny mortal as yourself?\"";
+ menu
+ "I'd like to offer him my humble services...", L_Pass,
+ "Listen, he'll get angry if you don't let me pass. ", L_Pass,
+ "You're right, I was just bluffing.", L_close;
+
+L_Pass:
+ mes "[Guarding Spirit]";
+ mes "\"Alright, I will let you pass.\"";
+ next;
+ mes "\"Remember that when you speak with him, do so with respect for someone befitting his status.\"";
+ OrumQuest = 15;
+ warp "017-4", 201, 26;
+ goto L_close;
+
+L_Block:
+ mes "[Guarding Spirit]";
+ mes "\"Stop, mortal! I cannot let you pass!\"";
+ menu
+ "What? Who are you?", L_Next,
+ "Why?", L_Next,
+ "Ok...", L_close;
+
+L_Next:
+ mes "[Guarding Spirit]";
+ mes "\"My master summoned me for the sole purpose of preventing anyone else from entering his refuge.";
+ mes "I'll stand guard and protect it with all my power!\"";
+ next;
+ mes "\"If I fail, he will punish me. I do not like being punished by his magic, it hurts.\"";
+ goto L_close;
+
+L_Chat:
+ mes "[Guarding Spirit]";
+ mes "Oh, it's you. You may enter.";
+ // TODO: more chat, maybe depending on the quest progress?
+ goto L_close;
+
+L_close:
+ close;
+
+OnTouch:
+ if (OrumQuest < 15)
+ goto L_Talk;
+ if (OrumQuest == 35)
+ goto L_Block;
+ warp "017-4", 201, 26;
+ end;
+}
diff --git a/npc/017-4/mapflags.txt b/npc/017-4/mapflags.txt
new file mode 100644
index 00000000..ba9ebbf5
--- /dev/null
+++ b/npc/017-4/mapflags.txt
@@ -0,0 +1 @@
+//017-4 mapflag resave 017-1,107,70
diff --git a/npc/017-4/orum.txt b/npc/017-4/orum.txt
new file mode 100644
index 00000000..771b3469
--- /dev/null
+++ b/npc/017-4/orum.txt
@@ -0,0 +1,821 @@
+
+017-4,211,32,0 script Orum NPC158,{
+ // first flower
+ @AMOUNT_SMALLMUSHROOM = 5;
+ @AMOUNT_ASH = 5;
+ @RECOMPENSATION_1 = 5000;
+ // second flower
+ @AMOUNT_PINKPETAL = 5;
+ @AMOUNT_STINGER = 5;
+ @RECOMPENSATION_2 = 10000;
+ // third flower
+ @AMOUNT_WHITEFUR = 5;
+ @AMOUNT_REDSTINGER = 5;
+ @RECOMPENSATION_3 = 20000;
+ // fourth flower
+ @AMOUNT_HARDSPIKE = 5;
+ @AMOUNT_ANGRYSTINGER = 5;
+ @RECOMPENSATION_4 = 40000;
+ // fifth flower
+ @AMOUNT_ACORN = 20;
+ @AMOUNT_PEARL = 3;
+ @AMOUNT_BLACKSTINGER = 5;
+ @RECOMPENSATION_5 = 80000;
+
+ @REWARD_MONEY = 100000;
+ @Reward_Exp = 100000;
+
+ if (OrumQuest > 31) goto L_Done;
+
+ if (OrumQuest == 31) goto L_PlacedFifthFlower;
+ if (OrumQuest == 30) goto L_PlaceFifthFlower;
+ if (OrumQuest == 29) goto L_FailedFifthFlower;
+ if (OrumQuest == 28) goto L_FifthFlower;
+
+ if (OrumQuest == 27) goto L_PlacedFourthFlower;
+ if (OrumQuest == 26) goto L_PlaceFourthFlower;
+ if (OrumQuest == 25) goto L_FourthFlower;
+
+ if (OrumQuest == 24) goto L_PlacedThirdFlower;
+ if (OrumQuest == 23) goto L_PlaceThirdFlower;
+ if (OrumQuest == 22) goto L_ThirdFlower;
+
+ if (OrumQuest == 21) goto L_PlacedSecondFlower;
+ if (OrumQuest == 20) goto L_PlaceSecondFlower;
+ if (OrumQuest == 19) goto L_SecondFlower;
+
+ if (OrumQuest == 18) goto L_PlacedFirstFlower;
+ if (OrumQuest == 17) goto L_PlaceFirstFlower;
+ if (OrumQuest == 16) goto L_FirstFlower;
+
+ if (OrumQuest == 15) goto L_InitialTalk;
+
+ goto L_Banish;
+
+L_InitialTalk: // 15: Persuaded the Guarding Spirit to let you into the cave
+ mes "[Orum]";
+ mes "\"I... My Guarding Spirit... You... What...\"";
+ mes "[Waric]";
+ mes "\"Pull yourself together!\"";
+ next;
+ mes "[Orum]";
+ mes "\"Y-yes, master.\"";
+ mes "He turns to you.";
+ mes "\"I told you not to follow us! Are you so eager to die?\"";
+ menu
+ "I'm here to offer my services...", L_Next,
+ "Ha! You thought you could hide from me?", L_Banish,
+ "Keep calm, I want to work with you.", L_Next,
+ "D-d-die?!", L_Banish;
+
+L_Next:
+ mes "[Orum]";
+ mes "\"You want to help us?\"";
+ mes "Waric raises his eyebrows.";
+ next;
+ mes "[Orum]";
+ mes "\"I don't think that's a good idea.\"";
+ menu
+ "You won't know until you try.", L_Next1,
+ "You have no choice, I've found your hideout!", L_Banish;
+
+L_Next1:
+ mes "[Orum]";
+ mes "\"Well, why not? Here is a simple enough task to prove you're serious.";
+ mes "Bring me " + @AMOUNT_SMALLMUSHROOM + " Small Mushrooms, " + @AMOUNT_ASH + " Piles of Ash and one Orange Tulip.\"";
+
+ OrumQuest = 16;
+ menu
+ "Sure!", L_close,
+ "Why do you need that?", L_Next2;
+
+L_Next2:
+ mes "[Orum]";
+ mes "\"Don't ask stupid questions! Do as you're told.\"";
+ mes "...";
+ mes "\"Those things are ingredients for a magical artifact. You don't need to know more at the moment.\"";
+ goto L_close;
+
+L_Banish:
+ mes "[Orum]";
+ mes "\"This will be the last mistake you did...\"";
+ mes "He starts mumbling under his breath and you suddenly feel weirdly weightless. Your vision fades...";
+ mes "The last thing you hear is Waric shouting something about untalented apprentices.";
+ Hp = 1 + rand(5);
+ warp "017-1", 0, 0;
+ goto L_close;
+
+L_FirstFlower: // 16: Got task to bring materials for first magical flower
+ mes "[Orum]";
+ mes "\"So? Where are the " + @AMOUNT_SMALLMUSHROOM + " Small Mushrooms, " + @AMOUNT_ASH + " Piles of Ash and Orange Tulip you should've brought?\"";
+ menu
+ "I have everything you want!", L_Next3,
+ "I don't have it yet.", L_close;
+
+L_Next3:
+ if ((countitem("SmallMushroom") < @AMOUNT_SMALLMUSHROOM)
+ || (countitem("PileOfAsh") < @AMOUNT_ASH)
+ || (countitem("OrangeTulip") < 1))
+ goto L_NoItem;
+
+ delitem "SmallMushroom", @AMOUNT_SMALLMUSHROOM;
+ delitem "PileOfAsh", @AMOUNT_SMALLMUSHROOM;
+ delitem "OrangeTulip", 1;
+ getitem "OrangeSummonFlower", 1;
+ OrumQuest = 17;
+
+ mes "Orum takes the items and starts crushing them, using a very old-looking mortar and pestle. As they turn into a fine powder, he mixes some of it together in the cauldron and finally dips the tulip into it, mumbling enchantements. The tulip changes its appearance. Then he hands it over to you.";
+ mes "[Orum]";
+ mes "\"Phew, done. Now I feel exhausted. You need to place it at its destination.\"";
+ next;
+ goto L_WayFirstFlower;
+
+L_WayFirstFlower:
+ mes "\"We prepared a place for this in the forest outside the caves. When you leave the cave, go a couple of steps to the east and you'll find a spot of grass with flowers on a small hill. You have to place it there, right in the middle.\"";
+ goto L_close;
+
+L_PlaceFirstFlower: // 17: Got task to place the first magical flower
+ mes "[Orum]";
+ mes "\"Go ahead and place the first magical flower.\"";
+ menu
+ "Okay, I'll do that.", L_close,
+ "Could you explain where to place it, one more time?", L_WayFirstFlower,
+ "I... I lost it.", L_Next4;
+
+L_Next4:
+ mes "[Orum]";
+ mes "\"What?! I can't believe this! How could you handle a powerful magical artifact in such a careless way?\"";
+ next;
+ mes "\"This behaviour shouldn't remain unpunished. Pay a recompensation fee of " + @RECOMPENSATION_1 + " GP, and I'm going to allow you to continue helping us. So?\"";
+ menu
+ "Okay.", L_Next5,
+ "No way, that's too much!", L_NoRecompensation;
+
+L_Next5:
+ if (Zeny < @RECOMPENSATION_1)
+ goto L_NoMoney;
+ Zeny = Zeny - @RECOMPENSATION_1;
+ OrumQuest = 16;
+
+ mes "[Orum]";
+ mes "\"Very well. Now bring me " + @AMOUNT_SMALLMUSHROOM + " Small Mushrooms, " + @AMOUNT_ASH + " Piles of Ash and one Orange Tulip again, so we can start over.\"";
+ goto L_close;
+
+L_PlacedFirstFlower: // 18: Placed first magical flower
+ mes "[Orum]";
+ mes "\"I felt the eruption of magical power when you placed it! Wonderful! Let's start with the next one right now.\"";
+ menu
+ "Okay, what should I do now?", L_Next6,
+ "Weird monsters appeared when I placed it!", L_AskMonsters;
+
+L_Next6:
+ OrumQuest = 19;
+ goto L_SecondFlower;
+
+L_AskMonsters:
+ mes "[Orum]";
+ mes "\"Oh, right. Well, that was to be expected, some of the power seeped out when you placed it. I hope those monsters didn't harm you.";
+ mes "However, we should continue.\"";
+ OrumQuest = 19;
+ next;
+ goto L_SecondFlower;
+
+L_SecondFlower: // 19: Got task to bring materials for second magical flower
+ mes "[Orum]";
+ mes "\"Bring me " + @AMOUNT_PINKPETAL + " Pink Petals, " + @AMOUNT_STINGER + " Scorpion Stingers and one Pink Tulip.\"";
+ menu
+ "I have it.", L_Next7,
+ "All right, I'll get it.", L_close,
+ "What's the purpose of this?", L_AskPurpose;
+
+L_Next7:
+ if ((countitem("PinkPetal") < @AMOUNT_PINKPETAL)
+ || (countitem("ScorpionStinger") < @AMOUNT_STINGER)
+ || (countitem("PinkTulip") < 1))
+ goto L_NoItem;
+
+ delitem "PinkPetal", @AMOUNT_PINKPETAL;
+ delitem "ScorpionStinger", @AMOUNT_STINGER;
+ delitem "PinkTulip", 1;
+ getitem "PurpleSummonFlower", 1;
+ OrumQuest = 20;
+
+ mes "Orum starts to work on the materials you've gathered, in the same manner he did the first time. Suddenly something from the mortar gets on his hand and it makes a nasty sizzling noise. He yells in pain, clutching his hand to his chest. After cleaning his hand he continues. In the end he gives you another magical flower while rubbing his hand.";
+ next;
+ mes "[Orum]";
+ mes "\"Ouch, it still hurts. I need some time to recover. In the meantime, go and place the flower.\"";
+ next;
+ goto L_WaySecondFlower;
+
+L_WaySecondFlower:
+ mes "[Orum]";
+ mes "\"The next spot is in the Woodland Hills. When you leave our caves, go south until you come out of the forest. Then walk west, past the hut of that old man.";
+ mes "The spot where you have to place it is on higher ground, so you'll have to find a way through the caves to reach it.\"";
+ goto L_close;
+
+L_AskPurpose:
+ mes "[Orum]";
+ mes "\"Purpose? Well... We're building a pentagram.\"";
+ goto L_close;
+
+L_PlaceSecondFlower: // 20: Got task to place the second magical flower
+ mes "[Orum]";
+ mes "\"Go and place the second magical flower.\"";
+ menu
+ "I'm on my way.", L_close,
+ "Where do I have to put it again?", L_WaySecondFlower,
+ "Sorry, I've lost it.", L_Next8;
+
+L_Next8:
+ mes "[Orum]";
+ mes "\"What?! You incompetent dunderhead! I got hurt while creating this powerful magical artifact and you managed to lose it!?\"";
+ next;
+ mes "\"This behaviour shouldn't remain unpunished. Pay a recompensation fee of " + @RECOMPENSATION_2 + " GP, and I'm going to allow you to continue helping us. So?\"";
+ menu
+ "Ok.", L_Next9,
+ "No way, that's too much!", L_NoRecompensation;
+
+L_Next9:
+ if (Zeny < @RECOMPENSATION_2)
+ goto L_NoMoney;
+ Zeny = Zeny - @RECOMPENSATION_2;
+ OrumQuest = 19;
+
+ mes "[Orum]";
+ mes "\"Okay, now that this is settled, bring me " + @AMOUNT_PINKPETAL + " Pink Petals, " + @AMOUNT_STINGER + " Scorpion Stingers and one Pink Tulip again.\"";
+ goto L_close;
+
+L_PlacedSecondFlower: // 21: Placed second magical flower
+ mes "[Orum]";
+ mes "\"Very good. You placed the second flower, right? I could feel it here.";
+ mes "Everything is going very well.\"";
+ mes "Orum grins contently.";
+ menu
+ "What do you need next?", L_Next10,
+ "How can we build a pentagram by randomly planting flowers?", L_AskPentagram;
+
+L_Next10:
+ OrumQuest = 22;
+ goto L_ThirdFlower;
+
+L_AskPentagram:
+ mes "[Orum]";
+ mes "\"Randomly? The spots for the flowers have been very carefully chosen! You see, it's going to be a very LARGE pentagram.\"";
+ OrumQuest = 22;
+ next;
+ goto L_ThirdFlower;
+
+L_ThirdFlower: // 22: Got task to bring materials for third magical flower
+ mes "[Orum]";
+ mes "\"Now we need " + @AMOUNT_WHITEFUR + " White Furs, " + @AMOUNT_REDSTINGER + " Red Scorpion Stingers and one White Tulip.\"";
+ menu
+ "I got everything you want.", L_Next11,
+ "I'm still trying to gather what you need.", L_close,
+ "And what is the pentagram going to do?", L_AskPentaEffect;
+
+L_Next11:
+ if ((countitem("WhiteFur") < @AMOUNT_WHITEFUR)
+ || (countitem("RedScorpionStinger") < @AMOUNT_REDSTINGER)
+ || (countitem("WhiteTulip") < 1))
+ goto L_NoItem;
+
+ delitem "WhiteFur", @AMOUNT_WHITEFUR;
+ delitem "RedScorpionStinger", @AMOUNT_REDSTINGER;
+ delitem "WhiteTulip", 1;
+
+ mes "Orum takes the materials out of your hands and starts preparing them.";
+ mes "[Orum]";
+ mes "\"This time you're going to help me. It's safer when I don't have to handle all of it myself. Okay, listen.\"";
+ next;
+ mes "\"Here is the rheological additive that you have to pour on it when the reaction between the powders is on its peak level. I'm going to slowly add a little more of the powder, which will make it react faster. Got it?\"";
+ menu
+ "Rheo-what?", L_Next12,
+ "Okay, let's try.", L_Next12,
+ "I'm not sure I understand...", L_Next12;
+
+L_Next12:
+ mes "[Orum]";
+ mes "\"Well, just pour when it's bubbling really hard.\"";
+ mes "He starts to mix the powders together in the caldron.";
+ next;
+
+ setarray @bubblingLevels$, "calmly", "slightly", "noticeably", "heavily";
+ @bubblingLevel = rand(10);
+ goto L_EasyMinigame;
+
+L_EasyMinigame:
+ mes "The mixture is bubbling " + @bubblingLevels$[@bubblingLevel/7] + ". What do you want to do?";
+ menu
+ "Wait.", L_Next13,
+ "Pour.", L_EasyCheck;
+
+L_Next13:
+ if (@menu == 1)
+ @bubblingLevel = @bubblingLevel + rand(1,10);
+ if (@bubblingLevel > 27)
+ goto L_EasyTooHigh;
+ mes "Orum adds some more powder.";
+ goto L_EasyMinigame;
+
+L_EasyCheck:
+ @bubblingLevel = @bubblingLevel + 3 - rand(7);
+ if (@bubblingLevel < 21)
+ goto L_EasyTooEarly;
+ if (@bubblingLevel > 27)
+ goto L_EasyTooLate;
+ goto L_EasySuccess;
+
+L_EasyTooLate:
+ mes "You are about to pour in the additive, but just before you do it...";
+ next;
+ goto L_EasyTooHigh;
+
+L_EasyTooHigh:
+ mes "Suddenly the mixture glows brightly. Then it calms down very quickly and turns into a weird greyish color.";
+ mes "[Orum]";
+ mes "\"Are you sleeping? Now it's ruined. You waited too long.\"";
+ next;
+ mes "\"You have to collect all the ingredients again, now.\"";
+ goto L_close;
+
+L_EasyTooEarly:
+ mes "You pour the liquid Orum gave you into the mixture.";
+ mes "It stops bubbling and gets thicker... and thicker... and thicker...";
+ mes "[Orum]";
+ mes "\"No! That was too early. Look at what you've done! It's hard as a rock now.\"";
+ next;
+ mes "\"How annoying! You have to gather new ingredients.\"";
+ goto L_close;
+
+L_EasySuccess:
+ getitem "WhiteSummonFlower", 1;
+ OrumQuest = 23;
+
+ mes "As you pour the liquid into the bubbling mixture, it calms down and becomes viscous. Orum takes the tulip and dips it into the mixture.";
+ mes "[Orum]";
+ mes "\"Excellent! Here it is.\"";
+ next;
+ goto L_WayThirdFlower;
+
+L_WayThirdFlower:
+ mes "[Orum]";
+ mes "\"This flower needs to be placed on top of the Hurnscald mines. It might be a bit hard to reach, but I'm sure you'll do fine.\"";
+ goto L_close;
+
+L_AskPentaEffect:
+ mes "[Orum]";
+ mes "\"Don't you know anything about Astral magic? A pentagram is used for summoning, of course.\"";
+ goto L_close;
+
+L_PlaceThirdFlower: // 23: Completed easy minigame and got task to place the third magical flower
+ mes "[Orum]";
+ mes "\"What are you waiting for? Place the third flower where it's supposed to go.\"";
+ menu
+ "Okay.", L_close,
+ "I forgot where to put it.", L_WayThirdFlower,
+ "Unfortunately... I don't have it anymore.", L_Next14;
+
+L_Next14:
+ mes "Orum sighs.";
+ mes "[Orum]";
+ mes "\"I hope this is a joke. No, you're serious? What impudence! This was a valuable and powerful magical artifact.\"";
+ next;
+ mes "\"This behaviour shouldn't remain unpunished. Pay a recompensation fee of " + @RECOMPENSATION_3 + " GP, and I'm going to allow you to continue helping us. So?\"";
+ menu
+ "Here it is.", L_Next15,
+ "That's too much!", L_NoRecompensation;
+
+L_Next15:
+ if (Zeny < @RECOMPENSATION_3)
+ goto L_NoMoney;
+ Zeny = Zeny - @RECOMPENSATION_3;
+ OrumQuest = 22;
+
+ mes "[Orum]";
+ mes "\"Once again we need " + @AMOUNT_WHITEFUR + " White Furs, " + @AMOUNT_REDSTINGER + " Red Scorpion Stingers and one White Tulip.\"";
+ goto L_close;
+
+L_PlacedThirdFlower: // 24: Placed third magical flower
+ mes "[Orum]";
+ mes "\"We're making very good progress. Now that you've placed the third magical flower, only two more are left.";
+ mes "But we shouldn't become careless now, with each flower the procedure gets more difficult.\"";
+ menu
+ "Understood! What's next?", L_Next16,
+ "What are we going to summon with that pentagram?", L_AskSummon;
+
+L_Next16:
+ OrumQuest = 25;
+ goto L_FourthFlower;
+
+L_AskSummon:
+ mes "[Orum]";
+ mes "\"Beings from the astral plane, of course. Some of them are already coming through the rift when you place the flowers.";
+ mes "But that is NOTHING compared to what will happen when the pentagram is complete! Hahaha!\"";
+ OrumQuest = 25;
+ next;
+ goto L_FourthFlower;
+
+L_FourthFlower: // 25: Got task to bring materials for fourth magical flower
+ mes "[Orum]";
+ mes "\"Now we need " + @AMOUNT_HARDSPIKE + " Hard Spikes, " + @AMOUNT_ANGRYSTINGER + " Angry Scorpion Stingers and one Yellow Rose.\"";
+ menu
+ "I managed to get everything.", L_Next17,
+ "I'll go and gather the items.", L_close,
+ "Won't it be dangerous to summon so many aggressive monsters?", L_AskDanger;
+
+L_Next17:
+ if ((countitem("HardSpike") < @AMOUNT_HARDSPIKE)
+ || (countitem("AngryScorpionStinger") < @AMOUNT_ANGRYSTINGER)
+ || (countitem("YellowRose") < 1))
+ goto L_NoItem;
+
+ delitem "HardSpike", @AMOUNT_HARDSPIKE;
+ delitem "AngryScorpionStinger", @AMOUNT_ANGRYSTINGER;
+ delitem "YellowRose", 1;
+
+ mes "Orum takes the materials and starts to pulverize them once again. You notice that his movements are slower this time and he seems to be really concentrating.";
+ mes "[Orum]";
+ mes "\"Okay. We're going to do it together again, but this time we'll switch the roles. You're going to mix the powders and I'm going to pour the rheological additive into the mixture.\"";
+ next;
+ mes "\"This is because... ahm, because you will learn something from it, yes.";
+ mes "But remember to handle the powders carefuly, they're highly vitriolic.\"";
+ next;
+ mes "\"You have two powders, one of them will make the mixture turn yellow, the other one will make it turn red.";
+ mes "You need to make it a clear, strong orange and hold that for a moment. That way I'll have enough time to pour the rheological additive.\"";
+ menu
+ "Let's try it.", L_Next18,
+ "I'm not sure what to do...", L_Next18;
+
+L_Next18:
+ mes "[Orum]";
+ mes "\"Just use the red powder when it's too bright, and the yellow powder when it's too dark. And be careful how much powder you use. The mixture will randomly fluctuate a bit, too, so keep that in mind.\"";
+ mes "He mixes together a few of each ingredients and then hands you two small bowls with the powders.";
+ next;
+
+ setarray @colorLevels$, "red", "light red", "dark orange", "orange", "light orange", "dark yellow", "yellow";
+ @colorLevel = rand(49);
+ @goodColor = 0;
+ goto L_HardMinigame;
+
+L_HardMinigame:
+ mes "The color of the mixture is " + @colorLevels$[@colorLevel/7] + ". What do you want to do?";
+ menu
+ "Add a small portion of Red Powder.", L_MenuItems,
+ "Add a large portion of Red Powder.", L_MenuItems,
+ "Add a small portion of Yellow Powder.", L_MenuItems,
+ "Add a large portion of Yellow Powder.", L_MenuItems;
+
+L_MenuItems:
+ if (@menu == 1)
+ @colorLevel = @colorLevel - rand(1,3);
+ if (@menu == 2)
+ @colorLevel = @colorLevel - rand(6,8);
+ if (@menu == 3)
+ @colorLevel = @colorLevel + rand(1,3);
+ if (@menu == 4)
+ @colorLevel = @colorLevel + rand(6,8);
+
+ if (@colorLevel > 48)
+ goto L_TooYellow;
+ if (@colorLevel < 0)
+ goto L_TooRed;
+
+ mes "Due to your addition, the mixture is now " + @colorLevels$[@colorLevel/7] + ".";
+
+ if ((@colorLevel > 20) && (@colorLevel < 28))
+ goto L_Good;
+ goto L_HardRandom;
+
+L_HardRandom:
+ @colorLevel = @colorLevel + 3 - rand(6);
+ mes "The mixture sizzles and bubbles.";
+
+ if ((@colorLevel < 21) || (@colorLevel > 27))
+ @goodColor = 0;
+
+ if (@colorLevel > 48)
+ goto L_TooYellow;
+ if (@colorLevel < 0)
+ goto L_TooRed;
+ next;
+ goto L_HardMinigame;
+
+L_Good:
+ @goodColor = @goodColor + 1;
+ if (@goodColor == 3)
+ goto L_HardSuccess;
+ mes "Hold it like this for a moment!";
+ next;
+ goto L_HardRandom;
+
+L_TooYellow:
+ next;
+ mes "The mixture can't get any more yellow. The bubbling increases and most of the liquid quickly turns into steam that makes you cough.";
+ goto L_HardTooExtreme;
+L_TooRed:
+ next;
+ mes "The mixture can't get any more red. Suddenly, the bubbling gets even more violent. It seems to be corroding the cauldron! Orum hastily pours the rheological additive on it to make it stop.";
+ goto L_HardTooExtreme;
+
+L_HardTooExtreme:
+ mes "[Orum]";
+ mes "\"What are you doing? It is supposed to turn orange. You have to use both powders for that!\"";
+ next;
+ mes "\"This is ruined now. Go and collect new ingredients.\"";
+ goto L_close;
+
+L_HardSuccess:
+ getitem "YellowSummonFlower", 1;
+ OrumQuest = 26;
+
+ mes "Orum pours the rheological additive on the mixture and then dips the flower into the cauldron.";
+ mes "[Orum]";
+ mes "\"Excellent! Wonderful. Here's the flower. I need to clean up the cauldron, so in the meantime go place the flower.\"";
+ next;
+ goto L_WayFourthFlower;
+
+L_WayFourthFlower:
+ mes "[Orum]";
+ mes "\"To find the place: go south after leaving our cave, and then follow the path to the east. Watch out for that nasty forest witch living there, she doesn't like humans.";
+ mes "You have to place the flower on a small island in front of the coast. To get there, you have to find a way through the caves that connect it with the mainland.\"";
+ goto L_close;
+
+L_AskDanger:
+ mes "[Orum]";
+ mes "\"Dangerous? Well, not really, since Waric and I are going to stay here in the cave.\"";
+ menu
+ "That's... very comforting.", L_Next19,
+ "And what about everyone outside? Like me!?", L_Next19;
+
+L_Next19:
+ mes "[Orum]";
+ mes "\"Umm, well. You won't be in the center of it where the monsters will appear, of course.";
+ mes "And you can handle a few of them, right?\"";
+ goto L_close;
+
+L_PlaceFourthFlower: // 26: Completed difficult minigame and got task to place the fourth magical flower
+ mes "[Orum]";
+ mes "\"I can't wait! Everything is going so well! Why are you wasting time? Go and place the fourth magical flower!\"";
+ menu
+ "All right.", L_close,
+ "Please describe where to place it again.", L_WayFourthFlower,
+ "The magical flower... I lost it.", L_Next20;
+
+L_Next20:
+ mes "Orum shakes his head in disbelief.";
+ mes "[Orum]";
+ mes "\"Lost it? Unbelievable! How could you lose it?\"";
+ next;
+ mes "\"This behaviour shouldn't remain unpunished. Pay a recompensation fee of " + @RECOMPENSATION_4 + " GP, and I will to allow you to continue helping us. So?\"";
+ menu
+ "Here it is.", L_Next21,
+ "That's too expensive!", L_NoRecompensation;
+
+L_Next21:
+ if (Zeny < @RECOMPENSATION_4)
+ goto L_NoMoney;
+ Zeny = Zeny - @RECOMPENSATION_4;
+ OrumQuest = 25;
+
+ mes "[Orum]";
+ mes "\"Now bring " + @AMOUNT_HARDSPIKE + " Hard Spikes, " + @AMOUNT_ANGRYSTINGER + " Angry Scorpion Stingers and one Yellow Rose again.\"";
+ goto L_close;
+
+L_PlacedFourthFlower: // 27: Placed fourth magical flower
+ mes "[Orum]";
+ mes "\"Oh, almost! Only the last flower needs to be placed. Don't lose your focus now!";
+ mes "This last flower is the most complicated one. Pay attention.\"";
+ menu
+ "Tell me what you need!", L_Next22,
+ "Why do you want to summon so many beings?", L_AskReason;
+
+L_Next22:
+ OrumQuest = 28;
+ goto L_FifthFlower;
+
+L_AskReason:
+ mes "[Orum]";
+ mes "\"Let's say... it's about paying back an old debt.";
+ mes "I'll give you a hint: think about what's in the center of the pentagram. Or rather who is.\"";
+ next;
+ mes "\"Anyway, let's get back to business!\"";
+ OrumQuest = 28;
+ next;
+ goto L_FifthFlower;
+
+L_FifthFlower: // 28: Got task to bring materials for fifth magical flower
+ mes "[Orum]";
+ mes "\"For the last flower we need " + @AMOUNT_ACORN + " Acorns, " + @AMOUNT_PEARL + " Pearls, " + @AMOUNT_BLACKSTINGER + " Black Scorpion Stingers and 1 Red Rose.\"";
+ menu
+ "Here it is.", L_Next23,
+ "Understood.", L_close,
+ "Sagatha is the target of the spell, right?", L_AskSagatha;
+
+L_Next23:
+ if ((countitem("Acorn") < @AMOUNT_ACORN)
+ || (countitem("Pearl") < @AMOUNT_PEARL)
+ || (countitem("BlackScorpionStinger") < @AMOUNT_BLACKSTINGER)
+ || (countitem("RedRose") < 1))
+ goto L_NoItem;
+
+ delitem "Acorn", @AMOUNT_ACORN;
+ delitem "Pearl", @AMOUNT_PEARL;
+ delitem "BlackScorpionStinger", @AMOUNT_BLACKSTINGER;
+ delitem "RedRose", 1;
+
+ mes "Orum takes the materials and draws a deep breath. He then begins to prepare them similarly to the materials for the other flowers.";
+ mes "[Orum]";
+ mes "\"Well, basically, we need to do the same as with the other flowers. We need to be careful, however, because this mixture is a bit more delicate. Would you like to do the add the rheological additive or mix the powders?\"";
+ menu
+ "I'll handle the additive.", L_Additive,
+ "Let me mix the powders.", L_Pulvers;
+
+L_Additive:
+ mes "Orum agrees and starts mixing the powders. You're ready to pour in the additive once the mixture reached a high level of bubbling.";
+ next;
+ mes "The next dash of powder Orum adds causes the mixture to sputter and splash. Some of the hot liquid lands on the back of your hand!";
+ heal -5, 0;
+ menu
+ "Ouch!",L_Next24,
+ "Aah!", L_Next24,
+ "Urgh!", L_Next24;
+
+L_Next24:
+ mes "As you step back from the cauldron you jostle Orum, and the Red Rose falls out of his pocket into the cauldron.";
+ goto L_FlowerHat;
+
+L_Pulvers:
+ mes "You start mixing the powders together. It bubbles much more than during the previous brewing.";
+ next;
+ mes "The next dash of powder you add causes the mixture to bubble and splash. Some of the hot liquid lands on Orum's hand! He screams and jumps back while waving his hand around.";
+ next;
+ mes "This causes the flower to fall out of his pocket, landing right into the cauldron.";
+ next;
+ mes "Orum stares at it.";
+ goto L_FlowerHat;
+
+L_FlowerHat:
+ mes "[Orum]";
+ mes "\"Fool! See what you've done? It's ruined!\"";
+ next;
+ mes "\"Though, we still have enough of the materials left to start over. Here, take this garbage out and get a new Red Rose!\"";
+ getitem "RedRoseHat", 1;
+ OrumQuest = 29;
+ goto L_close;
+
+L_AskSagatha:
+ mes "[Orum]";
+ mes "\"Ah, clever. Yes, you're right.";
+ mes "That self-righteous forest witch thinks she's better than other people. She thinks that gives her the right to stick her nose into other mages' affairs.\"";
+ next;
+ mes "\"What's even worse, she thinks she can punish other mages for actions she considers wrong - \"";
+ mes "[Waric]";
+ mes "\"Orum! You do not need to get into the details of this.\"";
+ next;
+ mes "[Orum]";
+ mes "\"Oh, heh, of course. However, we'll teach her a lesson.";
+ mes "You are going to help us.\"";
+ goto L_close;
+
+L_FailedFifthFlower: // 29: Failed unbeatable minigame and got the flower hat
+ mes "[Orum]";
+ mes "\"Did you get a new Red Rose, so we can create the last magical flower?\"";
+ menu
+ "Yes.", L_Next25,
+ "Not yet.", L_close,
+ "Will those monsters hurt Sagatha? Or kill her?", L_AskHurtSagatha;
+
+L_Next25:
+ if (countitem("RedRose") < 1)
+ goto L_NoItem;
+
+ delitem "RedRose", 1;
+ mes "[Orum]";
+ mes "\"Finally! This time I'll do it all by myself. You and your clumsy fingers need to take a step back so it won't get ruined again.\"";
+ next;
+ mes "You watch while Orum carefully prepares the last magic flower.";
+ next;
+ getitem "RedSummonFlower", 1;
+ OrumQuest = 30;
+ mes "[Orum]";
+ mes "\"Here it is. We're almost done. Don't mess it up!\"";
+ next;
+ goto L_WayFifthFlower;
+
+L_WayFifthFlower:
+ mes "[Orum]";
+ mes "\"To place the last flower: go east and follow the road. At some point it might be difficult to get through, since the road isn't used anymore, and the forest is growing back.";
+ mes "But you have to find a way and reach a clearing with a very old and tall tree. There you'll find another prepared spot with some flowers.\"";
+ goto L_close;
+
+L_AskHurtSagatha:
+ mes "[Orum]";
+ mes "\"Oh, are you getting scared? I thought you wanted to support us.\"";
+ next;
+ mes "\"However, no need to worry. Sagatha is much too powerful to get seriously injured by this, sadly.\"";
+ next;
+ mes "\"If wanted to actually harm her, we'd need to summon some greater powers. That'd be risky in the best case, and devastatingly costly in the worst.\"";
+ next;
+ mes "\"Unless... well, I assume you're not open to donating your soul for a pact with a higher astral being, are you?\"";
+ goto L_close;
+
+L_PlaceFifthFlower: // 30: Got task to place the fifth flower
+ mes "[Orum]";
+ mes "\"What are you waiting for? We've almost reached our goal! Go and place the last magical flower to finish the pentagram!\"";
+ menu
+ "Yes.", L_close,
+ "Where do I have to place it?", L_WayFifthFlower,
+ "Please keep calm, but I lost the flower.", L_Next26;
+
+L_Next26:
+ mes "[Orum]";
+ mes "\"Lost it? You incompetent excuse for a servant! What do you think you're doing?\"";
+ next;
+ mes "\"This behaviour shouldn't remain unpunished. Pay a recompensation fee of " + @RECOMPENSATION_5 + " GP, and I'm going to allow you to continue helping us. You also have to bring the necessary materials for a new flower.\"";
+ menu
+ "Okay, here it is.", L_Next27,
+ "What materials do we need?", L_MaterialFifth,
+ "That's too expensive!", L_NoRecompensation;
+
+L_Next27:
+ if (Zeny < @RECOMPENSATION_5)
+ goto L_NoMoney;
+ if ((countitem("Acorn") < @AMOUNT_ACORN)
+ || (countitem("Pearl") < @AMOUNT_PEARL)
+ || (countitem("BlackScorpionStinger") < @AMOUNT_BLACKSTINGER)
+ || (countitem("RedRose") < 1))
+ goto L_NoItem;
+
+ Zeny = Zeny - @RECOMPENSATION_5;
+ delitem "Acorn", @AMOUNT_ACORN;
+ delitem "Pearl", @AMOUNT_PEARL;
+ delitem "BlackScorpionStinger", @AMOUNT_BLACKSTINGER;
+ delitem "RedRose", 1;
+ getitem "RedSummonFlower", 1;
+
+ mes "Orum takes the materials and prepares a new flower.";
+ mes "[Orum]";
+ mes "\"Here is another flower. Don't mess it up this time, understood?\"";
+ goto L_close;
+
+L_MaterialFifth:
+ mes "[Orum]";
+ mes "\"For the last flower we need " + @AMOUNT_ACORN + " Acorns, " + @AMOUNT_PEARL + " Pearls, " + @AMOUNT_BLACKSTINGER + " Black Scorpion Stingers and 1 Red Rose.\"";
+ goto L_close;
+
+L_PlacedFifthFlower: // 31: Placed fifth flower
+ mes "[Orum]";
+ mes "\"Hahahaha! Wonderful! We were able to hear Sagatha's screaming and ranting here in the cave!\"";
+ next;
+ mes "\"Well done, really. I think you've earned yourself a small reward. Here, take this.\"";
+ Zeny = Zeny + @REWARD_MONEY;
+ getexp @Reward_Exp, 0;
+ OrumQuest = 32;
+ goto L_close;
+
+L_Done:
+ mes "[Orum]";
+ mes "\"Ah, whenever I think of Sagatha's reaction, it brings a smile to my face. You've done a very good job.\"";
+ goto L_close;
+
+L_NoRecompensation:
+ mes "[Orum]";
+ mes "\"Well, you could still try to recover the magical flower instead. It's your decision.\"";
+ goto L_close;
+
+L_NoMoney:
+ mes "[Orum]";
+ mes "\"Hey, you don't have enough money!\"";
+ goto L_close;
+
+L_NoItem:
+ mes "[Orum]";
+ mes "\"Hey, you don't have it!\"";
+ goto L_close;
+
+L_close:
+ @AMOUNT_SMALLMUSHROOM = 0;
+ @AMOUNT_ASH = 0;
+ @RECOMPENSATION_1 = 0;
+ @AMOUNT_PINKPETAL = 0;
+ @AMOUNT_STINGER = 0;
+ @RECOMPENSATION_2 = 0;
+ @AMOUNT_WHITEFUR = 0;
+ @AMOUNT_REDSTINGER = 0;
+ @RECOMPENSATION_3 = 0;
+ @bubblingLevel = 0;
+ cleararray @bubblingLevels$[0], "", 4;
+ @AMOUNT_HARDSPIKE = 0;
+ @AMOUNT_ANGRYSTINGER = 0;
+ @RECOMPENSATION_4 = 0;
+ @colorLevel = 0;
+ @goodColor = 0;
+ cleararray @colorLevels$[0], "", 7;
+ @AMOUNT_ACORN = 0;
+ @AMOUNT_PEARL = 0;
+ @AMOUNT_BLACKSTINGER = 0;
+ @RECOMPENSATION_5 = 0;
+ @REWARD_MONEY = 0;
+ @Reward_Exp = 0;
+ close;
+}
diff --git a/npc/017-4/waric.txt b/npc/017-4/waric.txt
new file mode 100644
index 00000000..f58eda6c
--- /dev/null
+++ b/npc/017-4/waric.txt
@@ -0,0 +1,407 @@
+
+017-4,216,36,0 script Waric NPC153,{
+ @mouboo_status = ((QUEST_MAGIC & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT) & 3;
+ @killed_mouboo = 0;
+ if ((@mouboo_status == 1) || (@mouboo_status == 2))
+ @killed_mouboo = 1;
+ @mouboo_status = 0;
+
+ if (MAGIC_FLAGS & MFLAG_DID_CUTTREE)
+ @cut_tree = 1;
+
+ @sagatha_follower = (QUEST_MAGIC & (NIBBLE_4_MASK | NIBBLE_5_MASK)) >> NIBBLE_4_SHIFT;
+ if (OrumQuest > 40) goto L_MoreMagic;
+ if (OrumQuest > 39) goto L_SnakesSpell;
+ if (OrumQuest > 38) goto L_SnakesIngredients;
+ if (OrumQuest > 37) goto L_Snakes;
+ if (OrumQuest > 36) goto L_ToxicDart;
+ if (OrumQuest > 35) goto L_Mushroom;
+ if (OrumQuest > 34) goto L_Banished;
+ if (OrumQuest > 33) goto L_LastChance;
+ if (OrumQuest > 32) goto L_BackforOath;
+ if (OrumQuest > 31) goto L_DarkMagic;
+ if (OrumQuest > 30) goto L_Flower5;
+ if (OrumQuest > 26) goto L_Flower4;
+ if (OrumQuest > 23) goto L_Flower3;
+ if (OrumQuest > 20) goto L_Flower2;
+ if (OrumQuest > 17) goto L_Flower1;
+ if (OrumQuest > 15) goto L_Mistrust;
+
+ mesn;
+ mes "\"You! You really are far too persistent to know what is good for you!\"";
+ mes "He turns towards Orum.";
+ next;
+ mesn;
+ mes "\"It seems your ridiculous Guarding Spirit has failed at his task.";
+ mes "Deal with this. We cannot afford any more of these distractions.\"";
+ goto L_close;
+
+L_Mistrust:
+ mesn;
+ mes "\"So, you say you want to help us? You do not look very competent.";
+ mes "Also, I do not see what motivation you have to help.\"";
+ next;
+ mes "\"Demonstrate your worth and I might take you seriously.\"";
+ goto L_close;
+
+L_Flower1:
+ mesn;
+ mes "\"You placed the first flower. Why, I am surprised! I did not expect you to actually stay and become useful.\"";
+ if (!(getskilllv(SKILL_MAGIC)))
+ goto L_close;
+ menu
+ "Can you teach me some magic?", L_Next,
+ "Of course!", L_close;
+
+L_Next:
+ if (@sagatha_follower)
+ goto L_Sagatha;
+ if (!@killed_mouboo && !@cut_tree)
+ goto L_Undecided;
+ mesn;
+ mes "\"Hmm. I suppose I could do that. You seem to have some potential.";
+ mes "First, proceed with the task given by Orum.\"";
+ goto L_close;
+
+L_Flower2:
+ mesn;
+ mes "\"You placed the second flower? It seems Orum's choice of tools is better than expected.\"";
+ goto L_close;
+
+L_Flower3:
+ mesn;
+ mes "\"I saw that you helped to create and place the third flower. Good.\"";
+ goto L_close;
+
+L_Flower4:
+ mesn;
+ mes "\"Now that you have placed the fourth flower, we are very close to reaching our goal. Keep it up.\"";
+ goto L_close;
+
+L_Flower5:
+ mesn;
+ mes "\"Hahaha, excellent. You handled the creation of our pentagram very well. I will be keeping that in mind.";
+ mes "I have advised Orum to give you a reward. Go now and speak with him.\"";
+ goto L_close;
+
+L_DarkMagic:
+ mesn;
+ mes "\"So, you have gotten your reward and finished the task Orum had for you. Very good.\"";
+ menu
+ "Can you teach me some magic?", L_Next1,
+ "I'm great or what!", L_close;
+
+L_Next1:
+ if (@sagatha_follower)
+ goto L_Sagatha;
+ if (!@killed_mouboo && !@cut_tree)
+ goto L_Undecided;
+ mesn;
+ mes "\"You appear to be trustworthy. I will allow you to become my apprentice.\"";
+ mes "\"I will teach you the basics of the branch of magic I practice. It is called Dark Magic. Very few people know of its existence these days, and hardly anyone is capable of teaching it.\"";
+ mes "\"You are very lucky that fate has brought us together.\"";
+ next;
+ mesn;
+ mes "\"You cut the tree to please the Earth Spirit. You chose the Dark Side of magic, and this cannot be undone.\"";
+ mes "\"Dark Magic draws its power from hate and anger. Your magic will be stronger against good creatures, and weaker against the undead and the corrupt.\"";
+ next;
+ mes "\"Once you start practicing Dark Magic, using certain spells will be painful. Everything comes with a price.\"";
+ next;
+ mesn;
+ mes "\"So, now that you know more about Dark Magic, are you still willing to become my apprentice?\"";
+ mes "\"Once you cross this line, there is no going back. Keep this in mind!\"";
+ OrumQuest = 33;
+ menu
+ "I'll have to think about it.", L_ComeBackLater,
+ "Yes.", L_Oath;
+
+L_DarkTalkAgain:
+ mes "The old wizard seems to be annoyed.";
+ mesn;
+ mes "\"Very well. Once you start practicing Dark Magic, certain spells will be painful to cast. Your magic will be stronger against good creatures, and weaker against the undead and the corrupt.\"";
+ next;
+ mes "\"When you cross this line, there is no going back. Remember that!\"";
+ mes "\"So, are you ready to become my apprentice?\"";
+ next;
+ menu
+ "No.", L_ComeBackLater,
+ "Yes. I want to be your apprentice.", L_Oath;
+
+L_BackforOath:
+ mesn;
+ mes "\"Ah, you're back. Have you decided yet if you want to become my apprentice?\"";
+ menu
+ "No." , L_ComeBackLater,
+ "Please, tell me about Dark Magic again.", L_DarkTalkAgain,
+ "Yes. I want to be your apprentice.", L_Oath;
+
+L_LastChance:
+ mes "Waric looks at you, with despise evident on his face.";
+ next;
+ mesn;
+ mes "\"I knew you were a coward.\"";
+ mes "\"I will give you one last chance to take the oath. If you refuse this time as well, I will no longer teach you.\"";
+ next;
+ mes "\"If you are still not sure, I will give you some time to reconsider, but if you start the ritual and run away, you are dead to me!\"";
+ next;
+ menu
+ "I am ready to take the oath. [last chance!]", L_Next2,
+ "I have to reconsider.", L_ComeBackLater;
+
+L_Next2:
+ mesn;
+ mes "\"If you stop during the oath again, I will not teach you anything. If you are not sure whether you want to become my apprentice or not, take more time to reconsider. However, this is your last chance to do so.\"";
+ next;
+ menu
+ "I have to reconsider.", L_ComeBackLater,
+ "I am ready to take the oath. [last chance!]", L_Oath;
+
+L_Oath:
+ mesn;
+ mes "\"Now say the oath of the Dark.\"";
+ next;
+ mes "Suddenly the room turns darker and writing penned in flames appears in front of you. You feel yourself shaking and shivering.";
+ next;
+ mes "As Waric yells, the walls tremble.";
+ mesn;
+ mes "\"Read it!\"";
+ mes "The sound of his voice echoes in the cave.";
+ next;
+ mes "You start to read the letters, but your throat closes up and you have a hard time speaking the words out loud.";
+ next;
+ mes "I swear to darkness and hate.";
+ mes "Destruction shall be my guide.";
+ mes "I shall not be the cure to poison,";
+ mes "but the salt to an open wound.";
+ mes "Sickness and death I shall spread,";
+ mes "take the food from those unfed.";
+ mes "Nothing is to be loved, everything has to end.";
+ mes "I shall prevail, other shall perish.";
+ next;
+ mes "Warric screams at your silence.";
+ mesn;
+ mes "\"Say it! Say it now!\"";
+ next;
+ menu
+ "[Say the oath]", L_Next3,
+ "I can't say this, it's too much for me!", L_NoOath;
+
+L_Next3:
+ mes "As you speak the words written in flames, you feel all of your positive feelings drain away. You no longer love, you're no longer happy. You feel indifferent to the world. But there is also a newfound feeling of power in you. You feel capable of doing anything.";
+ @SUP_id = SKILL_MAGIC_DARK;
+ @SUP_name$ = "Dark Magic";
+ @SUP_xp = 150000;
+ @SUP_lvl = 2;
+ callfunc "SkillUp";
+ next;
+ heal MaxHp, 0;
+ heal ((MaxHp/100) * -99), 0;
+ mes "You feel completely exhausted.";
+ OrumQuest = 36;
+ goto L_close;
+
+L_NoOath:
+ mes "Waric mumbles something. You guess it's a magic spell.";
+ warp "005-3", 86 , 33;
+ heal MaxHp, 0;
+ heal ((MaxHp/100) * -50), 0;
+ OrumQuest = OrumQuest + 1;
+ goto L_close;
+
+L_Mushroom:
+ mesn;
+ mesq l("Now that you are a student of mine, I will teach you some spells.");
+ next;
+ mesq l("We will start with an easy one. I will teach you how to summon a wicked mushroom.");
+ mesq l("The spell consumes a Small Mushroom and a Dark Crystal. Shove the Dark Crystal into the Small Mushroom and yell %s.");
+ next;
+ mesq l("A wicked mushroom will appear to fight for you. Usually.");
+ OrumQuest = 37;
+ learnskill SKILL_HELORP;
+ goto L_close;
+
+L_ToxicDart:
+ mesn;
+ mesq l("Welcome back, apprentice.");
+ mesq l("Are you read for another spell?");
+ menu
+ "No, I still have to practice the first one.", L_close,
+ "Yes. Show me some more!", L_Next4;
+
+L_Next4:
+ mesn;
+ mes "\"Very well. This spell is more complex than the last one. It is called toxic dart. Only your peers are susceptible to the dart's poison. If you hit an animal the dart will injure it, but the poison will not work.\"";
+ 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;
+ mesq l("Once this is done you have to throw it in the air and scream %s and the two roots will turn into toxic darts, a projectile you can throw.", b("Phlex"));
+ learnskill SKILL_PHLEX;
+ next;
+ mes "\"If you want to learn more, come back later.\"";
+ OrumQuest = 38;
+ goto L_close;
+
+L_Snakes:
+ mesc l("Waric nods at you.");
+ mesn;
+ mesq l("Have you practiced enough?");
+ menu
+ "Yes, I'm an outstanding Dark Mage!", L_Next5,
+ "No. I'm too lazy.", L_ComeBackLater;
+
+L_Next5:
+ mesn;
+ mes "\"Very well. I shall teach you another spell.\"";
+ mes "\"This one is so complex that I have to show it to you before explaining it further. Bring me a snake egg and a root.\"";
+ next;
+ mes "\"Off you go now. Bring me the ingredients.\"";
+ OrumQuest = 39;
+ goto L_close;
+
+L_SnakesIngredients:
+ OrumQuest = 39;
+ mesn;
+ mes "\"Did you bring one Dark Crystal and a Snake Egg?\"";
+ menu
+ "Yes, I have what you want.", L_Next6,
+ "No, I need more time.", L_NoItem;
+
+L_Next6:
+ if ((countitem(DarkCrystal) < 0)
+ || (countitem(SnakeEgg) < 0))
+ goto L_NoItem;
+ mesn;
+ mesq l("Observe!");
+ next;
+ mesc l("The wizard takes the crystal and the egg, mumbling something you don't understand. Suddenly, he throws the egg into the air and throws the crystal right through it midair.");
+ next;
+ mesc l("The Egg cracks open and a living snake comes out of the egg.");
+ next;
+ delitem DarkCrystal, 1;
+ delitem SnakeEgg, 1;
+ OrumQuest = 40;
+ monster "017-4", 217,36, "Evil", Snake, 1;
+ mesc l("The wizard looks at you, his eyes flashing, and laughs diabolically.");
+ goto L_close;
+
+L_SnakesSpell:
+ mesn;
+ mesq l("Did you see how this spell is cast?");
+ menu
+ "Yes. What did you mumble?", L_Next7,
+ "No. Could you show me again?", L_SnakesAgain;
+
+L_Next7:
+ mesn;
+ mesq l("I said %s.", b("Halhiss"));
+ mesq l("Have fun with those spells and use them to cause hate, anger and death.");
+ OrumQuest = 41;
+ learnskill SKILL_HALHISS;
+ goto L_close;
+
+L_SnakesAgain:
+ mesn;
+ mesq l("Do you really want me to show you the spell again? You will have to bring new ingredients.");
+ menu
+ "No.", L_SnakesSpell,
+ "Yes.", L_SnakesIngredients;
+
+L_ComeBackLater:
+ mesn;
+ mesq l("Then come back later.");
+ goto L_close;
+
+L_MoreMagic:
+ mesn;
+ mes "\"Hello, apprentice.\"";
+ mes "\"You must practice more! I will teach you more spells once you have mastered the ones I have already demonstrated.\"";
+ next;
+ menu
+ "Can you tell me the invocations for the spells you taught me again?", L_Next8,
+ rif(get_nibble(##03_TMWQUEST, 0), l("Actually, have you ever heard of Yeti's kidnapping little girls?")), L_VaultQuest,
+ "Thanks, master. I will come back later", L_close;
+
+L_VaultQuest:
+ mes "";
+ mesn;
+ mesq l("Sounds cool, but no. Besides, kidnapping is not my style.");
+ close;
+
+L_Next8:
+ mesn;
+ mesq l("Yes, of course.");
+ mesq l("To summon the snakes use %s.", b("Halhiss"));
+ mesq l("Say %s to make your roots into toxic darts.", b("Phlex"));
+ mesq l("And the first spell, to summon wicked mushrooms, is %s.", b("Helorp"));
+ next;
+ mesq l("Now leave. Spread chaos with the spells I have taught you!");
+ goto L_close;
+
+L_Undecided:
+ mesn;
+ mesq l("Well, I could. However, I am not sure you are trustworthy.");
+ next;
+ mesq l("How do I know you will not run off to Sagatha with what I would be teaching you?");
+ goto L_close;
+
+L_Sagatha:
+ mesn;
+ mesq l("You are already a student of Sagatha. I will not teach you anything!");
+ goto L_close;
+
+L_Banished:
+ mesc l("The wizard looks at you with despise.");
+ mesn;
+ mesq l("How did you...");
+ heal -Hp, 0;
+ goto L_close;
+
+L_NoItem:
+ mesn;
+ mesq l("Why are you wasting my time? Come back when you got everything I need.");
+ goto L_close;
+
+L_close:
+ @killed_mouboo = 0;
+ @cut_tree = 0;
+ @sagatha_follower = 0;
+ @SUP_id = 0;
+ @SUP_name$ = "";
+ @SUP_lvl = 0;
+ @SUP_xp = 0;
+ close;
+}
+
+017-1,74,32,0 script DebugFlowerP NPC153,{
+ mes "Debug options for Orum's quest:";
+ menu
+ "Candle Helmet done.", L_CandleHelmet,
+ "Input quest variable.", L_Var,
+ "Show current quest state.", L_CurrentState,
+ "Reset quest.", L_Reset,
+ "Nevermind.", L_close;
+
+L_CandleHelmet:
+ OrumQuest = 14;
+ goto L_close;
+
+L_Var:
+ input OrumQuest;
+ goto L_close;
+
+L_CurrentState:
+ mes "The value of the quest variable OrumQuest is currently " + OrumQuest + ".";
+ goto L_close;
+
+L_Reset:
+ OrumQuest = 0;
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "DebugFlowerP";
+ end;
+}
diff --git a/npc/017-9/_import.txt b/npc/017-9/_import.txt
new file mode 100644
index 00000000..17163a12
--- /dev/null
+++ b/npc/017-9/_import.txt
@@ -0,0 +1,5 @@
+// Map 017-9: GM Lounge
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/017-9/_warps.txt",
+"npc/017-9/mapflags.txt",
+"npc/017-9/npcs.txt",
diff --git a/npc/017-9/_warps.txt b/npc/017-9/_warps.txt
new file mode 100644
index 00000000..1c8f826c
--- /dev/null
+++ b/npc/017-9/_warps.txt
@@ -0,0 +1,7 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 017-9: GM Lounge warps
+017-9,39,24,0 warp #017-9_39_24 0,0,020-1,60,75
+017-9,36,25,0 warp #017-9_36_25 0,0,009-1,43,45
+017-9,31,24,0 warp #017-9_31_24 0,0,001-1,54,118
+017-9,41,24,0 warp #017-9_41_24 0,0,027-2,46,110
+017-9,33,24,0 warp #017-9_33_24 0,0,029-1,34,95
diff --git a/npc/017-9/mapflags.txt b/npc/017-9/mapflags.txt
new file mode 100644
index 00000000..5c673860
--- /dev/null
+++ b/npc/017-9/mapflags.txt
@@ -0,0 +1 @@
+//017-9 mapflag resave 017-9,26,25
diff --git a/npc/017-9/npcs.txt b/npc/017-9/npcs.txt
new file mode 100644
index 00000000..549d06d7
--- /dev/null
+++ b/npc/017-9/npcs.txt
@@ -0,0 +1,36 @@
+// Contains the secret doors for staff room
+
+009-1,42,43,0 script #SecretDoor NPC32767,0,0,{
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end;
+ //gmlog "@warp 017-9";
+ warp "017-9", 36, 26;
+ end;
+}
+
+020-1,60,76,0 script #SecretDoor2 NPC32767,0,0,{
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end;
+ gmlog "@warp 017-9";
+ warp "017-9", 38, 24;
+ end;
+}
+
+001-1,54,119,0 script #SecretDoor3 NPC32767,0,0,{
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end;
+ gmlog "@warp 017-9";
+ warp "017-9", 30, 24;
+ end;
+}
+
+027-2,46,111,0 script #SecretDoor4 NPC32767,0,0,{
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end;
+ gmlog "@warp 017-9";
+ warp "017-9", 40, 24;
+ end;
+}
+
+029-1,34,96,0 script #SecretDoor5 NPC32767,0,0,{
+ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end;
+ gmlog "@warp 017-9";
+ warp "017-9", 32, 24;
+ end;
+}
diff --git a/npc/018-1/_import.txt b/npc/018-1/_import.txt
new file mode 100644
index 00000000..fd95f9f7
--- /dev/null
+++ b/npc/018-1/_import.txt
@@ -0,0 +1,9 @@
+// Map 018-1: Woodland Mining Camp
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/018-1/_mobs.txt",
+"npc/018-1/_warps.txt",
+"npc/018-1/flowerpentagram3.txt",
+"npc/018-1/mapflags.txt",
+"npc/018-1/mike.txt",
+"npc/018-1/miners.txt",
+"npc/018-1/sword.txt",
diff --git a/npc/018-1/_mobs.txt b/npc/018-1/_mobs.txt
new file mode 100644
index 00000000..cf680a10
--- /dev/null
+++ b/npc/018-1/_mobs.txt
@@ -0,0 +1,29 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 018-1: Woodland Mining Camp mobs
+018-1,136,79,4,20 monster Sea Slime 1033,10,100000,30000
+018-1,108,87,26,12 monster Mana Bug 1131,10,100000,30000
+018-1,116,44,3,3 monster Sea Slime 1033,3,100000,30000
+018-1,119,56,6,3 monster Pink Flower 1014,2,100000,30000
+018-1,175,28,8,9 monster Jack O 1022,1,180000,120000
+018-1,78,59,1,0 monster Yellow Slime 1007,1,100000,30000
+018-1,57,63,7,3 monster Silkworm 1035,2,100000,30000
+018-1,43,63,15,14 monster Bat 1017,10,100000,30000
+018-1,134,39,9,5 monster Grass Snake 1034,4,100000,50000
+018-1,124,42,4,5 monster Grass Snake 1034,2,100000,50000
+018-1,124,19,11,4 monster Grass Snake 1034,3,100000,50000
+018-1,122,29,9,4 monster Grass Snake 1034,2,100000,50000
+018-1,149,45,5,4 monster Bat 1017,5,100000,30000
+018-1,169,47,10,5 monster Red Slime 1008,4,120000,30000
+018-1,136,49,6,4 monster Bat 1017,4,100000,30000
+018-1,166,49,6,4 monster Clover Patch 1037,1,100000,30000
+018-1,111,62,2,1 monster Silkworm 1035,1,60000,30000
+018-1,117,50,2,1 monster Sea Slime 1033,1,120000,60000
+018-1,96,47,9,5 monster Red Slime 1008,3,100000,50000
+018-1,106,52,7,3 monster Cobalt Plant 1030,1,240000,120000
+018-1,78,55,18,3 monster Red Slime 1008,7,100000,50000
+018-1,145,24,5,4 monster Red Slime 1008,3,100000,50000
+018-1,68,89,7,8 monster Bat 1017,3,100000,50000
+018-1,160,31,5,9 monster Red Slime 1008,5,100000,50000
+018-1,0,0,0,0 monster Clover Patch 1037,2,0,1000
+018-1,0,0,0,0 monster Butterfly 1055,20,30,20
+018-1,134,80,7,19 monster Maggot 1002,15,30,0
diff --git a/npc/018-1/_warps.txt b/npc/018-1/_warps.txt
new file mode 100644
index 00000000..33194827
--- /dev/null
+++ b/npc/018-1/_warps.txt
@@ -0,0 +1,19 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 018-1: Woodland Mining Camp warps
+018-1,79,59,0 warp #018-1_79_59 1,0,018-3,100,132
+018-1,112,61,0 warp #018-1_112_61 0,0,018-3,44,38
+018-1,115,40,0 warp #018-1_115_40 0,0,013-3,22,114
+018-1,128,56,0 warp #018-1_128_56 0,0,018-3,49,99
+018-1,90,42,0 warp #018-1_90_42 0,0,018-3,123,166
+018-1,69,54,0 warp #018-1_69_54 0,0,018-3,70,105
+018-1,127,36,0 warp #018-1_127_36 0,0,013-3,139,44
+018-1,134,45,0 warp #018-1_134_45 0,0,013-3,61,178
+018-1,147,40,0 warp #018-1_147_40 0,0,013-3,81,102
+018-1,153,46,0 warp #018-1_153_46 0,0,018-3,145,162
+018-1,158,34,0 warp #018-1_158_34 0,0,018-3,64,103
+018-1,162,44,0 warp #018-1_162_44 0,0,018-3,29,166
+018-1,177,20,0 warp #018-1_177_20 0,0,013-3,177,90
+018-1,65,73,0 warp #018-1_65_73 0,0,018-2,50,28
+018-1,79,98,0 warp #018-1_79_98 3,0,008-1,78,18
+018-1,64,70,0 warp #018-1_64_70 0,0,018-2,41,21
+018-1,78,34,0 warp #018-1_78_34 0,0,018-3,107,147
diff --git a/npc/018-1/flowerpentagram3.txt b/npc/018-1/flowerpentagram3.txt
new file mode 100644
index 00000000..4e5232b4
--- /dev/null
+++ b/npc/018-1/flowerpentagram3.txt
@@ -0,0 +1,102 @@
+
+018-1,83,29,0 script #FlowerPentagram3 NPC400,{
+ if (OrumQuest >= 31) goto L_PlacedFifthFlower;
+
+ if (OrumQuest > 23) goto L_PlacedThirdFlower;
+ if (OrumQuest == 23) goto L_ThirdFlower;
+
+ message strcharinfo(0), "Something is odd about this place.";
+ end;
+
+L_ThirdFlower:
+ mes "You recognize this place as the spot where Orum wants you to place the third of his magical flowers.";
+ menu
+ "Place the flower.", L_Next,
+ "Leave.", L_close;
+
+L_Next:
+ if (isin("018-1", 82, 28, 84, 30))
+ goto L_Place;
+
+ mes "This isn't working, you're too far away.";
+ goto L_close;
+
+L_Place:
+ set @localMonsterCount,
+ mobcount("018-1", "#FlowerPentagram3::OnSquirrelDeath") +
+ mobcount("018-1", "#FlowerPentagram3::OnMushroomDeath") +
+ mobcount("018-1", "#FlowerPentagram3::OnBlueparDeath") +
+ mobcount("018-1", "#FlowerPentagram3::OnScorpionDeath") +
+ mobcount("018-1", "#FlowerPentagram3::OnRScorpionDeath") +
+ mobcount("018-1", "#FlowerPentagram3::OnAScorpionDeath");
+ if (@localMonsterCount > 4)
+ goto L_MonstersAlive;
+
+ if (countitem("WhiteSummonFlower") < 1)
+ goto L_NoFlower;
+ delitem "WhiteSummonFlower", 1;
+ mes "Knowing what will happen, you prepare yourself for a fight. Then you go ahead with the ritual and place the magical flower.";
+ mes "You feel the now familiar tension around you. Here they come.";
+ OrumQuest = 24;
+ close2;
+ areamonster "018-1", 73, 22, 89, 36, "", 1105, 1, "#FlowerPentagram3::OnSquirrelDeath";
+ areamonster "018-1", 73, 22, 89, 36, "", 1106, 2, "#FlowerPentagram3::OnMushroomDeath";
+ areamonster "018-1", 73, 22, 89, 36, "", 1107, 1, "#FlowerPentagram3::OnBlueparDeath";
+ areamonster "018-1", 73, 22, 89, 36, "", 1003, 2, "#FlowerPentagram3::OnScorpionDeath";
+ areamonster "018-1", 73, 22, 89, 36, "", 1004, 1, "#FlowerPentagram3::OnRScorpionDeath";
+ areamonster "018-1", 73, 22, 89, 36, "", 1057, 2, "#FlowerPentagram3::OnAScorpionDeath";
+ @value = 15;
+ callfunc "QuestSagathaAnnoy";
+ @value = 0;
+ end;
+
+OnSquirrelDeath:
+ fix_mobkill(1105);
+ end;
+
+OnMushroomDeath:
+ fix_mobkill(1106);
+ end;
+
+OnBlueparDeath:
+ fix_mobkill(1107);
+ end;
+
+OnScorpionDeath:
+ fix_mobkill(1003);
+ end;
+
+OnRScorpionDeath:
+ fix_mobkill(1004);
+ end;
+
+OnAScorpionDeath:
+ fix_mobkill(1057);
+ end;
+
+L_MonstersAlive:
+ mes "As you get closer to the place, you feel an unnerving presence.";
+ mes "This place has recently been used to summon something! And the beings are still nearby!";
+ next;
+ mes "You should get rid of them before attempting the summoning yourself.";
+ goto L_close;
+
+L_NoFlower:
+ mes "You reach into your inventory to take out the flower and place it, but you can't find it!";
+ mes "Did you lose it somewhere along the way? If you can't find it, go talk to Orum again.";
+ goto L_close;
+
+L_PlacedThirdFlower:
+ mes "You placed the third of Orum's magical flowers on this spot.";
+ mes "You can feel the magical power around the place, waiting to be unleashed.";
+ goto L_close;
+
+L_PlacedFifthFlower:
+ mes "You remember this place. You placed the third of Orum's magical flowers here.";
+ mes "However, now that the summoning spell has been cast, everything is back to normal here.";
+ goto L_close;
+
+L_close:
+ @localMonsterCount = 0;
+ close;
+}
diff --git a/npc/018-1/mapflags.txt b/npc/018-1/mapflags.txt
new file mode 100644
index 00000000..462a68a8
--- /dev/null
+++ b/npc/018-1/mapflags.txt
@@ -0,0 +1 @@
+//018-1 mapflag resave 018-2,88,32
diff --git a/npc/018-1/mike.txt b/npc/018-1/mike.txt
new file mode 100644
index 00000000..c95e258f
--- /dev/null
+++ b/npc/018-1/mike.txt
@@ -0,0 +1,26 @@
+018-1,77,60,0 script Mike NPC113,{
+ mes "[Mike]";
+ mes "\"I need black stingers to make some medicine to cure my sister.\"";
+ next;
+
+ @dq_level = 40;
+ @dq_cost = 16;
+ @dq_count = 4;
+ @dq_name$ = "BlackScorpionStinger";
+ @dq_friendly_name$ = "black stingers";
+ @dq_money = 2500;
+ @dq_exp = 500;
+
+ callfunc "DailyQuest";
+
+ next;
+ mes "\"Hopefully I'll have enough soon.\"";
+ close;
+}
+
+// Buy en masse miner set aten by slimes and pays market price without bonus?
+/*
+
+Cronos - Boss Point Validation & Exchanger? Possibly in Keshlam Swamps?
+*/
+
diff --git a/npc/018-1/miners.txt b/npc/018-1/miners.txt
new file mode 100644
index 00000000..156e86c7
--- /dev/null
+++ b/npc/018-1/miners.txt
@@ -0,0 +1,35 @@
+018-1,80,61,0 script Miner NPC109,{
+ mes "[Miner]";
+ mes "\"Be careful in there.\"";
+ next;
+ mes "\"Actually maybe you can help an old miner out.\"";
+ next;
+ goto L_Keys;
+
+L_Keys:
+ mes "[Miner]";
+ @dq_level = 40;
+ @dq_cost = 35;
+ @dq_count = 10;
+ @dq_name$ = "TreasureKey";
+ @dq_friendly_name$ = "Treasure Key";
+ @dq_money = 3000;
+ @dq_exp = 300;
+
+ callfunc "DailyQuest";
+ goto L_close;
+
+L_close:
+ @money = 0;
+ @state = 0;
+ @dq_level = 0;
+ @dq_cost = 0;
+ @dq_count = 0;
+ @dq_name$ = "";
+ @dq_friendly_name$ = "";
+ @dq_money = 0;
+ @dq_exp = 0;
+ @dq_return = 0;
+ close;
+
+}
diff --git a/npc/018-1/sword.txt b/npc/018-1/sword.txt
new file mode 100644
index 00000000..6aa2af6e
--- /dev/null
+++ b/npc/018-1/sword.txt
@@ -0,0 +1,10 @@
+018-1,110,43,0 script #IceSword#_M NPC400,{
+ if (getskilllv(SKILL_MAGIC))
+ goto L_message;
+ close;
+
+L_message:
+ mes "[Sword in Pond]";
+ mes "\"Zzzzzz.....\"";
+ close;
+}
diff --git a/npc/018-2/_import.txt b/npc/018-2/_import.txt
new file mode 100644
index 00000000..923d5d7f
--- /dev/null
+++ b/npc/018-2/_import.txt
@@ -0,0 +1,10 @@
+// Map 018-2: Woodland Mining Camp Indoor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/018-2/_mobs.txt",
+"npc/018-2/_warps.txt",
+"npc/018-2/angus.txt",
+"npc/018-2/books.txt",
+"npc/018-2/caul.txt",
+"npc/018-2/mapflags.txt",
+"npc/018-2/miners.txt",
+"npc/018-2/receptionist.txt",
diff --git a/npc/018-2/_mobs.txt b/npc/018-2/_mobs.txt
new file mode 100644
index 00000000..9a77c147
--- /dev/null
+++ b/npc/018-2/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 018-2: Woodland Mining Camp Indoor mobs
+018-2,114,21,2,1 monster Yellow Slime 1007,1,100000,30000
diff --git a/npc/018-2/_warps.txt b/npc/018-2/_warps.txt
new file mode 100644
index 00000000..d768904a
--- /dev/null
+++ b/npc/018-2/_warps.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 018-2: Woodland Mining Camp Indoor warps
+018-2,50,29,0 warp #018-2_50_29 0,0,018-1,65,74
+018-2,41,20,0 warp #018-2_41_20 0,0,018-1,64,69
+018-2,20,24,0 warp #018-2_20_24 0,0,018-2,112,26
+018-2,112,25,0 warp #018-2_112_25 0,0,018-2,20,23
+018-2,21,28,0 warp #018-2_21_28 1,0,018-2,79,25
+018-2,79,26,0 warp #018-2_79_26 1,0,018-2,21,29
+018-2,114,19,0 warp #018-2_114_19 0,0,018-3,177,55
diff --git a/npc/018-2/angus.txt b/npc/018-2/angus.txt
new file mode 100644
index 00000000..4609f71f
--- /dev/null
+++ b/npc/018-2/angus.txt
@@ -0,0 +1,20 @@
+
+018-2,31,39,0 script Angus NPC147,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (@inspector == 10) goto L_NohMask;
+
+ mes "[Angus]";
+ mes "Angus is tinkering with some mechanical concoction.";
+ mes "\"It keeps breakin' left an' right... fortunat'ly I put in redundancies everywhere, but I haf' to keep repairin'.\"";
+ goto L_close;
+
+L_NohMask:
+ mes "[Angus]";
+ mes "\"I'm sorry, I truely am, but I stay in the town. One o' the miners might have heard something.\"";
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+}
diff --git a/npc/018-2/books.txt b/npc/018-2/books.txt
new file mode 100644
index 00000000..eb355cb0
--- /dev/null
+++ b/npc/018-2/books.txt
@@ -0,0 +1,21 @@
+
+018-2,112,19,0 script #Bookcase38 NPC400,0,1,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ if (@inspector == 11) goto L_NohMask;
+ mes "Looking over the bookcase, you find nothing strange or out of order.";
+ goto L_close;
+
+L_NohMask:
+ mes "Looking over the bookcase closely, you find a book is upside down.";
+ next;
+ mes "The book has been hollowed out. Inside is a theater mask and a note that you cannot even begin to read.";
+ next;
+ @inspector = 12;
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_3_MASK)) | (@inspector << NIBBLE_3_SHIFT);
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+}
diff --git a/npc/018-2/caul.txt b/npc/018-2/caul.txt
new file mode 100644
index 00000000..e5c3626f
--- /dev/null
+++ b/npc/018-2/caul.txt
@@ -0,0 +1,1088 @@
+
+018-2,37,22,0 script Caul NPC107,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ @SETZER_INITIAL = 0;
+ @SETZER_KNOWS_OIL = 1;
+ @SETZER_KNOWS_STINGER = 2;
+ @SETZER_FLAG_MADE_OIL = 4;
+
+ @MONSTER_OIL_XP = 100000;
+ @MOPOX_CURE_XP = 30000;
+
+ @Q_MASK = NIBBLE_3_MASK;
+ @Q_SHIFT = NIBBLE_3_SHIFT;
+
+ @Q_status = (QUEST_Forestbow_state & @Q_MASK) >> @Q_SHIFT;
+
+ set @Q_knows_mopox_cure, ((QUEST_MAGIC2 & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT) >= 4; // Elanore's quest for curing Kadiya
+
+ // Can the player get XP for brewing the cure?
+ set @Q_can_score_mopox_cure, (((QUEST_MAGIC2 & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT) == 4) // Elanore's quest for curing Kadiya
+ && (((QUEST_MAGIC2 & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT) < 2); // Haven't brewed it yet
+
+ mes "[Caul]";
+ mes "\"I can help you to brew healing potions out of mauve, cobalt, gamboge and alizarin herbs.";
+ mes "How many potions do you want to brew?\"";
+ next;
+
+ @C_monster_oil = 20;
+ @C_mopox_cure = 21;
+ @C_nohmask = 22;
+ @C_dementiapotion = 23;
+ @C_bye = 24;
+
+ setarray @choice$, "One.", "Five.", "Ten.", "Fifty.", "", "", "", "", "";
+ setarray @choice_idx, 1, 5, 10, 50, 0, 0, 0, 0, 0;
+ @choices_nr = 4;
+
+
+ if (!(@Q_status))
+ goto L_M_no_monster_oil;
+
+ @choice_idx[@choices_nr] = @C_monster_oil;
+ @choice$[@choices_nr] = "I would like to brew Monster Oil.";
+ @choices_nr = @choices_nr + 1;
+ goto L_M_no_monster_oil;
+
+L_M_no_monster_oil:
+ if (!@Q_knows_mopox_cure)
+ goto L_M_no_mopox_cure;
+
+ @choice_idx[@choices_nr] = @C_mopox_cure;
+ @choice$[@choices_nr] = "I would like to brew a Mopox Cure Potion.";
+ @choices_nr = @choices_nr + 1;
+ goto L_M_no_mopox_cure;
+
+L_M_no_mopox_cure:
+ if (@inspector != 10)
+ goto L_M_no_inspector;
+
+ @choice_idx[@choices_nr] = @C_nohmask;
+ @choice$[@choices_nr] = "Actually...";
+ @choices_nr = @choices_nr + 1;
+ goto L_M_no_inspector;
+
+L_M_no_inspector:
+ if (!(MAGIC_FLAGS & MFLAG_KNOWS_UNFOCUS_RECIPE))
+ goto L_M_no_dempo;
+
+ @choice_idx[@choices_nr] = @C_dementiapotion;
+ @choice$[@choices_nr] = "I would like to brew a Dementia Potion.";
+ @choices_nr = @choices_nr + 1;
+ goto L_M_no_dempo;
+
+L_M_no_dempo:
+ @choice_idx[@choices_nr] = @C_bye;
+ @choice$[@choices_nr] = "Never mind.";
+ @choices_nr = @choices_nr + 1;
+
+ menu
+ @choice$[0], L_MenuItems,
+ @choice$[1], L_MenuItems,
+ @choice$[2], L_MenuItems,
+ @choice$[3], L_MenuItems,
+ @choice$[4], L_MenuItems,
+ @choice$[5], L_MenuItems,
+ @choice$[6], L_MenuItems,
+ @choice$[7], L_MenuItems;
+
+L_MenuItems:
+ @choice = @choice_idx[@menu - 1];
+
+ if (@choice == @C_monster_oil)
+ goto L_mo_start;
+ if (@choice == @C_mopox_cure)
+ goto L_mox_start;
+ if (@choice == @C_nohmask)
+ goto L_NohMask;
+ if (@choice == @C_dementiapotion)
+ goto L_DemPotion;
+ if (@choice == @C_bye)
+ goto L_close;
+
+ // otherwise the choice is the number of potions-to-brew
+ @num = @choice;
+ if (@num == 0)
+ goto L_close;
+ goto L_brew;
+
+L_brew:
+ mes "[Caul]";
+ mes "\"Now put " + @num + " herbs of each kind into the cauldron, stir, and concentrate all your mental energy on it.\"";
+ next;
+
+ if (countitem("MauveHerb") < @num)
+ goto L_NotEnough;
+ if (countitem("CobaltHerb") < @num)
+ goto L_NotEnough;
+ if (countitem("GambogeHerb") < @num)
+ goto L_NotEnough;
+ if (countitem("AlizarinHerb") < @num)
+ goto L_NotEnough;
+
+ @a = @num;
+ @result1 = 0;
+ @result2 = 0;
+ @result3 = 0;
+ @result4 = 0;
+ goto L_CraftLoop;
+
+L_CraftLoop:
+ @throw = rand(Int);
+ @result = 1;
+ if (@throw >= 5) set @result, 2;
+ if (@throw >= 15) set @result, 3;
+ if (@throw >= 35) set @result, 4;
+
+ if (@result == 1) set @result1, @result1 + 1;
+ if (@result == 2) set @result2, @result2 + 1;
+ if (@result == 3) set @result3, @result3 + 1;
+ if (@result == 4) set @result4, @result4 + 1;
+
+ @a = @a - 1;
+ if (@a > 0) goto L_CraftLoop;
+
+ delitem "MauveHerb", @num;
+ delitem "CobaltHerb", @num;
+ delitem "GambogeHerb", @num;
+ delitem "AlizarinHerb", @num;
+
+ getitem "TinyHealingPotion", @result1;
+ getitem "SmallHealingPotion", @result2;
+ getitem "MediumHealingPotion", @result3;
+ getitem "LargeHealingPotion", @result4;
+
+ mes "[Caul]";
+ mes "\"Well done! You made:";
+ if (@result1 > 0)
+ mes @result1 + " tiny potions";
+ if (@result2 > 0)
+ mes @result2 + " small potions";
+ if (@result3 > 0)
+ mes @result3 + " medium potions";
+ if (@result4 > 0)
+ mes @result4 + " large potions";
+ mes "Come again.\"";
+ close;
+
+L_NotEnough:
+ mes "[Caul]";
+ mes "\"Oh, it seems like you don't have enough herbs. You can find herbs in deep forests.\"";
+ close;
+
+L_mo_start:
+ mes "[Caul]";
+ mes "\"Monster oil? Hmm, I have heard of it, but I don't remember the precise recipe to make it...\"";
+ next;
+ if (@Q_status == @SETZER_KNOWS_OIL)
+ menu
+ "OK, I'll ask around, perhaps someone else knows.", L_close;
+ if (@Q_status > @SETZER_KNOWS_OIL)
+ menu
+ "Rauk told me the recipe.", L_mo_knows_recipe;
+ close;
+
+L_mo_knows_recipe:
+ mes "[Caul]";
+ mes "\"Ah, but of course! Yes, we should be able to brew that here. Except that... hmm. Pearl and three black scorpion stingers? This sounds very dangerous;";
+ mes "I fear that I will have to ask you to do this yourself.\"";
+ next;
+ goto L_mo_main_menu;
+
+L_mo_main_menu:
+ @main_menu = 1;
+ menu
+ "What do you mean by 'dangerous'?", L_mo_why_dangerous,
+ "What do I need, again?", L_mo_ingredients,
+ "How does this work?", L_mo_explain,
+ "Let's start!", L_mo_start_brew,
+ "Where can I get a golden scorpion stinger?", L_mo_where_gold,
+ "I've changed my mind.", L_close;
+
+L_mo_why_dangerous:
+ mes "[Caul]";
+ mes "\"Well, with those two reagents in there at that ratio, you risk an explosion – quite possibly a fatal one. So be prepared to duck if the brew gets too bubbly – it's better to lose the ingredients than your head!\"";
+ next;
+ goto L_mo_main_menu;
+
+L_mo_ingredients:
+ mes "[Caul]";
+ mes "\"You will need one pearl, two snake skins, three black scorpion stingers, two piles of ash, and a golden scorpion stinger. The golden stinger goes in last, after the dangerous part, so you won't lose it if your brew blows up.\"";
+ next;
+ mes "[Caul]";
+ mes "\"You should also bring gamboge, mauve, alizarin and cobalt leaves. You will have to stabilize the brew, and they will help with that.\"";
+ next;
+ goto L_mo_main_menu;
+
+L_mo_explain:
+ mes "[Caul]";
+ mes "\"After you have put in the monster parts – except for the golden stinger – the brew will take on some random color; this can be a light, dark, or medium color. You have to stabilize this color by adding leaves to it.\"";
+ next;
+ mes "[Caul]";
+ mes "\"Of course, with such a violent brew the mixture will change color by itself, too, probably faster than your leaves can affect it. It will randomly add or remove colors, and might even get lighter.\"";
+ next;
+ mes "[Caul]";
+ mes "\"From what I have seen, it seems to go through phases – for each alternate leaf it adds a colour, then removes a color, then adds again and so on. Of course, if the color is there already it can't add any more.\"";
+ next;
+ mes "[Caul]";
+ mes "\"I haven't figured out yet precisely when it gets lighter, though.\"";
+ next;
+ mes "[Caul]";
+ mes "\"By adding Mauve, you can make it darker. Alizarin adds red, Gamboge yellow, Cobalt blue. To make it a proper black, you have to get it to be dark gray, then add one Mauve leaf.\"";
+ next;
+ mes "[Caul]";
+ mes "\"Unfortunately the brew changes randomly before your leaves dissolve, so sometimes you can't help but add the wrong color...\"";
+ next;
+ mes "[Caul]";
+ mes "\"Since the brew changes its color first, you might want to add the Mauve when your color is a dark purple or dark green or dark orange and hope for the best.\"";
+ next;
+ mes "[Caul]";
+ mes "\"But don't add too much! If you add a color that is already there, or try to make it darker at the wrong spot, it may backfire.\"";
+ next;
+ if (@main_menu)
+ goto L_mo_main_menu;
+ goto L_mo_loop;
+
+L_mo_where_gold:
+ mes "[Caul]";
+ mes "\"Good question. There aren't any golden scorpions nearby. Perhaps you can find a trader or an adventurer who have travelled further south and ask them to help?\"";
+ next;
+ goto L_mo_main_menu;
+
+L_mo_start_brew:
+ @main_menu = 0;
+ if (countitem ("Pearl") < 1)
+ goto L_mo_missing;
+ if (countitem ("SnakeSkin") < 2)
+ goto L_mo_missing;
+ if (countitem ("BlackScorpionStinger") < 3)
+ goto L_mo_missing;
+ if (countitem ("PileOfAsh") < 2)
+ goto L_mo_missing;
+ if (countitem ("GoldenScorpionStinger") < 1)
+ goto L_mo_missing_gold;
+
+ delitem "Pearl", 1;
+ delitem "SnakeSkin", 2;
+ delitem "BlackScorpionStinger", 3;
+ delitem "PileOfAsh", 2;
+
+ @bubble_mode = 0;
+ setarray @bubble_modes$,
+ "The brew is calm.",
+ "The brew is bubbling.",
+ "The brew is bubbling violently.";
+
+ @color = 1 << (rand(3));
+ setarray @colors$,
+ "white",
+ "red",
+ "yellow",
+ "orange",
+ "blue",
+ "purple",
+ "green",
+ "gray";
+
+ @intensity = 1;
+ setarray @intensities$,
+ "light",
+ "medium",
+ "dark";
+
+ set @auto_mode, 0; // Start by adding a colour or going lighter
+
+ goto L_mo_loop;
+
+L_mo_missing:
+ mes "[Caul]";
+ mes "\"You don't seem to have all of the ingredients. You need one pearl, two snake skins, three black stingers, two piles of ash, and one golden stinger.\"";
+ close;
+
+L_mo_missing_gold:
+ mes "[Caul]";
+ mes "\"You seem to have everything except for the golden stinger. I understand that this one is hard to get, but I'm sure that you can find one somewhere.\"";
+ close;
+
+L_mo_loop:
+ mes "[Brewing monster oil]";
+ mes @bubble_modes$[@bubble_mode];
+ mes "It is currently a " + @intensities$[@intensity] + " " + @colors$[@color] + ".";
+ next;
+
+ menu
+ "Add alizarin leaf", L_mo_alizarin,
+ "Add gamboge leaf", L_mo_gamboge,
+ "Add cobalt leaf", L_mo_cobalt,
+ "Add mauve leaf", L_mo_mauve,
+ "Ask Caul for advice", L_mo_explain,
+ "Duck!", L_Explodes;
+
+L_Explodes:
+ mes "[Brewing monster oil]";
+ mes "You throw yourself onto the ground. Seconds later, the cauldron shakes, and your entire mixture explodes upwards.";
+ mes "Caul crawls out from underneath a char.";
+ next;
+ mes "[Caul]";
+ mes "\"I'm glad to see that you chose to brew another day... perhaps it might be best if you give up on this dangerous concoction, though!\"";
+ close;
+
+L_mo_out_of_leaves:
+ mes "[Brewing monster oil]";
+ mes "You don't have any of these leaves left!";
+ next;
+ goto L_mo_loop;
+
+L_mo_alizarin:
+ @use_leaf$ = "AlizarinHerb";
+ @use_color = 1;
+ goto L_mo_leaf_color;
+
+L_mo_gamboge:
+ @use_leaf$ = "GambogeHerb";
+ @use_color = 2;
+ goto L_mo_leaf_color;
+
+L_mo_cobalt:
+ @use_leaf$ = "CobaltHerb";
+ @use_color = 4;
+ goto L_mo_leaf_color;
+
+L_mo_leaf_color:
+ if (countitem (@use_leaf$) < 1)
+ goto L_mo_out_of_leaves;
+
+ callsub S_mo_random_move;
+ if (@color & @use_color)
+ goto L_mo_pc_bad;
+ @color = @color | @use_color;
+ delitem @use_leaf$, 1;
+
+ mes "The brew changes its hue as your leaf dissolves.";
+ next;
+ goto L_mo_loop;
+
+L_mo_mauve:
+ if (countitem("MauveHerb") < 1)
+ goto L_mo_out_of_leaves;
+ delitem "MauveHerb", 1;
+
+ callsub S_mo_random_move;
+ if (@intensity == 2 && @color == 7)
+ goto L_mo_done;
+ if (@intensity == 2)
+ goto L_mo_pc_bad;
+
+ @intensity = @intensity + 1;
+ mes "The brew darkens as your mauve leaf dissolves.";
+ next;
+ goto L_mo_loop;
+
+S_mo_random_move:
+ mes "[Brewing monster oil]";
+ mes "You throw in a leaf and stir.";
+
+ if (@auto_mode == 1)
+ goto L_mo_random_1;
+ goto L_mo_random_0;
+
+L_mo_random_0: // mode 0: add colour or lighten up
+ @auto_mode = 1;
+ if (rand(3) == 0)
+ goto L_mo_random_0_lighten;
+
+ @choice = 1 << (rand(3));
+ if (@color & @choice)
+ goto L_mo_auto_bad;
+ @color = @color | @choice;
+
+ mes "Before your leaf has a chance to dissolve, the brew changes to a " + @colors$[@color] + " hue.";
+ return;
+
+L_mo_random_0_lighten:
+ if (@intensity == 0)
+ goto L_mo_auto_bad;
+ @intensity = @intensity - 1;
+ mes "Before your leaf has a chance to dissolve, the brew takes on a lighter shade of " + @colors$[@color] + ".";
+ return;
+
+L_mo_random_1: // mode 1: remove colour
+ @auto_mode = 0;
+ @choice = 1 << (rand(3));
+ if (!(@color & @choice))
+ goto L_mo_auto_bad;
+ @color = @color & (~@choice);
+ mes "Before your leaf has a chance to dissolve, the brew changes to a " + @colors$[@color] + " hue.";
+ return;
+
+L_mo_pc_bad:
+ if (rand(Int + 100) > 60)
+ goto L_mo_pc_bad_ok;
+ if (@bubble_mode)
+ mes "As your leaf dissolves, the intensity of the bubbling increases.";
+ if (!@bubble_mode)
+ mes "As your leaf dissolves, the brew begins to bubble.";
+ next;
+ @bubble_mode = @bubble_mode + 1;
+ if (@bubble_mode > 2)
+ goto L_mo_explode;
+ goto L_mo_loop;
+
+L_mo_pc_bad_ok:
+ mes "Your leaf dissolves but seems to have no effect.";
+ next;
+ goto L_mo_loop;
+
+L_mo_auto_bad:
+ if (rand(3) == 0)
+ goto L_Return;
+ if (rand(Int + 100) > 70)
+ goto L_Return;
+ mes "The brew begins to bubble more violently.";
+ @bubble_mode = @bubble_mode + 1;
+ if (@bubble_mode > 2)
+ next;
+ if (@bubble_mode > 2)
+ goto L_mo_explode;
+ return;
+
+L_mo_explode:
+ mes "[Exploding monster oil]";
+ mes "Your brew explodes!";
+ if (rand(readparam(bAgi)) > 40)
+ goto L_mo_explode_dodge;
+ mes "The burst of boiling monster brew hits you.";
+ next;
+ heal (15 * rand(Vit)) - 1500, 0;
+ close;
+
+L_mo_explode_dodge:
+ mes "You throw yourself to the ground at the very last moment, barely avoiding the burst of boiling monster brew.";
+ next;
+ mes "[Caul]";
+ mes "Caul nods at you from underneath a chair.";
+ mes "\"I told you, it's dangerous!!\"";
+ close;
+
+L_mo_done:
+ mes "As you throw in another mauve leaf, the brew takes on a deep black color and calms down.";
+ next;
+ mes "[Brewing monster oil]";
+ mes "As instructed, you toss in your golden scorpion stinger.";
+
+ if (countitem ("GoldenScorpionStinger") < 1)
+ goto L_mo_no_gold_end;
+
+ mes "The brew bubbles once more, then calms completely.";
+
+ delitem "GoldenScorpionStinger", 1;
+ getitem "MonsterOilPotion", 1;
+
+ if (!(@Q_status & @SETZER_FLAG_MADE_OIL))
+ getexp @MONSTER_OIL_XP, 0;
+ if (!(@Q_status & @SETZER_FLAG_MADE_OIL))
+ mes "[" + @MONSTER_OIL_XP + " experience points]";
+
+ @Q_status = @Q_status | @SETZER_FLAG_MADE_OIL;
+ callsub S_Update_Var;
+ next;
+ mes "[Caul]";
+ mes "Caul gets up from underneath the cover he was taking and looks at your brew. He is visibly impressed.";
+ mes "\"Well done! This should be just enough for one potion of monster oil. Let me get you a bottle.\"";
+ mes "He hands you the monster oil.";
+ close;
+
+L_mo_no_gold_end:
+ mes "But where is your golden stinger? Didn't you have one earlier?";
+ mes "Frustrated, you give up.";
+ close;
+
+L_mox_start:
+ mes "[Caul]";
+ mes "\"The mopox cure potion? Certainly, if you have all of the ingredients... oh, and make sure to bring water, roots, sulphur powder and Mauve leaves.\"";
+ mes "\"This is a very easy one, so I think I should let you do this yourself. It is very good exercise.\"";
+ next;
+ goto L_mox_overview_menu;
+
+L_mox_overview_menu:
+ menu
+ "I'm ready!", L_mox_setup,
+ "What are the ingredients?", L_mox_ingredients,
+ "How does this work?", L_mox_howto,
+ "I'd rather not try.", L_close;
+
+L_mox_ingredients:
+ mes "[Caul]";
+ mes "\"You will need one concentration potion, one iron potion, a lifestone, and one gamboge leaf.\"";
+ next;
+ goto L_mox_overview_menu;
+
+L_mox_howto:
+ mes "[Caul]";
+ mes "\"When you start brewing, the liquid very rarely has the proper consistency and color. You need to make it gooey and medium dark.\"";
+ next;
+ mes "[Caul]";
+ mes "\"You can affect the consistency by adding ground roots and water, and you can change the color by adding mauve leaves (to darken it) and sulphur powder (to make it brighter).\"";
+ next;
+ mes "[Caul]";
+ mes "\"The ingredients have some side effects, though, so you will have to experiment a little.\"";
+ next;
+ mes "[Caul]";
+ mes "\"Oh, and be careful: water will evaporate over time, too.\"";
+ next;
+ goto L_mox_overview_menu;
+
+L_mox_no_lifestone:
+ mes "[Caul]";
+ mes "\"You will need a lifestone.\"";
+ goto L_mox_overview_menu;
+
+L_mox_no_gamboge:
+ mes "[Caul]";
+ mes "\"You will need a gamboge leaf.\"";
+ goto L_mox_overview_menu;
+
+L_mox_no_concentration:
+ mes "[Caul]";
+ mes "\"You will need a concentration potion.\"";
+ goto L_mox_overview_menu;
+
+L_mox_no_iron:
+ mes "[Caul]";
+ mes "\"You will need an iron potion.\"";
+ goto L_mox_overview_menu;
+
+L_mox_setup:
+ if (countitem("IronPotion") < 1)
+ goto L_mox_no_iron;
+ if (countitem("ConcentrationPotion") < 1)
+ goto L_mox_no_concentration;
+ if (countitem("GambogeHerb") < 1)
+ goto L_mox_no_gamboge;
+ if (countitem("Lifestone") < 1)
+ goto L_mox_no_lifestone;
+
+ delitem "IronPotion", 1;
+ delitem "ConcentrationPotion", 1;
+ delitem "GambogeHerb", 1;
+ delitem "Lifestone", 1;
+
+ mes "[Brewing Mopox Cure]";
+ mes "You pour your two potions into the cauldron, then add a gamboge herb and a lifestone. Caul heats up the cauldron and you wait until it begins to boil.";
+
+ setarray @colours$, "white", "almost white", "light", "medium-dark", "dark", "very dark", "almost black", "black";
+ setarray @stickinesses$, "watery", "very runny", "runny", "gooey", "sticky", "very sticky", "almost solid";
+ @stickiness = rand(7);
+ @colour = 2 + rand(5);
+
+ // Target: (@stickiness, @colour) = (3, 3)
+
+ if (@stickiness == 3 && @colour == 3)
+ set @colour, 4; // don't allow insta-win; it's easy enough.
+ @rounds = 0;
+ goto L_mox_loop;
+
+L_mox_loop:
+ mes "[Brewing Mopox Cure]";
+ mes "The brew is " + @colours$[@colour] + " and " + @stickinesses$[@stickiness] + ".";
+
+ if (@colour == 3 && @stickiness == 3)
+ goto L_mox_win;
+ next;
+
+ @colour = @colour + 10;
+ @stickiness = @stickiness + 10;
+
+ menu
+ "Add root", L_mopox_B_root,
+ "Add water", L_mopox_B_water,
+ "Add sulphur powder", L_mopox_B_sulphur,
+ "Add mauve", L_mopox_B_mauve,
+ "...what should I do again?", L_mopox_reexplain,
+ "Wait", L_mox_next;
+
+L_mox_next:
+ @stickiness = @stickiness + @rounds;
+ @rounds = 1 - @rounds;
+
+ if (@stickiness < 10)
+ @stickiness = 10;
+ if (@colour < 10)
+ goto L_mopox_fail_bc;
+ if (@colour > 17)
+ goto L_mopox_fail_bc;
+ if (@stickiness > 16)
+ goto L_mof_hard;
+ if (@colour > 17)
+ goto L_mopox_fail_bc;
+
+ @colour = @colour - 10;
+ @stickiness = @stickiness - 10;
+
+ goto L_mox_loop;
+
+L_mopox_reexplain:
+ mes "[Caul]";
+ mes "\"Make this brew gooey and medium dark.\"";
+ mes "\"(Gooey is right between runny and sticky.)\"";
+ mes "\"You can add different items that will affect both color and stickiness.\"";
+ next;
+ mes "[Caul]";
+ mes "\"Water and ground roots mostly affect stickiness.\"";
+ mes "\"Mauve and sulphur powder mostly affect color, with Mauve darkening the brew.\"";
+ next;
+ goto L_mox_next;
+
+L_mopox_B_none:
+ mes "[Brewing Mopox Cure]";
+ mes "You don't have any left!";
+ next;
+ goto L_mox_next;
+
+L_mopox_B_root:
+ if (countitem ("Root") < 1)
+ goto L_mopox_B_none;
+ delitem "Root", 1;
+
+ mes "[Brewing Mopox Cure]";
+ mes "You grind a root and pour it into the brew.";
+ next;
+ @colour = @colour + 1;
+ @stickiness = @stickiness + 3;
+ goto L_mox_next;
+
+L_mopox_B_water:
+ if (countitem ("BottleOfWater") < 1)
+ goto L_mopox_B_none;
+ delitem "BottleOfWater", 1;
+ getitem "EmptyBottle", 1;
+
+ mes "[Brewing Mopox Cure]";
+ mes "You pour a bottle of water into the brew.";
+ next;
+ @colour = @colour;
+ @stickiness = @stickiness - 2;
+ goto L_mox_next;
+
+L_mopox_B_sulphur:
+ if (countitem ("SulphurPowder") < 1)
+ goto L_mopox_B_none;
+ delitem "SulphurPowder", 1;
+
+ mes "[Brewing Mopox Cure]";
+ mes "You mix some sulphur powder into the brew.";
+ next;
+ @colour = @colour - 3;
+ @stickiness = @stickiness + 1;
+ goto L_mox_next;
+
+L_mopox_B_mauve:
+ if (countitem ("MauveHerb") < 1)
+ goto L_mopox_B_none;
+ delitem "MauveHerb", 1;
+
+ mes "[Brewing Mopox Cure]";
+ mes "You grind a mauve herb and toss it in.";
+ next;
+ @colour = @colour + 2;
+ @stickiness = @stickiness + 1;
+ goto L_mox_next;
+
+L_mopox_fail_bc:
+ mes "[Brewing Mopox Cure]";
+ mes "The brew suddenly begins to bubble again, turning green.";
+ mes "\"Oh dear,\" Caul remarks, \"you let the color stray too much.\"";
+ next;
+ mes "[Caul]";
+ mes "\"Better luck next time!\"";
+ close;
+
+L_mof_hard:
+ mes "[Brewing Mopox Cure]";
+ mes "You find it almost impossible to stir the brew.";
+ mes "Suddenly, the thick mass bends outwards, a huge bubble bursting open right in your face!";
+ next;
+
+ if (rand(Vit) < 40)
+ sc_start SC_POISON, 1, 20;
+
+ mes "[Brewing Mopox Cure]";
+ mes "Yeech. That smelled bad.";
+ mes "\"Don't worry, I'll clean up the cauldron,\", interrupts Caul. \"You should wipe that off your face and make sure that you didn't get poisoned.\"";
+ next;
+ mes "[Caul]";
+ mes "\"Better luck next time!\"";
+ close;
+
+L_mox_win:
+ mes "Caul looks pleased. \"Well done! This looks very good to me.\"";
+ next;
+ mes "[Caul]";
+ mes "Caul picks a bottle from a shelf and fills it with your brew.";
+ mes "\"One potion of Mopox cure, here you are. Good luck!\"";
+ getitem "MopoxCurePotion", 1;
+ if (!@Q_can_score_mopox_cure)
+ goto L_mox_win_quick;
+ getexp @MOPOX_CURE_XP, 0;
+ mes "[" + @MOPOX_CURE_XP + " experience points]";
+ set QUEST_MAGIC2, (QUEST_MAGIC2 & ~NIBBLE_3_MASK) | (2 << NIBBLE_3_SHIFT); // Make sure we can only get XP for brewing this once
+ goto L_mox_win_quick;
+
+L_mox_win_quick:
+ close;
+
+L_DemPotion:
+ mes "[Caul]";
+ mes "\"Ok, you do know this potion is one of the most dangerous potions brewed? My cauldron is empty, you can try it yourself.\"";
+ next;
+ mes "Caul goes three steps away and watches your actions carefully.";
+ menu
+ "Please explain to me what you know about that potion.", L_explain_dempo,
+ "Ok, I will start brewing.", L_brew_dempo_init,
+ "Nevermind", L_close;
+
+L_explain_dempo:
+ mes "[Caul]";
+ mes "\"Hrrm. I have heard of that potion. I hope I can remember all the stuff needed.\"";
+ next;
+ mes "\"Basically this potion is a balancing between death and life; between knowledge and forgetting.\"";
+ next;
+ mes "\"So, to get it balanced, we need ingredients for both sides.\"";
+ next;
+ mes "\"For the death and forgetting side we can use bones. Although, bones do not work well. We would get the best results with a diseased heart of zombies. Of course, we can use undead ears and skulls as well.\"";
+ next;
+ mes "\"For the life and knowledge side we can use fresh mauve herbs. Lifestones would be even better. Roots will do as well, although these must be really fresh to show effect.\"";
+ next;
+ mes "\"Brewing such a powerful potion is dangerous. That is why you will need to do it yourself. I will try to assist you as best as I can.\"";
+ next;
+ mes "\"I don't know exactly, but there is a slight chance of exploding all time.\"";
+ next;
+ mes "\"The color of the mixture will give you a very good impression of what you need to do.\"";
+ mes "\"And to get that potion working, we need to stabilize it with a pearl at the end.\"";
+ next;
+ mes "\"The color will be in a range of really dark black to bright shining white. In between it is grey in different nuances.\"";
+ mes "\"When it is calm grey, the finalisation with a pearl will work best, so I have heard.\"";
+ next;
+ goto L_DemPotion;
+
+L_brew_dempo_init:
+ if ((countitem("BottleOfWater") == 0)
+ || (countitem("Bone") == 0)
+ || (countitem("Lifestone") == 0)
+ || (countitem("Pearl") == 0))
+ goto L_dempo_noinit;
+ delitem "BottleOfWater", 1;
+ delitem "Bone", 1;
+ delitem "Lifestone", 1;
+
+ @finish_dempo = 0;
+ // color can be either black or white at the beginning.
+ // with a slight randomness in there.
+ @dempo_color = rand(10);
+ if (rand(2)==0)
+ @dempo_color = @dempo_color + 90 ;
+ mes "To start that potion you put in the cauldron a bone, a bottle of water and a lifestone.";
+ next;
+ goto L_brew_dempo;
+
+L_dempo_noinit:
+ mes "[Caul]";
+ mes "\"Hrrm. Usually you start that potion with a bone, a bottle of water and a lifestone.\"";
+ mes "\"I'd propose you do it exactly that way. You see, maybe it would even work with a skull and a healing potion, but since we don't know, and I don't want to repair my cauldron again, please don't try other solutions.\"";
+ next;
+ mes "\"Please use only this way to start the recipe: a bone, a bottle of water and a lifestone. In that order!\"";
+ mes "\"Ah, and of course you will need at least one pearl with you. This pearl is needed to finalize the potion.\"";
+ close;
+
+L_brew_dempo:
+ callsub L_check_explosion;
+
+ callsub L_calc_dempo_color;
+ mes "After a little while of cooking you see its color turning into " + @dempo_color_S$+ ".";
+ next;
+
+ setarray @choice_idx, 0,0,0,0,0,0,0,0,0,0,0;
+ setarray @choice$, "","","","","","","","","","","";
+
+ @C_root = 12;
+ @C_mauve = 13;
+ @C_lifestone = 14;
+ @C_diseasedheart = 15;
+ @C_bone = 16;
+ @C_skull = 17;
+ @C_undeadear = 18;
+ @C_pearl = 19;
+ @C_nevermind = 20;
+
+ // counter of avalable answers
+ @choices_nr = 0;
+
+ if (countitem("Root") == 0)
+ goto L_Noroots;
+ @choice_idx[@choices_nr] = @C_root;
+ @choice$[@choices_nr] = "Add a root";
+ @choices_nr = @choices_nr + 1;
+ goto L_Noroots;
+
+L_Noroots:
+ if (countitem("MauveHerb") == 0)
+ goto L_Nomauve;
+ @choice_idx[@choices_nr] = @C_mauve;
+ @choice$[@choices_nr] = "Add a mauve herb";
+ @choices_nr = @choices_nr + 1;
+ goto L_Nomauve;
+
+L_Nomauve:
+ if (countitem("Lifestone") == 0)
+ goto L_Nolifestone;
+ @choice_idx[@choices_nr] = @C_lifestone;
+ @choice$[@choices_nr] = "Add a lifestone";
+ @choices_nr = @choices_nr + 1;
+ goto L_Nolifestone;
+
+L_Nolifestone:
+ if (countitem("DiseasedHeart") == 0)
+ goto L_Noheart;
+ @choice_idx[@choices_nr] = @C_diseasedheart;
+ @choice$[@choices_nr] = "Add a diseased heart";
+ @choices_nr = @choices_nr + 1;
+ goto L_Noheart;
+
+L_Noheart:
+ if (countitem("Bone") == 0)
+ goto L_Nobone;
+ @choice_idx[@choices_nr] = @C_bone;
+ @choice$[@choices_nr] = "Add a bone";
+ @choices_nr = @choices_nr + 1;
+ goto L_Nobone;
+
+L_Nobone:
+ if (countitem("Skull") == 0)
+ goto L_Noskull;
+ @choice_idx[@choices_nr] = @C_skull;
+ @choice$[@choices_nr] = "Add a skull";
+ @choices_nr = @choices_nr + 1;
+ goto L_Noskull;
+
+L_Noskull:
+ if (countitem("UndeadEar") == 0)
+ goto L_Noear;
+ @choice_idx[@choices_nr] = @C_undeadear;
+ @choice$[@choices_nr] = "Add an undead ear";
+ @choices_nr = @choices_nr + 1;
+ goto L_Noear;
+
+L_Noear:
+ if (countitem("Pearl") == 0)
+ goto L_Nopearl;
+ @choice_idx[@choices_nr] = @C_pearl;
+ @choice$[@choices_nr] = "Finalize with a pearl.";
+ @choices_nr = @choices_nr + 1;
+ goto L_Nopearl;
+
+L_Nopearl:
+ @choice_idx[@choices_nr] = @C_nevermind;
+ @choice$[@choices_nr] = "Nevermind and leave";
+
+ menu
+ @choice$[0],L_MenuItems1,
+ @choice$[1],L_MenuItems1,
+ @choice$[2],L_MenuItems1,
+ @choice$[3],L_MenuItems1,
+ @choice$[4],L_MenuItems1,
+ @choice$[5],L_MenuItems1,
+ @choice$[6],L_MenuItems1,
+ @choice$[7],L_MenuItems1,
+ @choice$[8],L_MenuItems1,
+ @choice$[9],L_MenuItems1,
+ @choice$[10],L_MenuItems1;
+
+L_MenuItems1:
+ @menu = @menu - 1;
+ if (@choice_idx[@menu] == 0)
+ goto L_brew_dempo;
+ if ((countitem("Root") != 0)
+ && (@choice_idx[@menu] == @C_root))
+ goto L_useroot;
+ if ((countitem("MauveHerb") != 0)
+ && (@choice_idx[@menu] == @C_mauve))
+ goto L_usemauve;
+ if ((countitem("Lifestone") != 0)
+ && (@choice_idx[@menu] == @C_lifestone))
+ goto L_uselifestone;
+ if ((countitem("DiseasedHeart") != 0)
+ && (@choice_idx[@menu] == @C_diseasedheart))
+ goto L_usediseasedheart;
+ if ((countitem("Bone") != 0)
+ && (@choice_idx[@menu] == @C_bone))
+ goto L_usebone;
+ if ((countitem("Skull") != 0)
+ && (@choice_idx[@menu] == @C_skull))
+ goto L_useskull;
+ if ((countitem("UndeadEar") != 0)
+ && (@choice_idx[@menu] == @C_undeadear))
+ goto L_useear;
+ if ((countitem("Pearl") != 0)
+ && (@choice_idx[@menu] == @C_pearl))
+ goto L_usepearl;
+ if ((@choice_idx[@menu] == @C_nevermind))
+ goto L_Ask_quit;
+
+ // fallthrough only when player remove the items while in menu, trying to cheat
+ // the potion will be lost then
+ mes "\"Do not try to betray me. Come back when you have a better morale.\"";
+ close;
+
+L_useroot:
+ delitem "Root", 1;
+ @dempo_color = @dempo_color + 9 + rand(9);
+ goto L_brew_dempo;
+
+L_usemauve:
+ delitem "MauveHerb", 1;
+ @dempo_color = @dempo_color + 1 + rand(2);
+ goto L_brew_dempo;
+
+L_uselifestone:
+ delitem "Lifestone", 1;
+ @dempo_color = @dempo_color + 3 + rand(4);
+ goto L_brew_dempo;
+
+L_usediseasedheart:
+ delitem "DiseasedHeart", 1;
+ @dempo_color = @dempo_color - 35 - rand(25);
+ goto L_brew_dempo;
+
+L_usebone:
+ delitem "Bone", 1;
+ @dempo_color = @dempo_color - 3 - rand(3);
+ goto L_brew_dempo;
+
+L_useskull:
+ delitem "Skull", 1;
+ @dempo_color = @dempo_color - 9 - rand(9);
+ goto L_brew_dempo;
+
+L_useear:
+ delitem "UndeadEar", 1;
+ @dempo_color = @dempo_color - 15 - rand(13);
+ goto L_brew_dempo;
+
+L_usepearl:
+ delitem "Pearl", 1;
+ //ending it is a little dangerous as well,
+ // stay calm, when it smashes your fine tuned well done potion.
+ @finish_dempo = 1;
+ callsub L_check_explosion;
+ // ok now you really did it. Here is your potion:
+ getitem "GrimaceOfDementia",1;
+
+ mes "[Caul]";
+ mes "\"The potion is now ready. It seems as if it worked fine.\"";
+ next;
+ mes "\"Ok here is a flask of that potion. I'll care for the rest.\"";
+ mes "\"I mean it is a very dangerous fluid.\"";
+ next;
+ mes "\"See you later, alligator!\"";
+ close;
+
+L_Ask_quit:
+ mes "[Caul]";
+ mes "\"The potion is not ready. You can't just leave now!\"";
+ menu
+ "Please throw away that stupid potion, I'm in a hurry!", L_close,
+ "Oh you are right, let me finish it.", L_brew_dempo;
+
+L_check_explosion:
+ // set to range [-50 50];
+ @prob = @dempo_color - 50;
+
+ @prob = ((@prob * @prob) / 80) + 4;
+ if (@finish_dempo == 0)
+ goto L_check_exp_nof;
+
+ // square again, so you must be in the middle to get it work there;
+ // and multiply with 3 so there is definitly no chance to get it directly after starting
+ @prob = (@prob * @prob) * 2;
+ goto L_check_exp_nof;
+
+L_check_exp_nof:
+ // in about 95% of the cases anything is fine, so return.
+ if (rand(1000) > @prob) goto L_Return;
+ // in some cases it is not:
+ // kabooom!
+ close2;
+ heal -(Hp/2), 0;
+ misceffect 5;
+ misceffect 16;
+ heal -Hp, 0;
+ end;
+
+L_calc_dempo_color:
+ // @dempo_color_S$ is set in here:
+
+ //really dark black 0-11
+ if (@dempo_color < 12)
+ @dempo_color_S$ = "really dark black";
+
+ //dark black 12-23
+ if ((@dempo_color > 11) && (@dempo_color < 24))
+ @dempo_color_S$ = "dark black";
+
+ //black 24-34
+ if ((@dempo_color > 23) && (@dempo_color < 35))
+ @dempo_color_S$ = "black";
+
+ //dark grey with little dark spots 35-41
+ if ((@dempo_color > 34) && (@dempo_color < 42))
+ @dempo_color_S$ = "dark grey with little dark spots";
+
+ //dark grey 42-47
+ if ((@dempo_color > 41) && (@dempo_color < 48))
+ @dempo_color_S$ = "dark grey";
+
+ //calm grey 48-52
+ if ((@dempo_color > 47) && (@dempo_color < 53))
+ @dempo_color_S$ = "calm grey";
+
+ //light grey 53-58
+ if ((@dempo_color > 52) && (@dempo_color < 59))
+ @dempo_color_S$ = "light grey";
+
+ //light grey with little light spots 59-65
+ if ((@dempo_color > 58) && (@dempo_color < 66))
+ @dempo_color_S$ = "light grey with little light spots";
+
+ //white 66-76
+ if ((@dempo_color > 65) && (@dempo_color < 77))
+ @dempo_color_S$ = "white";
+
+ //shining white 77-88
+ if ((@dempo_color > 76) && (@dempo_color < 89))
+ @dempo_color_S$ = "shining white";
+
+ //bright shining white 77-100
+ if (@dempo_color > 88)
+ @dempo_color_S$ = "bright shining white";
+
+ return;
+
+L_NohMask:
+ mes "[Caul]";
+ mes "\"I'm sorry, but I didn't. I'm staying in town. Try asking one of the miners.\"";
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+
+L_Return:
+ return;
+
+S_Update_Var:
+ set QUEST_Forestbow_state,
+ (QUEST_Forestbow_state & ~(@Q_MASK)
+ | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/018-2/mapflags.txt b/npc/018-2/mapflags.txt
new file mode 100644
index 00000000..a2d53b02
--- /dev/null
+++ b/npc/018-2/mapflags.txt
@@ -0,0 +1 @@
+//018-2 mapflag resave 018-2,88,32
diff --git a/npc/018-2/miners.txt b/npc/018-2/miners.txt
new file mode 100644
index 00000000..ab418c24
--- /dev/null
+++ b/npc/018-2/miners.txt
@@ -0,0 +1,173 @@
+
+018-2,85,23,0 script Malek NPC109,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ @MIN_GEM_AMOUNT = 7;
+
+ if (@inspector == 10) goto L_NohMask;
+
+ mes "[Malek]";
+ mes "\"Hi, can I help you at all?\"";
+ menu
+ "I'm looking for someone able to make gem powder.", L_GemPowder,
+ "I was just having a look, have a nice day.", L_close;
+
+L_NohMask:
+ mes "[Malek]";
+ mes "\"Hi, can I help you at all?\"";
+ menu
+ "I'm looking for someone able to make gem powder.", L_GemPowder,
+ "I was just having a look, have a nice day.", L_close,
+ "The inspector sent me here to investigate.", L_Investigation;
+
+L_Investigation:
+ @inspector = 11;
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_3_MASK)) | (@inspector << NIBBLE_3_SHIFT);
+ mes "\"Yeah, we did hear a commotion. We thought we heard someone go down to the basement, but we checked the whole place over and didn't see anything out of the ordinary.\"";
+ goto L_close;
+
+L_GemPowder:
+ mes "[Malek]";
+ mes "\"My father taught me how to make that sort of powder. Put the gem on a firm surface, hold your pickaxe tight and whack that gem hard. It'll be crushed into powder pretty soon if you keep at it.\"";
+ mes "\"Do you want me to make any for you?\"";
+ menu
+ "Yes, I really need some.", L_GemPowderStart,
+ "Actually, I don't want anything. Have a nice day.", L_close;
+
+L_GemPowderStart:
+ mes "[Malek]";
+ mes "\"Well, I can do that. Bring me a gem and I'll make you some powder - hope you don't mind if I keep a little as payment!\"";
+ menu
+ "I've got some gems.", L_Check_Gems,
+ "I'll be back with a gem soon.", L_close,
+ "Actually, I prefer my gems whole. Thanks anyway.", L_close;
+
+L_Check_Gems:
+ mes "[Malek]";
+ mes "\"Which gem do you want me to powder for you?\"";
+ next;
+ setarray @menuitems$, "", "", "", "", "", "", "";
+ @c = 0;
+ goto L_Check_Diamond;
+
+L_Check_Diamond:
+ if (countitem("Diamond") < 1)
+ goto L_Check_Ruby;
+ @menuitems$[@c] = "A diamond.";
+ @menuid[@c] = 0;
+ @c = @c + 1;
+ goto L_Check_Ruby;
+
+L_Check_Ruby:
+ if (countitem("Ruby") < 1)
+ goto L_Check_Emerald;
+ @menuitems$[@c] = "A ruby.";
+ @menuid[@c] = 1;
+ @c = @c + 1;
+ goto L_Check_Emerald;
+
+L_Check_Emerald:
+ if (countitem("Emerald") < 1)
+ goto L_Check_Sapphire;
+ @menuitems$[@c] = "An emerald.";
+ @menuid[@c] = 2;
+ @c = @c + 1;
+ goto L_Check_Sapphire;
+
+L_Check_Sapphire:
+ if (countitem("Sapphire") < 1)
+ goto L_Check_Topaz;
+ @menuitems$[@c] = "A sapphire.";
+ @menuid[@c] = 3;
+ @c = @c + 1;
+ goto L_Check_Topaz;
+
+L_Check_Topaz:
+ if (countitem("Topaz") < 1)
+ goto L_Check_Amethyst;
+ @menuitems$[@c] = "A topaz.";
+ @menuid[@c] = 4;
+ @c = @c + 1;
+ goto L_Check_Amethyst;
+
+L_Check_Amethyst:
+ if (countitem("Amethyst") < 1)
+ goto L_Choose_Gem;
+ @menuitems$[@c] = "An amethyst.";
+ @menuid[@c] = 5;
+ @c = @c + 1;
+ goto L_Choose_Gem;
+
+L_Choose_Gem:
+ @menuitems$[@c] = "None right now, thanks.";
+ @menuid[@c] = 6;
+ @c = @c + 1;
+ menu
+ @menuitems$[0], L_MenuItems,
+ @menuitems$[1], L_MenuItems,
+ @menuitems$[2], L_MenuItems,
+ @menuitems$[3], L_MenuItems,
+ @menuitems$[4], L_MenuItems,
+ @menuitems$[5], L_MenuItems,
+ @menuitems$[6], L_MenuItems;
+
+L_MenuItems:
+ @menu = @menu - 1;
+ if (@menu >= @c)
+ goto L_close;
+ if (@menuid[@menu] == 0)
+ @gem$ = "Diamond";
+ if (@menuid[@menu] == 1)
+ @gem$ = "Ruby";
+ if (@menuid[@menu] == 2)
+ @gem$ = "Emerald";
+ if (@menuid[@menu] == 3)
+ @gem$ = "Sapphire";
+ if (@menuid[@menu] == 4)
+ @gem$ = "Topaz";
+ if (@menuid[@menu] == 5)
+ @gem$ = "Amethyst";
+ if (@menuid[@menu] == 6)
+ goto L_close;
+
+ getinventorylist;
+ if (countitem(@gem$) < 1)
+ goto L_No_gem;
+ if (@inventorylist_count == 100
+ && countitem(@gem$) > 1)
+ goto L_TooMany;
+ delitem @gem$, 1;
+ if (@gem$ == "Diamond")
+ getitem "DiamondPowder", @MIN_GEM_AMOUNT + rand(6);
+ if (@gem$ == "Ruby")
+ getitem "RubyPowder", @MIN_GEM_AMOUNT + rand(6);
+ if (@gem$ == "Emerald")
+ getitem "EmeraldPowder", @MIN_GEM_AMOUNT + rand(6);
+ if (@gem$ == "Sapphire")
+ getitem "SapphirePowder", @MIN_GEM_AMOUNT + rand(6);
+ if (@gem$ == "Topaz")
+ getitem "TopazPowder", @MIN_GEM_AMOUNT + rand(6);
+ if (@gem$ == "Amethyst")
+ getitem "AmethystPowder", @MIN_GEM_AMOUNT + rand(6);
+
+ mes "[Malek]";
+ mes "\"Here's your powder. Hope it's fine enough for you.\"";
+ mes "\"Do you need me to make any more?\"";
+ menu
+ "Yes please.", L_Check_Gems,
+ "No thank you, this is enough.", L_close;
+
+L_TooMany:
+ mes "[Malek]";
+ mes "\"Doesn't look like you've got room for this powder. Come back when you do.\"";
+ goto L_close;
+
+L_No_gem:
+ mes "[Malek]";
+ mes "\"You don't have that gem.\"";
+ goto L_close;
+
+L_close:
+ @inspector = 0;
+ close;
+}
diff --git a/npc/018-2/receptionist.txt b/npc/018-2/receptionist.txt
new file mode 100644
index 00000000..2f0d2a9f
--- /dev/null
+++ b/npc/018-2/receptionist.txt
@@ -0,0 +1,66 @@
+
+018-2,50,24,0 script Receptionist#mine NPC108,{
+ @inspector = ((QUEST_Hurnscald & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT);
+
+ mes "[Receptionist]";
+ mes "\"Welcome to the mining camp!";
+ mes "Do you need anything?\"";
+ next;
+ goto L_Menu;
+
+L_Menu:
+ if (@inspector == 10)
+ menu
+ "Why was a mine setup here?", L_Mine,
+ "Can I go into the mine?", L_Enter,
+ "Did the company build this building?", L_Building,
+ "Did you hear a commotion here the other night?", L_NohMask,
+ "Thank you, no.", L_close;
+ menu
+ "Why was a mine setup here?", L_Mine,
+ "Can I go into the mine?", L_Enter,
+ "Did the company build this building?", L_Building,
+ "Thank you, no.", L_close;
+
+L_Mine:
+ mes "[Receptionist]";
+ mes "\"Minerals have been easy to find in this area historically. The mine entrance we're using collapsed from the mountain side when the volcano errupted. Plenty of minerals were exposed then.\"";
+ next;
+ goto L_Question_End;
+
+L_Enter:
+ mes "[Receptionist]";
+ mes "\"If you think you can handle all the monsters that have appeared there.\"";
+ next;
+ goto L_Question_End;
+
+L_Building:
+ mes "[Receptionist]";
+ mes "\"No, the company bought this building. It's been abandoned for a while. The villagers think it's haunted, but we haven't seen anything, except for the basement. None of us have been able to stay there for very long.\"";
+ next;
+ menu
+ "Why not?", L_Next,
+ "Not my problem", L_Question_End;
+
+L_Next:
+ mes "[Receptionist]";
+ mes "\"I haven't been down there myself, and the ones who have haven't been able to describe why at all.\"";
+ next;
+ goto L_Question_End;
+
+L_NohMask:
+ mes "[Receptionist]";
+ mes "\"I stay in town, and so couldn't have heard anything over here. One of the miners might be able to help you.\"";
+ next;
+ goto L_Question_End;
+
+L_Question_End:
+ mes "[Receptionist]";
+ mes "\"Do you need anything else?\"";
+ next;
+ goto L_Menu;
+
+L_close:
+ @inspector = 0;
+ close;
+}
diff --git a/npc/018-3/_import.txt b/npc/018-3/_import.txt
new file mode 100644
index 00000000..3595d680
--- /dev/null
+++ b/npc/018-3/_import.txt
@@ -0,0 +1,8 @@
+// Map 018-3: Northern Mines
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/018-3/_mobs.txt",
+"npc/018-3/_warps.txt",
+"npc/018-3/bookcase.txt",
+"npc/018-3/evil-obelisk.txt",
+"npc/018-3/mapflags.txt",
+"npc/018-3/sword.txt",
diff --git a/npc/018-3/_mobs.txt b/npc/018-3/_mobs.txt
new file mode 100644
index 00000000..b18b4a82
--- /dev/null
+++ b/npc/018-3/_mobs.txt
@@ -0,0 +1,25 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 018-3: Northern Mines mobs
+018-3,48,29,28,9 monster Bat 1017,10,100000,30000
+018-3,35,144,15,24 monster Evil Mushroom 1013,10,120000,30000
+018-3,35,65,14,11 monster Spider 1012,20,100000,50000
+018-3,28,157,1,1 monster Pink Flower 1014,1,60000,30000
+018-3,99,111,8,20 monster Yellow Slime 1007,10,90000,30000
+018-3,134,140,6,4 monster Maggot 1002,3,80000,40000
+018-3,82,149,36,13 monster Spider 1012,8,300000,120000
+018-3,102,172,65,6 monster Black Scorpion 1009,20,60000,10000
+018-3,174,37,5,15 monster Yellow Slime 1007,5,180000,120000
+018-3,148,148,6,12 monster Bat 1017,3,180000,40000
+018-3,136,87,10,3 monster Yellow Slime 1007,6,80000,40000
+018-3,81,77,13,10 monster Red Slime 1008,15,80000,40000
+018-3,111,80,2,3 monster Black Scorpion 1009,10,80000,40000
+018-3,175,122,2,20 monster Snake 1010,15,40000,20000
+018-3,172,94,8,8 monster Red Slime 1008,10,60000,30000
+018-3,59,95,5,4 monster Spider 1012,15,60000,30000
+018-3,77,92,11,3 monster Black Scorpion 1009,15,60000,30000
+018-3,94,55,8,4 monster Snake 1010,5,60000,30000
+018-3,133,39,6,8 monster Spider 1012,10,60000,30000
+018-3,111,33,15,8 monster Snake 1010,15,60000,30000
+018-3,68,101,2,2 monster Cave Snake 1021,4,60000,30000
+018-3,153,96,9,8 monster Cave Maggot 1056,4,100000,30000
+018-3,99,99,8,8 monster Cave Maggot 1056,4,100000,30000
diff --git a/npc/018-3/_warps.txt b/npc/018-3/_warps.txt
new file mode 100644
index 00000000..b0a15fcc
--- /dev/null
+++ b/npc/018-3/_warps.txt
@@ -0,0 +1,24 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 018-3: Northern Mines warps
+018-3,100,133,0 warp #018-3_100_133 1,0,018-1,79,60
+018-3,44,39,0 warp #018-3_44_39 0,0,018-1,112,62
+018-3,49,100,0 warp #018-3_49_100 0,0,018-1,128,57
+018-3,123,167,0 warp #018-3_123_167 0,0,018-1,90,43
+018-3,70,106,0 warp #018-3_70_106 0,0,018-1,69,55
+018-3,50,88,0 warp #018-3_50_88 0,0,013-3,69,142
+018-3,145,163,0 warp #018-3_145_163 0,0,018-1,153,47
+018-3,64,104,0 warp #018-3_64_104 0,0,018-1,158,35
+018-3,29,167,0 warp #018-3_29_167 0,0,018-1,162,45
+018-3,97,69,0 warp #018-3_97_69 0,0,013-3,178,43
+018-3,27,54,0 warp #018-3_27_54 0,0,013-3,169,44
+018-3,134,63,0 warp #018-3_134_63 0,0,013-3,152,29
+018-3,177,56,0 warp #018-3_177_56 0,0,018-2,114,20
+018-3,172,21,0 warp #018-3_172_21 0,0,013-3,123,103
+018-3,177,21,0 warp #018-3_177_21 0,0,013-3,147,103
+018-3,27,91,0 warp #018-3_27_91 0,0,013-3,158,67
+018-3,90,50,0 warp #018-3_90_50 0,0,013-3,67,50
+018-3,71,122,0 warp #018-3_71_122 0,0,013-3,111,41
+018-3,174,85,0 warp #018-3_174_85 0,0,013-3,62,99
+018-3,102,69,0 warp #018-3_102_69 0,0,013-3,68,96
+018-3,179,181,0 warp #018-3_179_181 0,0,009-3,157,31
+018-3,107,146,0 warp #018-3_107_146 0,0,018-1,78,33
diff --git a/npc/018-3/bookcase.txt b/npc/018-3/bookcase.txt
new file mode 100644
index 00000000..d661f749
--- /dev/null
+++ b/npc/018-3/bookcase.txt
@@ -0,0 +1,66 @@
+
+018-3,75,123,0 script #DemonMineBookcase1 NPC400,{
+ @state = ((QUEST_Hurnscald & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT);
+
+ if (@state == 0) goto L_Search;
+
+ mes "You see nothing different about the bookcase.";
+ mes "Do you want to search it again anyways?";
+ next;
+ menu
+ "Yes.", L_Search,
+ "No.", L_close;
+
+L_Search:
+ mes "After searching the bookcase, you were able to find a few passages that you can read.";
+ next;
+ mes "One of the describes an ancient barrier that guards a great treasure.";
+ mes "";
+ mes "To get through it, you need to consume the soul of a great pumpkin ghost.";
+ next;
+ mes "Another passage describes a ritual needed to open a certain cursed chest.";
+ mes "";
+ mes "It looks like a lot of items will be needed.";
+ next;
+ mes "The slime of a maggot.";
+ mes "A mushroom, big or small.";
+ mes "The petal of a pink flower.";
+ next;
+ mes "A pearl from the sea.";
+ mes "A spike; the harder, the better.";
+ mes "Some raw wood. One log should do.";
+ next;
+ mes "An antenna. Preferably pink.";
+ mes "The tongues of four different snakes.";
+ mes "A key to a treasure chest.";
+ next;
+ mes "A pile of ash.";
+ mes "Four different herbs.";
+ mes "A bug, or part of one.";
+ next;
+ mes "A lamp for the dark.";
+ mes "Rock and metal, as one.";
+ mes "Three different deaths dealt by three different scorpions.";
+ next;
+ mes "The womb that gives birth to butterflies.";
+ mes "The gentle caress of a creature without blemish.";
+ mes "A single piece of darkness.";
+ next;
+ mes "And a bottle's worth of water.";
+ mes "";
+ mes "You begin to wonder if you read that list right.";
+ next;
+ if (@state != 0)
+ goto L_close;
+ @state = 1;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_close:
+ @state = 0;
+ close;
+
+S_Update_Mask:
+ QUEST_Hurnscald = (QUEST_Hurnscald & ~(NIBBLE_2_MASK)) | (@state << NIBBLE_2_SHIFT);
+ return;
+}
diff --git a/npc/018-3/evil-obelisk.txt b/npc/018-3/evil-obelisk.txt
new file mode 100644
index 00000000..071936d2
--- /dev/null
+++ b/npc/018-3/evil-obelisk.txt
@@ -0,0 +1,30 @@
+
+018-3,67,28,0 script Evil Obelisk NPC185,{
+ if (getq(Quest_Reapercry) == 3) {
+ mesc l("We've already seen such obelisk before... Do you want to sacrifice %d %s?", .souls, getitemlink(Soul));
+ if (countitem(Soul) >= .souls) {
+ next;
+ if (askyesno() == ASK_YES) {
+ delitem Soul, .souls;
+ warp "099-7", 95, 31;
+ closeclientdialog;
+ close;
+ }
+ }
+ }
+ @map$ = "018-3";
+ @x0 = 56;
+ @y0 = 22;
+ @x1 = 77;
+ @y1 = 37;
+ callfunc "EvilObelisk";
+ @map$ = "";
+ @x0 = 0;
+ @y0 = 0;
+ @x1 = 0;
+ @y1 = 0;
+ close;
+OnInit:
+ .souls=25;
+ end;
+}
diff --git a/npc/018-3/mapflags.txt b/npc/018-3/mapflags.txt
new file mode 100644
index 00000000..22d2f40e
--- /dev/null
+++ b/npc/018-3/mapflags.txt
@@ -0,0 +1 @@
+//018-3 mapflag resave 018-2,88,32
diff --git a/npc/018-3/sword.txt b/npc/018-3/sword.txt
new file mode 100644
index 00000000..5ee19c82
--- /dev/null
+++ b/npc/018-3/sword.txt
@@ -0,0 +1,10 @@
+018-3,71,127,0 script #DemonSword#_M NPC400,{
+ if (getskilllv(SKILL_MAGIC))
+ goto L_message;
+ close;
+
+L_message:
+ mes "[Sword in Rock]";
+ mes "\"Ouch... my head...\"";
+ close;
+}
diff --git a/npc/019-1/_import.txt b/npc/019-1/_import.txt
new file mode 100644
index 00000000..b6018c04
--- /dev/null
+++ b/npc/019-1/_import.txt
@@ -0,0 +1,7 @@
+// Map 019-1: snow Field
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/019-1/_mobs.txt",
+"npc/019-1/_warps.txt",
+"npc/019-1/mapflags.txt",
+"npc/019-1/santa_helper.txt",
+"npc/019-1/snowman.txt",
diff --git a/npc/019-1/_mobs.txt b/npc/019-1/_mobs.txt
new file mode 100644
index 00000000..639a42fd
--- /dev/null
+++ b/npc/019-1/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 019-1: snow Field mobs
+019-1,0,0,0,0 monster Fluffy 1020,50,100000,30000
+019-1,0,0,0,0 monster Reinboo 1094,4,100000,30000
+019-1,0,0,0,0 monster White Bell 1095,5,100000,30000
+019-1,0,0,0,0 monster Santaboo 1112,4,100000,30000
diff --git a/npc/019-1/_warps.txt b/npc/019-1/_warps.txt
new file mode 100644
index 00000000..944982d1
--- /dev/null
+++ b/npc/019-1/_warps.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 019-1: snow Field warps
+019-1,70,21,0 warp #019-1_70_21 3,0,020-1,70,127
+019-1,96,40,0 warp #019-1_96_40 0,0,019-3,98,30
+019-1,38,75,0 warp #019-1_38_75 0,0,019-3,39,101
+019-1,21,70,0 warp #019-1_21_70 0,1,033-1,118,69
diff --git a/npc/019-1/mapflags.txt b/npc/019-1/mapflags.txt
new file mode 100644
index 00000000..e6de9fb1
--- /dev/null
+++ b/npc/019-1/mapflags.txt
@@ -0,0 +1 @@
+//019-1 mapflag resave 020-1,52,118
diff --git a/npc/019-1/santa_helper.txt b/npc/019-1/santa_helper.txt
new file mode 100644
index 00000000..4b120682
--- /dev/null
+++ b/npc/019-1/santa_helper.txt
@@ -0,0 +1,92 @@
+
+019-1,74,75,0 script Santa's Helper NPC105,{
+ callfunc "XmasStates";
+
+ if (($@xmas_time) && (@xmas_sh_done)) goto L_Done;
+ if ($@xmas_time) goto L_Quest;
+
+ mes "[Santa's Helper]";
+ mes "\"Ah, isn't it peaceful here? Around Christmas time we always have problems with some slimy monsters.";
+ mes "They steal the presents boxes. I think they feel attracted by the spiritual power of the Christmas presents.\"";
+ next;
+ mes "He smiles happily.";
+ mes "[Santa's Helper]";
+ mes "\"But at this time of the year everything's calm and relaxing.\"";
+ goto L_close;
+
+L_Quest:
+ mes "[Santa's Helper]";
+ mes "\"Hello my young friend.";
+ mes "Would you like to help me?\"";
+ next;
+ mes "[Santa's Helper]";
+ mes "\"Those monsters stole Santa's presents.";
+ mes "If you help me, I'll give you something very nice\"";
+ next;
+ goto L_Menu;
+
+L_Menu:
+ menu
+ "I have some present boxes", L_Yes,
+ "Hmm, see you later", L_No,
+ "What you need exactly?", L_Help;
+
+L_Yes:
+ mes "[Santa's Helper]";
+ mes "\"Hmm, let me check what you have.\"";
+ next;
+ if (countitem("PurplePresentBox") < $@xmas_sh_purple_amount)
+ goto L_NoItem;
+ if (countitem("BluePresentBox") < $@xmas_sh_blue_amount)
+ goto L_NoItem;
+ if (countitem("GreenPresentBox") < $@xmas_sh_green_amount)
+ goto L_NoItem;
+ getinventorylist;
+ @SantasHelper_Reward$ = $@SantasHelper_Annual_Reward$[ rand(getarraysize($@SantasHelper_Annual_Reward$)) ];
+ if ((@inventorylist_count > 99) || (checkweight(@SantasHelper_Reward$, 1) == 0))
+ goto L_TooMany;
+ mes "[Santa's Helper]";
+ mes "\"Great! Here is something for you\"";
+ delitem "PurplePresentBox", $@xmas_sh_purple_amount;
+ delitem "BluePresentBox", $@xmas_sh_blue_amount;
+ delitem "GreenPresentBox", $@xmas_sh_green_amount;
+ getitem @SantasHelper_Reward$, 1;
+ @SantasHelper_Reward$ = "";
+ XMASTIME = XMASTIME | $@xmas_sh_bit;
+ @karma_bonus = $@xmas_karma_bonus;
+ callfunc "XmasNice";
+ goto L_close;
+
+L_Help:
+ mes "[Santa's Helper]";
+ mes "\"I need:";
+ mes $@xmas_sh_purple_amount + " Purple Present Boxes";
+ mes $@xmas_sh_blue_amount + " Blue Present Boxes";
+ mes $@xmas_sh_green_amount + " Green Present Boxes\"";
+ next;
+ goto L_Menu;
+
+L_No:
+ mes "[Santa's Helper]";
+ mes "\"Enjoy your holidays and I wish you a happy Christmas!\"";
+ goto L_close;
+
+L_NoItem:
+ mes "[Santa's Helper]";
+ mes "\"You dont seem to have enough presents.\"";
+ goto L_close;
+
+L_Done:
+ mes "[Santa's Helper]";
+ mes "\"All the children got their Christmas presents.";
+ mes "Thank you for your help.\"";
+ goto L_close;
+
+L_TooMany:
+ mes "[Santa's Helper]";
+ mes "\"It doesn't look like you have room for this. Come back later.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/019-1/snowman.txt b/npc/019-1/snowman.txt
new file mode 100644
index 00000000..8fbdf683
--- /dev/null
+++ b/npc/019-1/snowman.txt
@@ -0,0 +1,84 @@
+
+019-1,77,44,0 script Snowman NPC129,{
+ if (FLAGS & FLAG_SNOWMAN) goto L_Done;
+ if (gettime(6) == 12 || gettime(6) == 1 || gettime(6) == 2) goto L_Quest;
+
+ mes "A beautiful snowman. It looks almost alive.";
+ mes "Maybe the magic of Christmas time will breath life into it?";
+ goto L_close;
+
+L_Quest:
+ @candy_amount = 15;
+ @chocolate_amount = 10;
+ @cactus_amount = 5;
+
+ mes "[Snowman]";
+ mes "\"Hello there.";
+ mes "Would you like a Christmas hat?\"";
+ next;
+ goto L_Menu;
+
+L_Menu:
+ menu
+ "Yes", L_Sure,
+ "No", L_Next,
+ "What do you need?", L_Need;
+
+L_Next:
+ mes "[Snowman]";
+ mes "\"Well, thats too bad, but make sure to have the holiday spirit!\"";
+ goto L_close;
+
+L_Sure:
+ mes "[Snowman]";
+ mes "\"Hmm, let me see what you have.\"";
+ next;
+ if(countitem("Candy") < @candy_amount)
+ goto L_NoItem;
+ if(countitem("ChocolateBar") < @chocolate_amount)
+ goto L_NoItem;
+ if(countitem("CactusPotion") < @cactus_amount)
+ goto L_NoItem;
+ getinventorylist;
+ if (@inventorylist_count > 99)
+ goto L_TooMany;
+ delitem "Candy", @candy_amount;
+ delitem "ChocolateBar", @chocolate_amount;
+ delitem "CactusPotion", @cactus_amount;
+ mes "[Snowman]";
+ mes "\"Here you go, enjoy your new hat!\"";
+ getitem "SantaHat", 1;
+ FLAGS = FLAGS | FLAG_SNOWMAN;
+ goto L_close;
+
+L_Need:
+ mes "[Snowman]";
+ mes "\"For this special hat, I need a pint of magic and a little help.";
+ mes "Just kidding. I would like to get some food:";
+ mes @candy_amount + " pieces of Candy";
+ mes @chocolate_amount + " Chocolate Bars";
+ mes @cactus_amount + " Cactus Potions\"";
+ next;
+ goto L_Menu;
+
+L_NoItem:
+ mes "[Snowman]";
+ mes "\"Well, I am interested in some food and you don't have enought to get a hat.\"";
+ goto L_close;
+
+L_Done:
+ mes "[Snowman]";
+ mes "\"Thank you for your help!\"";
+ goto L_close;
+
+L_TooMany:
+ mes "[Snowman]";
+ mes "\"It doesn't look like you have room for this. Come back later.\"";
+ goto L_close;
+
+L_close:
+ @candy_amount = 0;
+ @chocolate_amount = 0;
+ @cactus_amount = 0;
+ close;
+}
diff --git a/npc/019-3/_import.txt b/npc/019-3/_import.txt
new file mode 100644
index 00000000..f090cc9a
--- /dev/null
+++ b/npc/019-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 019-3: Snow Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/019-3/_mobs.txt",
+"npc/019-3/_warps.txt",
+"npc/019-3/mapflags.txt",
diff --git a/npc/019-3/_mobs.txt b/npc/019-3/_mobs.txt
new file mode 100644
index 00000000..a8c058eb
--- /dev/null
+++ b/npc/019-3/_mobs.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 019-3: Snow Cave mobs
+019-3,0,4,0,0 monster Moggun 1061,10,100000,30000
+019-3,0,4,0,0 monster Bat 1017,50,100000,30000
diff --git a/npc/019-3/_warps.txt b/npc/019-3/_warps.txt
new file mode 100644
index 00000000..16773290
--- /dev/null
+++ b/npc/019-3/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 019-3: Snow Cave warps
+019-3,40,102,0 warp #019-3_40_102 0,0,019-1,37,74
+019-3,98,29,0 warp #019-3_98_29 0,0,019-1,96,39
+019-3,80,103,0 warp #019-3_80_103 0,0,030-3,54,70
diff --git a/npc/019-3/mapflags.txt b/npc/019-3/mapflags.txt
new file mode 100644
index 00000000..7c077633
--- /dev/null
+++ b/npc/019-3/mapflags.txt
@@ -0,0 +1 @@
+//019-3 mapflag resave 020-1,52,118
diff --git a/npc/019-4/_import.txt b/npc/019-4/_import.txt
new file mode 100644
index 00000000..83f8041d
--- /dev/null
+++ b/npc/019-4/_import.txt
@@ -0,0 +1,5 @@
+// Map 019-4: Snow Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/019-4/_mobs.txt",
+"npc/019-4/_warps.txt",
+"npc/019-4/mapflags.txt",
diff --git a/npc/019-4/_mobs.txt b/npc/019-4/_mobs.txt
new file mode 100644
index 00000000..ad23e627
--- /dev/null
+++ b/npc/019-4/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 019-4: Snow Cave mobs
+019-4,0,0,0,0 monster Moggun 1061,12,45000,30000
+019-4,47,67,7,4 monster White Slime 1093,5,45000,45000
+019-4,0,0,0,0 monster Bat 1017,15,45000,25000
+019-4,0,0,0,0 monster Blue Slime 1091,7,45000,30000
diff --git a/npc/019-4/_warps.txt b/npc/019-4/_warps.txt
new file mode 100644
index 00000000..dffd7b5c
--- /dev/null
+++ b/npc/019-4/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 019-4: Snow Cave warps
+019-4,74,28,0 warp #019-4_74_28 0,0,047-1,154,93
+019-4,25,124,0 warp #019-4_25_124 1,0,046-1,62,27
diff --git a/npc/019-4/mapflags.txt b/npc/019-4/mapflags.txt
new file mode 100644
index 00000000..da86fd49
--- /dev/null
+++ b/npc/019-4/mapflags.txt
@@ -0,0 +1 @@
+//019-4 mapflag resave 020-1,52,118
diff --git a/npc/020-1/KrickKrackKrock.txt b/npc/020-1/KrickKrackKrock.txt
new file mode 100644
index 00000000..8e5db810
--- /dev/null
+++ b/npc/020-1/KrickKrackKrock.txt
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/npc/020-1/_import.txt b/npc/020-1/_import.txt
new file mode 100644
index 00000000..15453fc5
--- /dev/null
+++ b/npc/020-1/_import.txt
@@ -0,0 +1,10 @@
+// Map 020-1: Nivalis
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/020-1/KrickKrackKrock.txt",
+"npc/020-1/_mobs.txt",
+"npc/020-1/_warps.txt",
+"npc/020-1/mapflags.txt",
+"npc/020-1/rockscissor.txt",
+"npc/020-1/soul-menhir.txt",
+"npc/020-1/traveler.txt",
+"npc/020-1/well.txt",
diff --git a/npc/020-1/_mobs.txt b/npc/020-1/_mobs.txt
new file mode 100644
index 00000000..bebd0ea2
--- /dev/null
+++ b/npc/020-1/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 020-1: Nivalis mobs
+020-1,0,0,0,0 monster White Bell 1095,3,100000,30000
diff --git a/npc/020-1/_warps.txt b/npc/020-1/_warps.txt
new file mode 100644
index 00000000..cbcccd31
--- /dev/null
+++ b/npc/020-1/_warps.txt
@@ -0,0 +1,12 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 020-1: Nivalis warps
+020-1,76,38,0 warp #020-1_76_38 2,0,020-3,31,26
+020-1,47,48,0 warp #020-1_47_48 0,0,020-2,35,35
+020-1,66,52,0 warp #020-1_66_52 0,0,020-2,82,70
+020-1,64,82,0 warp #020-1_64_82 0,0,020-2,137,32
+020-1,86,46,0 warp #020-1_86_46 0,0,020-2,42,73
+020-1,57,91,0 warp #020-1_57_91 0,0,020-2,75,23
+020-1,70,128,0 warp #020-1_70_128 3,0,019-1,70,22
+020-1,107,55,0 warp #020-1_107_55 0,0,031-1,38,55
+020-1,59,45,0 warp #020-1_59_45 0,0,020-2,137,68
+020-1,33,93,0 warp #020-1_33_93 0,0,030-2,88,50
diff --git a/npc/020-1/mapflags.txt b/npc/020-1/mapflags.txt
new file mode 100644
index 00000000..b722e682
--- /dev/null
+++ b/npc/020-1/mapflags.txt
@@ -0,0 +1,2 @@
+//020-1 mapflag town
+//020-1 mapflag resave 020-1,52,118
diff --git a/npc/020-1/rockscissor.txt b/npc/020-1/rockscissor.txt
new file mode 100644
index 00000000..384ee9a8
--- /dev/null
+++ b/npc/020-1/rockscissor.txt
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/npc/020-1/soul-menhir.txt b/npc/020-1/soul-menhir.txt
new file mode 100644
index 00000000..7075fdcf
--- /dev/null
+++ b/npc/020-1/soul-menhir.txt
@@ -0,0 +1,15 @@
+
+020-1,63,89,0 script Soul Menhir#nivalis NPC346,{
+ @map$ = "020-1";
+ setarray @Xs, 62, 63, 64, 62, 64, 62, 64;
+ setarray @Ys, 88, 88, 88, 89, 89, 90, 90;
+ @x = 0;
+ @y = 0;
+ callfunc "SoulMenhir";
+ @map$ = "";
+ cleararray @Xs[0], 0, 7;
+ cleararray @Ys[0], 0, 7;
+ @x = 0;
+ @y = 0;
+ close;
+}
diff --git a/npc/020-1/traveler.txt b/npc/020-1/traveler.txt
new file mode 100644
index 00000000..68dc9403
--- /dev/null
+++ b/npc/020-1/traveler.txt
@@ -0,0 +1,6 @@
+020-1,57,123,0 script Knox the Traveler NPC103,{
+ @npcname$ = "Knox";
+ @NpcTravelBit = $@nivalis_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/020-1/well.txt b/npc/020-1/well.txt
new file mode 100644
index 00000000..4146200a
--- /dev/null
+++ b/npc/020-1/well.txt
@@ -0,0 +1,103 @@
+
+020-1,99,83,0 script #Well NPC400,{
+ if(QL_WELL == 2) goto L_Finished;
+
+ mes "...";
+ menu
+ "Throw something in the well.", L_Throw,
+ "Leave it alone.", L_close;
+
+L_Throw:
+ mes "What do you want to throw?";
+
+ setarray @response_list$, "Yuck! Who threw that on me?", "Ouch! Who's hurting me?", "White powder!? What's going on up there?", "It's raining in Nivalis?!";
+ setarray @item_list$, "MaggotSlime", "RawLog", "PileOfAsh", "BottleOfWater";
+ menu
+ "Maggot slime", L_CheckItem,
+ "A raw log", L_CheckItem,
+ "Pile of ash", L_CheckItem,
+ "Bottle of water", L_CheckItem,
+ "Leave it alone", L_close;
+
+L_CheckItem:
+ @index = @menu - 1;
+ @response$ = @response_list$[@index];
+ @item$ = @item_list$[@index];
+
+ mes @item$;
+
+ if(countitem(@item$) == 0)
+ goto L_MissingItem;
+ delitem @item$, 1;
+
+ if(@item$ == "BottleOfWater")
+ getitem "EmptyBottle", 1;
+
+ mes "[Mysterious voice inside the well]";
+ mes "\"" + @response$ + "\"";
+ next;
+ menu
+ "Who are you?", L_Who,
+ "How did you get down there?", L_How,
+ "Do you need help?", L_Help;
+
+L_Who:
+ @response$ = "I'll talk about who I am after leaving the well. ";
+ goto L_GetHelp;
+
+L_How:
+ @response$ = "Well, someone pushed me into the well, I'm not sure who. ";
+ goto L_GetHelp;
+
+L_Help:
+ @response$ = "I certainly can't get out on my own. ";
+ goto L_GetHelp;
+
+L_GetHelp:
+ mes "[Mysterious voice inside the well]";
+ mes "\"" + @response$ + "So if you can get some help for me... please do so!\"";
+ QL_WELL = 1;
+
+ cleararray @response_list$, "", 4;
+ cleararray @item_list$, "", 4;
+ @index = 0;
+ @response$ = "";
+
+ goto L_close;
+
+L_MissingItem:
+ mes "You can't throw something you don't have.";
+ goto L_close;
+
+L_Finished:
+ mes "This is a well.";
+ goto L_close;
+
+L_close:
+ close;
+}
+
+020-2,100,28,0 script Miler NPC100,{
+ mes "[Miler]";
+ mes "\"Hello!\"";
+
+ if(QL_WELL != 1) goto L_close;
+ menu
+ "Hello.", L_close,
+ "Hello, Can you help me?", L_Help;
+
+L_Help:
+ mes "[Miler]";
+ mes "\"What's the problem?\"";
+ menu "Someone fell into the well.", L_Next;
+
+L_Next:
+ mes "[Miler]";
+ mes "\"Ho! I'll help him!\"";
+ getexp (BaseLevel * 111), 0;
+ QL_WELL = 2;
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/020-2/_import.txt b/npc/020-2/_import.txt
new file mode 100644
index 00000000..62b2af2d
--- /dev/null
+++ b/npc/020-2/_import.txt
@@ -0,0 +1,8 @@
+// Map 020-2: Nivalis Indoor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/020-2/_warps.txt",
+"npc/020-2/baktar.txt",
+"npc/020-2/banker.txt",
+"npc/020-2/furquest.txt",
+"npc/020-2/mapflags.txt",
+"npc/020-2/shops.txt",
diff --git a/npc/020-2/_warps.txt b/npc/020-2/_warps.txt
new file mode 100644
index 00000000..4ccb9c31
--- /dev/null
+++ b/npc/020-2/_warps.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 020-2: Nivalis Indoor warps
+020-2,35,36,0 warp #020-2_35_36 0,0,020-1,47,49
+020-2,74,23,0 warp #020-2_74_23 0,0,020-1,56,91
+020-2,137,33,0 warp #020-2_137_33 0,0,020-1,64,83
+020-2,42,74,0 warp #020-2_42_74 0,0,020-1,86,47
+020-2,82,71,0 warp #020-2_82_71 0,0,020-1,66,53
+020-2,137,69,0 warp #020-2_137_69 0,0,020-1,59,46
diff --git a/npc/020-2/baktar.txt b/npc/020-2/baktar.txt
new file mode 100644
index 00000000..a7f5c367
--- /dev/null
+++ b/npc/020-2/baktar.txt
@@ -0,0 +1,225 @@
+020-2,80,61,0 script Baktar NPC191,{
+ @npcname$ = "[Baktar]";
+
+ @BIT_KNOWHIM = 0;
+
+ @BIT_DESERTHAT = 1;
+ @MONEY_DESERTHAT = 1500;
+ @XP_DESERTHAT = 500;
+
+ @BIT_DESERTSHIRT = 2;
+ @MONEY_DESERTSHIRT = 1500;
+ @XP_DESERTSHIRT = 600;
+
+ @BIT_SERFHAT = 3;
+ @MONEY_SERFHAT = 800;
+ @XP_SERFHAT = 350;
+
+ @BIT_MS_TONGUE = 4;
+ @MONEY_MS_TONGUE = 800;
+ @XP_MS_TONGUE = 350;
+
+ @BIT_MS_EGG = 5;
+ @MONEY_MS_EGG = 800;
+ @XP_MS_EGG = 350;
+
+ @BIT_SNAKESKIN = 6;
+ @MONEY_SNAKESKIN = 800;
+ @XP_SNAKESKIN = 350;
+
+ @BIT_BUGLEG = 7;
+ @MONEY_BUGLEG = 20;
+ @XP_BUGLEG = 130;
+
+ @run = ((QUEST_NorthTulimshar & TWOBIT_8_MASK) >> TWOBIT_8_SHIFT);
+ if ((@run == 3) && (QL_KYLIAN == 13))
+ goto L_Deliver;
+ goto L_Start;
+
+L_Deliver:
+ menu
+ "I have a delivery for you", L_Delivery;
+
+L_Delivery:
+ mes "[Baktar]";
+ mes "\"Ahh my delivery from Tulimshar, how nice it is to get some comforts from back home.\"";
+ QL_KYLIAN = 14;
+ goto L_close;
+
+L_Start:
+
+ if(QL_BAKTAR & (1<<@BIT_KNOWHIM)) goto L_KnowAlready;
+ mes @npcname$;
+ mes "\"Hello, did you come from Tulimshar? Because you have a nice tan. \"";
+ menu
+ "Yes, I'm from Tulimshar", L_exotic,
+ "Well, I just like sunbathing", L_close,
+ "Good bye", L_close;
+
+L_KnowAlready:
+ mes @npcname$;
+ mes "\"I love Tulimshar's stuff. I'm collecting souvenirs from Tulimshar to help remind me of all the great times I had there. If you give me an interesting item from the area, I'll give you a nice reward. So, you have a new item?\"";
+ goto L_Startitem;
+
+L_exotic:
+ mes @npcname$;
+ mes "\"I said that because I love Tulimshar's stuff...I'm collecting souvenirs from Tulimshar to help remind me of all the great times I had there. If you give me an interesting item maybe I can give you a nice reward. But I don't need a lot, I just need one of each item.\"";
+ menu
+ "I have some items on me maybe you'll like them ", L_Startitem,
+ "Don't touch my stuff!", L_close,
+ "I'll get them. Bye.", L_close;
+
+L_Startitem:
+ setarray @exotic_item$, "", "", "", "", "", "", "";
+ @c = 0;
+ QL_BAKTAR = QL_BAKTAR | (1<<@BIT_KNOWHIM);
+ if (countitem("DesertHat") < 1 || QL_BAKTAR & (1<<@BIT_DESERTHAT) ) goto L_DesertShirt;
+ @exotic_item$[@c] = "a Desert Hat ?";
+ @menuid[@c] = 0;
+ @c = @c + 1;
+ goto L_DesertShirt;
+
+L_DesertShirt:
+ if (countitem("DesertShirt") < 1 || QL_BAKTAR & (1<<@BIT_DESERTSHIRT) ) goto L_SerfHat;
+ @exotic_item$[@c] = "a Desert Shirt ?";
+ @menuid[@c] = 1;
+ @c = @c + 1;
+ goto L_SerfHat;
+
+L_SerfHat:
+ if (countitem("SerfHat") < 1 || QL_BAKTAR & (1<<@BIT_SERFHAT) ) goto L_tongue;
+ @exotic_item$[@c] = "a Serf Hat ?";
+ @menuid[@c] = 2;
+ @c = @c + 1;
+ goto L_tongue;
+
+L_tongue:
+ if (countitem("MountainSnakeTongue") < 1 || QL_BAKTAR & (1<<@BIT_MS_TONGUE)) goto L_egg;
+ @exotic_item$[@c] = "a Mountain Snake Tongue ?";
+ @menuid[@c] = 3;
+ @c = @c + 1;
+ goto L_egg;
+
+L_egg:
+ if (countitem("MountainSnakeEgg") < 1 || QL_BAKTAR & (1<<@BIT_MS_EGG)) goto L_Skin;
+ @exotic_item$[@c] = "a Mountain Snake Egg?";
+ @menuid[@c] = 4;
+ @c = @c + 1;
+ goto L_Skin;
+
+L_Skin:
+ if (countitem("SnakeSkin") < 1 || QL_BAKTAR & (1<<@BIT_SNAKESKIN)) goto L_bugleg;
+ @exotic_item$[@c] = "a Snake Skin?";
+ @menuid[@c] = 5;
+ @c = @c + 1;
+ goto L_bugleg;
+
+L_bugleg:
+ if (countitem("BugLeg") < 1 || QL_BAKTAR & (1<<@BIT_BUGLEG)) goto L_NeverMind;
+ @exotic_item$[@c] = "a Bug Leg?";
+ @menuid[@c] = 6;
+ @c = @c + 1;
+ goto L_NeverMind;
+
+L_NeverMind:
+ @exotic_item$[@c] = "Nevermind";
+ @menuid[@c] = 6;
+ menu
+ @exotic_item$[0], L_MenuItems,
+ @exotic_item$[1], L_MenuItems,
+ @exotic_item$[2], L_MenuItems,
+ @exotic_item$[3], L_MenuItems,
+ @exotic_item$[4], L_MenuItems,
+ @exotic_item$[5], L_MenuItems,
+ @exotic_item$[6], L_MenuItems;
+
+L_MenuItems:
+ @menu = @menu -1;
+
+ if (@menuid[@menu] == 0) goto L_DesertHat_Item;
+ if (@menuid[@menu] == 1) goto L_DesertShirt_Item;
+ if (@menuid[@menu] == 2) goto L_SerfHat_Item;
+ if (@menuid[@menu] == 3) goto L_tongue_Item;
+ if (@menuid[@menu] == 4) goto L_egg_Item;
+ if (@menuid[@menu] == 5) goto L_skin_Item;
+ if (@menuid[@menu] == 6) goto L_BugLegItem;
+ mes @npcname$;
+ mes "\"Ok, goodbye then.\"";
+ close;
+
+L_DesertHat_Item:
+ if(QL_BAKTAR & (1<<@BIT_DESERTHAT)) goto L_havealready;
+ if (countitem("DesertHat") < 1) goto L_NoItem;
+ delitem "DesertHat", 1;
+ Zeny = Zeny + @MONEY_DESERTHAT;
+ getexp @XP_DESERTHAT,0;
+ QL_BAKTAR = QL_BAKTAR | (1<<@BIT_DESERTHAT);
+ close;
+
+L_DesertShirt_Item:
+ if(QL_BAKTAR & (1<<@BIT_DESERTSHIRT)) goto L_havealready;
+ if (countitem("DesertShirt") < 1) goto L_NoItem;
+ delitem "DesertShirt", 1;
+ Zeny = Zeny + @MONEY_DESERTSHIRT;
+ getexp @XP_DESERTSHIRT,0;
+ QL_BAKTAR = QL_BAKTAR | (1<<@BIT_DESERTSHIRT);
+ close;
+
+L_SerfHat_Item:
+ if(QL_BAKTAR & (1<<@BIT_SERFHAT)) goto L_havealready;
+ if (countitem("SerfHat") < 1) goto L_NoItem;
+ delitem "SerfHat", 1;
+ Zeny = Zeny + @MONEY_SERFHAT;
+ getexp @XP_SERFHAT,0;
+ QL_BAKTAR = QL_BAKTAR | (1<<@BIT_SERFHAT);
+ close;
+
+L_tongue_Item:
+ if(QL_BAKTAR & (1<<@BIT_MS_TONGUE)) goto L_havealready;
+ if (countitem("MountainSnakeTongue") < 1) goto L_NoItem;
+ delitem "MountainSnakeTongue", 1;
+ Zeny = Zeny + @MONEY_MS_TONGUE;
+ getexp @XP_MS_TONGUE,0;
+ QL_BAKTAR = QL_BAKTAR | (1<<@BIT_MS_TONGUE);
+ close;
+
+L_egg_Item:
+ if(QL_BAKTAR & (1<<@BIT_MS_EGG)) goto L_havealready;
+ if (countitem("MountainSnakeEgg") < 1) goto L_NoItem;
+ delitem "MountainSnakeEgg", 1;
+ Zeny = Zeny + @MONEY_MS_EGG;
+ getexp @XP_MS_EGG,0;
+ QL_BAKTAR = QL_BAKTAR | (1<<@BIT_MS_EGG);
+ close;
+
+L_skin_Item:
+ if(QL_BAKTAR & (1<<@BIT_SNAKESKIN)) goto L_havealready;
+ if (countitem("SnakeSkin") < 1) goto L_NoItem;
+ delitem "SnakeSkin", 1;
+ Zeny = Zeny + @MONEY_SNAKESKIN;
+ getexp @XP_SNAKESKIN,0;
+ QL_BAKTAR = QL_BAKTAR | (1<<@BIT_SNAKESKIN);
+ close;
+
+L_BugLegItem:
+ if(QL_BAKTAR & (1<<@BIT_BUGLEG)) goto L_havealready;
+ if (countitem("BugLeg") < 1) goto L_NoItem;
+ delitem "BugLeg", 1;
+ Zeny = Zeny + @MONEY_BUGLEG;
+ getexp @XP_BUGLEG,0;
+ QL_BAKTAR = QL_BAKTAR | (1<<@BIT_BUGLEG);
+ close;
+
+L_NoItem:
+ mes @npcname$;
+ mes "\"Well, if you happen to get items from Tulimshar, see me first before you sell anything.\"";
+ close;
+
+L_havealready:
+ mes @npcname$;
+ mes "\"I already collected what you can offer me.\"";
+ close;
+
+L_close:
+ close;
+}
diff --git a/npc/020-2/banker.txt b/npc/020-2/banker.txt
new file mode 100644
index 00000000..69f5a48f
--- /dev/null
+++ b/npc/020-2/banker.txt
@@ -0,0 +1,16 @@
+020-2,132,64,0 script Ben NPC193,{
+ @npcname$ = "Ben";
+ callfunc "Banker";
+ close;
+}
+
+020-2,127,63,0 script Maria NPC190,{
+ mes "[Maria]";
+ mes "\"Hello!";
+ mes "\"Isn't it great?\"";
+ next;
+ mes "\"Nivalis has increased trade with merchants from Thermin in the west and the barbarian tribe who live in the mountains northwest of here.\"";
+ next;
+ mes "\"That's why this office was built.\"";
+ close;
+}
diff --git a/npc/020-2/furquest.txt b/npc/020-2/furquest.txt
new file mode 100644
index 00000000..6cae2f62
--- /dev/null
+++ b/npc/020-2/furquest.txt
@@ -0,0 +1,646 @@
+
+020-2,34,26,0 script Agostine Debug NPC137,{
+ mes "[Agostine Debug]";
+ mes "What do you want to do?";
+ menu
+ "Show Quest State", L_ShowState,
+ "Set Quest State", L_SetState,
+ "Reset", L_Reset,
+ "Nothing.", L_close;
+
+L_ShowState:
+ @wg_state = ((QUEST_WG_state & BYTE_0_MASK) >> BYTE_0_SHIFT);
+ mes "Current State is " + @wg_state;
+ goto L_close;
+
+L_SetState:
+ mes "What state do you want?";
+ input @wg_state;
+ callfunc "setWGState";
+ mes "Set to " + @wg_state;
+ goto L_close;
+
+L_Reset:
+ @wg_state = 0;
+ callfunc "setWGState";
+ mes "Reset!";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "Agostine Debug";
+ end;
+}
+020-2,37,26,0 script Agostine NPC137,{
+ @CUTFUR_EXP = 10;
+ @FINEDRESS_COTTON_CLOTHS = 20;
+ @FINEDRESS_GP = 20000;
+ @wg_state = ((QUEST_WG_state & BYTE_0_MASK) >> BYTE_0_SHIFT);
+
+
+ if (@wg_state == 1) goto L_State_0_3;
+ if (@wg_state == 2) goto L_State_1;
+ if (@wg_state == 3) goto L_State_2;
+ if (@wg_state == 4) goto L_State_4;
+ if (@wg_state == 5) goto L_State_4_success;
+ if (@wg_state == 6) goto L_State_6;
+ if (@wg_state == 7) goto L_State_11;
+ if (@wg_state == 8) goto L_State_12;
+ if (@wg_state >= 9 && @wg_state < 11) goto L_State_13;
+ if (@wg_state == 11) goto L_State_14;
+ if (@wg_state == 12) goto L_State_14_AA;
+ if (@wg_state == 13) goto L_State_15;
+ if (@wg_state > 13 && @wg_state < 16) goto L_State_15_Repeat;
+ if (@wg_state == 16) goto L_State_16;
+ if (@wg_state > 16 && @wg_state < 20) goto L_State_16_Repeat;
+ if (@wg_state == 20) goto L_State_17;
+ if (@wg_state == 21) goto L_State_17_AskItems;
+ if (@wg_state == 22) goto L_State_17_PBD;
+ if (@wg_state >= 23) goto L_State_18;
+
+ mes "\"This goes up, this goes left...\"";
+ next;
+ mes "\"Mmmm...?\"";
+ next;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Oh, a customer! Let me introduce myself! My name is Agostine!";
+ mes "Some people say that I am the best tailor in the world,";
+ mes "but I think I am the best one in the universe!";
+ mes "So, What can I do for you, my friend?\"";
+ next;
+ menu
+ "I want something new for my wardrobe!", L_State_0_1,
+ "Oh, nothing, thanks!", L_close;
+
+
+L_State_0_1:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Well.. you know... working so hard makes me so tired!";
+ mes "Can you bring me something tasty to drink, my friend?\"";
+ next;
+ menu
+ "Sure, what kind of drink you like?", L_State_0_2,
+ "I'm not your waiter!", L_close;
+
+L_State_0_2:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Here we do not have a bar. Let me taste different beverages.";
+ mes "I want something new to drink.\"";
+ next;
+ menu
+ "I'll bring you different drinks to try!", L_State_Accept,
+ "Maybe a bar will open soon, wait for it.", L_close;
+
+L_State_Accept:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Thanks so much.\"";
+ @wg_state = 1;
+ callfunc "setWGState";
+ goto L_close;
+
+L_State_0_3:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Well, what have you brought me?\"";
+ next;
+ menu
+ "A Cactus Drink.", L_State_0_4,
+ "A Cactus Potion.", L_State_0_5,
+ "Some milk.", L_State_0_6,
+ "A pint of beer.", L_State_0_7,
+ "An Iron potion.", L_State_0_9,
+ "A Concentration Potion.", L_State_0_8,
+ "Nothing, at the moment.", L_close;
+
+L_State_0_4:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"So, a Cactus Drink?\"";
+ if (countitem("CactusDrink") < 1) goto L_State_neg;
+ delitem "CactusDrink", 1;
+ goto L_State_bad;
+
+L_State_0_5:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"So, a Cactus Potion?\"";
+ if (countitem("CactusPotion") < 1) goto L_State_neg;
+ delitem "CactusPotion", 1;
+ goto L_State_bad;
+
+L_State_0_6:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"So, some milk for me?\"";
+ if (countitem("Milk") < 1) goto L_State_neg;
+ delitem "Milk", 1;
+ goto L_State_bad;
+
+L_State_0_7:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"So, a beer?\"";
+ if (countitem("Beer") < 1) goto L_State_neg;
+ delitem "Beer", 1;
+ goto L_State_bad;
+
+L_State_0_8:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"So, a Concentration Potion?\"";
+ if (countitem("ConcentrationPotion") < 1) goto L_State_neg;
+ delitem "ConcentrationPotion", 1;
+ goto L_State_bad;
+
+L_State_0_9:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"So, an Iron Potion?\"";
+ if (countitem("IronPotion") < 1) goto L_State_neg;
+ delitem "IronPotion", 1;
+ next;
+ mes "Agostine looks pleased as he drinks the potion.";
+ next;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Oh! This is damn good! I feel a new man, my friend!\"";
+ next;
+ Zeny = Zeny + 500;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"This is a little reward for your help. Take 500 GP, my friend!\"";
+ @wg_state = 2;
+ callfunc "setWGState";
+ goto L_close;
+
+L_State_neg:
+ next;
+ mes "\"Seems that you lied. You don't have the drink you told me.\"";
+ goto L_close;
+
+L_State_bad:
+ next;
+ mes "\"Well, I don't like it so much. Bring me something else.\"";
+ goto L_close;
+
+
+L_State_1:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Mmmm... Let me see... This year light colours are fashionable!";
+ mes "Would you like a pair of snow-white Winter Gloves?\"";
+ next;
+ menu
+ "No, thanks. I love dark clothes...", L_close,
+ "You really can do this for me?", L_State_2;
+
+L_State_2:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Well, Winter Gloves are so fashionable for their lovable fur!";
+ mes "Only the best furs can be used for these gloves!";
+ mes "But, as you see, I am a tailor, not a hunter! So, why don't you bring me the best fluffy's fur you can find?\"";
+ @wg_state = 3;
+ callfunc "setWGState";
+ next;
+ menu
+ "You are crazy! I won't kill any animal for this!", L_close,
+ "Sure, I will be back soon!", L_State_3;
+
+L_State_3:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Remember, I want the best of fur!\"";
+ @wg_state = 4;
+ callfunc "setWGState";
+ goto L_close;
+
+L_State_4:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Oh, my friend! Have you brought me some good furs?\"";
+ if (countitem("WhiteFur") < 1) goto L_close;
+ next;
+ menu
+ "Here, take a look!", L_State_4_try,
+ "Yes, but I need it for something else.", L_close;
+
+L_State_4_try:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Let me see, my friend! It needs to be perfect for my gloves!\"";
+ mes "Agostine examines the patch of fur.";
+ next;
+ if (countitem("WhiteFur") < 1) goto L_No_Fur;
+ delitem "WhiteFur", 1;
+ @Temp1 = rand(30);
+ if (@Temp1 == 0) goto L_State_4_success;
+ mes "Agostine throws away the white fur.";
+ getexp @CUTFUR_EXP, 0;
+ next;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"It was awfully cut! You should pay more attention when you kill fluffies!\"";
+ if (countitem("WhiteFur") < 1) goto L_close;
+ next;
+ menu
+ "Here I have another one!", L_State_4_try,
+ "Sorry, I will be careful...", L_close;
+
+L_State_4_success:
+ mes "Agostine breaks into a smile";
+ next;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"It's perfect! Perfect! Good job, my friend! I will prepare your gloves right now!\"";
+ next;
+ @wg_state = 5;
+ callfunc "setWGState";
+ goto L_State_5;
+
+L_State_5:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Ehm, my friend, my work is not free. I need 15,000 GP for the work.\"";
+ next;
+ menu
+ "You are not a tailor, you are a thief!!", L_close,
+ "I think it's a reasonable price...", L_State_5_pay;
+
+L_State_5_pay:
+ if (Zeny < 15000) goto L_State_5_nocash;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_TooMany;
+ Zeny = Zeny - 15000;
+ getitem "WinterGloves", 1;
+ @wg_state = 6;
+ callfunc "setWGState";
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Here they are. You will have the most fashionable hands in the world!\"";
+ goto L_close;
+
+L_State_5_nocash:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Seems like you are out of cash. Come back when you have the money.\"";
+ goto L_close;
+
+L_State_6:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Oh, I remember you! Your gloves are sooo fashionable, my friend!";
+ mes "Well, I have a good news for you. In this issue of 'TMW Fashion'";
+ mes "I saw a pretty accessory, a pair of Furry Boots, my friend.";
+ mes "I can make your own pair, if you want!\"";
+ next;
+ menu
+ "It's a great idea!", L_State_10,
+ "I'm glamourous enough, thanks", L_close;
+
+L_State_10:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Perfect! For satisfying your request I need another perfect White Fur";
+ mes "and a pair of Boots, like those you can find in the mines.";
+ mes "They will make you lovely, my friend!\"";
+ @wg_state = 7;
+ callfunc "setWGState";
+ goto L_close;
+
+L_State_11:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"So, my friend, have you brought me the right Fur?\"";
+ if (countitem("WhiteFur") < 1) goto L_close;
+ next;
+ menu
+ "Sure, I'm a fluffy hunter!", L_State_11_try,
+ "Not yet, sorry.", L_close;
+
+L_State_11_try:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"I'd rather see the patch of fur, first.\"";
+ next;
+ mes "Agostine examines the patch of fur.";
+ next;
+ if (countitem("WhiteFur") < 1) goto L_No_Fur;
+ delitem "WhiteFur", 1;
+ @Temp2 = rand(30);
+ if (@Temp2 == 0) goto L_State_11_success;
+ mes "Agostine rips the white fur.";
+ getexp @CUTFUR_EXP, 0;
+ next;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"That fur was terrible. I won't work with it!\"";
+ if (countitem("WhiteFur") < 1) goto L_close;
+ next;
+ menu
+ "Well, maybe this is better!", L_State_11_try,
+ "I will hunt other fluffies...", L_close;
+
+L_State_11_success:
+ mes "Agostine breaks into a smile";
+ next;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"This one is good enough, my friend. Good job.\"";
+ @wg_state = 8;
+ callfunc "setWGState";
+ goto L_State_12;
+
+L_State_12:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"I need also a pair of Boots for the work.";
+ mes "And my payment, obviously. 15,000 GP is right.\"";
+ next;
+ menu
+ "Sure, here it all is.", L_State_12_pay,
+ "I missed something, I will be back soon!", L_close;
+
+L_State_12_pay:
+ if (Zeny < 15000) goto L_State_12_missing;
+ if (countitem("Boots") < 1) goto L_State_12_missing;
+ // No inventory check needed, as boots are removed, opening a slot
+ Zeny = Zeny - 15000;
+ delitem "Boots", 1;
+ getitem "FurBoots", 1;
+ @wg_state = 9;
+ callfunc "setWGState";
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Enjoy your new boots, my friend!\"";
+ goto L_close;
+
+L_State_12_missing:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Seems you have forgotten something. Check your inventory";
+ mes "and your pockets!\"";
+ goto L_close;
+
+L_State_13:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"You are so glamourous, my dear friend!";
+ mes "I have done a very good job on your clothes!\"";
+ goto L_close;
+
+L_TooMany:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"You don't have anywhere to put them. Come back when you do.\"";
+ goto L_close;
+
+L_No_Fur:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"You don't have any white fur! Stop talking nonsense.\"";
+ goto L_close;
+
+L_State_14:
+ if (BaseLevel < 60)
+ goto L_State_13;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"You are so glamourous, my dear friend!";
+ mes "I have done a very good job on your clothes... But...\"";
+ next;
+
+ menu
+ "But?", L_Next;
+
+L_Next:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"There is a new fashion I've been dying to try out!";
+ mes "But I don't have all the knowledge in the world about seaming this wonderful fashion.\"";
+ next;
+
+ menu
+ "Ah, that's too bad...", L_close,
+ "I know another tailor who might know!", L_Next1;
+
+L_Next1:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"What tailor may that be?";
+ mes "I haven't been out of Nivalis for quite some time since I have been busy with clothes for the people of the town.";
+ mes "If you can tell me the name of this great tailor, maybe we can work something out, like a collaboration!\"";
+ next;
+
+ menu
+ "Well... There is a tailor in Dimond's Cove who makes pretty good clothing. Her name is Lora Tay.", L_Next2;
+
+L_Next2:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"I had almost forgotten about Lora Tay.";
+ mes "She has tried to put me out of business a few times long ago.";
+ mes "But I am willing to collaborate with her to make this fine fashion come alive.";
+ mes "Will you go ask her if she is willing to help sew and seam this fashion I will create?\"";
+
+ menu
+ "Sure thing! Be back soon.", L_State_14_Accept,
+ "It will never happen. I won't waste my time.", L_close;
+
+L_State_14_Accept:
+ @wg_state = 12;
+ callfunc "setWGState";
+ goto L_close;
+
+L_State_14_AA:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Please my friend, go talk to Lora Tay about our possible collaboration!\"";
+ goto L_close;
+
+L_State_15:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Hi there fashionable friend, have you talked to Lora Tay about my request?\"";
+ next;
+ menu
+ "Yes, but she would like to know more information about it and I'm kind of curious myself.", L_Next3,
+ "I haven't yet, sorry.", L_close;
+
+L_Next3:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Well I had a dream of a woman in a beautiful dress I would like to recreate from my dream...";
+ mes "But the thing is I have never sewn a dress this fabulous in my life!";
+ mes "This is why I wanted an experienced tailor to help me with it.\"";
+ next;
+
+ menu
+ "You must be thinking of fashion a lot if it's in your dreams! I shall bring this information to Lora Tay.", L_Next4,
+ "You're obsessed, I cant help you.", L_close;
+
+L_Next4:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Please take these materials with you to show Lora Tay the kind of vision I have!";
+ mes "These are the finest materials in my whole house and have been saving them for something special such as this.\"";
+ next;
+
+ message strcharinfo(0), "Agostine gives you bundles of luxurious cloth that you carefully put in your backpack.";
+ mes "Agostine gives you bundles of luxurious cloth that you carefully put in your backpack.";
+ next;
+
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Hurry back my friend!\"";
+
+ @wg_state = 14;
+ callfunc "setWGState";
+
+ goto L_close;
+
+L_State_15_Repeat:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Please take these materials with you to show Lora Tay the kind of vision I have!";
+ mes "Hurry back my friend!\"";
+ goto L_close;
+
+L_State_16:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Hello there! Did you tell Lora Tay about the type of fashion I was hoping to create?\"";
+ next;
+
+ menu
+ "Yes, she is also working on threading to sew the materials together.", L_Next5,
+ "Why would I do that for?", L_close;
+
+L_Next5:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Wow she did not only accept but she is willing to sew these materials for me?";
+ mes "This is amazing... I was quite worried I would ruin these fine cloths sewing them myself.\"";
+ next;
+
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Is there anything I can do in the meanwhile?\"";
+ next;
+ menu
+ "Actually she wanted the design drawings to know what it should look like.", L_Next6;
+
+L_Next6:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Of course! How could I forget, I drew the designs right after the dream I had.";
+ mes "Please take these to Lora Tay and ask her to try and make it as close as she can.\"";
+ next;
+
+ menu
+ "Sure thing be back soon!", L_Next7,
+ "... I'll take a nap first.", L_close;
+
+L_Next7:
+ @wg_state = 17;
+ callfunc "setWGState";
+
+ message strcharinfo(0), "Agostine gives you a folio containing his designs, that you put in a hidden compartment in your backpack.";
+ mes "Agostine gives you a folio containing his designs, that you put in a hidden compartment in your backpack.";
+
+ goto L_close;
+
+L_State_16_Repeat:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Please my friend, bring my designs to Lora Tay.\"";
+ goto L_close;
+
+L_State_17:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Wow is that the dress?";
+ mes "It looks fabulous...\"";
+ next;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"But I do notice it is missing something from my design.\"";
+ next;
+
+ menu
+ "Lora Tay mentioned the bottom has to be edged with cotton cloths but she cannot do the design you wanted.", L_Next8;
+
+L_Next8:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"That's fine. I will finish it with the cloth but it seems I don't have anymore around...\"";
+ next;
+
+ goto L_State_17_AskItems;
+
+L_State_17_AskItems:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"I will need about " + @FINEDRESS_COTTON_CLOTHS + " cotton cloths to finish this master piece. Do you think you can get some for me?\"";
+ next;
+
+ menu
+ "Sure thing, I will go get them!", L_Next9,
+ "Here you are!", L_State_17_GiveItems;
+
+L_Next9:
+ @wg_state = 21;
+ callfunc "setWGState";
+ goto L_close;
+
+L_State_17_NoItems:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"My friend, sorry to disappoint you, but you are lacking some cloth.";
+ mes "I need exactly " + @FINEDRESS_COTTON_CLOTHS + " cotton cloths to finish this master piece.\"";
+ goto L_close;
+
+L_State_17_GiveItems:
+ if (countitem ("CottonCloth") < @FINEDRESS_COTTON_CLOTHS)
+ goto L_State_17_NoItems;
+ delitem "CottonCloth", @FINEDRESS_COTTON_CLOTHS;
+ @wg_state = 22;
+ callfunc "setWGState";
+
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Great now just a little cloth here........\"";
+ next;
+ mes "............................";
+ next;
+ mes "...................";
+ next;
+ mes "..............";
+ next;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"It's finished!";
+ mes "The finest dress in my design is finally finished!\"";
+ next;
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"I don't know how I can repay you for all your hard work...\"";
+ next;
+
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Hmmm I know something that will be good for you and for myself!\"";
+ next;
+
+ menu
+ "What is it?", L_Next10;
+
+L_Next10:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"How about I let you buy the dress off me?";
+ mes "This will allow you to have a fine dress and allow me to show the world what I'm capable of.";
+ mes "I would charge " + @FINEDRESS_GP +" GP, which I think is a magnificent price for something this fine.\"";
+ next;
+
+ goto L_State_17_BuyDress;
+
+L_State_17_PBD:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Did you consider buying the dress off me?";
+ mes "I would charge " + @FINEDRESS_GP +" GP, which I think is a magnificent price for something this fine.\"";
+ next;
+
+ goto L_State_17_BuyDress;
+
+L_State_17_BuyDress:
+ menu
+ "Wow that sounds great I'll take it!", L_Next11,
+ "I'll think about it...", L_close;
+
+L_Next11:
+ if (Zeny < @FINEDRESS_GP)
+ goto L_State_17_NoMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_State_17_InvFull;
+
+ Zeny = Zeny - @FINEDRESS_GP;
+ getitem "FineDress", 1;
+ @wg_state = 23;
+ callfunc "setWGState";
+ goto L_close;
+
+L_State_17_NoMoney:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"Check your pockets my friend,";
+ mes "and come back when you have the money.\"";
+ goto L_close;
+
+L_State_17_InvFull:
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"My friend, you don't have room to carry my master piece. Come back when you do.\"";
+ goto L_close;
+
+L_State_18:
+ // Same dialog as on state 13, but we could add something about the dress
+ mes "[Agostine, The Legendary Tailor]";
+ mes "\"You are so glamourous, my dear friend!";
+ mes "I have done a very good job on your clothes!\"";
+ goto L_close;
+
+L_close:
+ @wg_state = 0;
+ close;
+}
+function script setWGState {
+ QUEST_WG_state = (QUEST_WG_state & ~(BYTE_0_MASK) | (@wg_state << BYTE_0_SHIFT));
+ return;
+}
diff --git a/npc/020-2/mapflags.txt b/npc/020-2/mapflags.txt
new file mode 100644
index 00000000..09eb87cf
--- /dev/null
+++ b/npc/020-2/mapflags.txt
@@ -0,0 +1,2 @@
+//020-2 mapflag town
+//020-2 mapflag resave 020-1,52,118
diff --git a/npc/020-2/shops.txt b/npc/020-2/shops.txt
new file mode 100644
index 00000000..b7dc3ec7
--- /dev/null
+++ b/npc/020-2/shops.txt
@@ -0,0 +1,57 @@
+
+020-2,85,28,0 script Taylor NPC137,{
+ mes "[Taylor]";
+ mes "\"While it can be dangerous up here in Kaizei, I take comfort that Nivalis is not surrounded by the Yeti like Thermin is. What a weird town.\"";
+ next;
+ mes "\"Around Christmas time, this place gets crazy, but most of the time Nivalis serves as a hub for adventurers and tourists that come to Kaizei.\"";
+ next;
+ mes "\"There caves around here can prove to be dangerous, be careful around here and bring friends if you should go into them..otherwise, it might spell your end.\"";
+ next;
+ mes "\"Well, pleasant journeys and I hope I haven't been too much of a bother. Good chatting with you.\"";
+ close;
+}
+020-2,35,65,0 script Bracco NPC135,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem IronArrow;
+ sellitem ShortBow;
+ sellitem Dagger;
+ sellitem LeatherShield;
+ .distance = 5;
+ end;
+}
+
+020-2,85,24,0 script Mede NPC103,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem CactusDrink;
+ sellitem CactusPotion;
+ sellitem IronPotion;
+ sellitem ConcentrationPotion;
+ sellitem SmallManaElixir, 120;
+ sellitem MediumManaElixir, 240;
+ sellitem LargeManaElixir, 480;
+ .distance = 5;
+ end;
+}
+
+020-2,137,23,0 script Kane NPC120,{
+ @npcname$ = "Kane the Inn Keeper";
+ @Cost = 100;
+
+ mes "[" + @npcname$ + "]";
+ mes "\"Welcome stranger!\"";
+ mes "\"What? You've already seen an INN like mine?\"";
+ mes "\"That's impossible!\"";
+ next;
+ callfunc "Inn";
+ close;
+}
diff --git a/npc/020-3/_import.txt b/npc/020-3/_import.txt
new file mode 100644
index 00000000..f4123c6b
--- /dev/null
+++ b/npc/020-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 020-3: Ice cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/020-3/_mobs.txt",
+"npc/020-3/_warps.txt",
+"npc/020-3/mapflags.txt",
diff --git a/npc/020-3/_mobs.txt b/npc/020-3/_mobs.txt
new file mode 100644
index 00000000..41d4126d
--- /dev/null
+++ b/npc/020-3/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 020-3: Ice cave mobs
+020-3,40,36,14,2 monster Bat 1017,1,100000,30000
+020-3,40,49,17,3 monster Pinkie 1018,1,100000,30000
+020-3,0,0,0,0 monster Bat 1017,20,0,0
+020-3,0,0,0,0 monster Pinkie 1018,10,0,0
diff --git a/npc/020-3/_warps.txt b/npc/020-3/_warps.txt
new file mode 100644
index 00000000..f1737405
--- /dev/null
+++ b/npc/020-3/_warps.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 020-3: Ice cave warps
+020-3,31,25,0 warp #020-3_31_25 0,0,020-1,76,37
+020-3,25,22,0 warp #020-3_25_22 0,0,020-3,97,101
+020-3,97,99,0 warp #020-3_97_99 0,0,020-3,25,24
+020-3,28,57,0 warp #020-3_28_57 0,0,020-3,33,99
+020-3,49,33,0 warp #020-3_49_33 0,0,020-3,110,56
+020-3,33,98,0 warp #020-3_33_98 0,0,020-3,28,56
+020-3,110,57,0 warp #020-3_110_57 0,0,020-3,49,34
diff --git a/npc/020-3/mapflags.txt b/npc/020-3/mapflags.txt
new file mode 100644
index 00000000..7e975d95
--- /dev/null
+++ b/npc/020-3/mapflags.txt
@@ -0,0 +1 @@
+//020-3 mapflag resave 020-1,52,118
diff --git a/npc/021-3/_import.txt b/npc/021-3/_import.txt
new file mode 100644
index 00000000..4ddc764c
--- /dev/null
+++ b/npc/021-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 021-3: Central Tulimshar Sewers
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/021-3/_mobs.txt",
+"npc/021-3/_warps.txt",
+"npc/021-3/mapflags.txt",
diff --git a/npc/021-3/_mobs.txt b/npc/021-3/_mobs.txt
new file mode 100644
index 00000000..7b568aa6
--- /dev/null
+++ b/npc/021-3/_mobs.txt
@@ -0,0 +1,12 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 021-3: Central Tulimshar Sewers mobs
+021-3,120,38,5,4 monster Cave Maggot 1056,5,100000,30000
+021-3,103,58,4,1 monster Cave Maggot 1056,5,100000,30000
+021-3,80,98,17,15 monster Cave Maggot 1056,5,100000,30000
+021-3,129,82,4,1 monster Cave Maggot 1056,5,100000,30000
+021-3,140,38,8,4 monster Angry Fire Goblin 1108,3,100000,30000
+021-3,79,98,16,15 monster Black Scorpion 1009,4,100000,1800000
+021-3,52,53,1,8 monster Green Slime 1005,4,40000,50000
+021-3,93,31,14,11 monster Sea Slime 1033,6,100000,30000
+021-3,121,128,4,1 monster Cave Maggot 1056,5,100000,30000
+021-3,47,139,4,1 monster Cave Maggot 1056,5,100000,30000
diff --git a/npc/021-3/_warps.txt b/npc/021-3/_warps.txt
new file mode 100644
index 00000000..2832f0ff
--- /dev/null
+++ b/npc/021-3/_warps.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 021-3: Central Tulimshar Sewers warps
+021-3,143,127,0 warp #021-3_143_127 0,0,001-1,117,109
+021-3,57,99,0 warp #021-3_57_99 0,0,001-1,60,84
+021-3,29,62,0 warp #021-3_29_62 0,0,001-1,28,45
+021-3,44,143,0 warp #021-3_44_143 0,0,004-3,80,23
diff --git a/npc/021-3/mapflags.txt b/npc/021-3/mapflags.txt
new file mode 100644
index 00000000..fba01a25
--- /dev/null
+++ b/npc/021-3/mapflags.txt
@@ -0,0 +1 @@
+//021-3 mapflag resave 001-1,60,105
diff --git a/npc/023-1/_import.txt b/npc/023-1/_import.txt
new file mode 100644
index 00000000..dc64077f
--- /dev/null
+++ b/npc/023-1/_import.txt
@@ -0,0 +1,4 @@
+// Map 023-1: Tulimshar Lighthouse Beach
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/023-1/_mobs.txt",
+"npc/023-1/_warps.txt",
diff --git a/npc/023-1/_mobs.txt b/npc/023-1/_mobs.txt
new file mode 100644
index 00000000..a2dc766d
--- /dev/null
+++ b/npc/023-1/_mobs.txt
@@ -0,0 +1,15 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 023-1: Tulimshar Lighthouse Beach mobs
+023-1,70,41,3,3 monster Thug 1119,1,100000,30000
+023-1,84,33,5,3 monster Swashbuckler 1120,1,100000,30000
+023-1,58,28,3,3 monster Grenadier 1121,1,100000,30000
+023-1,80,99,5,3 monster Swashbuckler 1120,1,100000,30000
+023-1,86,117,9,1 monster Grenadier 1121,1,100000,30000
+023-1,55,126,3,3 monster Thug 1119,1,100000,30000
+023-1,47,86,3,3 monster Thug 1119,1,100000,30000
+023-1,102,67,5,3 monster Swashbuckler 1120,1,100000,30000
+023-1,105,90,3,3 monster Thug 1119,1,100000,30000
+023-1,62,60,3,3 monster Thug 1119,1,100000,30000
+023-1,93,49,6,5 monster Grenadier 1121,1,100000,30000
+023-1,64,95,0,23 monster Angry Sea Slime 1109,3,150000,100000
+023-1,45,54,2,19 monster Angry Sea Slime 1109,3,150000,100000
diff --git a/npc/023-1/_warps.txt b/npc/023-1/_warps.txt
new file mode 100644
index 00000000..1191fb85
--- /dev/null
+++ b/npc/023-1/_warps.txt
@@ -0,0 +1,15 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 023-1: Tulimshar Lighthouse Beach warps
+023-1,65,146,0 warp #023-1_65_146 1,0,042-1,65,24
+023-1,75,134,0 warp #023-1_75_134 0,0,023-3,75,132
+023-1,71,117,0 warp #023-1_71_117 0,0,023-3,71,114
+023-1,83,114,0 warp #023-1_83_114 0,0,023-3,83,112
+023-1,107,120,0 warp #023-1_107_120 0,0,023-3,106,118
+023-1,105,114,0 warp #023-1_105_114 0,0,023-3,106,115
+023-1,70,95,0 warp #023-1_70_95 0,0,023-3,70,93
+023-1,48,80,0 warp #023-1_48_80 0,0,023-3,48,78
+023-1,61,36,0 warp #023-1_61_36 0,0,023-3,61,39
+023-1,36,34,0 warp #023-1_36_34 0,0,023-2,37,29
+023-1,37,23,0 warp #023-1_37_23 0,0,023-2,37,23
+023-1,66,101,0 warp #023-1_66_101 0,3,023-1,61,100
+023-1,62,101,0 warp #023-1_62_101 0,3,023-1,67,100
diff --git a/npc/023-2/_import.txt b/npc/023-2/_import.txt
new file mode 100644
index 00000000..0c94c7c7
--- /dev/null
+++ b/npc/023-2/_import.txt
@@ -0,0 +1,3 @@
+// Map 023-2: ERROR
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/023-2/_warps.txt",
diff --git a/npc/023-2/_warps.txt b/npc/023-2/_warps.txt
new file mode 100644
index 00000000..f9e0d6f0
--- /dev/null
+++ b/npc/023-2/_warps.txt
@@ -0,0 +1,2 @@
+023-2,37,30,0 warp #023-2_37_30 0,0,023-1,36,35
+023-2,37,22,0 warp #023-2_37_22 0,0,023-1,36,23
diff --git a/npc/023-3/_import.txt b/npc/023-3/_import.txt
new file mode 100644
index 00000000..0951c0c6
--- /dev/null
+++ b/npc/023-3/_import.txt
@@ -0,0 +1,4 @@
+// Map 023-3: Tulimshar Beach Caves
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/023-3/_mobs.txt",
+"npc/023-3/_warps.txt",
diff --git a/npc/023-3/_mobs.txt b/npc/023-3/_mobs.txt
new file mode 100644
index 00000000..474a1f1a
--- /dev/null
+++ b/npc/023-3/_mobs.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 023-3: Tulimshar Beach Caves mobs
+023-3,91,77,3,3 monster Thug 1119,1,100000,30000
+023-3,127,85,3,3 monster Swashbuckler 1120,1,100000,30000
+023-3,98,28,3,3 monster Swashbuckler 1120,1,100000,30000
+023-3,120,45,3,3 monster Thug 1119,1,100000,30000
+023-3,51,107,6,2 monster Swashbuckler 1120,1,100000,30000
+023-3,69,52,33,4 monster Thug 1119,1,100000,30000
diff --git a/npc/023-3/_warps.txt b/npc/023-3/_warps.txt
new file mode 100644
index 00000000..444baa89
--- /dev/null
+++ b/npc/023-3/_warps.txt
@@ -0,0 +1,10 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 023-3: Tulimshar Beach Caves warps
+023-3,75,134,0 warp #023-3_75_134 0,0,023-1,75,136
+023-3,71,117,0 warp #023-3_71_117 0,0,023-1,71,119
+023-3,83,114,0 warp #023-3_83_114 0,0,023-1,83,116
+023-3,106,120,0 warp #023-3_106_120 0,0,023-1,107,122
+023-3,106,112,0 warp #023-3_106_112 0,0,023-1,105,112
+023-3,70,95,0 warp #023-3_70_95 0,0,023-1,70,97
+023-3,48,80,0 warp #023-3_48_80 0,0,023-1,48,82
+023-3,61,36,0 warp #023-3_61_36 0,0,023-1,61,34
diff --git a/npc/025-1/_import.txt b/npc/025-1/_import.txt
new file mode 100644
index 00000000..4a8b3c7b
--- /dev/null
+++ b/npc/025-1/_import.txt
@@ -0,0 +1,7 @@
+// Map 025-1: Woodland Swamp
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/025-1/_mobs.txt",
+"npc/025-1/_warps.txt",
+"npc/025-1/barrier.txt",
+"npc/025-1/mapflags.txt",
+"npc/025-1/reset.txt",
diff --git a/npc/025-1/_mobs.txt b/npc/025-1/_mobs.txt
new file mode 100644
index 00000000..053e55b3
--- /dev/null
+++ b/npc/025-1/_mobs.txt
@@ -0,0 +1,12 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 025-1: Woodland Swamp mobs
+025-1,100,60,28,39 monster Clover Patch 1037,3,30000,10000
+025-1,56,96,6,2 monster Clover Patch 1037,1,1200000,10000
+025-1,56,35,38,16 monster Alizarin Plant 1032,2,240000,12000
+025-1,38,84,18,15 monster Silkworm 1035,18,40000,300
+025-1,96,47,31,27 monster Log Head 1025,14,18000,3000
+025-1,0,0,0,0 monster Pink Flower 1014,34,20000,5000
+025-1,41,86,17,13 monster Grass Snake 1034,3,100000,50000
+025-1,78,46,11,14 monster Grass Snake 1034,3,100000,50000
+025-1,73,84,19,8 monster Grass Snake 1034,3,100000,50000
+025-1,53,33,29,8 monster Grass Snake 1034,4,100000,50000
diff --git a/npc/025-1/_warps.txt b/npc/025-1/_warps.txt
new file mode 100644
index 00000000..ad422d95
--- /dev/null
+++ b/npc/025-1/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 025-1: Woodland Swamp warps
+025-1,19,66,0 warp #025-1_19_66 0,0,026-1,128,66
+025-1,90,19,0 warp #025-1_90_19 3,0,015-1,59,100
+025-1,130,58,0 warp #025-1_130_58 0,2,016-1,21,53
diff --git a/npc/025-1/barrier.txt b/npc/025-1/barrier.txt
new file mode 100644
index 00000000..521a4b74
--- /dev/null
+++ b/npc/025-1/barrier.txt
@@ -0,0 +1,15 @@
+
+025-1,42,79,0 script #JuliaBarrier NPC45,1,1,{
+ if (Rossy_Quest > 14 || FLAGS & FLAG_ROSSI_COMPLETED) goto L_Warp;
+ if (Rossy_Quest <= 13) goto L_Block;
+ if (Rossy_Quest == 14) message strcharinfo(0), "You hear distant screams of fear.";
+ goto L_Warp;
+
+L_Warp:
+ warp "025-3", 112, 97;
+ end;
+
+L_Block:
+ message strcharinfo(0), "You are too frightened by what you can hear coming out of the cave that you can't enter.";
+ end;
+}
diff --git a/npc/025-1/mapflags.txt b/npc/025-1/mapflags.txt
new file mode 100644
index 00000000..c8047e3a
--- /dev/null
+++ b/npc/025-1/mapflags.txt
@@ -0,0 +1,2 @@
+//025-1 mapflag resave 016-1,94,30
+025-1 mapflag zone outside
diff --git a/npc/025-1/reset.txt b/npc/025-1/reset.txt
new file mode 100644
index 00000000..3f2ff2d6
--- /dev/null
+++ b/npc/025-1/reset.txt
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/npc/025-3/_import.txt b/npc/025-3/_import.txt
new file mode 100644
index 00000000..e60c045e
--- /dev/null
+++ b/npc/025-3/_import.txt
@@ -0,0 +1,6 @@
+// Map 025-3: Rossy Main Hall
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/025-3/_mobs.txt",
+"npc/025-3/_warps.txt",
+"npc/025-3/barriers.txt",
+"npc/025-3/mapflags.txt",
diff --git a/npc/025-3/_mobs.txt b/npc/025-3/_mobs.txt
new file mode 100644
index 00000000..41aea3e6
--- /dev/null
+++ b/npc/025-3/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 025-3: Rossy Main Hall mobs
+025-3,0,0,0,0 monster Cave Maggot 1056,100,0,100
+025-3,0,0,0,0 monster Archant 1060,20,0,100
+025-3,0,0,0,0 monster Angry Scorpion 1057,25,0,100
+025-3,69,153,6,0 monster Skeleton 1043,1,0,30000
diff --git a/npc/025-3/_warps.txt b/npc/025-3/_warps.txt
new file mode 100644
index 00000000..5da43858
--- /dev/null
+++ b/npc/025-3/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 025-3: Rossy Main Hall warps
+025-3,112,98,0 warp #025-3_112_98 2,0,025-1,42,81
+025-3,105,86,0 warp #025-3_105_86 0,0,025-4,28,36
diff --git a/npc/025-3/barriers.txt b/npc/025-3/barriers.txt
new file mode 100644
index 00000000..147bdd4f
--- /dev/null
+++ b/npc/025-3/barriers.txt
@@ -0,0 +1,1274 @@
+
+
+025-3,78,127,0 script #WarpBattleCave1 NPC45,1,1,{
+ if (Rossy_Quest >= 16 || FLAGS & FLAG_ROSSI_COMPLETED)
+ goto L_AlreadyHelped;
+ if (getareausers("025-4", 26, 63, 60, 97) >= 1 || $@battlecave1 > 0)
+ goto L_SomeoneInside;
+ if (cavefights & BATTLE_CAVE1)
+ goto L_AlreadyDone;
+ if (Rossy_Quest < 15)
+ goto L_Block;
+ goto L_StartFight;
+
+L_StartFight:
+ $@battlecave1 = 1;
+ warp "025-4", 41, 95;
+ $@cave1fighter$ = strcharinfo(0);
+ $@cave1fighterdeaths = PC_DIE_COUNTER;
+ $@cave1start = gettimetick(2);
+ message strcharinfo(0), "As you enter, you feel an evil force filling up the cave.";
+ // Cave 1 Configuration.
+ setarray $@cave1_monsters_IDS[1], 1087, 1084;
+ setarray $@cave1_monsters_QTY[1], 3, 3;
+ $@cave1_waves = 1;
+ $@cave1_time = 180;
+ startnpctimer;
+ end;
+
+L_SomeoneInside:
+ message strcharinfo(0), $@cave1fighter$ + " is already inside. The cave seems to be blocked.";
+ end;
+
+L_AlreadyDone:
+ message strcharinfo(0), "I already eliminated this source of energy.";
+ end;
+
+L_AlreadyHelped:
+ message strcharinfo(0), "There is nothing more than dead monster corpses in this cave.";
+ end;
+
+L_Block:
+ message strcharinfo(0), "Maybe I should learn a bit more about this place before I go inside.";
+ end;
+
+OnTimer5000:
+ if ($@battlecave1 == 0)
+ goto L_AlreadyClean;
+ if (attachrid(getcharid(3,$@cave1fighter$))==0)
+ goto OnNoRid;
+ if (getareausers("025-4", 26, 63, 60, 97) < 1)
+ goto OnNoRid;
+ if (PC_DIE_COUNTER > $@cave1fighterdeaths)
+ goto L_CleaningDead;
+ if (cavefights & BATTLE_CAVE1)
+ goto L_Win;
+ if (gettimetick(2) - $@cave1start >= $@cave1_time)
+ goto L_Cleaning;
+ setnpctimer 0;
+ end;
+
+L_Win:
+ message strcharinfo(0), "It is getting harder to breathe inside this cave... You feel like you are almost passing out.";
+ if ((gettimetick(2) - $@cave1start) < 60)
+ $@cave1start = $@cave1start + 60;
+ if (Hp - (MaxHp*5)/100 <= 0)
+ goto L_BadAir;
+ heal ((MaxHp/100) * -5), 0;
+ $@cave1_timer = $@cave1_timer + 5;
+ if ($@cave1_timer >= 60)
+ goto L_BadAir;
+ setnpctimer 0;
+ end;
+
+S_Cleaning:
+ $@wave_cave1 = 0;
+ $@cave1_kills = 0;
+ $@cave1start = 0;
+ $@cave1_timer = 0;
+ $@cave1fighter$ = "";
+ $@cave1fighterdeaths$ = 0;
+ $@battlecave1 = 0;
+ cleararray $@cave1_monsters_IDS[0], 0, 2;
+ cleararray $@cave1_monsters_QTY[0], 0, 2;
+ $@cave1_waves = 0;
+ $@cave1_time = 0;
+ killmonster "025-4", "#StartCaveFight1::OnMonsterDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ return;
+
+L_BadAir:
+ warp "025-3", 78, 129;
+ message strcharinfo(0), "You can't stand the foul air inside the cave and run away!";
+ callsub S_Cleaning;
+ end;
+
+L_Cleaning:
+ warp "025-3", 78, 129;
+ message strcharinfo(0), "You took too much time to eliminate this source of energy... If you stay one more second in this cave you won't be able to breathe....";
+ callsub S_Cleaning;
+ end;
+
+L_CleaningDead:
+ warp "025-3", 78, 129;
+ message strcharinfo(0), "You were not strong enough to eliminate this power source.";
+ callsub S_Cleaning;
+ end;
+
+OnNoRid:
+ callsub S_Cleaning;
+ end;
+
+OnGetout:
+ if (attachrid(getcharid(3,$@cave1fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-3", 78, 129;
+ callsub S_Cleaning;
+ end;
+
+L_AlreadyClean:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+}
+
+
+025-3,53,107,0 script #WarpBattleCave2 NPC45,1,1,{
+ if (Rossy_Quest >= 16 || FLAGS & FLAG_ROSSI_COMPLETED)
+ goto L_AlreadyHelped;
+ if (getareausers("025-4", 97, 62, 126, 96) >= 1 || $@battlecave2 > 0)
+ goto L_SomeoneInside;
+ if (cavefights & BATTLE_CAVE2)
+ goto L_AlreadyDone;
+ if (Rossy_Quest < 15)
+ goto L_Block;
+ goto L_StartFight;
+
+L_StartFight:
+ $@battlecave2 = 1;
+ warp "025-4", 110, 94;
+ $@cave2fighter$ = strcharinfo(0);
+ $@cave2fighterdeaths = PC_DIE_COUNTER;
+ $@cave2start = gettimetick(2);
+ message strcharinfo(0), "As you enter, you feel an evil force filling up the cave.";
+ // Cave 2 Configuration.
+ setarray $@cave2_monsters_IDS[1], 1083, 1084;
+ setarray $@cave2_monsters_QTY[1], 3, 4;
+ $@cave2_waves = 1;
+ $@cave2_time = 210;
+ startnpctimer;
+ end;
+
+L_SomeoneInside:
+ message strcharinfo(0), $@cave2fighter$ + " is already inside. The cave seems to be blocked.";
+ end;
+
+L_AlreadyDone:
+ message strcharinfo(0), "I already eliminated this source of energy.";
+ end;
+
+L_AlreadyHelped:
+ message strcharinfo(0), "There is nothing more than dead monster corpses in this cave.";
+ end;
+
+L_Block:
+ message strcharinfo(0), "Maybe I should learn a bit more about this place before I go inside.";
+ end;
+
+OnTimer5000:
+ if ($@battlecave2 == 0)
+ goto L_AlreadyClean;
+ if (attachrid(getcharid(3,$@cave2fighter$))==0)
+ goto OnNoRid;
+ if (getareausers("025-4", 97, 62, 126, 96) < 1)
+ goto OnNoRid;
+ if (PC_DIE_COUNTER > $@cave2fighterdeaths)
+ goto L_CleaningDead;
+ if (cavefights & BATTLE_CAVE2)
+ goto L_Win;
+ if (gettimetick(2) - $@cave2start >= $@cave2_time)
+ goto L_Cleaning;
+ setnpctimer 0;
+ end;
+
+L_Win:
+ message strcharinfo(0), "It is getting harder to breathe inside this cave... You feel like you are almost passing out.";
+ if ((gettimetick(2) - $@cave2start) < 60)
+ $@cave2start = $@cave2start + 60;
+ if (Hp - (MaxHp*5)/100 <= 0)
+ goto L_BadAir;
+ heal ((MaxHp/100) * -5), 0;
+ $@cave2_timer = $@cave2_timer + 5;
+ if ($@cave2_timer >= 60)
+ goto L_BadAir;
+ setnpctimer 0;
+ end;
+
+S_Cleaning:
+ $@wave_cave2 = 0;
+ $@cave2_kills = 0;
+ $@cave2start = 0;
+ $@cave2_timer = 0;
+ $@cave2fighter$ = "";
+ $@cave2fighterdeaths$ = 0;
+ $@battlecave2 = 0;
+ cleararray $@cave2_monsters_IDS[0], 0, 2;
+ cleararray $@cave2_monsters_QTY[0], 0, 2;
+ $@cave2_waves = 0;
+ $@cave2_time = 0;
+ killmonster "025-4", "#StartCaveFight2::OnMonsterDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ return;
+
+L_BadAir:
+ warp "025-3", 53, 109;
+ message strcharinfo(0), "You can't stand the foul air inside the cave and run away!";
+ callsub S_Cleaning;
+ end;
+
+L_Cleaning:
+ warp "025-3", 53, 109;
+ message strcharinfo(0), "You took too much time to eliminate this source of energy... If you stay one more second in this cave you won't be able to breathe....";
+ callsub S_Cleaning;
+ end;
+
+L_CleaningDead:
+ warp "025-3", 53, 109;
+ message strcharinfo(0), "You were not strong enough to eliminate this power source.";
+ callsub S_Cleaning;
+ end;
+
+OnNoRid:
+ callsub S_Cleaning;
+ end;
+
+OnGetout:
+ if (attachrid(getcharid(3,$@cave2fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-3", 53, 109;
+ callsub S_Cleaning;
+ end;
+
+L_AlreadyClean:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+}
+
+
+025-3,71,83,0 script #WarpBattleCave3 NPC45,1,1,{
+ if (Rossy_Quest >= 16 || FLAGS & FLAG_ROSSI_COMPLETED)
+ goto L_AlreadyHelped;
+ if (getareausers("025-4", 150, 84, 177, 117) >= 1 || $@battlecave3 > 0)
+ goto L_SomeoneInside;
+ if (cavefights & BATTLE_CAVE3)
+ goto L_AlreadyDone;
+ if (Rossy_Quest < 15)
+ goto L_Block;
+ goto L_StartFight;
+
+L_StartFight:
+ $@battlecave3 = 1;
+ warp "025-4", 168, 115;
+ $@cave3fighter$ = strcharinfo(0);
+ $@cave3fighterdeaths = PC_DIE_COUNTER;
+ $@cave3start = gettimetick(2);
+ message strcharinfo(0), "As you enter, you feel an evil force filling up the cave.";
+ // Cave 3 Configuration.
+ setarray $@cave3_monsters_IDS[1], 1088, 1083;
+ setarray $@cave3_monsters_QTY[1], 4, 4;
+ $@cave3_waves = 1;
+ $@cave3_time = 240;
+ startnpctimer;
+ end;
+
+L_SomeoneInside:
+ message strcharinfo(0), $@cave3fighter$ + " is already inside. The cave seems to be blocked.";
+ end;
+
+L_AlreadyDone:
+ message strcharinfo(0), "I already eliminated this source of energy.";
+ end;
+
+L_AlreadyHelped:
+ message strcharinfo(0), "There is nothing more than dead monster corpses in this cave.";
+ end;
+
+L_Block:
+ message strcharinfo(0), "Maybe I should learn a bit more about this place before I go inside.";
+ end;
+
+OnTimer5000:
+ if ($@battlecave3 == 0)
+ goto L_AlreadyClean;
+ if (attachrid(getcharid(3,$@cave3fighter$))==0)
+ goto OnNoRid;
+ if (getareausers("025-4", 150, 84, 177, 117) < 1)
+ goto OnNoRid;
+ if (cavefights & BATTLE_CAVE3)
+ goto L_Win;
+ if (PC_DIE_COUNTER > $@cave3fighterdeaths)
+ goto L_CleaningDead;
+ if (gettimetick(2) - $@cave3start >= $@cave3_time)
+ goto L_Cleaning;
+ setnpctimer 0;
+ end;
+
+L_Win:
+ message strcharinfo(0), "It is getting harder to breathe inside this cave... You feel like you are almost passing out.";
+ if ((gettimetick(2) - $@cave3start) < 60)
+ $@cave3start = $@cave3start + 60;
+ if (Hp - (MaxHp*5)/100 <= 0)
+ goto L_BadAir;
+ heal ((MaxHp/100) * -5), 0;
+ $@cave3_timer = $@cave3_timer + 5;
+ if ($@cave3_timer >= 60)
+ goto L_BadAir;
+ setnpctimer 0;
+ end;
+
+S_Cleaning:
+ $@wave_cave3 = 0;
+ $@cave3_kills = 0;
+ $@cave3start = 0;
+ $@cave3_timer = 0;
+ $@cave3fighter$ = "";
+ $@cave3fighterdeaths$ = 0;
+ $@battlecave3 = 0;
+ cleararray $@cave3_monsters_IDS[0], 0, 2;
+ cleararray $@cave3_monsters_QTY[0], 0, 2;
+ $@cave3_waves = 0;
+ $@cave3_time = 0;
+ killmonster "025-4", "#StartCaveFight3::OnMonsterDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ return;
+
+L_BadAir:
+ warp "025-3", 71, 85;
+ message strcharinfo(0), "You can't stand the foul air inside the cave and run away!";
+ callsub S_Cleaning;
+ end;
+
+L_Cleaning:
+ warp "025-3", 71, 85;
+ message strcharinfo(0), "You took too much time to eliminate this source of energy... If you stay one more second in this cave you won't be able to breathe....";
+ callsub S_Cleaning;
+ end;
+
+L_CleaningDead:
+ warp "025-3", 71, 85;
+ message strcharinfo(0), "You were not strong enough to eliminate this power source.";
+ callsub S_Cleaning;
+ end;
+
+OnNoRid:
+ callsub S_Cleaning;
+ end;
+
+OnGetout:
+ if (attachrid(getcharid(3,$@cave3fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-3", 71, 85;
+ callsub S_Cleaning;
+ end;
+
+L_AlreadyClean:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+}
+
+
+025-3,80,83,0 script #WarpBattleCave4 NPC45,1,1,{
+ if (Rossy_Quest >= 16 || FLAGS & FLAG_ROSSI_COMPLETED)
+ goto L_AlreadyHelped;
+ if (getareausers("025-4", 28, 124, 57, 156) >= 1 || $@battlecave4 > 0)
+ goto L_SomeoneInside;
+ if (cavefights & BATTLE_CAVE4)
+ goto L_AlreadyDone;
+ if (Rossy_Quest < 15)
+ goto L_Block;
+ goto L_StartFight;
+
+L_StartFight:
+ $@battlecave4 = 1;
+ warp "025-4", 32, 154;
+ $@cave4fighter$ = strcharinfo(0);
+ $@cave4fighterdeaths = PC_DIE_COUNTER;
+ $@cave4start = gettimetick(2);
+ message strcharinfo(0), "As you enter, you feel an evil force filling up the cave.";
+ // Cave 4 Configuration.
+ setarray $@cave4_monsters_IDS[1], 1087, 1083, 1084;
+ setarray $@cave4_monsters_QTY[1], 2, 2, 4;
+ $@cave4_waves = 2;
+ $@cave4_time = 360;
+ startnpctimer;
+ end;
+
+L_SomeoneInside:
+ message strcharinfo(0), $@cave4fighter$ + " is already inside. The cave seems to be blocked.";
+ end;
+
+L_AlreadyDone:
+ message strcharinfo(0), "I already eliminated this source of energy.";
+ end;
+
+L_AlreadyHelped:
+ message strcharinfo(0), "There is nothing more than dead monster corpses in this cave.";
+ end;
+
+L_Block:
+ message strcharinfo(0), "Maybe I should learn a bit more about this place before I go inside.";
+ end;
+
+OnTimer5000:
+ if ($@battlecave4 == 0)
+ goto L_AlreadyClean;
+ if (attachrid(getcharid(3,$@cave4fighter$))==0)
+ goto OnNoRid;
+ if (getareausers("025-4", 28, 124, 57, 156) < 1)
+ goto OnNoRid;
+ if (PC_DIE_COUNTER > $@cave4fighterdeaths)
+ goto L_CleaningDead;
+ if (cavefights & BATTLE_CAVE4)
+ goto L_Win;
+ if (gettimetick(2) - $@cave4start >= $@cave4_time)
+ goto L_Cleaning;
+ setnpctimer 0;
+ end;
+
+L_Win:
+ message strcharinfo(0), "It is getting harder to breathe inside this cave... You feel like you are almost passing out.";
+ if ((gettimetick(2) - $@cave4start) < 60)
+ $@cave4start = $@cave4start + 60;
+ if (Hp - (MaxHp*5)/100 <= 0)
+ goto L_BadAir;
+ heal ((MaxHp/100) * -5), 0;
+ $@cave4_timer = $@cave4_timer + 5;
+ if ($@cave4_timer >= 60)
+ goto L_BadAir;
+ setnpctimer 0;
+ end;
+
+S_Cleaning:
+ $@wave_cave4 = 0;
+ $@cave4_kills = 0;
+ $@cave4start = 0;
+ $@cave4_timer = 0;
+ $@cave4fighter$ = "";
+ $@cave4fighterdeaths$ = 0;
+ $@battlecave4 = 0;
+ cleararray $@cave4_monsters_IDS[0], 0, 3;
+ cleararray $@cave4_monsters_QTY[0], 0, 3;
+ $@cave4_waves = 0;
+ $@cave4_time = 0;
+ killmonster "025-4", "#StartCaveFight4::OnMonsterDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ return;
+
+L_BadAir:
+ warp "025-3", 80, 85;
+ message strcharinfo(0), "You can't stand the foul air inside the cave and run away!";
+ callsub S_Cleaning;
+ end;
+
+L_Cleaning:
+ warp "025-3", 80, 85;
+ message strcharinfo(0), "You took too much time to eliminate this source of energy... If you stay one more second in this cave you won't be able to breathe....";
+ callsub S_Cleaning;
+ end;
+
+L_CleaningDead:
+ warp "025-3", 80, 85;
+ message strcharinfo(0), "You were not strong enough to eliminate this power source.";
+ callsub S_Cleaning;
+ end;
+
+OnNoRid:
+ callsub S_Cleaning;
+ end;
+
+OnGetout:
+ if (attachrid(getcharid(3,$@cave4fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-3", 80, 85;
+ callsub S_Cleaning;
+ end;
+
+L_AlreadyClean:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+}
+
+
+025-3,71,30,0 script #WarpBattleCave5 NPC45,1,1,{
+ if (Rossy_Quest >= 16 || FLAGS & FLAG_ROSSI_COMPLETED)
+ goto L_AlreadyHelped;
+ if (getareausers("025-4", 91, 131, 124, 160) >= 1 || $@battlecave5 > 0)
+ goto L_SomeoneInside;
+ if (cavefights & BATTLE_CAVE5)
+ goto L_AlreadyDone;
+ if (Rossy_Quest < 15)
+ goto L_Block;
+ goto L_StartFight;
+
+L_StartFight:
+ $@battlecave5 = 1;
+ warp "025-4", 100, 158;
+ $@cave5fighter$ = strcharinfo(0);
+ $@cave5fighterdeaths = PC_DIE_COUNTER;
+ $@cave5start = gettimetick(2);
+ message strcharinfo(0), "As you enter, you feel an evil force filling up the cave.";
+ // Cave 5 Configuration.
+ setarray $@cave5_monsters_IDS[1], 1088, 1083, 1084;
+ setarray $@cave5_monsters_QTY[1], 3, 3, 3;
+ $@cave5_waves = 2;
+ $@cave5_time = 390;
+ startnpctimer;
+ end;
+
+L_SomeoneInside:
+ message strcharinfo(0), $@cave5fighter$ + " is already inside. The cave seems to be blocked.";
+ end;
+
+L_AlreadyDone:
+ message strcharinfo(0), "I already eliminated this source of energy.";
+ end;
+
+L_AlreadyHelped:
+ message strcharinfo(0), "There is nothing more than dead monster corpses in this cave.";
+ end;
+
+L_Block:
+ message strcharinfo(0), "Maybe I should learn a bit more about this place before I go inside.";
+ end;
+
+OnTimer5000:
+ if ($@battlecave5 == 0)
+ goto L_AlreadyClean;
+ if (attachrid(getcharid(3,$@cave5fighter$))==0)
+ goto OnNoRid;
+ if (getareausers("025-4", 91, 131, 124, 160) < 1)
+ goto OnNoRid;
+ if (PC_DIE_COUNTER > $@cave5fighterdeaths)
+ goto L_CleaningDead;
+ if (cavefights & BATTLE_CAVE5)
+ goto L_Win;
+ if (gettimetick(2) - $@cave5start >= $@cave5_time)
+ goto L_Cleaning;
+ setnpctimer 0;
+ end;
+
+L_Win:
+ message strcharinfo(0), "It is getting harder to breathe inside this cave... You feel like you are almost passing out.";
+ if ((gettimetick(2) - $@cave5start) < 60)
+ $@cave5start = $@cave5start + 60;
+ if (Hp - (MaxHp*5)/100 <= 0)
+ goto L_BadAir;
+ heal ((MaxHp/100) * -5), 0;
+ $@cave5_timer = $@cave5_timer + 5;
+ if ($@cave5_timer >= 60)
+ goto L_BadAir;
+ setnpctimer 0;
+ end;
+
+S_Cleaning:
+ $@wave_cave5 = 0;
+ $@cave5_kills = 0;
+ $@cave5start = 0;
+ $@cave5_timer = 0;
+ $@cave5fighter$ = "";
+ $@cave5fighterdeaths$ = 0;
+ $@battlecave5 = 0;
+ cleararray $@cave5_monsters_IDS[0], 0, 3;
+ cleararray $@cave5_monsters_QTY[0], 0, 3;
+ $@cave5_waves = 0;
+ $@cave5_time = 0;
+ killmonster "025-4", "#StartCaveFight5::OnMonsterDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ return;
+
+L_BadAir:
+ warp "025-3", 71, 32;
+ message strcharinfo(0), "You can't stand the foul air inside the cave and run away!";
+ callsub S_Cleaning;
+ end;
+
+L_Cleaning:
+ warp "025-3", 71, 32;
+ message strcharinfo(0), "You took too much time to eliminate this source of energy... If you stay one more second in this cave you won't be able to breathe....";
+ callsub S_Cleaning;
+ end;
+
+L_CleaningDead:
+ warp "025-3", 71, 32;
+ message strcharinfo(0), "You were not strong enough to eliminate this power source.";
+ callsub S_Cleaning;
+ end;
+
+OnNoRid:
+ callsub S_Cleaning;
+ end;
+
+OnGetout:
+ if (attachrid(getcharid(3,$@cave5fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-3", 71, 32;
+ callsub S_Cleaning;
+ end;
+
+L_AlreadyClean:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+}
+
+
+025-3,128,35,0 script #WarpBattleCave6 NPC45,1,1,{
+ if (Rossy_Quest >= 16 || FLAGS & FLAG_ROSSI_COMPLETED)
+ goto L_AlreadyHelped;
+ if (getareausers("025-4", 153, 143, 178, 174) >= 1 || $@battlecave6 > 0)
+ goto L_SomeoneInside;
+ if (cavefights & BATTLE_CAVE6)
+ goto L_AlreadyDone;
+ if (Rossy_Quest < 15)
+ goto L_Block;
+ goto L_StartFight;
+
+L_StartFight:
+ $@battlecave6 = 1;
+ warp "025-4", 159, 172;
+ $@cave6fighter$ = strcharinfo(0);
+ $@cave6fighterdeaths = PC_DIE_COUNTER;
+ $@cave6start = gettimetick(2);
+ message strcharinfo(0), "As you enter, you feel an evil force filling up the cave.";
+ // Cave 6 Configuration.
+ setarray $@cave6_monsters_IDS[1], 1087, 1088, 1083;
+ setarray $@cave6_monsters_QTY[1], 3, 4, 4;
+ $@cave6_waves = 2;
+ $@cave6_time = 450;
+ startnpctimer;
+ end;
+
+L_SomeoneInside:
+ message strcharinfo(0), $@cave6fighter$ + " is already inside. The cave seems to be blocked.";
+ end;
+
+L_AlreadyDone:
+ message strcharinfo(0), "I already eliminated this source of energy.";
+ end;
+
+L_AlreadyHelped:
+ message strcharinfo(0), "There is nothing more than dead monster corpses in this cave.";
+ end;
+
+L_Block:
+ message strcharinfo(0), "Maybe I should learn a bit more about this place before I go inside.";
+ end;
+
+OnTimer5000:
+ if ($@battlecave6 == 0)
+ goto L_AlreadyClean;
+ if (attachrid(getcharid(3,$@cave6fighter$))==0)
+ goto OnNoRid;
+ if (getareausers("025-4", 153, 143, 178, 174) < 1)
+ goto OnNoRid;
+ if (PC_DIE_COUNTER > $@cave6fighterdeaths)
+ goto L_CleaningDead;
+ if (cavefights & BATTLE_CAVE6)
+ goto L_Win;
+ if (gettimetick(2) - $@cave6start >= $@cave6_time)
+ goto L_Cleaning;
+ setnpctimer 0;
+ end;
+
+L_Win:
+ message strcharinfo(0), "It is getting harder to breathe inside this cave... You feel like you are almost passing out.";
+ if ((gettimetick(2) - $@cave6start) < 60)
+ $@cave6start = $@cave6start + 60;
+ if (Hp - (MaxHp*5)/100 <= 0)
+ goto L_BadAir;
+ heal ((MaxHp/100) * -5), 0;
+ $@cave6_timer = $@cave6_timer + 5;
+ if ($@cave6_timer >= 60)
+ goto L_BadAir;
+ setnpctimer 0;
+ end;
+
+S_Cleaning:
+ $@wave_cave6 = 0;
+ $@cave6_kills = 0;
+ $@cave6start = 0;
+ $@cave6_timer = 0;
+ $@cave6fighter$ = "";
+ $@cave6fighterdeaths$ = 0;
+ $@battlecave6 = 0;
+ cleararray $@cave6_monsters_IDS[0], 0, 3;
+ cleararray $@cave6_monsters_QTY[0], 0, 3;
+ $@cave6_waves = 0;
+ $@cave6_time = 0;
+ killmonster "025-4", "#StartCaveFight6::OnMonsterDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ return;
+
+L_BadAir:
+ warp "025-3", 128, 37;
+ message strcharinfo(0), "You can't stand the foul air inside the cave and run away!";
+ callsub S_Cleaning;
+ end;
+
+L_Cleaning:
+ warp "025-3", 128, 37;
+ message strcharinfo(0), "You took too much time to eliminate this source of energy... If you stay one more second in this cave you won't be able to breathe....";
+ callsub S_Cleaning;
+ end;
+
+L_CleaningDead:
+ warp "025-3", 128, 37;
+ message strcharinfo(0), "You were not strong enough to eliminate this power source.";
+ callsub S_Cleaning;
+ end;
+
+OnNoRid:
+ callsub S_Cleaning;
+ end;
+
+OnGetout:
+ if (attachrid(getcharid(3,$@cave6fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-3", 128, 37;
+ callsub S_Cleaning;
+ end;
+
+L_AlreadyClean:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+}
+
+
+025-3,70,57,0 script #WarpBattleCave7 NPC45,1,1,{
+ if (Rossy_Quest >= 16 || FLAGS & FLAG_ROSSI_COMPLETED)
+ goto L_AlreadyHelped;
+ if (getareausers("025-4", 27, 185, 61, 219) >= 1 || $@battlecave7 > 0)
+ goto L_SomeoneInside;
+ if (cavefights & BATTLE_CAVE7)
+ goto L_AlreadyDone;
+ if (Rossy_Quest < 15)
+ goto L_Block;
+ goto L_StartFight;
+
+L_StartFight:
+ $@battlecave7 = 1;
+ warp "025-4", 42, 217;
+ $@cave7fighter$ = strcharinfo(0);
+ $@cave7fighterdeaths = PC_DIE_COUNTER;
+ $@cave7start = gettimetick(2);
+ message strcharinfo(0), "As you enter, you feel an evil force filling up the cave.";
+ // Cave 7 Configuration.
+ setarray $@cave7_monsters_IDS[1], 1087, 1088, 1083, 1084;
+ setarray $@cave7_monsters_QTY[1], 2, 2, 2, 2;
+ $@cave7_waves = 3;
+ $@cave7_time = 540;
+ startnpctimer;
+ end;
+
+L_SomeoneInside:
+ message strcharinfo(0), $@cave7fighter$ + " is already inside. The cave seems to be blocked.";
+ end;
+
+L_AlreadyDone:
+ message strcharinfo(0), "I already eliminated this source of energy.";
+ end;
+
+L_AlreadyHelped:
+ message strcharinfo(0), "There is nothing more than dead monster corpses in this cave.";
+ end;
+
+L_Block:
+ message strcharinfo(0), "Maybe I should learn a bit more about this place before I go inside.";
+ end;
+
+OnTimer5000:
+ if ($@battlecave7 == 0)
+ goto L_AlreadyClean;
+ if (attachrid(getcharid(3,$@cave7fighter$))==0)
+ goto OnNoRid;
+ if (getareausers("025-4", 27, 185, 61, 219) < 1)
+ goto OnNoRid;
+ if (PC_DIE_COUNTER > $@cave7fighterdeaths)
+ goto L_CleaningDead;
+ if (cavefights & BATTLE_CAVE7)
+ goto L_Win;
+ if (gettimetick(2) - $@cave7start >= $@cave7_time)
+ goto L_Cleaning;
+ setnpctimer 0;
+ end;
+
+L_Win:
+ message strcharinfo(0), "It is getting harder to breathe inside this cave... You feel like you are almost passing out.";
+ if ((gettimetick(2) - $@cave7start) < 60)
+ $@cave7start = $@cave7start + 60;
+ if (Hp - (MaxHp*5)/100 <= 0)
+ goto L_BadAir;
+ heal ((MaxHp/100) * -5), 0;
+ $@cave7_timer = $@cave7_timer + 5;
+ if ($@cave7_timer >= 60)
+ goto L_BadAir;
+ setnpctimer 0;
+ end;
+
+S_Cleaning:
+ $@wave_cave7 = 0;
+ $@cave7_kills = 0;
+ $@cave7start = 0;
+ $@cave7_timer = 0;
+ $@cave7fighter$ = "";
+ $@cave7fighterdeaths$ = 0;
+ $@battlecave7 = 0;
+ cleararray $@cave7_monsters_IDS[0], 0, 4;
+ cleararray $@cave7_monsters_QTY[0], 0, 4;
+ $@cave7_waves = 0;
+ $@cave7_time = 0;
+ killmonster "025-4", "#StartCaveFight7::OnMonsterDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ return;
+
+L_BadAir:
+ warp "025-3", 70, 59;
+ message strcharinfo(0), "You can't stand the foul air inside the cave and run away!";
+ callsub S_Cleaning;
+ end;
+
+L_Cleaning:
+ warp "025-3", 70, 59;
+ message strcharinfo(0), "You took too much time to eliminate this source of energy... If you stay one more second in this cave you won't be able to breathe....";
+ callsub S_Cleaning;
+ end;
+
+L_CleaningDead:
+ warp "025-3", 70, 59;
+ message strcharinfo(0), "You were not strong enough to eliminate this power source.";
+ callsub S_Cleaning;
+ end;
+
+OnNoRid:
+ callsub S_Cleaning;
+ end;
+
+OnGetout:
+ if (attachrid(getcharid(3,$@cave7fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-3", 70, 59;
+ callsub S_Cleaning;
+ end;
+
+L_AlreadyClean:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+}
+
+
+025-3,138,92,0 script #WarpBattleCave8 NPC45,1,1,{
+ if (Rossy_Quest >= 16 || FLAGS & FLAG_ROSSI_COMPLETED)
+ goto L_AlreadyHelped;
+ if (getareausers("025-4", 90, 193, 119, 216) >= 1 || $@battlecave8 > 0)
+ goto L_SomeoneInside;
+ if (cavefights & BATTLE_CAVE8)
+ goto L_AlreadyDone;
+ if (Rossy_Quest < 15)
+ goto L_Block;
+ goto L_StartFight;
+
+L_StartFight:
+ $@battlecave8 = 1;
+ warp "025-4", 105, 214;
+ $@cave8fighter$ = strcharinfo(0);
+ $@cave8fighterdeaths = PC_DIE_COUNTER;
+ $@cave8start = gettimetick(2);
+ message strcharinfo(0), "As you enter, you feel an evil force filling up the cave.";
+ // Cave 8 Configuration.
+ setarray $@cave8_monsters_IDS[1], 1087, 1088, 1083, 1084;
+ setarray $@cave8_monsters_QTY[1], 2, 2, 3, 3;
+ $@cave8_waves = 3;
+ $@cave8_time = 570;
+ startnpctimer;
+ end;
+
+L_SomeoneInside:
+ message strcharinfo(0), $@cave8fighter$ + " is already inside. The cave seems to be blocked.";
+ end;
+
+L_AlreadyDone:
+ message strcharinfo(0), "I already eliminated this source of energy.";
+ end;
+
+L_AlreadyHelped:
+ message strcharinfo(0), "There is nothing more than dead monster corpses in this cave.";
+ end;
+
+L_Block:
+ message strcharinfo(0), "Maybe I should learn a bit more about this place before I go inside.";
+ end;
+
+OnTimer5000:
+ if ($@battlecave8 == 0)
+ goto L_AlreadyClean;
+ if (attachrid(getcharid(3,$@cave8fighter$))==0)
+ goto OnNoRid;
+ if (getareausers("025-4", 90, 193, 119, 216) < 1)
+ goto OnNoRid;
+ if (PC_DIE_COUNTER > $@cave8fighterdeaths)
+ goto L_CleaningDead;
+ if (cavefights & BATTLE_CAVE8)
+ goto L_Win;
+ if (gettimetick(2) - $@cave8start >= $@cave8_time)
+ goto L_Cleaning;
+ setnpctimer 0;
+ end;
+
+L_Win:
+ message strcharinfo(0), "It is getting harder to breathe inside this cave... You feel like you are almost passing out.";
+ if ((gettimetick(2) - $@cave8start) < 60)
+ $@cave8start = $@cave8start + 60;
+ if (Hp - (MaxHp*5)/100 <= 0)
+ goto L_BadAir;
+ heal ((MaxHp/100) * -5), 0;
+ $@cave8_timer = $@cave8_timer + 5;
+ if ($@cave8_timer >= 60)
+ goto L_BadAir;
+ setnpctimer 0;
+ end;
+
+S_Cleaning:
+ $@wave_cave8 = 0;
+ $@cave8_kills = 0;
+ $@cave8start = 0;
+ $@cave8_timer = 0;
+ $@cave8fighter$ = "";
+ $@cave8fighterdeaths$ = 0;
+ $@battlecave8 = 0;
+ cleararray $@cave8_monsters_IDS[0], 0, 4;
+ cleararray $@cave8_monsters_QTY[0], 0, 4;
+ $@cave8_waves = 0;
+ $@cave8_time = 0;
+ killmonster "025-4", "#StartCaveFight8::OnMonsterDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ return;
+
+L_BadAir:
+ warp "025-3", 138, 94;
+ message strcharinfo(0), "You can't stand the foul air inside the cave and run away!";
+ callsub S_Cleaning;
+ end;
+
+L_Cleaning:
+ warp "025-3", 138, 94;
+ message strcharinfo(0), "You took too much time to eliminate this source of energy... If you stay one more second in this cave you won't be able to breathe....";
+ callsub S_Cleaning;
+ end;
+
+L_CleaningDead:
+ warp "025-3", 138, 94;
+ message strcharinfo(0), "You were not strong enough to eliminate this power source.";
+ callsub S_Cleaning;
+ end;
+
+OnNoRid:
+ callsub S_Cleaning;
+ end;
+
+OnGetout:
+ if (attachrid(getcharid(3,$@cave8fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-3", 138, 94;
+ callsub S_Cleaning;
+ end;
+
+L_AlreadyClean:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+}
+
+
+025-3,138,160,0 script #WarpBattleCave9 NPC45,1,1,{
+ if (Rossy_Quest >= 16 || FLAGS & FLAG_ROSSI_COMPLETED)
+ goto L_AlreadyHelped;
+ if (getareausers("025-4", 144, 192, 173, 226) >= 1 || $@battlecave9 > 0)
+ goto L_SomeoneInside;
+ if (cavefights & BATTLE_CAVE9)
+ goto L_AlreadyDone;
+ if (Rossy_Quest < 15)
+ goto L_Block;
+ goto L_StartFight;
+
+L_StartFight:
+ $@battlecave9 = 1;
+ warp "025-4", 157, 222;
+ $@cave9fighter$ = strcharinfo(0);
+ $@cave9fighterdeaths = PC_DIE_COUNTER;
+ $@cave9start = gettimetick(2);
+ message strcharinfo(0), "As you enter, you feel an evil force filling up the cave.";
+ // Cave 9 Configuration.
+ setarray $@cave9_monsters_IDS[1], 1087, 1088, 1083, 1084;
+ setarray $@cave9_monsters_QTY[1], 3, 3, 3, 3;
+ $@cave9_waves = 3;
+ $@cave9_time = 630;
+ startnpctimer;
+ end;
+
+L_SomeoneInside:
+ message strcharinfo(0), $@cave9fighter$ + " is already inside. The cave seems to be blocked.";
+ end;
+
+L_AlreadyDone:
+ message strcharinfo(0), "I already eliminated this source of energy.";
+ end;
+
+L_AlreadyHelped:
+ message strcharinfo(0), "There is nothing more than dead monster corpses in this cave.";
+ end;
+
+L_Block:
+ message strcharinfo(0), "Maybe I should learn a bit more about this place before I go inside.";
+ end;
+
+OnTimer5000:
+ if ($@battlecave9 == 0)
+ goto L_AlreadyClean;
+ if (attachrid(getcharid(3,$@cave9fighter$))==0)
+ goto OnNoRid;
+ if (getareausers("025-4", 144, 192, 173, 226) < 1)
+ goto OnNoRid;
+ if (PC_DIE_COUNTER > $@cave9fighterdeaths)
+ goto L_CleaningDead;
+ if (cavefights & BATTLE_CAVE9)
+ goto L_Win;
+ if (gettimetick(2) - $@cave9start >= $@cave9_time)
+ goto L_Cleaning;
+ setnpctimer 0;
+ end;
+
+L_Win:
+ message strcharinfo(0), "It is getting harder to breathe inside this cave... You feel like you are almost passing out.";
+ if ((gettimetick(2) - $@cave9start) < 60)
+ $@cave9start = $@cave9start + 60;
+ if (Hp - (MaxHp*5)/100 <= 0)
+ goto L_BadAir;
+ heal ((MaxHp/100) * -5), 0;
+ $@cave9_timer = $@cave9_timer + 5;
+ if ($@cave9_timer >= 60)
+ goto L_BadAir;
+ setnpctimer 0;
+ end;
+
+S_Cleaning:
+ $@wave_cave9 = 0;
+ $@cave9_kills = 0;
+ $@cave9start = 0;
+ $@cave9_timer = 0;
+ $@cave9fighter$ = "";
+ $@cave9fighterdeaths$ = 0;
+ $@battlecave9 = 0;
+ cleararray $@cave9_monsters_IDS[0], 0, 4;
+ cleararray $@cave9_monsters_QTY[0], 0, 4;
+ $@cave9_waves = 0;
+ $@cave9_time = 0;
+ killmonster "025-4", "#StartCaveFight9::OnMonsterDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ return;
+
+L_BadAir:
+ warp "025-3", 138, 158;
+ message strcharinfo(0), "You can't stand the foul air inside the cave and run away!";
+ callsub S_Cleaning;
+ end;
+
+L_Cleaning:
+ warp "025-3", 138, 158;
+ message strcharinfo(0), "You took too much time to eliminate this source of energy... If you stay one more second in this cave you won't be able to breathe....";
+ callsub S_Cleaning;
+ end;
+
+L_CleaningDead:
+ warp "025-3", 138, 158;
+ message strcharinfo(0), "You were not strong enough to eliminate this power source.";
+ callsub S_Cleaning;
+ end;
+
+OnNoRid:
+ callsub S_Cleaning;
+ end;
+
+OnGetout:
+ if (attachrid(getcharid(3,$@cave9fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-3", 138, 158;
+ callsub S_Cleaning;
+ end;
+
+L_AlreadyClean:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+}
+
+
+025-3,77,170,0 script #WarpBossCave NPC45,1,1,{
+ if (Rossy_Quest > 16 || FLAGS & FLAG_ROSSI_COMPLETED)
+ end;
+ if (Rossy_Quest == 16)
+ goto L_AlreadyHelped;
+ @barrier_force = -9;
+ if (cavefights & BATTLE_CAVE1)
+ @barrier_force = @barrier_force + 1;
+ if (cavefights & BATTLE_CAVE2)
+ @barrier_force = @barrier_force + 1;
+ if (cavefights & BATTLE_CAVE3)
+ @barrier_force = @barrier_force + 1;
+ if (cavefights & BATTLE_CAVE4)
+ @barrier_force = @barrier_force + 1;
+ if (cavefights & BATTLE_CAVE5)
+ @barrier_force = @barrier_force + 1;
+ if (cavefights & BATTLE_CAVE6)
+ @barrier_force = @barrier_force + 1;
+ if (cavefights & BATTLE_CAVE7)
+ @barrier_force = @barrier_force + 1;
+ if (cavefights & BATTLE_CAVE8)
+ @barrier_force = @barrier_force + 1;
+ if (cavefights & BATTLE_CAVE9)
+ @barrier_force = @barrier_force + 1;
+ if (@barrier_force != 0)
+ goto L_Hurt;
+ if (getareausers("025-4", 142, 24, 172, 48) >= 1 || $@battlecave10 > 0)
+ goto L_SomeoneInside;
+ if (@barrier_force == 0)
+ goto L_StartFight;
+ end;
+
+L_Hurt:
+ message strcharinfo(0), "As you try to enter, you bump into a magic barrier. Its force pushes you back, hurting you badly.";
+ heal (MaxHp * (@barrier_force / 10)), 0;
+ warp "025-3", 77, 164;
+ end;
+
+L_StartFight:
+ message strcharinfo(0), "You go through the magic barrier without problems... you can hear screams that seem to be very close.";
+ $@battlecave10 = 1;
+ warp "025-4", 157, 44;
+ $@cave10fighter$ = strcharinfo(0);
+ $@cave10fighterdeaths = PC_DIE_COUNTER;
+ $@cave10start = gettimetick(2);
+ // Cave 10 Configuration.
+ setarray $@cave10_monsters_IDS[1], 1087, 1088, 1083, 1084;
+ setarray $@cave10_monsters_QTY[1], 3, 3, 3, 3;
+ $@cave10_boss_ID = 1086;
+ $@cave10_waves = 4;
+ $@cave10_time = 1080;
+ startnpctimer;
+ end;
+
+L_SomeoneInside:
+ message strcharinfo(0), $@cave10fighter$ + " is already inside.";
+ end;
+
+L_AlreadyHelped:
+ message strcharinfo(0), "There is nothing more than corpses in this cave. You close your eyes and go straight to the place where Julia is hidden.";
+ warp "025-4", 93, 33;
+ end;
+
+OnTimer5000:
+ if ($@battlecave10 == 0)
+ goto L_AlreadyClean;
+ if (attachrid(getcharid(3,$@cave10fighter$))==0)
+ goto OnNoRid;
+ if (getareausers("025-4", 142, 24, 172, 48) < 1)
+ goto OnNoRid;
+ if (PC_DIE_COUNTER > $@cave10fighterdeaths)
+ goto L_CleaningDead;
+ if (Rossy_Quest == 16)
+ goto L_Win;
+ if (gettimetick(2) - $@cave10start >= $@cave10_time)
+ goto L_Cleaning;
+ setnpctimer 0;
+ end;
+
+L_Win:
+ message strcharinfo(0), "It is getting harder to breathe inside this cave... You feel like you are almost passing out.";
+ if ((gettimetick(2) - $@cave10start) < 60)
+ $@cave10start = $@cave10start + 60;
+ if (Hp - (MaxHp*5)/100 <= 0)
+ goto L_BadAir;
+ heal ((MaxHp/100) * -5), 0;
+ $@cave10_timer = $@cave10_timer + 5;
+ if ($@cave10_timer >= 60)
+ goto L_BadAir;
+ setnpctimer 0;
+ end;
+
+S_Cleaning:
+ $@wave_cave10 = 0;
+ $@cave10_kills = 0;
+ $@cave10start = 0;
+ $@cave10_timer = 0;
+ $@cave10fighter$ = "";
+ $@cave10fighterdeaths$ = 0;
+ $@battlecave10 = 0;
+ cleararray $@cave10_monsters_IDS[0], 0, 4;
+ cleararray $@cave10_monsters_QTY[0], 0, 4;
+ $@cave10_boss_ID = 0;
+ $@cave10_waves = 0;
+ $@cave10_time = 0;
+ killmonster "025-4", "#StartBossCaveFight::OnMonsterDeath";
+ killmonster "025-4", "#StartBossCaveFight::OnBossDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ return;
+
+L_BadAir:
+ warp "025-4", 93, 33;
+ message strcharinfo(0), "You can't stand the foul air inside the cave and run as fast as you can to save Julia!";
+ callsub S_Cleaning;
+ end;
+
+L_Cleaning:
+ warp "025-3", 77, 168;
+ message strcharinfo(0), "You took too much time to eliminate this source of energy... If you stay one more second in this cave you won't be able to breathe....";
+ callsub S_Cleaning;
+ end;
+
+L_CleaningDead:
+ warp "025-3", 77, 168;
+ if ($@wave_cave10 < 5)
+ message strcharinfo(0), "You were not strong enough to eliminate this power source.";
+ if ($@wave_cave10 == 5)
+ message strcharinfo(0), "This horrible monster is probably too powerful for you right now.";
+ callsub S_Cleaning;
+ end;
+
+OnNoRid:
+ callsub S_Cleaning;
+ end;
+
+OnGetout:
+ if (attachrid(getcharid(3,$@cave10fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-3", 77, 168;
+ callsub S_Cleaning;
+ end;
+
+OnWin:
+ if (attachrid(getcharid(3,$@cave10fighter$)) == 0)
+ goto OnNoRid;
+ warp "025-4", 93, 33;
+ callsub S_Cleaning;
+ end;
+
+L_AlreadyClean:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+}
diff --git a/npc/025-3/mapflags.txt b/npc/025-3/mapflags.txt
new file mode 100644
index 00000000..c63d436b
--- /dev/null
+++ b/npc/025-3/mapflags.txt
@@ -0,0 +1 @@
+//025-3 mapflag resave 025-1,33,50
diff --git a/npc/025-4/_import.txt b/npc/025-4/_import.txt
new file mode 100644
index 00000000..9fb6c566
--- /dev/null
+++ b/npc/025-4/_import.txt
@@ -0,0 +1,8 @@
+// Map 025-4: Rossy Battle Caves
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/025-4/_mobs.txt",
+"npc/025-4/_warps.txt",
+"npc/025-4/battlecaves.txt",
+"npc/025-4/clauquer.txt",
+"npc/025-4/julia.txt",
+"npc/025-4/mapflags.txt",
diff --git a/npc/025-4/_mobs.txt b/npc/025-4/_mobs.txt
new file mode 100644
index 00000000..d672ad40
--- /dev/null
+++ b/npc/025-4/_mobs.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 025-4: Rossy Battle Caves mobs
+025-4,29,31,10,7 monster Cave Maggot 1056,3,0,100
+025-4,94,24,10,10 monster Cave Maggot 1056,5,0,100
diff --git a/npc/025-4/_warps.txt b/npc/025-4/_warps.txt
new file mode 100644
index 00000000..109bdde3
--- /dev/null
+++ b/npc/025-4/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 025-4: Rossy Battle Caves warps
+025-4,28,37,0 warp #025-4_28_37 0,0,025-3,105,87
diff --git a/npc/025-4/battlecaves.txt b/npc/025-4/battlecaves.txt
new file mode 100644
index 00000000..16b8d6d4
--- /dev/null
+++ b/npc/025-4/battlecaves.txt
@@ -0,0 +1,953 @@
+
+
+025-4,41,85,0 script #StartCaveFight1 NPC324,{
+ if ($@battlecave1 == 2 && $@cave1fighter$ == strcharinfo(0))
+ end;
+ if ($@battlecave1 == 2 && $@cave1fighter$ != strcharinfo(0))
+ goto L_Cheat;
+ if (Rossy_Quest < 15)
+ goto L_Cheat;
+ if ($@battlecave1 == 1)
+ goto L_Start;
+ goto L_Cheat;
+
+L_Cheat:
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Start:
+ menu
+ "Place a root at the center of the energy source.", L_PlaceCenter,
+ "I am not prepared yet!", L_close;
+
+L_PlaceCenter:
+ if ((countitem("Root")<1))
+ goto L_No_root;
+ close2;
+ delitem "Root", 1;
+ message strcharinfo(0), "As you place the root on the energy source, earth monsters seem to emerge from the ground.";
+ $@battlecave1 = 2;
+ goto L_Summon;
+
+L_Summon:
+ $@cave1_loop = $@cave1_loop + 1;
+ areamonster "025-4",26,63,60,97,"",$@cave1_monsters_IDS[$@cave1_loop],$@cave1_monsters_QTY[$@cave1_loop],"#StartCaveFight1::OnMonsterDeath";
+ if ($@cave1_loop <= getarraysize($@cave1_monsters_IDS))
+ goto L_Summon;
+ $@cave1_loop = 0;
+ end;
+
+L_Abort:
+ donpcevent "#WarpBattleCave1::OnNoRid";
+ end;
+
+L_Done:
+ $@wave_cave1 = $@wave_cave1 + 1;
+ $@cave1_kills = 0;
+ if (attachrid(getcharid(3,$@cave1fighter$)) == 0) goto L_Abort;
+
+ if ($@wave_cave1 == 1)
+ message strcharinfo(0), "As soon as you kill the last monster, your vision blacks out and you feel a strange sensation... Maybe it is not healthy to stay in this cave.";
+
+ if ($@wave_cave1 < $@cave1_waves)
+ goto L_Summon;
+ cavefights = (cavefights | BATTLE_CAVE1);
+ BOSS_POINTS = BOSS_POINTS + 10;
+ message strcharinfo(0), "You gain 10 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+OnMonsterDeath:
+ $@cave1_kills = $@cave1_kills + 1;
+ if ($@cave1_kills >= $@cave1_monsters_QTY[1] + $@cave1_monsters_QTY[2] + $@cave1_monsters_QTY[3] + $@cave1_monsters_QTY[4])
+ goto L_Done;
+ end;
+
+L_close:
+ close;
+
+L_No_root:
+ mes "I don't have any roots in my inventory!";
+ close;
+
+}
+
+
+025-4,41,97,0 script #CheckCaveFight1 NPC45,1,1,{
+ if (cavefights & BATTLE_CAVE1 || $@battlecave1 == 1)
+ goto L_Done;
+ message strcharinfo(0), "You can't get out! Seems like a barrier was created when the energy transmuted itself into monsters.";
+ end;
+
+L_Done:
+ donpcevent "#WarpBattleCave1::OnGetout";
+ end;
+}
+
+
+
+025-4,115,77,0 script #StartCaveFight2 NPC324,{
+ if ($@battlecave2 == 2 && $@cave2fighter$ == strcharinfo(0))
+ end;
+ if ($@battlecave2 == 2 && $@cave2fighter$ != strcharinfo(0))
+ goto L_Cheat;
+ if (Rossy_Quest < 15)
+ goto L_Cheat;
+ if ($@battlecave2 == 1)
+ goto L_Start;
+ goto L_Cheat;
+
+L_Cheat:
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Start:
+ menu
+ "Place a root at the center of the energy source.", L_PlaceCenter,
+ "I am not prepared yet!", L_close;
+
+L_PlaceCenter:
+ if ((countitem("Root")<1))
+ goto L_No_root;
+ close2;
+ delitem "Root", 1;
+ message strcharinfo(0), "As you place the root on the energy source, earth monsters seem to emerge from the ground.";
+ $@battlecave2 = 2;
+ goto L_Summon;
+
+L_Summon:
+ $@cave2_loop = $@cave2_loop + 1;
+ areamonster "025-4",97, 62, 126, 96,"",$@cave2_monsters_IDS[$@cave2_loop],$@cave2_monsters_QTY[$@cave2_loop],"#StartCaveFight2::OnMonsterDeath";
+ if ($@cave2_loop <= getarraysize($@cave2_monsters_IDS))
+ goto L_Summon;
+ $@cave2_loop = 0;
+ end;
+
+L_Abort:
+ donpcevent "#WarpBattleCave2::OnNoRid";
+ end;
+
+L_Done:
+ $@wave_cave2 = $@wave_cave2 + 1;
+ $@cave2_kills = 0;
+ if (attachrid(getcharid(3,$@cave2fighter$)) == 0) goto L_Abort;
+
+
+ if ($@wave_cave2 == 1)
+ message strcharinfo(0), "As soon as you kill the last monster, your vision blacks out and you feel a strange sensation... Maybe it is not healthy to stay in this cave.";
+
+ if ($@wave_cave2 < $@cave2_waves)
+ goto L_Summon;
+ cavefights = (cavefights | BATTLE_CAVE2);
+ BOSS_POINTS = BOSS_POINTS + 10;
+ message strcharinfo(0), "You gain 10 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+OnMonsterDeath:
+ $@cave2_kills = $@cave2_kills + 1;
+ if ($@cave2_kills >= $@cave2_monsters_QTY[1] + $@cave2_monsters_QTY[2] + $@cave2_monsters_QTY[3] + $@cave2_monsters_QTY[4])
+ goto L_Done;
+ end;
+
+L_close:
+ close;
+
+L_No_root:
+ mes "I don't have any roots in my inventory!";
+ close;
+}
+
+
+025-4,110,96,0 script #CheckCaveFight2 NPC45,1,1,{
+ if (cavefights & BATTLE_CAVE2 || $@battlecave2 == 1)
+ goto L_Done;
+ message strcharinfo(0), "You can't get out! Seems like a barrier was created when the energy transmuted itself into monsters.";
+ end;
+
+L_Done:
+ donpcevent "#WarpBattleCave2::OnGetout";
+ end;
+}
+
+025-4,164,103,0 script #StartCaveFight3 NPC324,{
+ if ($@battlecave3 == 2 && $@cave3fighter$ == strcharinfo(0))
+ end;
+ if ($@battlecave3 == 2 && $@cave3fighter$ != strcharinfo(0))
+ goto L_Cheat;
+ if (Rossy_Quest < 15)
+ goto L_Cheat;
+ if ($@battlecave3 == 1)
+ goto L_Start;
+ goto L_Cheat;
+
+L_Cheat:
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Start:
+ menu
+ "Place a root at the center of the energy source.", L_PlaceCenter,
+ "I am not prepared yet!", L_close;
+
+L_PlaceCenter:
+ if ((countitem("Root")<1))
+ goto L_No_root;
+ close2;
+ delitem "Root", 1;
+ message strcharinfo(0), "As you place the root on the energy source, earth monsters seem to emerge from the ground.";
+ $@battlecave3 = 2;
+ goto L_Summon;
+
+L_Summon:
+ $@cave3_loop = $@cave3_loop + 1;
+ areamonster "025-4",150, 84, 177, 117,"",$@cave3_monsters_IDS[$@cave3_loop],$@cave3_monsters_QTY[$@cave3_loop],"#StartCaveFight3::OnMonsterDeath";
+ if ($@cave3_loop <= getarraysize($@cave3_monsters_IDS))
+ goto L_Summon;
+ $@cave3_loop = 0;
+ end;
+
+L_Abort:
+ donpcevent "#WarpBattleCave3::OnNoRid";
+ end;
+
+L_Done:
+ $@wave_cave3 = $@wave_cave3 + 1;
+ $@cave3_kills = 0;
+ if (attachrid(getcharid(3,$@cave3fighter$)) == 0) goto L_Abort;
+
+
+ if ($@wave_cave3 == 1)
+ message strcharinfo(0), "As soon as you kill the last monster, your vision blacks out and you feel a strange sensation... Maybe it is not healthy to stay in this cave.";
+
+ if ($@wave_cave3 < $@cave3_waves)
+ goto L_Summon;
+ cavefights = (cavefights | BATTLE_CAVE3);
+ BOSS_POINTS = BOSS_POINTS + 10;
+ message strcharinfo(0), "You gain 10 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+OnMonsterDeath:
+ $@cave3_kills = $@cave3_kills + 1;
+ if ($@cave3_kills >= $@cave3_monsters_QTY[1] + $@cave3_monsters_QTY[2] + $@cave3_monsters_QTY[3] + $@cave3_monsters_QTY[4])
+ goto L_Done;
+ end;
+
+L_close:
+ close;
+
+L_No_root:
+ mes "I don't have any roots in my inventory!";
+ close;
+
+}
+
+
+025-4,168,117,0 script #CheckCaveFight3 NPC45,1,1,{
+ if (cavefights & BATTLE_CAVE3 || $@battlecave3 == 1)
+ goto L_Done;
+ message strcharinfo(0), "You can't get out! Seems like a barrier was created when the energy transmuted itself into monsters.";
+ end;
+
+L_Done:
+ donpcevent "#WarpBattleCave3::OnGetout";
+ end;
+}
+
+025-4,39,143,0 script #StartCaveFight4 NPC324,{
+ if ($@battlecave4 == 2 && $@cave4fighter$ == strcharinfo(0))
+ end;
+ if ($@battlecave4 == 2 && $@cave4fighter$ != strcharinfo(0))
+ goto L_Cheat;
+ if (Rossy_Quest < 15)
+ goto L_Cheat;
+ if ($@battlecave4 == 1)
+ goto L_Start;
+ goto L_Cheat;
+
+L_Cheat:
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Start:
+ menu
+ "Place a root at the center of the energy source.", L_PlaceCenter,
+ "I am not prepared yet!", L_close;
+
+L_PlaceCenter:
+ if ((countitem("Root")<1))
+ goto L_No_root;
+ close2;
+ delitem "Root", 1;
+ message strcharinfo(0), "As you place the root on the energy source, earth monsters seem to emerge from the ground.";
+ $@battlecave4 = 2;
+ goto L_Summon;
+
+L_Summon:
+ $@cave4_loop = $@cave4_loop + 1;
+ areamonster "025-4",28, 124, 57, 156,"",$@cave4_monsters_IDS[$@cave4_loop],$@cave4_monsters_QTY[$@cave4_loop],"#StartCaveFight4::OnMonsterDeath";
+ if ($@cave4_loop <= getarraysize($@cave4_monsters_IDS))
+ goto L_Summon;
+ $@cave4_loop = 0;
+ end;
+
+L_Abort:
+ donpcevent "#WarpBattleCave4::OnNoRid";
+ end;
+
+L_Done:
+ $@wave_cave4 = $@wave_cave4 + 1;
+ $@cave4_kills = 0;
+ if (attachrid(getcharid(3,$@cave4fighter$)) == 0) goto L_Abort;
+
+
+ if ($@wave_cave4 == 1)
+ message strcharinfo(0), "Oh no, more monsters?!";
+ if ($@wave_cave4 == 2)
+ message strcharinfo(0), "As soon as you kill the last monster, your vision blacks out and you feel a strange sensation... Maybe it is not healthy to stay in this cave.";
+
+ if ($@wave_cave4 < $@cave4_waves)
+ goto L_Summon;
+ cavefights = (cavefights | BATTLE_CAVE4);
+ BOSS_POINTS = BOSS_POINTS + 10;
+ message strcharinfo(0), "You gain 10 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+OnMonsterDeath:
+ $@cave4_kills = $@cave4_kills + 1;
+ if ($@cave4_kills >= $@cave4_monsters_QTY[1] + $@cave4_monsters_QTY[2] + $@cave4_monsters_QTY[3] + $@cave4_monsters_QTY[4])
+ goto L_Done;
+ end;
+
+L_close:
+ close;
+
+L_No_root:
+ mes "I don't have any roots in my inventory!";
+ close;
+
+}
+
+
+025-4,32,156,0 script #CheckCaveFight4 NPC45,1,1,{
+ if (cavefights & BATTLE_CAVE4 || $@battlecave4 == 1)
+ goto L_Done;
+ message strcharinfo(0), "You can't get out! Seems like a barrier was created when the energy transmuted itself into monsters.";
+ end;
+
+L_Done:
+ donpcevent "#WarpBattleCave4::OnGetout";
+ end;
+}
+
+
+025-4,109,143,0 script #StartCaveFight5 NPC324,{
+ if ($@battlecave5 == 2 && $@cave5fighter$ == strcharinfo(0))
+ end;
+ if ($@battlecave5 == 2 && $@cave5fighter$ != strcharinfo(0))
+ goto L_Cheat;
+ if (Rossy_Quest < 15)
+ goto L_Cheat;
+ if ($@battlecave5 == 1)
+ goto L_Start;
+ goto L_Cheat;
+
+L_Cheat:
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Start:
+ menu
+ "Place a root at the center of the energy source.", L_PlaceCenter,
+ "I am not prepared yet!", L_close;
+
+L_PlaceCenter:
+ if ((countitem("Root")<1))
+ goto L_No_root;
+ close2;
+ delitem "Root", 1;
+ message strcharinfo(0), "As you place the root on the energy source, earth monsters seem to emerge from the ground.";
+ $@battlecave5 = 2;
+ goto L_Summon;
+
+L_Summon:
+ $@cave5_loop = $@cave5_loop + 1;
+ areamonster "025-4",91, 131, 124, 160,"",$@cave5_monsters_IDS[$@cave5_loop],$@cave5_monsters_QTY[$@cave5_loop],"#StartCaveFight5::OnMonsterDeath";
+ if ($@cave5_loop <= getarraysize($@cave5_monsters_IDS))
+ goto L_Summon;
+ $@cave5_loop = 0;
+ end;
+
+L_Abort:
+ donpcevent "#WarpBattleCave5::OnNoRid";
+ end;
+
+L_Done:
+ $@wave_cave5 = $@wave_cave5 + 1;
+ $@cave5_kills = 0;
+ if (attachrid(getcharid(3,$@cave5fighter$)) == 0) goto L_Abort;
+
+
+ if ($@wave_cave5 == 1)
+ message strcharinfo(0), "Oh no, more monsters?!";
+ if ($@wave_cave5 == 2)
+ message strcharinfo(0), "As soon as you kill the last monster, your vision blacks out and you feel a strange sensation... Maybe it is not healthy to stay in this cave.";
+
+ if ($@wave_cave5 < $@cave5_waves)
+ goto L_Summon;
+ cavefights = (cavefights | BATTLE_CAVE5);
+ BOSS_POINTS = BOSS_POINTS + 10;
+ message strcharinfo(0), "You gain 10 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+OnMonsterDeath:
+ $@cave5_kills = $@cave5_kills + 1;
+ if ($@cave5_kills >= $@cave5_monsters_QTY[1] + $@cave5_monsters_QTY[2] + $@cave5_monsters_QTY[3] + $@cave5_monsters_QTY[4])
+ goto L_Done;
+ end;
+
+L_close:
+ close;
+
+L_No_root:
+ mes "I don't have any roots in my inventory!";
+ close;
+
+}
+
+
+025-4,100,160,0 script #CheckCaveFight5 NPC45,1,1,{
+ if (cavefights & BATTLE_CAVE5 || $@battlecave5 == 1)
+ goto L_Done;
+ message strcharinfo(0), "You can't get out! Seems like a barrier was created when the energy transmuted itself into monsters.";
+ end;
+
+L_Done:
+ donpcevent "#WarpBattleCave5::OnGetout";
+ end;
+}
+
+
+025-4,162,162,0 script #StartCaveFight6 NPC324,{
+ if ($@battlecave6 == 2 && $@cave6fighter$ == strcharinfo(0))
+ end;
+ if ($@battlecave6 == 2 && $@cave6fighter$ != strcharinfo(0))
+ goto L_Cheat;
+ if (Rossy_Quest < 15)
+ goto L_Cheat;
+ if ($@battlecave6 == 1)
+ goto L_Start;
+ goto L_Cheat;
+
+L_Cheat:
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Start:
+ menu
+ "Place a root at the center of the energy source.", L_PlaceCenter,
+ "I am not prepared yet!", L_close;
+
+L_PlaceCenter:
+ if ((countitem("Root")<1))
+ goto L_No_root;
+ close2;
+ delitem "Root", 1;
+ message strcharinfo(0), "As you place the root on the energy source, earth monsters seem to emerge from the ground.";
+ $@battlecave6 = 2;
+ goto L_Summon;
+
+L_Summon:
+ $@cave6_loop = $@cave6_loop + 1;
+ areamonster "025-4",153, 143, 178, 174,"",$@cave6_monsters_IDS[$@cave6_loop],$@cave6_monsters_QTY[$@cave6_loop],"#StartCaveFight6::OnMonsterDeath";
+ if ($@cave6_loop <= getarraysize($@cave6_monsters_IDS))
+ goto L_Summon;
+ $@cave6_loop = 0;
+ end;
+
+L_Abort:
+ donpcevent "#WarpBattleCave6::OnNoRid";
+ end;
+
+L_Done:
+ $@wave_cave6 = $@wave_cave6 + 1;
+ $@cave6_kills = 0;
+ if (attachrid(getcharid(3,$@cave6fighter$)) == 0) goto L_Abort;
+
+
+ if ($@wave_cave6 == 1)
+ message strcharinfo(0), "Oh no, more monsters?!";
+ if ($@wave_cave6 == 2)
+ message strcharinfo(0), "As soon as you kill the last monster, your vision blacks out and you feel a strange sensation... Maybe it is not healthy to stay in this cave.";
+
+ if ($@wave_cave6 < $@cave6_waves)
+ goto L_Summon;
+ cavefights = (cavefights | BATTLE_CAVE6);
+ BOSS_POINTS = BOSS_POINTS + 10;
+ message strcharinfo(0), "You gain 10 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+OnMonsterDeath:
+ $@cave6_kills = $@cave6_kills + 1;
+ if ($@cave6_kills >= $@cave6_monsters_QTY[1] + $@cave6_monsters_QTY[2] + $@cave6_monsters_QTY[3] + $@cave6_monsters_QTY[4])
+ goto L_Done;
+ end;
+
+L_close:
+ close;
+
+L_No_root:
+ mes "I don't have any roots in my inventory!";
+ close;
+
+}
+
+
+025-4,159,174,0 script #CheckCaveFight6 NPC45,1,1,{
+ if (cavefights & BATTLE_CAVE6 || $@battlecave6 == 1)
+ goto L_Done;
+ message strcharinfo(0), "You can't get out! Seems like a barrier was created when the energy transmuted itself into monsters.";
+ end;
+
+L_Done:
+ donpcevent "#WarpBattleCave6::OnGetout";
+ end;
+}
+
+
+025-4,44,202,0 script #StartCaveFight7 NPC324,{
+ if ($@battlecave7 == 2 && $@cave7fighter$ == strcharinfo(0))
+ end;
+ if ($@battlecave7 == 2 && $@cave7fighter$ != strcharinfo(0))
+ goto L_Cheat;
+ if (Rossy_Quest < 15)
+ goto L_Cheat;
+ if ($@battlecave7 == 1)
+ goto L_Start;
+ goto L_Cheat;
+
+L_Cheat:
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Start:
+ menu
+ "Place a root at the center of the energy source.", L_PlaceCenter,
+ "I am not prepared yet!", L_close;
+
+L_PlaceCenter:
+ if ((countitem("Root")<1))
+ goto L_No_root;
+ close2;
+ delitem "Root", 1;
+ message strcharinfo(0), "As you place the root on the energy source, earth monsters seem to emerge from the ground.";
+ $@battlecave7 = 2;
+ goto L_Summon;
+
+L_Summon:
+ $@cave7_loop = $@cave7_loop + 1;
+ areamonster "025-4",27, 185, 61, 219,"",$@cave7_monsters_IDS[$@cave7_loop],$@cave7_monsters_QTY[$@cave7_loop],"#StartCaveFight7::OnMonsterDeath";
+ if ($@cave7_loop <= getarraysize($@cave7_monsters_IDS))
+ goto L_Summon;
+ $@cave7_loop = 0;
+ end;
+
+L_Abort:
+ donpcevent "#WarpBattleCave7::OnNoRid";
+ end;
+
+L_Done:
+ $@wave_cave7 = $@wave_cave7 + 1;
+ $@cave7_kills = 0;
+ if (attachrid(getcharid(3,$@cave7fighter$)) == 0) goto L_Abort;
+
+
+ if ($@wave_cave7 == 1)
+ message strcharinfo(0), "Oh no, more monsters?!";
+ if ($@wave_cave7 == 2)
+ message strcharinfo(0), "I can't give up now!";
+ if ($@wave_cave7 == 3)
+ message strcharinfo(0), "As soon as you kill the last monster, your vision blacks out and you feel a strange sensation... Maybe it is not healthy to stay in this cave.";
+
+ if ($@wave_cave7 < $@cave7_waves)
+ goto L_Summon;
+ cavefights = (cavefights | BATTLE_CAVE7);
+ BOSS_POINTS = BOSS_POINTS + 10;
+ message strcharinfo(0), "You gain 10 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+OnMonsterDeath:
+ $@cave7_kills = $@cave7_kills + 1;
+ if ($@cave7_kills >= $@cave7_monsters_QTY[1] + $@cave7_monsters_QTY[2] + $@cave7_monsters_QTY[3] + $@cave7_monsters_QTY[4])
+ goto L_Done;
+ end;
+
+L_close:
+ close;
+
+L_No_root:
+ mes "I don't have any roots in my inventory!";
+ close;
+
+}
+
+
+025-4,42,219,0 script #CheckCaveFight7 NPC45,1,1,{
+ if (cavefights & BATTLE_CAVE7 || $@battlecave7 == 1)
+ goto L_Done;
+ message strcharinfo(0), "You can't get out! Seems like a barrier was created when the energy transmuted itself into monsters.";
+ end;
+
+L_Done:
+ donpcevent "#WarpBattleCave7::OnGetout";
+ end;
+}
+
+
+025-4,105,210,0 script #StartCaveFight8 NPC324,{
+ if ($@battlecave8 == 2 && $@cave8fighter$ == strcharinfo(0))
+ end;
+ if ($@battlecave8 == 2 && $@cave8fighter$ != strcharinfo(0))
+ goto L_Cheat;
+ if (Rossy_Quest < 15)
+ goto L_Cheat;
+ if ($@battlecave8 == 1)
+ goto L_Start;
+ goto L_Cheat;
+
+L_Cheat:
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Start:
+ menu
+ "Place a root at the center of the energy source.", L_PlaceCenter,
+ "I am not prepared yet!", L_close;
+
+L_PlaceCenter:
+ if ((countitem("Root")<1))
+ goto L_No_root;
+ close2;
+ delitem "Root", 1;
+ message strcharinfo(0), "As you place the root on the energy source, earth monsters seem to emerge from the ground.";
+ $@battlecave8 = 2;
+ goto L_Summon;
+
+L_Summon:
+ $@cave8_loop = $@cave8_loop + 1;
+ areamonster "025-4",90, 193, 119, 216,"",$@cave8_monsters_IDS[$@cave8_loop],$@cave8_monsters_QTY[$@cave8_loop],"#StartCaveFight8::OnMonsterDeath";
+ if ($@cave8_loop <= getarraysize($@cave8_monsters_IDS))
+ goto L_Summon;
+ $@cave8_loop = 0;
+ end;
+
+L_Abort:
+ donpcevent "#WarpBattleCave8::OnNoRid";
+ end;
+
+L_Done:
+ $@wave_cave8 = $@wave_cave8 + 1;
+ $@cave8_kills = 0;
+ if (attachrid(getcharid(3,$@cave8fighter$)) == 0) goto L_Abort;
+
+
+ if ($@wave_cave8 == 1)
+ message strcharinfo(0), "Oh no, more monsters?!";
+ if ($@wave_cave8 == 2)
+ message strcharinfo(0), "I can't give up now!";
+ if ($@wave_cave8 == 3)
+ message strcharinfo(0), "As soon as you kill the last monster, your vision blacks out and you feel a strange sensation... Maybe it is not healthy to stay in this cave.";
+
+ if ($@wave_cave8 < $@cave8_waves)
+ goto L_Summon;
+ cavefights = (cavefights | BATTLE_CAVE8);
+ BOSS_POINTS = BOSS_POINTS + 10;
+ message strcharinfo(0), "You gain 10 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+OnMonsterDeath:
+ $@cave8_kills = $@cave8_kills + 1;
+ if ($@cave8_kills >= $@cave8_monsters_QTY[1] + $@cave8_monsters_QTY[2] + $@cave8_monsters_QTY[3] + $@cave8_monsters_QTY[4])
+ goto L_Done;
+ end;
+
+L_close:
+ close;
+
+L_No_root:
+ mes "I don't have any roots in my inventory!";
+ close;
+
+}
+
+
+025-4,105,216,0 script #CheckCaveFight8 NPC45,1,1,{
+ if (cavefights & BATTLE_CAVE8 || $@battlecave8 == 1)
+ goto L_Done;
+ message strcharinfo(0), "You can't get out! Seems like a barrier was created when the energy transmuted itself into monsters.";
+ end;
+
+L_Done:
+ donpcevent "#WarpBattleCave8::OnGetout";
+ end;
+}
+
+
+025-4,157,220,0 script #StartCaveFight9 NPC324,{
+ if ($@battlecave9 == 2 && $@cave9fighter$ == strcharinfo(0))
+ end;
+ if ($@battlecave9 == 2 && $@cave9fighter$ != strcharinfo(0))
+ goto L_Cheat;
+ if (Rossy_Quest < 15)
+ goto L_Cheat;
+ if ($@battlecave9 == 1)
+ goto L_Start;
+ goto L_Cheat;
+
+L_Cheat:
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Start:
+ menu
+ "Place a root at the center of the energy source.", L_PlaceCenter,
+ "I am not prepared yet!", L_close;
+
+L_PlaceCenter:
+ if ((countitem("Root")<1))
+ goto L_No_root;
+ close2;
+ delitem "Root", 1;
+ message strcharinfo(0), "As you place the root on the energy source, earth monsters seem to emerge from the ground.";
+ $@battlecave9 = 2;
+ goto L_Summon;
+
+L_Summon:
+ $@cave9_loop = $@cave9_loop + 1;
+ areamonster "025-4",144, 192, 173, 226,"",$@cave9_monsters_IDS[$@cave9_loop],$@cave9_monsters_QTY[$@cave9_loop],"#StartCaveFight9::OnMonsterDeath";
+ if ($@cave9_loop <= getarraysize($@cave9_monsters_IDS))
+ goto L_Summon;
+ $@cave9_loop = 0;
+ end;
+
+L_Abort:
+ donpcevent "#WarpBattleCave9::OnNoRid";
+ end;
+
+L_Done:
+ $@wave_cave9 = $@wave_cave9 + 1;
+ $@cave9_kills = 0;
+ if (attachrid(getcharid(3,$@cave9fighter$)) == 0) goto L_Abort;
+
+
+ if ($@wave_cave9 == 1)
+ message strcharinfo(0), "Oh no, more monsters?!";
+ if ($@wave_cave9 == 2)
+ message strcharinfo(0), "I can't give up now!";
+ if ($@wave_cave9 == 3)
+ message strcharinfo(0), "As soon as you kill the last monster, your vision blacks out and you feel a strange sensation... Maybe it is not healthy to stay in this cave.";
+
+ if ($@wave_cave9 < $@cave9_waves)
+ goto L_Summon;
+ cavefights = (cavefights | BATTLE_CAVE9);
+ BOSS_POINTS = BOSS_POINTS + 10;
+ message strcharinfo(0), "You gain 10 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+OnMonsterDeath:
+ $@cave9_kills = $@cave9_kills + 1;
+ if ($@cave9_kills >= $@cave9_monsters_QTY[1] + $@cave9_monsters_QTY[2] + $@cave9_monsters_QTY[3] + $@cave9_monsters_QTY[4])
+ goto L_Done;
+ end;
+
+L_close:
+ close;
+
+L_No_root:
+ mes "I don't have any roots in my inventory!";
+ close;
+
+}
+
+
+025-4,157,226,0 script #CheckCaveFight9 NPC45,1,1,{
+ if (cavefights & BATTLE_CAVE9 || $@battlecave9 == 1)
+ goto L_Done;
+ message strcharinfo(0), "You can't get out! Seems like a barrier was created when the energy transmuted itself into monsters.";
+ end;
+
+L_Done:
+ donpcevent "#WarpBattleCave9::OnGetout";
+ end;
+}
+
+
+025-4,157,30,0 script #StartBossCaveFight NPC325,{
+ if ($@battlecave10 == 2 && $@cave10fighter$ == strcharinfo(0))
+ end;
+ if (Rossy_Quest >= 16)
+ end;
+ if ($@battlecave10 == 1 && cavefights & BATTLE_CAVE1 && cavefights & BATTLE_CAVE2 && cavefights & BATTLE_CAVE3 && cavefights & BATTLE_CAVE4 && cavefights & BATTLE_CAVE5 && cavefights & BATTLE_CAVE6 && cavefights & BATTLE_CAVE7 && cavefights & BATTLE_CAVE8 && cavefights & BATTLE_CAVE9 && Rossy_Quest == 15)
+ goto L_Start;
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Start:
+ menu
+ "Place a root at the center of the energy source.", L_PlaceCenter,
+ "I am not prepared yet!", L_close;
+
+L_PlaceCenter:
+ if ((countitem("Root")<1))
+ goto L_No_root;
+ close2;
+ delitem "Root", 1;
+ message strcharinfo(0), "As you place the root on the energy source, earth monsters seem to emerge from the ground.";
+ $@battlecave10 = 2;
+ goto L_Summon;
+
+L_Summon:
+ $@cave10_loop = $@cave10_loop + 1;
+ areamonster "025-4",142, 24, 172, 48,"",$@cave10_monsters_IDS[$@cave10_loop],$@cave10_monsters_QTY[$@cave10_loop],"#StartBossCaveFight::OnMonsterDeath";
+ if ($@cave10_loop <= getarraysize($@cave10_monsters_IDS))
+ goto L_Summon;
+ $@cave10_loop = 0;
+ end;
+
+L_SummonBoss:
+ if (attachrid(getcharid(3,$@cave10fighter$)) == 0) goto L_Abort;
+ areamonster "025-4",142, 24, 172, 48,"",$@cave10_boss_ID,1,"#StartBossCaveFight::OnBossDeath";
+ stopnpctimer;
+ end;
+
+L_Abort:
+ donpcevent "#WarpBossCave::OnNoRid";
+ end;
+
+L_Done:
+ $@wave_cave10 = $@wave_cave10 + 1;
+ $@cave10_kills = 0;
+ if (attachrid(getcharid(3,$@cave10fighter$)) == 0) goto L_Abort;
+
+
+ if ($@wave_cave10 == 1)
+ message strcharinfo(0), "I can't give up now!";
+ if ($@wave_cave10 == 2)
+ message strcharinfo(0), "I feel I'm getting close to the end...";
+ if ($@wave_cave10 == 3)
+ message strcharinfo(0), "What? This is harder than I imagined!";
+ if ($@wave_cave10 == 4)
+ message strcharinfo(0), "Finally! It seems I have defeated all of them!";
+
+ if ($@wave_cave10 < $@cave10_waves)
+ goto L_Summon;
+ $@wave_cave10 = 5;
+ @boss = 0;
+ initnpctimer;
+ end;
+
+OnTimer4000:
+ if (attachrid(getcharid(3,$@cave10fighter$)) == 0) goto L_Abort;
+ @boss = @boss + 1;
+ if (@boss == 1)
+ message strcharinfo(0), "You feel something strange... Looks like something terrible is about to show up in this cave.";
+ if (@boss == 2)
+ goto L_SummonBoss;
+ setnpctimer 0;
+ end;
+
+OnMonsterDeath:
+ $@cave10_kills = $@cave10_kills + 1;
+ if ($@cave10_kills >= $@cave10_monsters_QTY[1] + $@cave10_monsters_QTY[2] + $@cave10_monsters_QTY[3] + $@cave10_monsters_QTY[4])
+ goto L_Done;
+ end;
+
+OnBossDeath:
+ if (attachrid(getcharid(3,$@cave10fighter$)) == 0) goto L_Abort;
+ message strcharinfo(0), "What a harsh battle... You should hurry and save Julia!";
+ Rossy_Quest = 16;
+ getexp 100000, 0;
+ BOSS_POINTS = BOSS_POINTS + 50;
+ message strcharinfo(0), "You gain 50 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+L_close:
+ close;
+
+L_No_root:
+ mes "I don't have any roots in my inventory!";
+ close;
+
+}
+
+
+025-4,157,48,0 script #CheckCaveFightBoss NPC45,1,1,{
+ if (Rossy_Quest >= 17)
+ goto L_Done;
+ if (Rossy_Quest == 16)
+ goto L_Julia;
+ if (Rossy_Quest < 16 && $@battlecave10 == 1)
+ goto L_Out;
+ if (Rossy_Quest < 16 && $@battlecave10 == 2)
+ goto L_Julia;
+ end;
+
+L_Julia:
+ message strcharinfo(0), "I shouldn't leave yet. Julia is still in danger.";
+ end;
+
+L_Done:
+ warp "025-3", 77, 168;
+ end;
+
+L_Out:
+ donpcevent "#WarpBossCave::OnGetout";
+ end;
+}
+
+
+025-4,157,24,0 script #CheckJuliaCaveOutside NPC45,1,1,{
+ if (Rossy_Quest > 15)
+ goto L_Done;
+ message strcharinfo(0), "As you try to walk through, you bump into a strong magical barrier.";
+ heal ((MaxHp/100) * -10), 0;
+ end;
+
+L_Done:
+ donpcevent "#WarpBossCave::OnWin";
+ end;
+}
+
+
+025-4,93,35,0 script #CheckJuliaCaveInside NPC45,1,1,{
+ if (Rossy_Quest >= 17)
+ goto L_Done;
+ if (Rossy_Quest == 16)
+ goto L_Save;
+ if (Rossy_Quest <= 15)
+ goto L_Cheat;
+ end;
+
+L_Cheat:
+ message strcharinfo(0), "You shouldn't be here, you cheater.";
+ heal -Hp, 0;
+ end;
+
+L_Done:
+ message strcharinfo(0), "As you go back to the cave you close your eyes, terrified of the bloody battle you just fought in this place, and feel your way back to the entrance of the cave.";
+ warp "025-3", 77, 168;
+ end;
+
+L_Save:
+ message strcharinfo(0), "You can't leave Julia here, all alone!";
+ end;
+}
+
diff --git a/npc/025-4/clauquer.txt b/npc/025-4/clauquer.txt
new file mode 100644
index 00000000..5067d853
--- /dev/null
+++ b/npc/025-4/clauquer.txt
@@ -0,0 +1,114 @@
+
+025-4,30,30,0 script Clauquer NPC169,{
+ if (Rossy_Quest >= 16 || FLAGS & FLAG_ROSSI_COMPLETED) goto L_Rescued;
+ if (Rossy_Quest == 15) goto L_Hmmm;
+ if (Rossy_Quest == 14) goto L_Help;
+ if (Rossy_Quest <= 13) goto L_Huh;
+ goto L_Help;
+
+L_Help:
+ mes "[Clauquer]";
+ mes "\"Hello stranger, are you lost?\"";
+ next;
+ mes "\"Don't answer, I know you are looking for someone... A little girl, is that right?\"";
+ next;
+ menu
+ "I must admit you're right, but how come you...", L_LittleGirl,
+ "I'm not lost and I don't need help, bye.", L_No;
+
+L_LittleGirl:
+ mes "[Clauquer]";
+ mes "\"How do I know you're looking for her? Well, because I am a very good observer. I know you were helping her family. Besides, I saw the little girl. I also heard her. She screamed, and probably still screams like hell. Moreover, I don't think you would enter these caves just for fun!\"";
+ next;
+ menu
+ "Of course not.", L_Next;
+
+L_Next:
+ mes "[Clauquer]";
+ mes "\"I can see that you really want to save the little girl. She is trapped in a place inside one of these caves, protected by a magic barrier created by a fey spirit. To save her, you have to annulate the energy sources of this barrier. They are located in 10 different spots, each one in a different cave.\"";
+ next;
+ menu
+ "But how can I annulate this barrier?", L_ButBarrier;
+
+L_ButBarrier:
+ mes "\"It is simple, you just have to place a root on the exact center of the energy source. Once you do this, its entire power will transmute into some terrible earth monsters. If you defeat them, this source of energy will be close to nothing and the barrier will be weaker.\"";
+ next;
+ mes "\"If my observations are correct, the girl is trapped in a cave protected by a barrier fed by 9 different power sources. And inside this cave, there is another barrier, fed by a single, but very strong, power source. The girl is inside that cave, protected by that strong barrier.\"";
+ next;
+ mes "\"Be prepared before you enter one of those caves, because once you put the root in the power source, you won't be able to get out. Also, remember that you can't stay in those caves for a long time, because of the foul air.\"";
+ next;
+ mes "\"Now I should tell you more about how that little girl got into that cave and warn you about what you are going to face there...\"";
+ next;
+ menu
+ "Please go on.", L_Advice;
+
+L_Advice:
+ mes "[Clauquer]";
+ mes "\"I advise you to be mentally prepared for this rescue operation. A fey nature spirit kidnapped the little girl and is planning to replace her with a changeling.\"";
+ next;
+ mes "\"The old tales of Hurnscald say this spirit always exchanges his offspring with beautiful and smart human children, to use them as servants. And his offspring usually forget about their own origin, growing up in a human family. But they are usually 'people' with really bad tempers, the kind of people who do terrible things in this world...\"";
+ next;
+ mes "However, the girl you are looking for is mentally too strong, and the spirit is having problems creating a changeling identical to her. So it locked her in one of those terrible caves, trying to scare the poor girl and make his task easier.\"";
+ next;
+ mes "\"Oh, and if you really plan to rescue the girl, I advise you to use potions for every single battle. I'm thinking of Concentration and Iron Potions. You might want to take some food with you too. I would personally take some water, I'm always thirsty. Don't be afraid to bring too much with you, these battles take time to end.\"";
+ next;
+ mes "\"I think you're now ready to explore these caves and fight.\"";
+ if (Rossy_Quest == 14) set Rossy_Quest, 15;
+ close;
+
+L_Hmmm:
+ @cleaned_caves = 0;
+ if (cavefights & BATTLE_CAVE1)
+ @cleaned_caves = @cleaned_caves + 1;
+ if (cavefights & BATTLE_CAVE2)
+ @cleaned_caves = @cleaned_caves + 1;
+ if (cavefights & BATTLE_CAVE3)
+ @cleaned_caves = @cleaned_caves + 1;
+ if (cavefights & BATTLE_CAVE4)
+ @cleaned_caves = @cleaned_caves + 1;
+ if (cavefights & BATTLE_CAVE5)
+ @cleaned_caves = @cleaned_caves + 1;
+ if (cavefights & BATTLE_CAVE6)
+ @cleaned_caves = @cleaned_caves + 1;
+ if (cavefights & BATTLE_CAVE7)
+ @cleaned_caves = @cleaned_caves + 1;
+ if (cavefights & BATTLE_CAVE8)
+ @cleaned_caves = @cleaned_caves + 1;
+ if (cavefights & BATTLE_CAVE9)
+ @cleaned_caves = @cleaned_caves + 1;
+ mes "[Clauquer]";
+ mes "\"You already know everything about these caves. You don't need me anymore to find the little girl.\"";
+ next;
+ menu
+ "But please, I really need your help!", L_NeedYourHelp,
+ "Oh, so many caves! Do you know how many are still left?", L_Feedback,
+ "You're right, I don't need your help!", L_No;
+
+L_NeedYourHelp:
+ mes "\"Ok, if you insist... But I can only repeat what I already said.\"";
+ goto L_Advice;
+
+L_Feedback:
+ if (@cleaned_caves > 0
+ && @cleaned_caves < 9)
+ mes "\"You are doing good... If I am right, you already eliminated " + @cleaned_caves + " of the 9 energy sources of the barrier that protects the cave in which Julia is hidden.\"";
+ if (@cleaned_caves == 9)
+ mes "\"I am amazed... You eliminated all the 9 energy sources. Now is the difficult part. To save Julia, you need to eliminate the last and most powerful barrier. Good Luck!\"";
+ if (@cleaned_caves <= 0)
+ mes "\"Well... You didn't eliminate any of the barriers, so that means there are still 9 caves and the tenth one, the strongest...\"";
+ close;
+
+L_Huh:
+ mes "[Clauquer]";
+ mes "\"Why are you here? Get out.\"";
+ close;
+
+L_No:
+ close;
+
+L_Rescued:
+ mes "[Clauquer]";
+ mes "\"I'm very impressed!";
+ mes "Now this fey nature spirit will never kidnap a poor child again.\"";
+ close;
+}
diff --git a/npc/025-4/julia.txt b/npc/025-4/julia.txt
new file mode 100644
index 00000000..1b64edeb
--- /dev/null
+++ b/npc/025-4/julia.txt
@@ -0,0 +1,44 @@
+
+025-4,89,21,0 script Julia NPC114,{
+ @Reward_Exp = 5000;
+
+ if (Rossy_Quest > 16 || FLAGS & FLAG_ROSSI_COMPLETED) goto L_End;
+ if (Rossy_Quest == 16) goto L_Done;
+ if (Rossy_Quest <= 15) goto L_Hmmm;
+ goto L_Done;
+
+L_Done:
+ mes "[Julia]";
+ mes "\"I heard some battle noises a few minutes ago. Are you here to save me?\"";
+ next;
+ menu
+ "Of course I'm here to save you, Rossy sent me here!", L_Next;
+
+L_Next:
+ mes "\"Rossy? My twin sister? I knew she was going to look for me. Thank you so much, here is a present for you.\"";
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_TooMany;
+ getitem "BlackBoots", 1;
+ getexp @Reward_Exp, 0;
+ Rossy_Quest = 17;
+ mes "\"I'm out of here now, lets get out of this horrible cave.\"";
+ close;
+
+L_End:
+ mes "[Julia]";
+ mes "\"Lets get out of this horrible cave.\"";
+ close;
+
+L_Hmmm:
+ mes "[Julia]";
+ mes "\"Don't hurt me!\"";
+ close;
+
+L_TooMany:
+ mes "[Julia]";
+ mes "\"Oh, you don't have room for it. Come back when your backpack isn't full.\"";
+ next;
+ mes "\"I'll wait here until I can give your present to you!\"";
+ close;
+}
diff --git a/npc/025-4/mapflags.txt b/npc/025-4/mapflags.txt
new file mode 100644
index 00000000..8183383c
--- /dev/null
+++ b/npc/025-4/mapflags.txt
@@ -0,0 +1,2 @@
+025-4 mapflag nosave 025-1,33,50
+025-4 mapflag zone MMO
diff --git a/npc/026-1/_import.txt b/npc/026-1/_import.txt
new file mode 100644
index 00000000..1b4477e7
--- /dev/null
+++ b/npc/026-1/_import.txt
@@ -0,0 +1,11 @@
+// Map 026-1: Asphodel Moor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/026-1/_mobs.txt",
+"npc/026-1/_warps.txt",
+"npc/026-1/evil_guard.txt",
+"npc/026-1/headless_man.txt",
+"npc/026-1/husband.txt",
+"npc/026-1/mapflags.txt",
+"npc/026-1/sign.txt",
+"npc/026-1/soul-menhir.txt",
+"npc/026-1/traveler.txt",
diff --git a/npc/026-1/_mobs.txt b/npc/026-1/_mobs.txt
new file mode 100644
index 00000000..fa52d840
--- /dev/null
+++ b/npc/026-1/_mobs.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 026-1: Asphodel Moor mobs
+026-1,0,0,0,0 monster Wisp 1040,34,120000,40000
+026-1,0,0,0,0 monster Spectre 1042,34,120000,40000
+026-1,0,0,0,0 monster Poltergeist 1047,34,120000,40000
+026-1,0,0,0,0 monster Silkworm 1035,10,300000,60000
+026-1,0,0,0,0 monster Log Head 1025,8,300000,40000
+026-1,49,31,28,7 monster Drunken Skeleton 1077,4,100000,30000
+026-1,50,31,26,5 monster Tipsy Skeleton 1078,4,100000,30000
+026-1,56,77,33,15 monster Drunken Skeleton 1077,4,100000,30000
+026-1,57,77,29,11 monster Tipsy Skeleton 1078,4,100000,30000
+026-1,110,59,15,37 monster Drunken Skeleton 1077,4,100000,30000
+026-1,110,59,14,35 monster Tipsy Skeleton 1078,4,100000,30000
+026-1,110,59,15,37 monster Drunken Lady Skeleton 1079,4,100000,30000
+026-1,57,79,34,16 monster Drunken Lady Skeleton 1079,4,100000,30000
+026-1,48,31,27,6 monster Drunken Lady Skeleton 1079,4,100000,30000
diff --git a/npc/026-1/_warps.txt b/npc/026-1/_warps.txt
new file mode 100644
index 00000000..33727884
--- /dev/null
+++ b/npc/026-1/_warps.txt
@@ -0,0 +1,7 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 026-1: Asphodel Moor warps
+026-1,63,16,0 warp #026-1_63_16 0,0,027-1,63,105
+026-1,129,66,0 warp #026-1_129_66 0,0,025-1,20,66
+026-1,48,39,0 warp #026-1_48_39 0,0,026-2,29,33
+026-1,43,24,0 warp #026-1_43_24 0,0,026-2,31,128
+026-1,25,20,0 warp #026-1_25_20 0,0,026-2,22,95
diff --git a/npc/026-1/evil_guard.txt b/npc/026-1/evil_guard.txt
new file mode 100644
index 00000000..8f6e3c09
--- /dev/null
+++ b/npc/026-1/evil_guard.txt
@@ -0,0 +1,26 @@
+026-1,50,32,0 script Blackwin NPC316,{
+ mes "...";
+ next;
+ mes "The guard glares at you, silently daring you to try something.";
+ next;
+ mes "[Evil Guard]";
+ mes "\"Heed my warning, young human. My master will suffer no fools here.\"";
+ next;
+ mes "[Evil Guard]";
+ mes "\"He created this as a place of leisure, and we are here to ensure that it remains undisturbed.\"";
+ close;
+}
+
+026-1,29,28,0 script Forwin NPC316,{
+ mes "[Evil Guard]";
+ mes "\"" + strcharinfo(0) + "...\"";
+ next;
+ mes "[Evil Guard]";
+ mes "\"I am your father...\"";
+ next;
+ mes "There is an awkward pause, and then the guard bursts out laughing.";
+ mes "";
+ mes "[Evil Guard]";
+ mes "\"Just kidding! Can you imagine Golbenez's reaction if we had such puny offspring?\"";
+ close;
+}
diff --git a/npc/026-1/headless_man.txt b/npc/026-1/headless_man.txt
new file mode 100644
index 00000000..f70809de
--- /dev/null
+++ b/npc/026-1/headless_man.txt
@@ -0,0 +1,202 @@
+
+026-1,34,30,0 script Thurstan NPC318,{
+ @Graveyard_Inn_MASK = NIBBLE_6_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_6_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ @Wisp_Powder = 50;
+ @Polt_Powder = 50;
+ @Spec_Powder = 50;
+ @iron_Pot = 50;
+ @Conc_Pot = 30;
+ @Red_Dye = 50;
+ @Yellow_Dye = 50;
+ @LB_Dye = 50;
+
+ @Glue_Exp = 50000;
+
+ if (@state >= 3) goto L_Final;
+ if (@state == 2) goto L_Quest_finished;
+ if (@state == 1) goto L_Quest_progress;
+
+ mes "You see a man, propped up against the foot of the tree.";
+ mes "In his hand, he is holding what you assume to be his own head.";
+ next;
+ mes "You jump back a bit, startled, as the head starts talking to you!";
+ mes "It's a little strange watching him talk, but it's better than looking at what's left of his neck.";
+ next;
+ if (BaseLevel < 85)
+ goto L_greet;
+ mes "[Headless Man]";
+ mes "\"Hello. My name is Thurstan. Could I ask your assistance with something? I seem to be in a spot of difficulty.\"";
+ menu
+ "I'll listen, just keep that thing from dripping on me.", L_Quest_ask,
+ "Ack, a bloody talking head! Gross, no way!", L_close;
+
+L_greet:
+ mes "[Headless Man]";
+ mes "\"Greetings! Do you have any duck tape?\"";
+ goto L_close;
+
+L_Quest_ask:
+ mes "[Thurstan]";
+ mes "\"A little while ago there was a patron visiting the inn...I can't remember his name now. He noticed this predicament I am in and offered to help me. He told me that he was an alchemist and that he had a recipe for an adhesive that would keep my head where it's supposed to be. Unfortunately, he wasn't able to stay long enough to gather all the ingredients for the spell, so he gave me the recipe instead. However, it's rather hard to gather things when I have to carry it around all day.\"";
+ next;
+ mes "[Thurstan]";
+ mes "\"I have a list of items and how many of each are needed. Would you mind gathering them for me?\"";
+ menu
+ "Lay it on me, Mr. Noggin!", L_Quest_start,
+ "Sorry, I'm kinda busy with, you know, living.", L_Quest_no;
+
+L_Quest_start:
+ mes "[Thurstan]";
+ mes "\"Great! I will need the following things.\"";
+ mes "\"" + @Wisp_Powder + " Wisp Powder,\"";
+ mes "\"" + @Polt_Powder + " Poltergeist Powder,\"";
+ mes "\"" + @Spec_Powder + " Spectre Powder,\"";
+ mes "\"" + @iron_Pot + " Iron Potion,\"";
+ mes "\"" + @Conc_Pot + " Concentration Potion,\"";
+ mes "\"" + @Red_Dye + " vials of Red Dye,\"";
+ mes "\"" + @Yellow_Dye + " vials of Yellow Dye,\"";
+ mes "\"and...\"";
+ mes "\"" + @LB_Dye + " vials of Light Blue Dye,\"";
+ next;
+ mes "[Thurstan]";
+ mes "\"My friend also said that I should use a metal bowl instead of a wooden one. I don't have one and I think a cauldron from the kitchen would be too big. Perhaps we could use an Infantry Helmet to serve that task.\"";
+ next;
+ mes "[Thurstan]";
+ mes "\"I know it probably doesn't seem like that much to you, but it is a really big deal for me. I will try to find something to compensate you for your efforts.\"";
+ @state = 1;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Quest_no:
+ mes "[Thurstan]";
+ mes "\"Very well. Just don't come looking to me when your own head falls off!\"";
+ goto L_close;
+
+L_Quest_progress:
+ mes "[Thurstan]";
+ mes "Have you managed to find those items yet?\"";
+ menu
+ "Yes, here you go!", L_Quest_check,
+ "What was I supposed to get again?", L_Quest_items,
+ "No, I'm still working on it.", L_close;
+
+L_Quest_check:
+ if (countitem("WispPowder") < @Wisp_Powder
+ || countitem("PoltergeistPowder") < @Polt_Powder
+ || countitem("SpectrePowder") < @Spec_Powder
+ || countitem("IronPotion") < @iron_Pot
+ || countitem("ConcentrationPotion") < @Conc_Pot
+ || countitem("RedDye") < @Red_Dye
+ || countitem("YellowDye") < @Yellow_Dye
+ || countitem("LightBlueDye") < @LB_Dye
+ || countitem("InfantryHelmet") < 1)
+ goto L_Quest_notenough;
+
+ delitem "WispPowder", @Wisp_Powder;
+ delitem "PoltergeistPowder", @Polt_Powder;
+ delitem "SpectrePowder", @Spec_Powder;
+ delitem "IronPotion", @iron_Pot;
+ delitem "ConcentrationPotion", @Conc_Pot;
+ delitem "RedDye", @Red_Dye;
+ delitem "YellowDye", @Yellow_Dye;
+ delitem "LightBlueDye", @LB_Dye;
+ delitem "InfantryHelmet", 1;
+ getexp @Glue_Exp, 0;
+ mes "[Thurstan]";
+ mes "\"Excellent, excellent!\"";
+ mes "";
+ mes "Thurstan takes your ingredients and seperates them into little piles according to some complex formula he is reading, seemingly from the tops of his shoes.";
+ next;
+ mes "[Thurstan]";
+ mes "\"Now if I could prevail upon you to mix the ingredients according to the instructions I have here, I would be greatly indebted.\"";
+ next;
+ mes "You mix the powders together in the Infantry bowl, adding potions and dyes as instructed. Gradually, the concoction starts to get tacky and takes on a hue similar to Thurstan's skin.";
+ mes "You can see him starting to get excited beside you...";
+ next;
+ mes "[Thurstan]";
+ mes "\"Oh this is perfect! I'll be back in action in no time!\"";
+ next;
+ mes "Thurstan covers the base of his neck with a thick coat of the glue using his free hand. He then lifts his head in both hands, places it on the layer of adhesive, and makes some minor adjustments to the position. He mutters an incantation that you can't make out and the wound across his neck seems to fade away.";
+ misceffect sfx_magic_transmute;
+ next;
+ mes "Thurstan is practically jumping for joy now.";
+ mes "";
+ mes "[Thurstan]";
+ mes "\"Thank you so much! That is such a weight on my shoulders! Now that I have some mobility back, let me see what I can do to repay you. Would you mind coming back in a few minutes?\"";
+ @state = 2;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Quest_notenough:
+ mes "Thurstan quickly looks through the items you've brought.";
+ mes "[Thurstan]";
+ mes "\"It seems you are missing a few things. Please come back once you have everything on the list.\"";
+ goto L_close;
+
+L_Quest_items:
+ mes "[Thurstan]";
+ mes "\"" + @Wisp_Powder + " Wisp Powder,\"";
+ mes "\"" + @Polt_Powder + " Poltergeist Powder,\"";
+ mes "\"" + @Spec_Powder + " Spectre Powder,\"";
+ mes "\"" + @iron_Pot + " Iron Potion,\"";
+ mes "\"" + @Conc_Pot + " Concentration Potion,\"";
+ mes "\"" + @Red_Dye + " vials of Red Dye,\"";
+ mes "\"" + @Yellow_Dye + " vials of Yellow Dye,\"";
+ mes "\"" + @LB_Dye + " vials of Light Blue Dye,\"";
+ mes "\"We'll also need 1 Infantry Helmet to use as a bowl for mixing everything together.\"";
+ goto L_close;
+
+L_Quest_finished:
+ mes "[Thurstan]";
+ mes "\"Thank you for all your help.\"";
+ next;
+ mes "[Thurstan]";
+ mes "\"It worked well and the bond seemed to be holding for a while. Then I started feeling a strange tingling in my neck. I suppose that was the adhesive starting to dissolve. I was leaned over my trunk digging around for something appropriate to give you..Aaaand once again my head left it's proper place.\"";
+ next;
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+ mes "[Thurstan]";
+ mes "\"Please take this for your efforts. I got it in payment of some work I did protecting the pinkie population from a terrible scourge some time ago.\"";
+ getitem "PinkieHelmet", 1;
+ @state = 3;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Full_Inv:
+ mes "[Thurstan]";
+ mes "\"I'd like to give you something for your efforts, but you're carrying too much stuff.\"";
+ goto L_close;
+
+L_Final:
+ mes "[Thurstan]";
+ mes "\"I guess I will need to find another way to re-attach my cranium. If you come across any good alchemists who might be able to help, please let me know.\"";
+ goto L_close;
+
+L_close:
+
+ @Graveyard_Inn_MASK = 0;
+ @Graveyard_Inn_SHIFT = 0;
+ @state = 0;
+ @Wisp_Powder = 0;
+ @Polt_Powder = 0;
+ @Spec_Powder = 0;
+ @iron_Pot = 0;
+ @Conc_Pot = 0;
+ @Red_Dye = 0;
+ @Yellow_Dye = 0;
+ @LB_Dye = 0;
+ @Glue_Exp = 0;
+ close;
+
+S_Update_Mask:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_MASK))
+ | (@state << @Graveyard_Inn_SHIFT);
+ return;
+
+}
diff --git a/npc/026-1/husband.txt b/npc/026-1/husband.txt
new file mode 100644
index 00000000..922a554c
--- /dev/null
+++ b/npc/026-1/husband.txt
@@ -0,0 +1,344 @@
+
+026-1,40,41,0 script Hamond NPC319,{
+ @Graveyard_Inn_MASK = NIBBLE_3_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_3_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ @Graveyard_Inn_Woman_MASK = NIBBLE_0_MASK;
+ @Graveyard_Inn_Woman_SHIFT = NIBBLE_0_SHIFT;
+
+ @woman = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Woman_MASK) >> @Graveyard_Inn_Woman_SHIFT);
+
+ @Graveyard_Inn_Kid_MASK = NIBBLE_2_MASK;
+ @Graveyard_Inn_Kid_SHIFT = NIBBLE_2_SHIFT;
+
+ @kidstate = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Kid_MASK) >> @Graveyard_Inn_Kid_SHIFT);
+
+ @Graveyard_Inn_Golbenez_MASK = NIBBLE_4_MASK;
+ @Graveyard_Inn_Golbenez_SHIFT = NIBBLE_4_SHIFT;
+
+ @golbanez = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Golbenez_MASK) >> @Graveyard_Inn_Golbenez_SHIFT);
+
+ @minLevel = 85;
+ @iCE_CUBE_AMOUNT = 100;
+ @iCE_CUBE_EXP = 75000;
+ @BONE_AMOUNT = 100;
+ @SKULL_AMOUNT = 75;
+ @BONE_EXP = 100000;
+ set @RUBY_AMOUNT, 25; // caution, this value needs to be the same as in the innkeepers script!
+
+ if (@state >= 7) goto L_Thanks;
+ if (@state == 6) goto L_Apologize;
+ if (@state == 5) goto L_Waiting;
+ if (@state == 4) goto L_News;
+ if (@state == 3) goto L_Brought_Bones;
+ if (@state == 2) goto L_Check_Bones;
+ if (@state == 1) goto L_Ice_Cube;
+
+ mes "[Pale Man]";
+ mes "\"Hello, My name is Hamond. I run the inn together with my beautiful wife Reid. If there is anything I can do for you, please let me know.\"";
+ if (BaseLevel < @minLevel)
+ goto L_close;
+ next;
+ menu
+ "I'd like to know why all the people in here are dead.",L_Next,
+ "Are you feeling well? You look very pale... In fact, deathly pale.",L_Next,
+ "Thank you, but I'm fine.", L_close;
+
+L_Next:
+ mes "Hamond seems very confused. Then he notices the grey color of his hands and begins to shake his head in panic.";
+ mes "[Hamond]";
+ mes "\"WHAT IS THIS?\"";
+ next;
+ mes "Because of the fast movement of his head, it hinges back in his neck along a cut in his throat.. a deep cut you didn't notice before.";
+ next;
+ mes "You're trying hard not to run away screaming. Instead, you grab his hair and pull his head back into place.";
+ next;
+ mes "Hamond blinks a few times, with a puzzled look on his face.";
+ mes "[Hamond]";
+ mes "\"That was uncomfortable! I guess you are right. I am dead. Weird.\"";
+ next;
+ mes "\"How can I be dead if I am walking around and talking? This is very strange. \"";
+ next;
+ mes "\"But nevertheless, I will continue to run the inn and do my best to make all our patrons happy and satisfied - be they alive or dead.\"";
+ next;
+ menu
+ "Can I help with that?", L_Continue;
+
+L_Continue:
+ mes "[Hamond]";
+ mes "\"Help me? Normally I would never ask you for this, but actually, I do need something to cool the drinks. Maybe you can find something.\"";
+
+ @state = 1;
+ callsub S_Update_Mask;
+
+ goto L_close;
+
+L_Ice_Cube:
+ mes "[Hamond]";
+ mes "\"Hello my friend! Good to see you again. Did you find something to cool the drinks?\"";
+ next;
+
+ if ((@kidstate == 4)
+ && countitem("IceCube") > 0)
+ menu
+ "Maybe this never melting Ice Cube?", L_Check_Ice,
+ "I found this in the main hall. Do you know to whom it belongs?", L_Ring,
+ "I'm still searching.", L_close;
+ if (@kidstate == 4)
+ menu
+ "I found this in the main hall. Do you know to whom it belongs?", L_Ring,
+ "I'm still searching.", L_close;
+ if (countitem("IceCube") > 0)
+ menu
+ "Maybe this never melting Ice Cube?", L_Check_Ice,
+ "I'm still searching.", L_close;
+ mes "\"You didn't? Too bad.\"";
+ goto L_close;
+
+L_Check_Ice:
+ if (countitem("IceCube") < @iCE_CUBE_AMOUNT)
+ goto L_Not_Enough_Cubes;
+ delitem "IceCube", @iCE_CUBE_AMOUNT;
+
+ getexp @iCE_CUBE_EXP, 0;
+
+ @state = 2;
+ callsub S_Update_Mask;
+
+ mes "[Hamond]";
+ mes "\"Yes, wonderful! That's exactly what I need.\"";
+ next;
+ mes "\"I put all my effort in making the inn a run well for my beloved Reid.\"";
+ next;
+ mes "\"You know, she had a very hard childhood.\"";
+ next;
+ mes "\"Her parents were the former owners of the inn. But they had some problems and the inn wasn't running well.\"";
+ next;
+ mes "\"Also they died very early and Reid was so lonely and sad. She is such a wonderful woman, I'd do anything for her.\"";
+ next;
+ mes "He mumbles the next sentence as if to himself.";
+ next;
+ mes "\"And I won't let a wannabe mage take her away from me...\"";
+ next;
+ menu
+ "What do you mean?",L_More;
+
+L_More:
+ mes "[Hamond]";
+ mes "\"Nevermind, nevermind. I'd like to ask you for another favor, if I might.\"";
+ next;
+ mes "\"A patron asked for - uhm, bones. He said he needed to replace some of his bones, which were damaged in a scuffle with mortals.\"";
+ next;
+ mes "\"I know, this is a bit strange - I'm still getting used to being dead. But a patron's wish is a patron's wish!\"";
+ next;
+ mes "\"Can you bring me a huge amount of bones and skulls? This way I can fulfill that peculiar wish and make another patron very happy!\"";
+ goto L_close;
+
+L_Check_Bones:
+ mes "[Hamond]";
+ mes "\"Welcome back! Let me see what you have.\"";
+ if ((countitem("Bone") < @BONE_AMOUNT)
+ || (countitem("Skull") < @SKULL_AMOUNT))
+ goto L_Not_Enough_B;
+ delitem "Bone", @BONE_AMOUNT;
+ delitem "Skull", @SKULL_AMOUNT;
+
+ getexp @BONE_EXP, 0;
+
+ @state = 3;
+ callsub S_Update_Mask;
+ goto L_Brought_Bones;
+
+L_Brought_Bones:
+ mes "[Hamond]";
+ mes "\"Thanks for your help! Now I'll be able to satisfy another strange request from one of our patrons.\"";
+ next;
+
+ if ((@kidstate == 4)
+ && (@woman > 5))
+ menu
+ "Would you tell me about this mage named Savaric?", L_Savaric,
+ "I found this in the main hall. Do you know to whom it belongs?", L_Ring,
+ "You're welcome.", L_close;
+ if (@kidstate == 4)
+ menu
+ "I found this in the main hall. Do you know to whom it belongs?", L_Ring,
+ "You're welcome.", L_close;
+ if (@woman > 5)
+ menu
+ "Would you tell me about this mage named Savaric?", L_Savaric,
+ "You're welcome.",L_Welcome;
+ goto L_Welcome;
+
+L_Welcome:
+ mes "[Hamond]";
+ mes "\"Please make yourself at home.\"";
+ goto L_close;
+
+L_Savaric:
+ mes "Hamond's face turns into an ugly grimace.";
+ mes "[Hamond]";
+ mes "\"That cheeky egomaniac - \"";
+ next;
+
+ if (@kidstate < 7)
+ goto L_Problem;
+ mes "\"Well, I have been thinking about you. You seem to be a very helpful and wise person. Even my son told me good things about you, making a long speech about how great you are and your ability to comprehend and deal with delicate matters. I wonder how he reached that conclusion... But anyway, I'll tell you about Savaric.\"";
+ next;
+ goto L_Jealousy;
+
+L_Jealousy:
+ mes "[Hamond]";
+ mes "\"Savaric calls himself the first apprentice of a great wizard and seems to hold his head very high because of that. Pah, that snooty-nosed little upstart.\"";
+ next;
+ mes "\"Don't get me wrong, usually I'm a very open minded man, everyone can live their life as ever they like. But I never saw a wizard do anything good. They're in their books and ancient riddles and speaking with demons and whatever else they might come up with.\"";
+ next;
+ mes "\"But do they care for normal people? I've never seen that. And not only that! This Savaric guy seems to think it is fun to play games with my wife.\"";
+ next;
+ mes "Hamond seems to nearly burst with anger.";
+ next;
+ mes "\"I guess, they think I don't see what they are doing! But they are flirting all the time, my poor Reid seems unable to have a straight thought anymore.\"";
+ next;
+ mes "\"I already thought about throwing him out of the inn - but he is a patron! I can't be rude to a patron.\"";
+ next;
+ mes "\"Ah, this is annoying.\"";
+ @state = 4;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Problem:
+ mes "[Hamond]";
+ mes "\"To be honest, I think I'd only be able to talk about such a complicated matter if I am sure I am sharing my feelings with a good, wise and understanding person. No offense, it is just that I barely know you...\"";
+ goto L_close;
+
+L_Ring:
+ mes "[Hamond]";
+ mes "\"Well.. this is just a cheap ring. It is very popular with the young kids, especially the magic students.\"";
+ next;
+ mes "\"They say the ring increases 'magic attack' if you add a sapphire gem to it... But, in fact, I think these kids are delusional. Magic, pah.\"";
+ next;
+ mes "\"Anyway, I remember you could easily find one of these in a lot of small shops in town. I am pretty sure that whoever lost it won't bother coming all the way back to get it.\"";
+ @kidstate = 5;
+ callsub S_Update_Mask_Kid;
+ goto L_close;
+
+L_News:
+ mes "[Hamond]";
+ mes "\"Ah, dear friend. How are you?\"";
+ if (@golbanez < 5)
+ menu
+ "I'm enjoying myself.",L_close;
+ menu
+ "I'm enjoying myself.",L_close,
+ "I found out what happened to you and this place.",L_FoundOut;
+
+L_FoundOut:
+ mes "[Hamond]";
+ mes "\"You did? Amazing! Please tell me.\"";
+ next;
+ mes "You explain to him how you came here, the results of your research and what Golbenez showed to you.";
+ next;
+ mes "[Hamond]";
+ mes "\"WHAT? This is just crazy! But - you've shown me that you're trustworthy. This must be the truth.\"";
+ next;
+ mes "\"But still, it is hard to believe - I can't imagine I would ever hurt Reid and that she - that she would cheat on me.\"";
+ next;
+ mes "\"How did this come about? What did I do wrong? I should have shown her my love more. I should have protected her from the allurements of that sneaky mage. And I - I should have never ever hurt her.\"";
+ next;
+ mes "Hamond seems about to break down.";
+ menu
+ "Maybe it was just fate.",L_HamondFate,
+ "You got very upset, don't blame yourself",L_HamondFate,
+ "You're right. You were very violent. How could you do that if you love her?",L_HamondFate;
+
+L_HamondFate:
+ mes "[Hamond]";
+ mes "\"I- I need to apologize.\"";
+ next;
+ mes "\"" + strcharinfo(0) + "! Can you help me once more? Please get " + @RUBY_AMOUNT + " Rubies and bring them to her as a symbol of my love and my remorse.\"";
+ @state = 5;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Waiting:
+ mes "[Hamond]";
+ mes "\"Did you bring Reid the " + @RUBY_AMOUNT + " Rubies?\"";
+ goto L_close;
+
+L_Apologize:
+ mes "[Hamond]";
+ mes "\"I thank you! Reid came to me to talk about what happened.\"";
+ next;
+ mes "\"We talked about all the stuff that happened. It's hard for me, but I accepted her feelings for that mage. I mean - we are dead! And we have to stay in this place together for the rest of eternity! This is just perverted.\"";
+ next;
+ mes "\"But whatever, we need to get along with each other someway and I won't be the one who makes this difficult.\"";
+ next;
+ mes "\"And frankly, it gives me a bitter satisfaction that they long for each other but can't touch each other.\"";
+ next;
+ mes "\"However, you are a great friend and did a lot for me. I want you to have this.\"";
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+ getitem "BowlerHatBrown", 1;
+ @state = 7;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Thanks:
+ mes "[Hamond]";
+ mes "\"Good to see you, my friend! The inn is running well and I'm getting used to being dead.\"";
+ goto L_close;
+
+L_Not_Enough_B:
+ if (countitem("Bone") < @BONE_AMOUNT)
+ mes "\"I need more Bones than you have with you right now.\"";
+ if (countitem("Skull") < @SKULL_AMOUNT)
+ mes "\"Maybe you should come back with more Skulls than you have now. I don't think it is enough.\"";
+ goto L_close;
+
+L_Not_Enough_Cubes:
+ mes "[Hamond]";
+ mes "\"Yes, they look good! But I think I need more of them. Maybe " + @iCE_CUBE_AMOUNT + "?\"";
+ goto L_close;
+
+L_Full_Inv:
+ mes "[Hamond]";
+ mes "\"You have a really full backpack, haven't you? Come back when you have some room in there.\"";
+ goto L_close;
+
+L_close:
+ @Graveyard_Inn_MASK = 0;
+ @Graveyard_Inn_SHIFT = 0;
+ @state = 0;
+ @Graveyard_Inn_Woman_MASK = 0;
+ @Graveyard_Inn_Woman_SHIFT = 0;
+ @woman = 0;
+ @Graveyard_Inn_Kid_MASK = 0;
+ @Graveyard_Inn_Kid_SHIFT = 0;
+ @Graveyard_Inn_Golbenez_MASK = 0;
+ @Graveyard_Inn_Golbenez_SHIFT = 0;
+ @golbanez = 0;
+ @kidstate = 0;
+ @minLevel = 0;
+ @iCE_CUBE_AMOUNT = 0;
+ @iCE_CUBE_EXP = 0;
+ @BONE_AMOUNT = 0;
+ @SKULL_AMOUNT = 0;
+ @BONE_EXP = 0;
+ @RUBY_AMOUNT = 0;
+ close;
+
+S_Update_Mask_Kid:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_Kid_MASK))
+ | (@kidstate << @Graveyard_Inn_Kid_SHIFT);
+ return;
+
+S_Update_Mask:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_MASK))
+ | (@state << @Graveyard_Inn_SHIFT);
+ return;
+}
diff --git a/npc/026-1/mapflags.txt b/npc/026-1/mapflags.txt
new file mode 100644
index 00000000..5cadd285
--- /dev/null
+++ b/npc/026-1/mapflags.txt
@@ -0,0 +1,2 @@
+//026-1 mapflag resave 026-1,28,35
+026-1 mapflag zone outside
diff --git a/npc/026-1/sign.txt b/npc/026-1/sign.txt
new file mode 100644
index 00000000..96893a95
--- /dev/null
+++ b/npc/026-1/sign.txt
@@ -0,0 +1,6 @@
+
+026-1,64,16,0 script Sign NPC400,{
+ mes "Hurnscald's Graveyard is north of here.";
+ mes "BEWARE!";
+ close;
+}
diff --git a/npc/026-1/soul-menhir.txt b/npc/026-1/soul-menhir.txt
new file mode 100644
index 00000000..6b373861
--- /dev/null
+++ b/npc/026-1/soul-menhir.txt
@@ -0,0 +1,15 @@
+
+026-1,29,34,0 script Soul Menhir#deadmire NPC351,{
+ @map$ = "026-1";
+ setarray @Xs, 28, 29, 30, 28, 30, 28, 30;
+ setarray @Ys, 32, 33, 34, 32, 34, 32, 34;
+ @x = 0;
+ @y = 0;
+ callfunc "SoulMenhir";
+ @map$ = "";
+ cleararray @Xs[0], 0, 7;
+ cleararray @Ys[0], 0, 7;
+ @x = 0;
+ @y = 0;
+ close;
+}
diff --git a/npc/026-1/traveler.txt b/npc/026-1/traveler.txt
new file mode 100644
index 00000000..1f263fe7
--- /dev/null
+++ b/npc/026-1/traveler.txt
@@ -0,0 +1,7 @@
+
+026-1,49,46,0 script Styx the Traveler NPC103,{
+ @npcname$ = "Styx";
+ @NpcTravelBit = $@graveyard_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/026-2/_import.txt b/npc/026-2/_import.txt
new file mode 100644
index 00000000..05e59fe7
--- /dev/null
+++ b/npc/026-2/_import.txt
@@ -0,0 +1,16 @@
+// Map 026-2: Swamp Indoors
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/026-2/_warps.txt",
+"npc/026-2/barman.txt",
+"npc/026-2/cerhan.txt",
+"npc/026-2/crying_child.txt",
+"npc/026-2/diary.txt",
+"npc/026-2/door.txt",
+"npc/026-2/eurni.txt",
+"npc/026-2/golbenez.txt",
+"npc/026-2/gy_inn_shops.txt",
+"npc/026-2/innkeeper.txt",
+"npc/026-2/lover.txt",
+"npc/026-2/mapflags.txt",
+"npc/026-2/testnpcs.txt",
+"npc/026-2/werewolf.txt",
diff --git a/npc/026-2/_warps.txt b/npc/026-2/_warps.txt
new file mode 100644
index 00000000..5f7ed09c
--- /dev/null
+++ b/npc/026-2/_warps.txt
@@ -0,0 +1,13 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 026-2: Swamp Indoors warps
+026-2,30,35,0 warp #026-2_30_35 3,0,026-1,48,40
+026-2,23,25,0 warp #026-2_23_25 1,0,026-2,66,25
+026-2,66,26,0 warp #026-2_66_26 1,0,026-2,23,27
+026-2,26,55,0 warp #026-2_26_55 1,0,026-2,23,31
+026-2,23,33,0 warp #026-2_23_33 1,0,026-2,26,56
+026-2,22,96,0 warp #026-2_22_96 0,0,026-1,25,21
+026-2,41,82,0 warp #026-2_41_82 1,0,026-2,83,95
+026-2,84,96,0 warp #026-2_84_96 1,0,026-2,41,83
+026-2,23,58,0 warp #026-2_23_58 0,0,026-2,81,57
+026-2,82,57,0 warp #026-2_82_57 0,0,026-2,24,58
+026-2,31,129,0 warp #026-2_31_129 0,0,026-1,43,25
diff --git a/npc/026-2/barman.txt b/npc/026-2/barman.txt
new file mode 100644
index 00000000..5c45bde0
--- /dev/null
+++ b/npc/026-2/barman.txt
@@ -0,0 +1,9 @@
+026-2,37,24,0 script Bennet NPC310,{
+ mes "[Bennet]";
+ mes "\"Hi there, stranger! My name is Bennet, the bartender here.\"";
+ next;
+ mes "[Bennet]";
+ mes "\"If you're planning to stick around for a while, please check back with me later. I might have some work for you.\"";
+ mes "\"In the meantime, enjoy your stay!\"";
+ close;
+}
diff --git a/npc/026-2/cerhan.txt b/npc/026-2/cerhan.txt
new file mode 100644
index 00000000..cd2d889f
--- /dev/null
+++ b/npc/026-2/cerhan.txt
@@ -0,0 +1,38 @@
+
+026-2,38,118,0 script Cerhan NPC311,{
+ mes "[Cerhan]";
+ mes "\"Ah, hello! It's good to see another normal human at this strange place!\"";
+ next;
+ menu
+ "That's true. What are you doing here?",L_Story,
+ "Yes, this place is really strange. I'm going to have another look around.",L_close;
+
+L_Story:
+ mes "[Cerhan]";
+ mes "\"I came from Thermin, a town in the Kazei area.\"";
+ next;
+ mes "\"I'm an experienced weapon master and I was thinking about establishing a smithy here. I'll need some more equipment, though.\"";
+ next;
+ if (countitem("MylarinDust") > 0)
+ menu
+ "Do you know something about 'Mylarin Dust'?", L_Mylarin,
+ "Good luck with that.",L_GoodLuckWith;
+ goto L_GoodLuckWith;
+
+L_GoodLuckWith:
+ mes "[Cerhan]";
+ mes "\"If you're interested in weapons and armor, you may want to come back later.\"";
+ goto L_close;
+
+L_Mylarin:
+ mes "[Cerhan]";
+ mes "\"Mylarin dust?! Where did you get that? That's amazing!\"";
+ next;
+ mes "\"I can craft you an amazing strong armor with that - uhm, well, first I need to set up my smithy here.\"";
+ next;
+ mes "\"Please come back, when I'm ready for that. Mylarin dust... amazing.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/026-2/crying_child.txt b/npc/026-2/crying_child.txt
new file mode 100644
index 00000000..ab9b43e8
--- /dev/null
+++ b/npc/026-2/crying_child.txt
@@ -0,0 +1,206 @@
+
+026-2,67,86,0 script Aldred NPC314,{
+
+ @Graveyard_Inn_MASK = NIBBLE_2_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_2_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ @minLevel = 85;
+
+ if (@state == 7) goto L_Return5;
+ if (@state == 6) goto L_Return4;
+ if (@state == 4 || @state == 5) goto L_Return3;
+ if (@state == 3) goto L_Return2;
+ if (@state == 2) goto L_Return1;
+ if (@state == 1) goto L_Return;
+ if (BaseLevel >= @minLevel) goto L_Intro;
+ goto L_cry;
+
+L_cry:
+ mes "[Crying Child]";
+ mes "\"Waaahhhhh!\"";
+ goto L_close;
+
+L_Intro:
+ mes "[Crying Child]";
+ mes "\"Waaah!\"";
+ next;
+ mes "\"Waaahhhaaa!\"";
+ next;
+ mes "You bend your knees near the child, trying to gain his confidence and ask why he is crying. But looking closely, you are surprised to see that his skin color is an awful, cadaveric grey...";
+ menu
+ "Calm down kid, what happened?",L_WhatHappen,
+ "Leave the kid alone.",L_close;
+
+L_WhatHappen:
+ mes "[Crying Child]";
+ mes "\"Oh, what? Who are you, what are you doing here?\"";
+ next;
+ menu
+ "My name is "+strcharinfo(0)+". I heard you cry and decided to check if you needed any help.",L_MyNameIs;
+
+L_MyNameIs:
+ mes "The child looks at you from head to toe and says: aren't you scared of me?\"";
+ next;
+ menu
+ "No... Why would I be scared of you?",L_NotScaredOf;
+
+L_NotScaredOf:
+ mes "[Crying Child]";
+ mes "\"I am, you know... dead. Like Mom and Dad, and a lot of other people in this inn... But most of them don't like to talk about it.\"";
+ menu
+ "You are a brave and smart kid... I have nothing to be afraid of.",L_BraveSmart;
+
+L_BraveSmart:
+ mes "[Crying Child]";
+ mes "\"It's nice to talk to you. I don't have any friends and Mom is always sad and Dad is always angry about something I don't know... and... Did you see the man in the room next to me? The one with horns? Oh, I don't like him! \"";
+ next;
+ mes "[Crying Child]";
+ mes "\"My parents told me not to talk to strangers... But you look nice... I guess I can trust you... I'm Aldred and we live here, my parents and I. This is our inn.\"";
+ next;
+ mes "[Aldred]";
+ mes "\"You asked why I was crying. My problem is... I don't know what to do... My dad will be so angry with me... He used to be very nice, but now... if you do something wrong... he... Waaaaa!\"";
+ next;
+ menu
+ "There, there. Don't cry... What did you do?",L_DontCryWhat;
+
+L_DontCryWhat:
+ mes "[Aldred]";
+ mes "\"Umm... I was looking at my parents' stuff and I found this funny thing! It looked like a normal ring, but with a round empty space... I thought it would be fun to take it with me and maybe look for a stone or a gem to fit into the empty space. But I... I lost it...\"";
+ next;
+ mes "\"I don't know what happened. I was in this room and... I heard some very loud noises, people screaming, cracking sounds... and a smell, a terrible smell, like something rotten. And then... I can't remember anything else!\"";
+ next;
+ mes "\"I think it was something very bad, because, after all that, I woke up the way I am now and I couldn't find the ring in my pocket. Oh, and my parents are acting like they're not themselves. I don't know what happened, maybe it was my fault... I shouldn't have played with that ring... \"";
+ next;
+ menu
+ "Don't worry, I will look around. Maybe I can find it for you...",L_DontWorryFind,
+ "Hey, you messed up. Deal with it.",L_close;
+
+L_DontWorryFind:
+ mes "[Aldred]";
+ mes "\"Thank you " +strcharinfo(0)+"! Find it for me, pleeeease! Oh, and don't tell my parents that I lost their ring, okay?\"";
+ @state = 1;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Return:
+ mes "[Aldred]";
+ mes "\"Please, help me. If you find that ring, I think things will be a little better between me and my parents.\"";
+ goto L_close;
+
+
+L_Return1:
+ menu
+ "Hi Aldred. I found the ring!",L_RingFoundHere;
+
+L_RingFoundHere:
+ mes "[Aldred]";
+ mes "\"Great! You're the best! Where did you find it?\"";
+ next;
+ menu
+ "It was easy, I found it on one of the monsters outside.",L_RingMonstersOut;
+
+L_RingMonstersOut:
+ mes "[Aldred]";
+ mes "\"Ohh.. a monster? It must've been a nice monster since it returned it so easily to you!\"";
+ next;
+ menu
+ "Err... kind of...",L_ErrKindOf;
+
+L_ErrKindOf:
+ mes "[Aldred]";
+ mes "\"Now, I'll put this thing back in its proper place... Thank you!\"";
+ @state = 3;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Return2:
+ mes "[Aldred]";
+ mes "\"Hi "+strcharinfo(0)+ "! I was thinking... you were sooo nice helping me find the ring... I think I should give you a gift, but I'm just a dead kid, I have nothing to give you!\"";
+ next;
+ menu
+ "Don't worry, you don't need to give me anything...",L_GiveMeAnything;
+
+L_GiveMeAnything:
+ mes "[Aldred]";
+ mes "\"Are you sure? That's why you're so great! But hey, I have an idea. What if you talk to my parents about this thing? If it's not important or valuable, I don't think it would be a problem to let you keep it. And I really want to know if they're acting all weird because I lost it. Would you do this for me?\"";
+ next;
+ menu
+ "Sounds interesting... But who are your parents?",L_WhereParents,
+ "Bad idea, it will only bring more problems...",L_close;
+
+L_WhereParents:
+ @state = 4;
+ callsub S_Update_Mask;
+ mes "[Aldred]";
+ mes "\"Okay, great... But please, don't tell them about it. I don't want my parents to know I was playing with their stuff. My father is always carrying a lantern... I guess he's still afraid of the dark. My mother is the innkeeper. She's very beautiful and she's wearing a red dress.\"";
+ next;
+ mes "\"Don't forget to come back with the ring after you've talked to my parents.\"";
+ message strcharinfo(0), "Aldred hands you the ring and you keep it in a small pocket on your backpack.";
+ goto L_close;
+
+L_Return3:
+ mes "[Aldred]";
+ mes "\"I hope this ring doesn't mean a lot to my parents. That way you can keep it as a gift and I won't feel guilty about taking it.\"";
+ goto L_close;
+
+L_Return4:
+ menu
+ "Hi, I talked to your parents.",L_TalkParents;
+
+L_TalkParents:
+ mes "[Aldred]";
+ mes "\"Really? What did my father say about it?\"";
+ menu
+ "He said it's just a cheap ring. And it doesn't belong to him.",L_JustCheapRing;
+
+L_JustCheapRing:
+ mes "[Aldred]";
+ mes "\"And what did my mother say?\"";
+ menu
+ "She said it was a gift, but she doesn't want it anymore.",L_GiftNoWant;
+
+L_GiftNoWant:
+ mes "[Aldred]";
+ mes "\"Really? A gift? And why doesn't she want it anymore?\"";
+ next;
+ menu
+ "She said it makes her sad.",L_MakesHerSad;
+
+L_MakesHerSad:
+ mes "\"Ohh... really? I don't like it when my mother gets sad... If this ring is making her feel bad, I should keep it away from her. \"";
+ next;
+ mes "\"Well, I guess you can keep it, but don't show it to my mother again, she's already very sad. But now I'm really curious. Who else would give a gift to my mother? There are so many strange things happening lately...\"";
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full;
+ getitem "SimpleRing", 1;
+ @state = 7;
+ callsub S_Update_Mask;
+ mes "\"I'll tell my parents how great and helpful you are. Maybe they can even let you stay here at the inn for free!\"";
+ goto L_close;
+
+L_Return5:
+ mes "[Aldred]";
+ mes "\"Thank you for all your help.\"";
+ goto L_close;
+
+L_Full:
+ mes "[Aldred]";
+ mes "\"I dont think you can carry this ring... Your backpack is full! Throw something away and come back to get it.\"";
+ goto L_close;
+
+L_close:
+ @Graveyard_Inn_MASK = 0;
+ @Graveyard_Inn_SHIFT = 0;
+ @state = 0;
+ @minLevel = 0;
+ close;
+
+S_Update_Mask:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_MASK))
+ | (@state << @Graveyard_Inn_SHIFT);
+ return;
+}
diff --git a/npc/026-2/diary.txt b/npc/026-2/diary.txt
new file mode 100644
index 00000000..6b18228e
--- /dev/null
+++ b/npc/026-2/diary.txt
@@ -0,0 +1,53 @@
+
+026-2,76,85,0 script #Diary NPC400,{
+ @npc_distance = 3;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ @Graveyard_Inn_MASK = NIBBLE_0_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_0_SHIFT;
+
+ @reid = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ if (@reid >= 6) goto L_Diary;
+ @reid = 0;
+ end;
+
+L_Diary:
+ mes "You pull out Reid's diary from behind a huge poetry book. Towards the end of the diary, you find some entries which seem to be about Savaric.";
+ next;
+ mes "'Savaric keeps confusing me - one time he is so flirtatious and smooth, another time he is cold and unfriendly. What is it with this man?'";
+ next;
+ mes "'I need to stay away from him! It's not right, what I am feeling. It seems Hamond doesn't suspect anything about my feelings - but I know, it's just a matter of time. I need to come to my senses again!'";
+ next;
+ mes "'Oh, this chaotic situation between Savaric and me is getting serious. I was in his room today and he put his arms around me - I wanted to push him away, but I couldn't move. It was such a sweet feeling. I was torn between my brain saying 'No!' and my body wanting to feel his touch. Then, Aldred showed up and Savaric let me go.'";
+ next;
+ mes "The next part is blurred - it seems Reid was crying while writing it.";
+ mes "'Savaric was talking again about leaving, because he can't find the mana seed. The thought that I would never see him again made me feel like I was falling into a dark abyss! I need to decide what to do. But Hamond - I owe him so much. And what about Aldred?'";
+ next;
+ mes "'We kissed each other - oh, I'm feeling so bad. I'm an unfaithful slut. But I want it to happen again, so badly.'";
+ next;
+ mes "'I told Savaric we have to stop with this - he was very understanding. But then he started to hold me again and I couldn't resist. I don't know what to do, at all! His touch on my waist, even through my clothes, made me feel more excited than Hamond's touch ever did.'";
+ next;
+ mes "'I don't know if Hamond suspects us - he was holding me tight all through the night, whispering declarations of love in my ears. Oh, I feel so bad.'";
+ next;
+ mes "'Hamond won't be here tomorrow night - he needs to visit our wine supplier to negotiate the prices. Savaric knows this. I'm feeling so excited - I should go with Hamond, but I told him I need to take care of the inn while he's away. Savaric... '";
+ next;
+ mes "This is the last entry.";
+ if (@reid != 6)
+ goto L_close;
+
+ @reid = 7;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_close:
+ @reid = 0;
+ close;
+
+S_Update_Mask:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_MASK))
+ | (@reid << @Graveyard_Inn_SHIFT);
+ return;
+}
diff --git a/npc/026-2/door.txt b/npc/026-2/door.txt
new file mode 100644
index 00000000..7a9ad2bd
--- /dev/null
+++ b/npc/026-2/door.txt
@@ -0,0 +1,20 @@
+026-2,77,92,0 script #DoorIn NPC45,0,0,{
+ @Graveyard_Inn_MASK = NIBBLE_0_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_0_SHIFT;
+
+ @reid = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ if (@reid >= 6) goto L_Warp;
+ message strcharinfo(0), "The door is locked.";
+ end;
+
+L_Warp:
+ warp "026-2", 77, 89;
+ @reid = 0;
+ end;
+}
+
+026-2,77,90,0 script #DoorOut-gyinn NPC45,0,0,{
+ warp "026-2", 77, 93;
+ end;
+}
diff --git a/npc/026-2/eurni.txt b/npc/026-2/eurni.txt
new file mode 100644
index 00000000..330ba58e
--- /dev/null
+++ b/npc/026-2/eurni.txt
@@ -0,0 +1,15 @@
+
+026-2,20,124,0 script Eurni NPC136,{
+ @halloween_npc_id = $@halloween_npc_eurni;
+ callfunc "TrickOrTreat";
+
+ mes "[Eurni the Surgeon]";
+ mes "\"Are you tired of who you are?\"";
+ next;
+ mes "\"Would you be interested in changing your appearance?\"";
+ next;
+ callfunc "Barber";
+ mes "[Eurni the Surgeon]";
+ mes "\"Come back any time!\"";
+ close;
+}
diff --git a/npc/026-2/golbenez.txt b/npc/026-2/golbenez.txt
new file mode 100644
index 00000000..c6bd2fd3
--- /dev/null
+++ b/npc/026-2/golbenez.txt
@@ -0,0 +1,614 @@
+
+026-2,60,57,0 script Golbenez NPC307,{
+ @Graveyard_Inn_MASK = NIBBLE_4_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_4_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ @Graveyard_Inn_Woman_MASK = NIBBLE_0_MASK;
+ @Graveyard_Inn_Woman_SHIFT = NIBBLE_0_SHIFT;
+
+ @woman = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Woman_MASK) >> @Graveyard_Inn_Woman_SHIFT);
+
+ @Graveyard_Inn_Lover_MASK = NIBBLE_1_MASK;
+ @Graveyard_Inn_Lover_SHIFT = NIBBLE_1_SHIFT;
+
+ @lover = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Lover_MASK) >> @Graveyard_Inn_Lover_SHIFT);
+
+ @Graveyard_Inn_Husband_MASK = NIBBLE_3_MASK;
+ @Graveyard_Inn_Husband_SHIFT = NIBBLE_3_SHIFT;
+
+ @husband = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Husband_MASK) >> @Graveyard_Inn_Husband_SHIFT);
+
+ @ROTTENRAGS_AMOUNT = 50;
+ @ROTTENRAGS_EXP = 100000;
+ @UNDEADEAR_AMOUNT = 15;
+ @UNDEADEAR_EXP = 150000;
+ @UNDEADEYE_AMOUNT = 10;
+ @UNDEADEYE_EXP = 150000;
+ @JACKOSOUL_EXP = 2000;
+
+ if (@state >= 7) goto L_Done;
+ if (@state == 6) goto L_Soul;
+ if (@state == 5) goto L_All;
+ if (@state == 4) goto L_Savaric;
+ if (@state == 3) goto L_Hamond;
+ if (@state == 2) goto L_Reid;
+ if (@state == 1) goto L_Back;
+
+ mes "[Golbenez]";
+ mes "\"How do you like my place of leisure, mortal?\"";
+ menu
+ "What is this place? Why is it full of dead people?",L_WhatPlace,
+ "You look different here. Nice horns.",L_Horns,
+ "I'm enjoying myself, thanks for asking.",L_close;
+
+L_WhatPlace:
+ mes "[Golbenez]";
+ mes "\"Mortal, this is beyond your comprehension. Do not worry about it and enjoy your time.\"";
+
+ if (@lover < 2)
+ goto L_close;
+ menu
+ "I want to know. Try me.",L_WantKnow;
+
+L_WantKnow:
+ mes "Golbenez takes a piercing look at you.";
+ mes "[Golbenez]";
+ mes "\"Fine.\"";
+ next;
+ mes "\"This place was a normal inn many, many of your years ago. Chance brought me here and it became one of my favorite playgrounds.\"";
+ next;
+ mes "Golbenez laughs in a way which really gives you the creeps.";
+ next;
+ mes "[Golbenez]";
+ mes "\"Unfortunately, it got destroyed. I had no choice but to take the memories from the dead and recreate this place.\"";
+ menu
+ "What do you mean by 'playground?'",L_WantGoOn,
+ "Recreate? What do you mean by that?",L_WantGoOn;
+
+L_WantGoOn:
+ mes "[Golbenez]";
+ mes "\"As I said, you do not understand. You are starting to bore me. Leave.\"";
+
+ @state = 1;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Back:
+ if (@lover >= 3)
+ goto L_Memory;
+ mes "Golbenez ignores your presence.";
+ goto L_close;
+
+L_Memory:
+ mes "[Golbenez]";
+ mes "\"Mortal, you are back. Are you going to bore me with other stupid questions?\"";
+ menu
+ "I want to know what happened in the inn, before it was destroyed.",L_KnowDestroy,
+ "Nevermind.",L_close;
+
+L_KnowDestroy:
+ if ((@woman >= 7)
+ && (@lover >= 3)
+ && (@husband >= 4))
+ goto L_Detective;
+ mes "[Golbenez]";
+ mes "\"I was watching you play detective. I find it amusing. Play it a little longer and I may show you some of the memories from that time.\"";
+ goto L_close;
+
+L_Detective:
+ mes "[Golbenez]";
+ mes "\"Watching you digging into this dirty little love story of those foolish humans has certainly been amusing so far.\"";
+ next;
+ mes "\"I can show you all their memories. Would you like that?\"";
+ next;
+ mes "\"The only thing you would have to do is promise me your soul.\"";
+ menu
+ "No!",L_WantsSoul,
+ "That's too expensive. Make another offer.",L_WantsSoul,
+ "My soul?!",L_WantsSoul;
+
+L_WantsSoul:
+ mes "Golbenez giggles, a strange and somewhat unnerving sound from such a being.";
+ mes "[Golbenez]";
+ mes "\"You should have seen your face. Really, mortals can be so funny.\"";
+ next;
+ mes "\"Very well, I will show you the birdbrained woman's memories if you bring me " + @ROTTENRAGS_AMOUNT + " Rotten Rags. And an Orange Cake.\"";
+ @state = 2;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Reid:
+ mes "[Golbenez]";
+ mes "\"So, do you have the " + @ROTTENRAGS_AMOUNT + " Rotten Rags I want?\"";
+ if (countitem("RottenRags") < @ROTTENRAGS_AMOUNT)
+ menu
+ "What do you need them for?",L_Why_Stuff,
+ "I'm working on that.",L_close;
+ menu
+ "Here you go.",L_GiveRags,
+ "I'm working on that.",L_close;
+
+L_GiveRags:
+ if (countitem("OrangeCake") < 1)
+ goto L_No_Cake;
+ if (countitem("RottenRags") < @ROTTENRAGS_AMOUNT)
+ goto L_Betray;
+ delitem "RottenRags", @ROTTENRAGS_AMOUNT;
+ delitem "OrangeCake", 1;
+ getexp @ROTTENRAGS_EXP, 0;
+
+ mes "[Golbenez]";
+ mes "\"Very nice. I will show you the woman's memories of that night. Come closer.\"";
+ next;
+ mes "\"You hesitate but then take a step towards Golbenez. He grabs your head with his claw-like fingers.\"";
+ next;
+ callsub S_Reidsmem;
+ @state = 3;
+ callsub S_Update_Mask;
+ menu
+ "Can I see it again?",L_CollectMem,
+ "Wow, that was interesting.",L_CollectMem,
+ "Why do you collect such personal memories?",L_CollectMem;
+
+L_CollectMem:
+ mes "Golbenez throws you an amused look.";
+ next;
+ mes "[Golbenez]";
+ mes "\"I will explain the deal to you. Once you have paid for a memory, you can come and see it again as often as you like. And I collect whatever memory I want to. Mortals are a constant source of amusement for me.\"";
+ next;
+ mes "\"I have more memories you might want to see. Bring me "+ @UNDEADEAR_AMOUNT + " Undead Ears. And a Chocolate Cake.\"";
+ goto L_close;
+
+L_Hamond:
+ mes "[Golbenez]";
+ mes "\"Ah, mortal. Do you have the " + @UNDEADEAR_AMOUNT + " Undead Ears I want?\"";
+ if (countitem("UndeadEar") < @UNDEADEAR_AMOUNT)
+ menu
+ "I want to see Reid's memory again.",L_R_Again,
+ "What will you do with them?",L_Why_Stuff,
+ "Not yet.",L_close;
+ menu
+ "I want to see Reid's memory again.",L_R_Again,
+ "I have what you want.",L_GiveEar,
+ "I'm working on that.",L_close;
+
+L_GiveEar:
+ if (countitem("ChocolateCake") < 1)
+ goto L_No_Cake;
+ if (countitem("UndeadEar") < @UNDEADEAR_AMOUNT)
+ goto L_Betray;
+ delitem "UndeadEar", @UNDEADEAR_AMOUNT;
+ delitem "ChocolateCake", 1;
+ getexp @UNDEADEAR_EXP, 0;
+ mes "[Golbenez]";
+ mes "\"Good. I will show you the memories of the dumb husband now. Come to me.\"";
+ next;
+ mes "You step closer to Golbenez and he holds your head again.";
+ callsub S_Hamondsmem;
+ @state = 4;
+ callsub S_Update_Mask;
+ mes "[Golbenez]";
+ mes "\"It is really interesting how illogical humans behave.\"";
+ next;
+ mes "\"And how predictable they are. I can see in your eyes that you want to know how this drama went on.\"";
+ next;
+ mes "\"Bring me " + @UNDEADEYE_AMOUNT + " Undead Eyes and an Apple Cake.\"";
+ goto L_close;
+
+L_Savaric:
+ mes "[Golbenez]";
+ mes "\"I hope you are bringing me the " + @UNDEADEYE_AMOUNT + " Undead Eyes I want.\"";
+ if (countitem("UndeadEye") < @UNDEADEYE_AMOUNT)
+ menu
+ "I want to see Reid's memory again.",L_R_Again,
+ "I want to see Hamond's memory again.",L_H_Again,
+ "I really wonder what you do with the stuff I bring you.",L_Why_Stuff,
+ "They're hard to get. I'm still working on that.",L_close;
+ menu
+ "I want to see Reid's memory again.",L_R_Again,
+ "I want to see Hamond's memory again.",L_H_Again,
+ "I got what you want.",L_GiveEye,
+ "I'm working on that.",L_close;
+
+L_GiveEye:
+ if (countitem("AppleCake") < 1)
+ goto L_No_Cake;
+ if (countitem("UndeadEye") < @UNDEADEYE_AMOUNT)
+ goto L_Betray;
+ delitem "UndeadEye", @UNDEADEYE_AMOUNT;
+ delitem "AppleCake", 1;
+ getexp @UNDEADEYE_EXP, 0;
+ mes "[Golbenez]";
+ mes "\"Very good. Now I will show you the pitiful mage's memory.\"";
+ next;
+ mes "He holds your head and everything goes black again.";
+ callsub S_Savaricsmem;
+ @state = 5;
+ callsub S_Update_Mask;
+ mes "[Golbenez]";
+ mes "\"Humans can be so amusing!\"";
+ menu
+ "YOU CRUEL MONSTER!",L_MonsterIdiots,
+ "I agree. What a bunch of idiots.",L_MonsterIdiots;
+
+L_MonsterIdiots:
+ mes "Golbenez's mouth twists into something resembling a smile.";
+ mes "[Golbenez]";
+ mes "\"Oh, thank you.\"";
+ goto L_close;
+
+L_All:
+ if (@lover == 6)
+ goto L_Negotiate;
+ mes "[Golbenez]";
+ mes "\"Did you come back to see the memories again?\"";
+ menu
+ "I want to see Reid's memory again.",L_R_Again,
+ "I want to see Hamond's memory again.",L_H_Again,
+ "I want to see Savaric's memory again.",L_S_Again,
+ "Nevermind.",L_close;
+
+L_Negotiate:
+ mes "Golbenez's eyes are glowing greedily.";
+ mes "[Golbenez]";
+ mes "\"Did you come back to see the memories again? Or are you going to offer me another deal?\"";
+ menu
+ "I want Savaric's soul back.",L_WantSoulBack,
+ "I want to see Reid's memory again.",L_R_Again,
+ "I want to see Hamond's memory again.",L_H_Again,
+ "I want to see Savaric's memory again.",L_S_Again,
+ "Nevermind.",L_close;
+
+L_WantSoulBack:
+ mes "[Golbenez]";
+ mes "\"Savaric's soul, yes. It is a pretty nice soul, you know. From a mage... no, even better... from a lovestruck mage. It is valuable.\"";
+ next;
+ mes "\"Why do you think it would be easy to get it back? Do you have anything of equal worth to offer?\"";
+ next;
+ menu
+ "What about another cake?",L_Cake,
+ "I'm not sure. What do you want?",L_GetSoul,
+ "No.",L_close;
+
+L_GetSoul:
+ mes "[Golbenez]";
+ mes "\"Bring me a soul of at least equal power to the mage's. I do not care about its origin.\"";
+ @state = 6;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Soul:
+ mes "[Golbenez]";
+ mes "\"So, did you get a soul for me?\"";
+ goto L_Soul_Try;
+
+L_Soul_Try:
+ if (countitem("Soul") < 1)
+ menu
+ "I'll go and get one.",L_close;
+ menu
+ "What about this Soul?",L_TryThisSoul,
+ "I'll go and try to find a soul.",L_close;
+
+L_TryThisSoul:
+ if (countitem("Soul") < 1)
+ goto L_Betray;
+ delitem "Soul", 1;
+ @soul = rand(50);
+ if (@soul == 0)
+ goto L_Soul_Success;
+ mes "[Golbenez]";
+ mes "\"No, this one is not as powerful as the mage's. Bring me another one of those.\"";
+ getexp @JACKOSOUL_EXP, 0;
+ goto L_Soul_Try;
+
+L_Soul_Success:
+ mes "Golbenez suddenly gets excited.";
+ mes "[Golbenez]";
+ mes "\"Yes! This one is full of energy.\"";
+ @state = 7;
+ callsub S_Update_Mask;
+ next;
+ mes "\"So be it, mortal. I will release Savaric's soul in exchange for this one.\"";
+ goto L_close;
+
+L_Done:
+ mes "[Golbenez]";
+ mes "\"I hope you enjoyed your little detective game. I certainly did.\"";
+ menu
+ "You're cruel.",L_close,
+ "I want to see Reid's memory again.",L_R_Again,
+ "I want to see Hamond's memory again.",L_H_Again,
+ "I want to see Savaric's memory again.",L_S_Again;
+
+L_Cake:
+ mes "Golbenez laughs.";
+ mes "[Golbenez]";
+ mes "\"This is why I like you. Despite being human, you have a delightful sense of humor.\"";
+ goto L_close;
+
+L_S_Again:
+ callsub S_Savaricsmem;
+ mes "[Golbenez]";
+ mes "\"What a fool he was, even for a human.\"";
+ goto L_close;
+
+L_R_Again:
+ callsub S_Reidsmem;
+ mes "\"This memory seems to excite you. Interesting.\"";
+ goto L_close;
+
+L_H_Again:
+ callsub S_Hamondsmem;
+ mes "[Golbenez]";
+ mes "\"Humans can be so stupid, have you noticed that?\"";
+ goto L_close;
+
+L_Horns:
+ mes "Golbenez bursts out with laughter.";
+ next;
+ mes "[Golbenez]";
+ mes "\"Mortals! They never stop surprising me.\"";
+ goto L_close;
+
+L_Why_Stuff:
+ mes "[Golbenez]";
+ mes "\"That is not your concern.\"";
+ goto L_close;
+
+L_Betray:
+ mes "[Golbenez]";
+ mes "\"I am warning you, mortal. Do not try to betray me!\"";
+ goto L_close;
+
+L_No_Cake:
+ mes "[Golbenez]";
+ mes "\"Fool! You forgot my cake!\"";
+ goto L_close;
+
+L_close:
+ @Graveyard_Inn_MASK = 0;
+ @Graveyard_Inn_SHIFT = 0;
+ @state = 0;
+ @Graveyard_Inn_Woman_MASK = 0;
+ @Graveyard_Inn_Woman_SHIFT = 0;
+ @woman = 0;
+ @Graveyard_Inn_Lover_MASK = 0;
+ @Graveyard_Inn_Lover_SHIFT = 0;
+ @lover = 0;
+ @Graveyard_Inn_Husband_MASK = 0;
+ @Graveyard_Inn_Husband_SHIFT = 0;
+ @husband = 0;
+ @ROTTENRAGS_AMOUNT = 0;
+ @ROTTENRAGS_EXP = 0;
+ @UNDEADEAR_AMOUNT = 0;
+ @UNDEADEAR_EXP = 0;
+ @UNDEADEYE_AMOUNT = 0;
+ @UNDEADEYE_EXP = 0;
+ @JACKOSOUL_EXP = 0;
+ @soul = 0;
+ close;
+
+S_Reidsmem:
+ mes "[Golbenez]";
+ mes "\"I will send her memories into your brain now. Do not collapse or do something equally foolish.\"";
+ next;
+ mes "Everything turns black. Then, slowly, you see something. You're standing outside and watching an alive-looking Hamond ride away on a carriage drawn by a mouboo.\"";
+ next;
+ mes "\"You turn back and enter a nice looking building. It seems to be the inn.";
+ next;
+ mes "Obviously, you are watching Reid's memories through her eyes. You're getting excited. Or is it Reid who feels excited? You're not sure.";
+ next;
+ mes "You-Reid walks up the stairs and stops in front of the door you recognize as Savaric's room. You get a twisting feeling, something between desire, guilt and despair.";
+ next;
+ mes "It seems you're not only seeing Reid's memories, but also feeling them!";
+ next;
+ mes "Reid turns away from Savaric's door and walks to her rooms quickly. She is shivering. You feel her heart pounding.";
+ next;
+ mes "She enters the room and pulls a red dress out of a chest and changes into it. As you feel her heart pounding even faster, you recognize the dress as the one her ghost is wearing.";
+ next;
+ mes "She sits down on the bed holding her head in her hands.";
+ next;
+ mes "[Reid]";
+ mes "\"This is wrong...\"";
+ next;
+ mes "Then she stands up and returns to Savaric's door. She hesitates again. Suddenly the door opens, Savaric standing there, smiling.";
+ next;
+ mes "[Savaric]";
+ mes "\"I was hoping you would come.\"";
+ next;
+ mes "He reaches out with his hands and you feel Reid getting dizzy.";
+ next;
+ mes "You enter his room together. There is only one candle on the table, providing a dim light.";
+ next;
+ mes "[Reid]";
+ mes "\"I- we- Savaric- this is not right- we shouldn't do this.\"";
+ next;
+ mes "[Savaric]";
+ mes "\"But you came. Shh, don't worry. Let me hold you.\"";
+ next;
+ mes "Savaric puts his arms around Reid and leads her to the bed. You feel a rush of Sexual desire.";
+ next;
+ mes "He starts to caress Reid's face with his lips, as his hands slip the dress from her shoulders.";
+ next;
+ mes "Reid's feelings are like a firestorm and it's hard for you to concentrate on what is happening.";
+ next;
+ mes "Savaric touches her body and - you suddenly stand in front of Golbenez again, wobbling around for a moment, before falling to the ground.";
+ next;
+ mes "[Golbenez]";
+ mes "\"I told you not to collapse!\"";
+ next;
+ mes "\"It seems Reid's feelings were too strong for you to withstand.\"";
+ next;
+ mes "Golbenez grins.";
+ next;
+ mes "[Golbenez]";
+ mes "\"But I guess you can imagine what followed.\"";
+ next;
+ return;
+
+S_Hamondsmem:
+ mes "The darkness vanishes and you see the back of a mouboo pulling the carriage you're sitting on. Or better to say, Hamond is sitting on.";
+ next;
+ mes "You feel very, very nervous and worried.";
+ next;
+ mes "[Hamond]";
+ mes "\"I shouldn't leave her alone with that debaucher. But she loves me. She won't give in to such a dandy. I believe in her. I trust her.\"";
+ next;
+ mes "The carriage reaches a river, but it seems the bridge is damaged. A group of people is standing on the riverside. There is one little boat, taking the people across, one by one.";
+ next;
+ mes "You feel a great surge of relief growing in Hamond's chest.";
+ next;
+ mes "He shakes the reins and turns his carriage around. Obviously this is a great excuse for him to return to Reid at once.";
+ next;
+ mes "When he returns to the inn, the sun is already low on the horizon. He tells the stableboy to take care of the mouboo and carriage, then rushes up the stairs heading to his and Reid's rooms. You can feel his heart pounding.";
+ next;
+ mes "He rips the door open and the room is empty. A cold feeling grows in his chest. He turns around and sees Reid standing in front of him, wearing her best dress. The red one which makes her look so beautiful - you feel a sharp sting in Hamonds heart.";
+ next;
+ mes "The dress is crumpled and seems to have been put on in haste. Her hair is in a disarray.";
+ next;
+ mes "[Reid]";
+ mes "\"Hamond! What are you doing here? Why are you already back?\"";
+ next;
+ mes "You feel a burning rage growing in Hamond.";
+ mes "[Hamond]";
+ mes "\"You're not happy to see me, are you? Would you prefer me to run this inn for you but ignore your cockish behavior?!\"";
+ next;
+ mes "The shocked, painful, and obviously guilty look on Reid's face fills Hamond with a strange mixture of pain and gratification.";
+ next;
+ mes "He grabs her arm, pulls her into the room and slams the door shut behind them. You see a fearful look on Reid's face.";
+ next;
+ mes "[Reid]";
+ mes "\"Hamond! Please, calm down!\"";
+ next;
+ mes "The feeling of broken trust and disappoinment seems to drive you... Hamond... crazy.";
+ next;
+ mes "Hamond slaps her across the face.";
+ next;
+ mes "[Hamond]";
+ mes "\"You are MY WIFE! I'll teach you what that means!\"";
+ next;
+ mes "As Hamond grabs Reid roughly and holds her tight, you can smell her sweat and fear, but under that is the smell of another man! Hamond's vision goes red.";
+ next;
+ mes "[Hamond]";
+ mes "\"You dirty slut! I did everything for you!\"";
+ next;
+ mes "Reid is struggling wildly to get out of Hamond's hold. She is surprisingly strong and together they fall onto the table.";
+ next;
+ mes "The next thing you see is a teapot smashing into Hamond's face. He stumbles back.";
+ next;
+ mes "You see Reid running to the door, where she pauses and throws a look over her shoulder. Then she runs out of the room.";
+ next;
+ mes "Her face was wet with tears, her lips bloody and her eye was already turning black.";
+ next;
+ mes "You feel shock and regret.";
+ mes "[Hamond]";
+ mes "\"What did I do? Reid... How could I ever hurt you?\"";
+ next;
+ mes "Your sight turns black and with your next blink you're standing in front of Golbenez again.";
+ next;
+ return;
+
+S_Savaricsmem:
+ mes "As you gain your eyesight again, you find yourself bustling back and forth in Savaric's room.";
+ next;
+ mes "The mixture of feelings you sense is very confusing. Worry, guilt, craving and below all that a deep feeling of luck and satisfaction.";
+ next;
+ mes "Then you hear steps outside the room. Savaric turns to the door quickly, then Reid breaks into the room.";
+ next;
+ mes "She looks utterly tattered, her dress ripped and her lips bleeding. She has a black eye and she is sobbing uncontrollably. It takes Savaric less than a second to reach her and put his arms around her carefully.";
+ next;
+ mes "You feel a deep, cold anger.";
+ next;
+ mes "[Savaric]";
+ mes "\"Reid, my love, what did he do to you? Please come and lay down.\"";
+ next;
+ mes "Savaric leads Reid to his bed and covers her gently. Then he holds and rocks her until she falls asleep. You notice Savaric is only wearing his underpants.";
+ next;
+ mes "After Reid's breathing has calmed down and her abused face looks peaceful again, he stands up and his cold burning anger comes back.";
+ next;
+ mes "[Savaric]";
+ mes "\"I won't let him get away with that!\"";
+ next;
+ mes "Savaric pulls some things out of a chest and puts them on the table. He lights some candles and begins to mix together some powders and fluids. You can feel his concentration, but below that is a great anger keeping clear thoughts at bay.";
+ next;
+ mes "Savaric seems to be done with his magic ingredients and takes what he mixed together. You feel rising power inside of you. The moment you think you can't stand it anymore, the tension disappears and a purple light fills the room for a moment.";
+ next;
+ mes "Golbenez is standing in front of you.";
+ next;
+ mes "[Golbenez]";
+ mes "\"Mortal! It was very rude of you to force me to this place with that spell - are you aware of the power you are playing around with?!\"";
+ next;
+ mes "Fear is rising inside of you, but also excitement accompanied by a feeling of power.";
+ next;
+ mes "[Savaric]";
+ mes "\"I called you to get rid of the person who did this to this adorable woman.\"";
+ mes "He points at Reid";
+ next;
+ mes "[Savaric]";
+ mes "\"Tell me your price.\"";
+ next;
+ mes "Golbenez's behavior changes immediately and he suddenly seems much friendlier.";
+ next;
+ mes "[Golbenez]";
+ mes "\"Ah, you are offering me a deal. That is something completely different. Let me see... I can free her from all pain and anything or anyone causing her trouble.\"";
+ next;
+ mes "You feel Savaric's heart pounding.";
+ mes "[Savaric]";
+ mes "\"Yes. That's what I want. I want her to be safe from any harm.\"";
+ next;
+ mes "Golbenez's face turns into a smile.";
+ mes "[Golbenez]";
+ mes "\"This requires some effort. It will have a remarkable price. I want your soul in exchange.\"";
+ next;
+ mes "The feeling of power disappears, giving place to uncertainty.";
+ mes "[Savaric]";
+ mes "\"My - soul? Can't it be something else?\"";
+ next;
+ mes "[Golbenez]";
+ mes "\"Think about what you get! This woman will never feel any pain again!\"";
+ next;
+ mes "Savaric's hesitation vanishes.";
+ mes "[Savaric]";
+ mes "\"So be it. Take my soul and prevent Reid from feeling pain ever again.\"";
+ next;
+ mes "Golbenez's smile changes to an ugly grin filled with malice. He reaches out to Savaric and seems to pull something out of him. Suddenly, you feel very weak and empty.";
+ next;
+ mes "In the next moment, you're lying on the ground and see Golbenez raising his arms. You sense an unbelievable magic force - what is he doing?";
+ next;
+ mes "Undead enter the room and one of them walks to the bed and breaks Reid's neck with a quick movement. A dark and black feeling of despair rises inside of you.";
+ next;
+ mes "[Savaric]";
+ mes "\"NO!! What are you doing?\"";
+ next;
+ mes "[Golbenez]";
+ mes "\"She will never feel pain anymore. Just like everyone else in this inn - besides you, foolish mortal.\"";
+ next;
+ mes "Golbenez leaves the room and you feel Savaric giving in to his pain. He is lying on the floor and trying to understand what he did.";
+ next;
+ mes "After a few moments of only feeling his suffering, Savaric finally manages to stand up again. He can't stand to see Reid's dead body anymore and stumbles out of the room.";
+ next;
+ mes "But what you can see in the rest of the inn isn't able to ease the suffering you're feeling. The undead have slaughtered every person in the inn, leaving only Savaric alive.";
+ next;
+ mes "Savaric seems stunned by shock. He slowly returns to his room and kneels in front of the bed, taking Reids hand.";
+ next;
+ mes "[Savaric]";
+ mes "\"Reid - I'm so sorry. My haughtiness was greater than my skills.\"";
+ next;
+ mes "The numb feeling gives way to a new feeling of determination.";
+ next;
+ mes "Savaric pulls a rope out of the chest beside the bed.";
+ mes "[Savaric]";
+ mes "\"Now there's only one thing left for me to do.\"";
+ next;
+ mes "Your vision turns black again and you find yourself standing in front of Golbenez.";
+ return;
+
+S_Update_Mask:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_MASK))
+ | (@state << @Graveyard_Inn_SHIFT);
+ return;
+}
diff --git a/npc/026-2/gy_inn_shops.txt b/npc/026-2/gy_inn_shops.txt
new file mode 100644
index 00000000..be7f9fcd
--- /dev/null
+++ b/npc/026-2/gy_inn_shops.txt
@@ -0,0 +1,93 @@
+
+026-2,30,56,0 script Chef#graveyard NPC300,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem ZombieNachos;
+ sellitem LadyFingers;
+ sellitem JellAhh;
+ sellitem Snapple;
+ .distance = 5;
+ end;
+}
+
+026-2,38,30,0 script Estrilda NPC301,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem BeetleJuice;
+ sellitem GutBuster;
+ sellitem BloodWine;
+ .distance = 5;
+ end;
+}
+
+026-2,31,119,0 script Leofwin NPC304,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem CactusDrink;
+ sellitem CactusPotion;
+ sellitem BugLeg;
+ sellitem SmallMushroom;
+ sellitem IronPotion;
+ sellitem ConcentrationPotion;
+ sellitem HardSpike;
+ sellitem DarkCrystal;
+ sellitem Root;
+ sellitem WispPowder;
+ sellitem SpectrePowder;
+ sellitem PoltergeistPowder;
+ .distance = 5;
+ end;
+}
+
+026-2,22,120,0 script Umfrey NPC302,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem BoneArrows;
+ sellitem ShockSweet;
+ .distance = 5;
+ end;
+}
+
+026-2,40,24,0 script Edwin NPC309,{
+ @npcname$ = "Edwin";
+
+ mes "[" + @npcname$ + "]";
+ mes "\"This place is always busy.\"";
+ next;
+ mes "\"Be careful about bumping into the patrons, they might not take it kindly if you spill their drink.\"";
+ close;
+}
+
+026-2,75,23,0 script Barbara Grey NPC320,{
+ @npcname$ = "Barbara Grey";
+ @Cost = 1000;
+
+ mes "[" + @npcname$ + "]";
+ mes "\"Don't be shy, darling.";
+ mes "\"Come on in and have a nice long... long slumber...";
+ next;
+ callfunc "Inn";
+ close;
+}
+
+026-2,25,120,0 script J.P. Morbid NPC321,{
+ @npcname$ = "J.P. Morbid";
+ callfunc "Banker";
+ close;
+}
diff --git a/npc/026-2/innkeeper.txt b/npc/026-2/innkeeper.txt
new file mode 100644
index 00000000..11285951
--- /dev/null
+++ b/npc/026-2/innkeeper.txt
@@ -0,0 +1,457 @@
+
+026-2,35,84,0 script Reid's Ghost NPC315,{
+ @Graveyard_Inn_MASK = NIBBLE_0_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_0_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ @Graveyard_Inn_Lover_MASK = NIBBLE_1_MASK;
+ @Graveyard_Inn_Lover_SHIFT = NIBBLE_1_SHIFT;
+
+ @lover = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Lover_MASK) >> @Graveyard_Inn_Lover_SHIFT);
+
+ @Graveyard_Inn_Kid_MASK = NIBBLE_2_MASK;
+ @Graveyard_Inn_Kid_SHIFT = NIBBLE_2_SHIFT;
+
+ @kidstate = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Kid_MASK) >> @Graveyard_Inn_Kid_SHIFT);
+
+ @Graveyard_Inn_Husband_MASK = NIBBLE_3_MASK;
+ @Graveyard_Inn_Husband_SHIFT = NIBBLE_3_SHIFT;
+
+ @husband = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Husband_MASK) >> @Graveyard_Inn_Husband_SHIFT);
+
+ @Graveyard_Inn_Golbanez_MASK = NIBBLE_4_MASK;
+ @Graveyard_Inn_Golbanez_SHIFT = NIBBLE_4_SHIFT;
+
+ @golbanez = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Golbanez_MASK) >> @Graveyard_Inn_Golbanez_SHIFT);
+
+ @minLevel = 85;
+ @YETI_TEAR_AMOUNT = 15;
+ @YETI_TEAR_EXP = 100000;
+ set @DIAMOND_AMOUNT, 20; // caution, this value needs to be the same as in the lovers script!
+ set @RUBY_AMOUNT, 25; // caution, this value needs to be the same as in the husbands script!
+
+ if (@state >= 11) goto L_Happy;
+ if (@state == 10) goto L_Thanks;
+ if ((@state == 8) || (@state == 9)) goto L_Sorry;
+ if (@state == 7) goto L_Savaric;
+ if (@state == 6) goto L_Read_Diary;
+ if (@state == 5) goto L_Check_Kid;
+ if (@state == 4) goto L_Ask_Life;
+ if (@state == 3) goto L_Bring_Tears;
+ if (@state == 2) goto L_Offer_Help2;
+ if (@state == 1) goto L_After_Welcome;
+
+ mes "You see a dead woman lying on the floor and something that appears to be her ghost floating above her dead body.";
+ next;
+ mes "[Ghost]";
+ mes "\"He- I - What - Oh -\"";
+ mes "The womans ghost seems to be confused.";
+ next;
+ mes "[Ghost]";
+ mes "Oh, I'm sorry. Welcome to Reid's Inn. My name is Reid, I am the innkeeper of this wonderful place of leisure. Please enjoy your visit here!";
+ next;
+
+ @state = 1;
+ callsub S_Update_Mask;
+
+ goto L_Ask_Dead;
+
+L_After_Welcome:
+ mes "[Reid's Ghost]";
+ mes "\"Please enjoy yourself!\"";
+ if (BaseLevel < @minLevel)
+ goto L_close;
+ goto L_Ask_Dead;
+
+L_Ask_Dead:
+ if (BaseLevel < 85)
+ goto L_close;
+
+ menu
+ "What happened to you?", L_Next,
+ "Thank you, I'll surely enjoy my visit.", L_close;
+
+L_Next:
+ mes "[Reid's Ghost]";
+ mes "\"What happened to me? What do you mean?\"";
+ menu
+ "Ahm, you don't look very well - actually, you look dead.",L_Next1,
+ "You don't seem to be in the best condition.",L_Next1,
+ "You are dead!",L_Next1;
+
+L_Next1:
+ mes "Reid looks down at her body and turns even more pale, if this is possible.";
+ next;
+ mes "[Reid's Ghost]";
+ mes "\"OH?\"";
+ next;
+ menu
+ "I'm sorry. I didn't know you weren't aware of that.",L_Next2,
+ "Yes - do you understand my question now?",L_Next2,
+ "Shall I help you to find out what happened to you?", L_Offer_Help1;
+
+L_Next2:
+ mes "[Reid's Ghost]";
+ mes "\"I'm dead? But why? And why am I still here?\"";
+ next;
+ mes "She stares into space and doesn't seem to notice you anymore.";
+ @state = 2;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Offer_Help2:
+ mes "Reid's Ghost is still staring into space.";
+
+ if (@kidstate == 5)
+ menu
+ "Shall I help you to find out what happened to you?", L_Offer_Help1,
+ "Hi. I found this in the main hall. Do you know to whom it belongs?", L_Ring,
+ "I don't want to bother you.", L_close;
+ goto L_Skip1;
+
+L_Skip1:
+ menu
+ "Shall I help you to find out what happened to you?", L_Offer_Help1,
+ "I don't want to bother you.", L_close;
+
+L_Offer_Help1:
+ mes "\"I.. I don't know you. Why should you help me?\"";
+ next;
+ mes "\"Bring me proof that you are serious. My life seems to have ended in a terrible and sad way, I can see it very clearly. If you want to help me, please bring me something that represents this immeasurable sadness I am feeling!\"";
+
+ @state = 3;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Bring_Tears:
+ mes "[Reid's Ghost]";
+ mes "\"Did you find something that can represent my sadness?\"";
+ next;
+
+ if ((@kidstate == 5)
+ && countitem("FrozenYetiTear") > 0)
+ menu
+ "I found this frozen tear to represent your sadness.", L_Check_Tears,
+ "Hi. I found this in the main hall. Do you know to whom it belongs?", L_Ring,
+ "I'm still searching.", L_close;
+ if (@kidstate == 5)
+ menu
+ "Hi. I found this in the main hall. Do you know to whom it belongs?", L_Ring,
+ "I'm still searching.", L_close;
+ if (countitem("FrozenYetiTear") > 0)
+ menu
+ "I found this frozen tear to represent your sadness.", L_Check_Tears,
+ "I'm still searching.", L_close;
+ mes "\"You didn't? It seems you're not serious with your offer to help me.\"";
+ goto L_close;
+
+L_Check_Tears:
+ if (countitem("FrozenYetiTear") < @YETI_TEAR_AMOUNT)
+ goto L_Not_Enough_Tears;
+ delitem "FrozenYetiTear", @YETI_TEAR_AMOUNT;
+
+ getexp @YETI_TEAR_EXP, 0;
+
+ @state = 4;
+ callsub S_Update_Mask;
+
+ mes "[Reid's Ghost]";
+ mes "\"These tears.. how they shimmer in the candle light. Yes, it seems you are serious about your offer. I think maybe you have the sensibility to help me find out the real meaning behind this terrible feeling.\"";
+ next;
+ goto L_Ask_Life;
+
+L_Ask_Life:
+ mes "[Reid's Ghost]";
+ mes "\"But how do you plan to help me?\"";
+ next;
+
+ if (@kidstate == 5)
+ menu
+ "Please tell me about your life. Maybe this will give us a clue about what happened.",L_Skip2,
+ "Hi. I found this in the main hall. Do you know to whom it belongs?", L_Ring,
+ "I need to think about that.", L_close;
+ goto L_Skip2;
+
+L_Skip2:
+ menu
+ "Please tell me about your life. Maybe this will give us a clue about what happened.",L_Next4,
+ "I need to think about that.", L_close;
+
+L_Next4:
+ mes "[Reid's Ghost]";
+ mes "\"About my life? Well, ok.\"";
+ next;
+ mes "\"I'm the owner of this inn. I inherited it from my parents, who ran it while I was a child.\"";
+ next;
+ mes "\"My father - he was a very joyful man. But one day, when I was just ten years old, he had an accident while carrying a barrel of beer.\"";
+ next;
+ mes "\"The barrel smashed his legs and he wasn't able to walk anymore. He got very despondent about that and started to drink.\"";
+ next;
+ mes "\"My mother and I didn't know how to cheer him up, and he wouldn't listen to us. My mother tried her best to keep the inn running and I tried my best to help her, even though I was still a child.\"";
+ next;
+ mes "\"But a few years later, my mother lost her will to go on and the inn slowly went down the drain. Everything was dirty and we had less and less patrons.\"";
+ next;
+ mes "\"I don't blame my mother. She loved my father so much, she couldn't stand to see what was happening to him. When he died because of his drinking, she totally lost her will to live and just lay in bed and followed him.\"";
+ next;
+ mes "Reid seems to be tortured by her memories.";
+ next;
+ mes "\"That was a very hard time.\"";
+ menu
+ "Yes, yes, but what about your life shortly before you died?",L_Next5,
+ "I can imagine. I'm very sorry for you",L_Next5;
+
+L_Next5:
+ mes "She doesn't seem to pay much attention to what you say.";
+ next;
+ mes "\"But Hamond, my friend since I was a child, helped me in those bad times. We built up the inn again and we - we married.\"";
+ next;
+ mes "\"He was so kind and my only light in those dark times. And our little son Aldred gave me back my joy in life.\"";
+ next;
+ mes "\"Everything was peaceful and I thought I had found my place. But one day -\"";
+ next;
+
+ @state = 5;
+ callsub S_Update_Mask;
+ goto L_Check_Kid;
+
+L_Check_Kid:
+ if (@kidstate == 5)
+ menu
+ "Hi. I found this in the main hall. Do you know to whom it belongs?", L_Ring;
+
+ if (@kidstate < 7)
+ goto L_Problem;
+
+ mes "\"What I'm going to tell you is very personal, but your acts have shown me that you're a person I can trust. You kindly asked me about that ring you have found... and also, even my son, who is always so reserved with strangers, came to me and spent a long time telling me a lot of nice things about you. So I will tell you about my sad love.\"";
+ next;
+
+ mes "[Reid's Ghost]";
+ mes "\"It began as a completely normal day. We were taking care of our overnight guests and preparing the inn for the evening rush.\"";
+ next;
+ mes "\"But that day, a very special patron checked in. His name was Savaric, and he was a student of magic. He came from far away to check some rumors about a legendary mana seed.\"";
+ next;
+ mes "Reid's Ghost has a completely enchanted look on her face.";
+ next;
+ mes "\"He really made me feel alive - when he was near, I was feeling like I never felt before. I started to search for reasons to be near him - I told myself that I liked him just because he was interesting, coming from so far away and being a mage.\"";
+ next;
+ mes "\"But I was lying to myself.\"";
+ next;
+ mes "\"I - oh, it is really hard to talk about this. Maybe - yes, I could let you read my diary. I'll give you the key to our rooms.\"";
+ next;
+ mes "She pulls a key out of her pocket as transparent as herself. As you try to grab it, your fingers just go through it.";
+ next;
+ mes "[Reid's Ghost]";
+ mes "\"I keep forgetting! Please take the key out of my pocket.\"";
+ mes "She is pointing at her dead body with a sad look on her face. You take the key.";
+ next;
+ mes "[Reid's Ghost]";
+ mes "\"This is the key to our personal room, it is located at the very end of the corridor upstairs. You will find my diary in the bookshelf, hidden behind a book with poems. Hamond doesn't like poems.\"";
+ next;
+ mes "\"Please go and read it.\"";
+
+ @state = 6;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Read_Diary:
+ mes "[Reid's Ghost]";
+ mes "\"Please go into my room and read the diary. You will find my diary in the bookshelf, hidden behind a book with poems.\"";
+ goto L_close;
+
+L_Savaric:
+ mes "[Reid's Ghost]";
+ mes "\"Now you know about my recent past and... and my twisted feelings.\"";
+ next;
+ menu
+ "Yes, I feel very sorry for you.",L_Next6,
+ "Savaric seems to be a really hot guy, making you so compliant.",L_Tease;
+
+L_Next6:
+ mes "[Reid's Ghost]";
+ mes "\"Oh, thank you.\"";
+ if (@golbanez < 5)
+ menu
+ "But I still didn't find out what happened. I'll return when I have news.",L_close;
+ menu
+ "But I still didn't find out what happened. I'll return when I have news.",L_close,
+ "I found out what happened to you and this place. I'll tell you.",L_Next7;
+
+L_Next7:
+ mes "You explain to her about Golbenez, Savaric and the memories you have seen.";
+ next;
+ mes "[Reid's Ghost]";
+ mes "\"Oh, I always knew we weren't doing the right thing! But how could we have known it would end like this?\"";
+ next;
+ mes "\"I would never have expected Hamond to beat me - and Savaric... I trusted him with my life... And he carelessly wasted it. Mine and everyone else in the inn.\"";
+ next;
+ mes "\"I'm feeling hurt. And confused. Both Hamond and Savaric turned out not to be the persons I believed them to be.\"";
+ @state = 8;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Sorry:
+ mes "[Reid's Ghost]";
+ mes "\"Welcome back.\"";
+ if ((@lover == 4)
+ && (countitem("Diamond") >= @DIAMOND_AMOUNT)
+ && (countitem("Ruby") >= @RUBY_AMOUNT)
+ && (@husband == 5))
+ menu
+ "Savaric asked me to give you something.",L_Diamond,
+ "Hamond sent me to bring you this.",L_Ruby,
+ "Nevermind.",L_close;
+ if (@lover == 4 && (countitem("Diamond") >= @DIAMOND_AMOUNT))
+ menu
+ "Savaric asked me to give you something.",L_Diamond,
+ "Nevermind.",L_close;
+ if (@husband == 5 && (countitem("Ruby") >= @RUBY_AMOUNT))
+ menu
+ "Hamond sent me to bring you this.",L_Ruby,
+ "Nevermind.",L_close;
+ goto L_close;
+
+L_Diamond:
+ if (countitem("Diamond") < @DIAMOND_AMOUNT)
+ goto L_Kidding;
+ delitem "Diamond", @DIAMOND_AMOUNT;
+ mes "You explain how Savaric feels and what the diamonds mean.";
+ next;
+ mes "[Reid's Ghost]";
+ mes "\"Oh Savaric. I just can't be angry at him. Thanks for your help. I'll go to talk with him.\"";
+ @lover = 5;
+ callsub S_Update_Mask_Lover;
+ @state = @state + 1;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Ruby:
+ if (countitem("Ruby") < @RUBY_AMOUNT)
+ goto L_Kidding;
+ delitem "Ruby", @RUBY_AMOUNT;
+ mes "You tell her about Hamonds feelings.";
+ next;
+ mes "[Reid's Ghost]";
+ mes "\"I need to talk to him. Thanks for bringing me this.\"";
+ @husband = 6;
+ callsub S_Update_Mask_Husband;
+ @state = @state + 1;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Kidding:
+ mes "[Reid's Ghost]";
+ mes "\"Are you kidding? You don't have the items you are talking about. This is not funny.\"";
+ goto L_Tease;
+
+L_Tease:
+ mes "[Reid's Ghost]";
+ mes "\"Don't be mean! I never felt like that before.\"";
+ goto L_close;
+
+L_Thanks:
+ mes "[Reid's Ghost]";
+ mes "\"I'm so glad, now I know what happened and spoke to both Savaric and Hamond. Thank you so much. Please take this.\"";
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+ getitem "MylarinDust", 1;
+ @state = 11;
+ callsub S_Update_Mask;
+ next;
+ goto L_Mylarin;
+
+L_Mylarin:
+ mes "[Reid's Ghost]";
+ mes "\"This is called mylarin dust. My mother gave it to me when my father had his accident. She said it is very valuable.\"";
+ next;
+ mes "\"I'm not sure what it is used for, but I remember her saying something about some special crafting tradition which uses it to make really strong armor.\"";
+ next;
+ mes "\"Maybe you should try to find someone who can use it.\"";
+ goto L_close;
+
+L_Happy:
+ mes "[Reid's Ghost]";
+ mes "\"Thank you for all you've done.\"";
+ menu
+ "Can you tell me again about the powder you gave me?",L_Mylarin,
+ "I'm glad I could help.",L_close;
+
+L_Not_Enough_Tears:
+ mes "[Reid's Ghost]";
+ @tears = countitem("FrozenYetiTear");
+ if (@tears == 1)
+ mes "\"This is beautiful! But one of them isn't enough to represent my sadness.\"";
+ if (@tears > 1)
+ mes "\"This is beautiful! But " + @tears + " of them aren't enough to represent my sadness.\"";
+ goto L_close;
+
+L_Problem:
+ mes "[Reid's Ghost]";
+ mes "\"What I have to tell is very personal. I'm not sure if I want to tell you. I know you helped me already and showed me you are a sensitive, but I barely know you. I am sorry, but I have to think a little bit more. Maybe later, when I know you better, I can tell you more about it. \"";
+ goto L_close;
+
+L_Ring:
+ mes "[Reid's Ghost]";
+ mes "\"Oh, this - I - it's mine. It was a present from a very precious person.\"";
+ next;
+ mes "She reaches out to take the ring, but it just go through her fingers. She looks sad.";
+ next;
+ mes "\"Ah, I forgot again. It pains me not being able to wear it. Please, take it with you, I don't want it anymore. It hurts too much.\"";
+ @kidstate = 6;
+ callsub S_Update_Mask_Kid;
+ goto L_close;
+
+L_Full_Inv:
+ mes "[Reid's Ghost]";
+ mes "\"Dear, you're carrying so much stuff, you can't take my present. Come back later to take it.\"";
+ goto L_close;
+
+L_close:
+ @Graveyard_Inn_MASK = 0;
+ @Graveyard_Inn_SHIFT = 0;
+ @state = 0;
+ @Graveyard_Inn_Lover_MASK = 0;
+ @Graveyard_Inn_Lover_SHIFT = 0;
+ @lover = 0;
+ @Graveyard_Inn_Kid_MASK = 0;
+ @Graveyard_Inn_Kid_SHIFT = 0;
+ @kidstate = 0;
+ @Graveyard_Inn_Husband_MASK = 0;
+ @Graveyard_Inn_Husband_SHIFT = 0;
+ @husband = 0;
+ @Graveyard_Inn_Golbanez_MASK = 0;
+ @Graveyard_Inn_Golbanez_SHIFT = 0;
+ @golbanez = 0;
+ @minLevel = 0;
+ @YETI_TEAR_AMOUNT = 0;
+ @YETI_TEAR_EXP = 0;
+ @DIAMOND_AMOUNT = 0;
+ @RUBY_AMOUNT = 0;
+ @tears = 0;
+ close;
+
+S_Update_Mask_Kid:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_Kid_MASK))
+ | (@kidstate << @Graveyard_Inn_Kid_SHIFT);
+ return;
+
+S_Update_Mask_Husband:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_Husband_MASK))
+ | (@husband << @Graveyard_Inn_Husband_SHIFT);
+ return;
+
+S_Update_Mask_Lover:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_Lover_MASK))
+ | (@lover << @Graveyard_Inn_Lover_SHIFT);
+ return;
+
+S_Update_Mask:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_MASK))
+ | (@state << @Graveyard_Inn_SHIFT);
+ return;
+}
diff --git a/npc/026-2/lover.txt b/npc/026-2/lover.txt
new file mode 100644
index 00000000..605dae86
--- /dev/null
+++ b/npc/026-2/lover.txt
@@ -0,0 +1,307 @@
+
+026-2,80,31,0 script Savaric NPC317,{
+ @Graveyard_Inn_MASK = NIBBLE_1_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_1_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ @Graveyard_Inn_Woman_MASK = NIBBLE_0_MASK;
+ @Graveyard_Inn_Woman_SHIFT = NIBBLE_0_SHIFT;
+
+ @woman = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Woman_MASK) >> @Graveyard_Inn_Woman_SHIFT);
+
+ @Graveyard_Inn_Golbenez_MASK = NIBBLE_4_MASK;
+ @Graveyard_Inn_Golbenez_SHIFT = NIBBLE_4_SHIFT;
+
+ @golbanez = ((QUEST_Graveyard_Inn & @Graveyard_Inn_Golbenez_MASK) >> @Graveyard_Inn_Golbenez_SHIFT);
+
+ @minLevel = 85;
+ @CRYSTAL_AMOUNT = 500;
+ @CRYSTAL_EXP = 200000;
+ @CRYSTAL_EXTRA_EXP = 100;
+ @CRYSTAL_MAX = 2000;
+ set @DIAMOND_AMOUNT, 20; // caution, this value needs to be the same as in the innkeepers script!
+
+ if (@state >= 7) goto L_Have_Soul;
+ if (@state == 6) goto L_Want_Soul;
+ if (@state == 5) goto L_Apologize;
+ if (@state == 4) goto L_Waiting;
+ if (@state == 3) goto L_Golb;
+ if (@state == 2) goto L_News;
+ if (@state == 1) goto L_Crystals;
+
+ mes "You see a dead man hanging. This place is creepy!";
+ next;
+ if (BaseLevel < @minLevel) goto L_close;
+ mes "Suddenly the man opens his eyes and looks at you.";
+ next;
+ mes "[Hanged Man]";
+ mes "\"Oh, hello. Nice to see you - I seem to be dead, but I don't know why and why I'm still consciousness. This is very interesting.\"";
+ menu
+ "INTERESTING? Are you crazy?",L_Next;
+
+L_Next:
+ mes "[Hanged Man]";
+ mes "\"Well, as you mention it, it is quite annoying and uncomfortable. Would you mind helping me down to the floor?\"";
+ next;
+ mes "You take a step towards him, but some invisible force holds you back.";
+ next;
+ mes "[Hanged Man]";
+ mes "\"Oh, someone is holding you back with magic! I sense a really dark and mighty power. What has happened!?\"";
+ next;
+ mes "\"Can I ask you for a favor? Can you bring me lots of Dark Crystals? You might need to ask a dark mage for it. I want to try to break the barrier.\"";
+ next;
+ mes "\"I'll need... well, at least " + @CRYSTAL_AMOUNT + ". But if you have more, I can use extras!\"";
+ @state = 1;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Crystals:
+ mes "[Hanged Man]";
+ mes "\"Ah, you're back! Did you get the Dark Crystals?\"";
+
+ if (countitem("DarkCrystal") == 0)
+ menu
+ "Not yet.", L_close;
+
+ if (countitem("DarkCrystal") < @CRYSTAL_AMOUNT)
+ goto L_Not_Enough_Crystals;
+
+ delitem "DarkCrystal", @CRYSTAL_AMOUNT;
+ getexp @CRYSTAL_EXP, 0;
+ next;
+ mes "\"Oh, I can feel them! Please lay them down on the floor.\"";
+ next;
+ mes "You lay "+ @CRYSTAL_AMOUNT + " dark crystals down on the floor and step back, nervously expecting the coming.";
+ next;
+ if (countitem("DarkCrystal") == 0) goto L_Skip;
+ mes "[Hanged Man]";
+ mes "\"You have more of them, haven't you? It will work better if you give them to me too.\"";
+ menu
+ "Ok, here you go.",L_Next1,
+ "I prefer to keep them.",L_Skip;
+
+L_Next1:
+ @crystal = countitem("DarkCrystal");
+ if (@crystal > @CRYSTAL_MAX)
+ @crystal = @CRYSTAL_MAX;
+ delitem "DarkCrystal", @crystal;
+ getexp @crystal*@CRYSTAL_EXTRA_EXP, 0;
+ goto L_Skip;
+
+L_Skip:
+ mes "[Hanged Man]";
+ mes "\"Well, let's start now.\"";
+ next;
+ mes "The hanged man seems very concentrated now, which looks absurd with him hanging there.";
+ next;
+ mes "The dark crystals start to glow and buzz. You take another step back.";
+ next;
+ mes "The buzzing gets louder and louder, so you can't hear a word the hanged man is saying now.";
+ next;
+ Hp = 5;
+ mes "The crystals explode and hit you!";
+ next;
+ mes "You fall down on the floor and blink frantically to regain your eyesight.";
+ next;
+ mes "[Hanged Man]";
+ mes "\"Hello? You're ok? I'm sorry, something went wrong. It seems, not only is there a magical barrier, but also my manaflow is blocked. I don't know if this is because I'm dead or part of the barrier spell.\"";
+ next;
+ mes "\"I never was dead before, so I can't be sure. But I was able to access my magic - it just got out of control at the critical moment.\"";
+ next;
+ mes "\"This is fascinating!\"";
+ menu
+ "Ok, you are crazy!",L_Next2,
+ "Yes, it is very fascinating to be blown up!",L_Next2,
+ "I NEARLY DIED! AND YOU THINK THIS IS FASCINATING?!",L_Next2;
+
+L_Next2:
+ mes "[Hanged Man]";
+ mes "\"I sometimes forget the fact that not everybody is fascinated by the riddles of magic. Please forgive me.\"";
+ next;
+ mes "\"And I even didn't introduce myself! I am very sorry for my rude behavior!\"";
+ next;
+ mes "\"My name is Savaric, first apprentice of the Great Demon Summoner Ymbert.\"";
+ next;
+ mes "\"If you can forgive me my behaviour, may I ask you for another favor? Can you please search for someone or something in this inn that could be the source of this dark magic?\"";
+ @state = 2;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_News:
+ mes "[Savaric]";
+ mes "\"Welcome back. Did you find a possible source for the dark magic?\"";
+ if ((@woman < 6)
+ && (@golbanez == 0))
+ menu
+ "Not yet, I'm still searching.",L_close;
+ if ((@woman < 6)
+ && (@golbanez > 0))
+ menu
+ "Yes, let me tell you.",L_Golbenez,
+ "I don't think so.",L_close;
+ if ((@woman >= 6)
+ && (@golbanez == 0))
+ menu
+ "Can you tell me about your relationship to Reid?",L_Reid,
+ "Not yet, I'm still searching.",L_close;
+ if ((@woman >= 6)
+ && (@golbanez >= 0))
+ menu
+ "Can you tell me about your relationship to Reid?",L_Reid,
+ "Yes, let me tell you.",L_Golbenez,
+ "I don't think so.",L_close;
+ goto L_Golbenez;
+
+L_Golbenez:
+ mes "You explain how you came to the inn and what Golbenez said to you.";
+ next;
+ mes "[Savaric]";
+ mes "\"This... this is very disturbing news. Playground he said? Mh.. \"";
+ next;
+ mes "\"Savaric seems to be completely absorbed in his thoughts.\"";
+ menu
+ "Hello? Are you still there?",L_Next3,
+ "Excuse me, I don't want to interrupt you, but can you explain to me what's going on? I'm confused.",L_Next3,
+ "Hey! I'm talking with you!",L_Next3;
+
+L_Next3:
+ mes "Savaric winces.";
+ next;
+ mes "\"Oh, right - I was just thinking. It makes me feel uncomfortable to hear about Golbenez being involved in this.\"";
+ next;
+ mes "\"I told you I'm the apprentice of a demon summoner, remember? Well, this includes learning about the astral beings in this world.\"";
+ next;
+ mes "\"And Golbenez - he is a very powerful being, a Demi-God, with a very questionable sense of humor. He was worshipped by a group of cultists some hundred years ago - uhm, some hundred years ago from my lifetime, I mean.\"";
+ next;
+ mes "\"But most of his adherents died when he thought it would be funny to test their loyality by sending them on a journey over the sea to a paradise island he promised them - of course, there was no such island.\"";
+ next;
+ mes "\"Maybe now you understand what I mean about a questionable sense of humor.\"";
+ next;
+ mes "\"But on the other hand, he can grant great power to those who are capable of dealing with him and who offer him enough for his service. Trying to do that would be a risky undertaking in any case.\"";
+ next;
+ mes "\"He told you this inn was one of his favorite playgrounds - so it seems he was playing one of his evil games with the people in this inn. And now, he resurrected our memories to this parody of life!\"";
+ next;
+ mes "\"" + strcharinfo(0) + "! I need your help again! Please return to Golbenez and try to get out of him what was happening here. But be careful when negotiating.. he will demand a service in return.\"";
+ @state = 3;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Golb:
+ mes "[Savaric]";
+ mes "\"Good to see you back my friend. What did you find out?\"";
+ if (@golbanez < 5)
+ menu
+ "I'm still working on doing all the stuff Golbenez wants me to do.",L_close;
+ menu
+ "Now I know what happened. I'll tell you.",L_Next4,
+ "I'm sorry to tell you, but this was all your fault.",L_Next4;
+
+L_Next4:
+ mes "You tell Savaric about what Golbenez showed to you.";
+ next;
+ mes "[Savaric]";
+ mes "\"I.. I can't believe.. My master told me, I need to be careful because of my temper - but I never thought it would lead me to make such a terrible mistake. Oh, Reid - and all the people in the inn! What have I done?!\"";
+ next;
+ mes "He seems pained by his guilt.";
+ next;
+ mes "[Savaric]";
+ mes "\"" + strcharinfo(0) + ", please, can you go to Reid and tell her about what I've done? And then ask her if she will ever be able to forgive me?\"";
+ next;
+ mes "\"But wait. It is not enough just to ask for forgiveness. Please, can you bring her " + @DIAMOND_AMOUNT + " Diamonds? They symbolize my pure feelings for her.\"";
+ @state = 4;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Waiting:
+ mes "[Savaric]";
+ mes "\"Have you already brought the Diamonds to Reid?\"";
+ goto L_close;
+
+L_Apologize:
+ mes "[Savaric]";
+ mes "\"Oh thank you! I thank you so much! Reid came here to talk to me.\"";
+ next;
+ mes "\"She forgave me! I'm so happy!\"";
+ next;
+ mes "\"You did so much for me, can I ask you for one last favor?\"";
+ next;
+ mes "\"Golbenez took my soul and I want it back. You were very clever with how you negotiated with him so far. Could you get my soul back for me?\"";
+ @state = 6;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Want_Soul:
+ if (@golbanez >= 7)
+ goto L_Soul;
+ mes "[Savaric]";
+ mes "\"Welcome back! Are you still working on getting my soul back?\"";
+ menu
+ "I'm doing my best.",L_NextEnd,
+ "Yes, but it isn't easy.",L_NextEnd;
+
+L_NextEnd:
+ mes "[Savaric]";
+ mes "\"Thank you so much! I'm counting on you!\"";
+ goto L_close;
+
+L_Soul:
+ mes "[Savaric]";
+ mes "\"My soul came back! Oh thank you!\"";
+ next;
+ mes "\"Please take this as a symbol of my gratitude.\"";
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+ getitem "SorcererRed", 1;
+ @state = 7;
+ callsub S_Update_Mask;
+ mes "\"This is what mages and their apprentices wore when I lived. It is white because I wasn't a master yet.\"";
+ next;
+ mes "\"But I guess the old traditions have changed since then.\"";
+ goto L_close;
+
+L_Have_Soul:
+ mes "[Savaric]";
+ mes "\"I'll be in your debt forever. Thank you so much.\"";
+ goto L_close;
+
+L_Reid:
+ mes "[Savaric]";
+ mes "\"Relationship? Well, she is the innkeeper of this inn and I'm a patron. There is nothing more to say about this.\"";
+ goto L_close;
+
+L_Not_Enough_Crystals:
+ mes "It seems you managed to get some, but not enough. Can you bring me more?";
+ goto L_close;
+
+L_Full_Inv:
+ mes "[Savaric]";
+ mes "\"Oh, you can't carry anything more. Come back when you can take it.\"";
+ goto L_close;
+
+L_close:
+ @Graveyard_Inn_MASK = 0;
+ @Graveyard_Inn_SHIFT = 0;
+ @state = 0;
+ @Graveyard_Inn_Woman_MASK = 0;
+ @Graveyard_Inn_Woman_SHIFT = 0;
+ @woman = 0;
+ @Graveyard_Inn_Golbenez_MASK = 0;
+ @Graveyard_Inn_Golbenez_SHIFT = 0;
+ @golbanez = 0;
+ @minLevel = 0;
+ @CRYSTAL_AMOUNT = 0;
+ @CRYSTAL_EXP = 0;
+ @CRYSTAL_EXTRA_EXP = 0;
+ @CRYSTAL_MAX = 0;
+ @DIAMOND_AMOUNT = 0;
+ @crystal = 0;
+ close;
+
+S_Update_Mask:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_MASK))
+ | (@state << @Graveyard_Inn_SHIFT);
+ return;
+}
diff --git a/npc/026-2/mapflags.txt b/npc/026-2/mapflags.txt
new file mode 100644
index 00000000..0799ef30
--- /dev/null
+++ b/npc/026-2/mapflags.txt
@@ -0,0 +1,2 @@
+//026-1 mapflag resave 026-1,28,35
+//026-2 mapflag town
diff --git a/npc/026-2/testnpcs.txt b/npc/026-2/testnpcs.txt
new file mode 100644
index 00000000..b6001cc5
--- /dev/null
+++ b/npc/026-2/testnpcs.txt
@@ -0,0 +1,57 @@
+
+026-2,64,32,0 script Lovers NPC303,{
+ mes "You see a man and a woman holding each other very tight.";
+ next;
+ mes "They are kissing and whispering things to each other you can't hear.";
+ next;
+ mes "Now the woman giggles. They don't notice you.";
+ next;
+ mes "Maybe it's better not to bother them.";
+ close;
+}
+
+026-2,34,59,0 script Archibald NPC306,{
+ mes "[Archibald]";
+ mes "\"Me need to prepare the food. Me helping the chef cook.\"";
+ next;
+ mes "\"Person doesn't disturb me when me is making the food\"";
+ close;
+}
+
+026-2,41,30,0 script Darnel NPC308,{
+ @drunker = rand(4);
+ if (@drunker == 0) goto L_0;
+ if (@drunker == 1) goto L_1;
+ if (@drunker == 2) goto L_2;
+ if (@drunker == 3) goto L_3;
+ end;
+L_0:
+ mes "[Darnel]";
+ mes "\"zzzZZZzzz...\"";
+ goto L_close;
+L_1:
+ mes "[Darnel]";
+ mes "\"Ish that a Zzombee?...\"";
+ goto L_close;
+L_2:
+ mes "[Darnel]";
+ mes "\"Auuu... Hiccup... Don't byte mee... \"";
+ goto L_close;
+L_3:
+ mes "[Darnel]";
+ mes "\"Moar Bearr...Pleash!\"";
+ goto L_close;
+
+L_close:
+ @drunker = 0;
+ close;
+}
+
+026-2,33,29,0 script Nigel NPC312,{
+ mes "[Nigel]";
+ mes "\"Ohh... My head is killing me! I have to stop "
+ + "drinking too much or I will lose my job... But "
+ + "being a waiter... oh I can't resist a drink or two!\"";
+ close;
+}
+
diff --git a/npc/026-2/werewolf.txt b/npc/026-2/werewolf.txt
new file mode 100644
index 00000000..febc4149
--- /dev/null
+++ b/npc/026-2/werewolf.txt
@@ -0,0 +1,176 @@
+
+026-2,30,23,0 script Wolfgang NPC305,{
+ @Graveyard_Inn_MASK = NIBBLE_5_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_5_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ @ANIMALBONES_AMOUNT = 30;
+ @ANIMALBONES_EXP = 40000;
+ @money = 1000;
+ @minLevel = 80;
+
+ if (@state > 1) goto L_Happy;
+ if (@state == 1) goto L_Bones;
+
+ mes "[Wolfgang]";
+ mes "\"What a nice place here, isn't it?\"";
+ next;
+ mes "\"Just the stuff they call 'food' in here is awful, bah.\"";
+ if (BaseLevel < @minLevel)
+ goto L_close;
+ next;
+ mes "\"I like bones from big animals, the best would be with some raw flesh on it. But just the bones are fine too.\"";
+ next;
+ mes "\"Can you bring me " + @ANIMALBONES_AMOUNT + " of them?\"";
+ @state = 1;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Bones:
+ mes "[Wolfgang]";
+ mes "\"Do you have " + @ANIMALBONES_AMOUNT + " bones of an animal for me?\"";
+ next;
+ if ((countitem("Bone") > 0)
+ && (countitem("AnimalBones") >= @ANIMALBONES_AMOUNT))
+ menu
+ "Yes, here they are.",L_Bring,
+ "What about this normal bone?",L_Human,
+ "Not yet.",L_close;
+ if (countitem("Bone") > 0)
+ menu
+ "What about this normal bone?",L_Human,
+ "Not yet.",L_close;
+ if (countitem("AnimalBones") >= @ANIMALBONES_AMOUNT)
+ menu
+ "Yes, here they are.",L_Bring,
+ "Not yet.",L_close;
+ menu
+ "Not yet.",L_close;
+
+L_Bring:
+ if (countitem("AnimalBones") < @ANIMALBONES_AMOUNT)
+ goto L_Not_Enough;
+ delitem "AnimalBones", @ANIMALBONES_AMOUNT;
+ getexp @ANIMALBONES_EXP, 0;
+ mes "[Wolfgang]";
+ mes "\"Ah! Wonderful! Thank you.\"";
+ @state = 2;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Human:
+ mes "[Wolfgang]";
+ mes "\"What?! That's a humans bone! I don't eat humans. That brings only trouble.\"";
+ next;
+ mes "\"Besides, from that I heard, they taste bad.\"";
+ goto L_close;
+
+L_Not_Enough:
+ mes "[Wolfgang]";
+ mes "\"Are you trying to kid me? I can count.\"";
+ goto L_close;
+
+L_Happy:
+ mes "You see the werewolf happily crunching the bones you brought him.";
+ mes "[Wolfgang]";
+ mes "\"Delicious. Thanks again.\"";
+ next;
+ mes "\"By the way... would you be interested in a little round of blackjack?\"";
+ mes "He pulls a deck of cards out of his pocket.";
+ next;
+ mes "[Wolfgang]";
+ mes "\"You will need " + @money + " GP.\"";
+ menu
+ "Sure, why not?",L_Game,
+ "No, thanks.",L_close;
+
+L_Game:
+ if (Zeny < @money)
+ goto L_No_Money;
+ mes "[Wolfgang]";
+ mes "\"Very nice. Let's start.\"";
+ mes "He shuffles the cards.";
+ next;
+ Zeny = Zeny - @money;
+ @croupier = rand(0, 4);
+ @croupier = @croupier + 17;
+ @player = rand(4, 21);
+ mes "\"You got " + @player + " with your cards.";
+ if (@player == 21)
+ goto L_End;
+ mes "Do you want another card?\"";
+ next;
+ menu
+ "Yes.", L_Another,
+ "No.", L_End;
+
+L_Another:
+ @tempace = rand(2, 11);
+ if (@tempace == 11)
+ goto L_Ace;
+ @player = @player + @tempace;
+ if (@player > 21)
+ goto L_Lost;
+ if (@player == 21)
+ goto L_End;
+ mes "\"You got " + @player + " with your cards.";
+ mes "Do you want another card?\"";
+ next;
+ menu
+ "Yes", L_Another,
+ "No", L_End;
+
+L_End:
+ if (@player <= @croupier)
+ goto L_Lost;
+ mes "\"You won! Hrm, here is your money.\"";
+ Zeny = Zeny + (3 * @money);
+ goto L_close;
+
+L_No_Money:
+ mes "\"You need at least " + @money + " GP.\"";
+ goto L_close;
+
+L_Lost:
+ mes "[Wolfgang]";
+ mes "\"Fine! I won!";
+ mes "You got " + @player + " with your cards.";
+ mes "I had " + @croupier + ".\"";
+ goto L_close;
+
+L_Ace:
+ @player = @player + 11;
+ if (@player > 21)
+ @player = @player - 10;
+ if (@player > 21)
+ goto L_Lost;
+ if (@player == 21)
+ goto L_End;
+ mes "You got " + @player + " with your cards.";
+ mes "Do you want another card?";
+ next;
+ menu
+ "Yes", L_Another,
+ "No", L_End;
+
+L_close:
+ @Graveyard_Inn_MASK = 0;
+ @Graveyard_Inn_SHIFT = 0;
+ @state = 0;
+ @ANIMALBONES_AMOUNT = 0;
+ @ANIMALBONES_EXP = 0;
+ @money = 0;
+ @minLevel = 0;
+
+ @croupier = 0;
+ @player = 0;
+ @tempace = 0;
+ close;
+
+S_Update_Mask:
+ set QUEST_Graveyard_Inn,
+ (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_MASK))
+ | (@state << @Graveyard_Inn_SHIFT);
+ return;
+}
diff --git a/npc/027-1/_import.txt b/npc/027-1/_import.txt
new file mode 100644
index 00000000..a9eef2b5
--- /dev/null
+++ b/npc/027-1/_import.txt
@@ -0,0 +1,7 @@
+// Map 027-1: Graveyard
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/027-1/_mobs.txt",
+"npc/027-1/_warps.txt",
+"npc/027-1/crypt.txt",
+"npc/027-1/graves.txt",
+"npc/027-1/mapflags.txt",
diff --git a/npc/027-1/_mobs.txt b/npc/027-1/_mobs.txt
new file mode 100644
index 00000000..16e2912c
--- /dev/null
+++ b/npc/027-1/_mobs.txt
@@ -0,0 +1,18 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 027-1: Graveyard mobs
+027-1,81,91,47,13 monster Poltergeist 1047,4,900000,60000
+027-1,81,91,48,12 monster Spectre 1042,4,900000,60000
+027-1,81,91,49,11 monster Wisp 1040,4,900000,60000
+027-1,37,64,16,10 monster Skeleton 1043,2,60000,8000
+027-1,37,64,16,10 monster Lady Skeleton 1044,2,60000,8000
+027-1,71,41,15,11 monster Skeleton 1043,1,175000,20000
+027-1,71,41,15,11 monster Lady Skeleton 1044,1,175000,20000
+027-1,37,41,16,11 monster Skeleton 1043,4,180000,20000
+027-1,37,41,16,11 monster Lady Skeleton 1044,4,180000,20000
+027-1,105,40,16,10 monster Skeleton 1043,2,35000,20000
+027-1,105,40,16,10 monster Lady Skeleton 1044,3,33000,25000
+027-1,70,64,15,10 monster Skeleton 1043,1,60000,8000
+027-1,70,64,15,10 monster Lady Skeleton 1044,1,60000,8000
+027-1,104,64,15,10 monster Skeleton 1043,2,60000,8000
+027-1,104,64,15,10 monster Lady Skeleton 1044,2,60000,8000
+027-1,70,40,50,10 monster Vampire Bat 1066,15,100000,30000
diff --git a/npc/027-1/_warps.txt b/npc/027-1/_warps.txt
new file mode 100644
index 00000000..5fb38ea6
--- /dev/null
+++ b/npc/027-1/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 027-1: Graveyard warps
+027-1,88,84,0 warp #027-1_88_84 0,0,027-2,46,33
+027-1,63,106,0 warp #027-1_63_106 0,0,026-1,63,17
diff --git a/npc/027-1/crypt.txt b/npc/027-1/crypt.txt
new file mode 100644
index 00000000..25a6d0ec
--- /dev/null
+++ b/npc/027-1/crypt.txt
@@ -0,0 +1,10 @@
+027-1,28,67,0 script #CryptEntrance NPC45,0,0,{
+ if (BaseLevel < 60)
+ goto L_Weak;
+ warp "027-2", 36, 110;
+ end;
+
+L_Weak:
+ message strcharinfo(0), "Come back when you're a bit more experienced.";
+ end;
+}
diff --git a/npc/027-1/graves.txt b/npc/027-1/graves.txt
new file mode 100644
index 00000000..7ed82bac
--- /dev/null
+++ b/npc/027-1/graves.txt
@@ -0,0 +1,108 @@
+
+027-1,89,62,0 script Grave#1 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ FotherJ ~";
+ mes "The mad sprite making genius who made all the creepy undead monster graphics.";
+ close;
+}
+
+027-1,118,54,0 script Grave#2 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ Yosuhara ~";
+ mes "Contributed some of the tombstones.";
+ close;
+}
+
+027-1,111,62,0 script Grave#3 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ Feline Monstrosity ~";
+ mes "Made the background music you are hearing.";
+ close;
+}
+
+027-1,112,76,0 script Grave#4 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ Superkoop ~";
+ mes "Mapped the swamp to the south.";
+ close;
+}
+
+027-1,120,76,0 script Grave#5 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ Aroleon ~";
+ mes "Mapped the swamp to the southeast.";
+ close;
+}
+
+027-1,100,68,0 script Grave#6 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ John P ~";
+ mes "Wrote the graveyard backstory and the dialog for the caretaker quest.";
+ close;
+}
+
+027-1,94,70,0 script Grave#7 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ Spit23 ~";
+ mes "Made those freakin awesome cemetery gates.";
+ close;
+}
+
+027-1,106,60,0 script Grave#8 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ Black Don ~";
+ mes "Contributed those cool gargoyle statues.";
+ close;
+}
+
+027-1,92,54,0 script Grave#9 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ Jaxad0127 ~";
+ mes "Did all the scripting work for the graveyard. Made Caretaker's house.";
+ close;
+}
+
+027-1,122,64,0 script Grave#10 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ Ces Vargavind ~";
+ mes "Scripted caretaker's daughter.";
+ close;
+}
+
+027-1,102,62,0 script Grave#11 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ Crush ~";
+ mes "Organizer of the whole graveyard project, graveyard fence graphics, mapping of the graveyard itself.";
+ close;
+}
+
+027-1,104,76,0 script Grave#12 NPC400,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ mes "~ Freeyorp ~";
+ mes "Planned out monster stats and placements.";
+ close;
+}
diff --git a/npc/027-1/mapflags.txt b/npc/027-1/mapflags.txt
new file mode 100644
index 00000000..83e0536c
--- /dev/null
+++ b/npc/027-1/mapflags.txt
@@ -0,0 +1,2 @@
+//027-1 mapflag resave 026-1,28,35
+027-1 mapflag zone outside
diff --git a/npc/027-2/_import.txt b/npc/027-2/_import.txt
new file mode 100644
index 00000000..69ea2789
--- /dev/null
+++ b/npc/027-2/_import.txt
@@ -0,0 +1,8 @@
+// Map 027-2: Graveyard Indoor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/027-2/_mobs.txt",
+"npc/027-2/_warps.txt",
+"npc/027-2/alacrius.txt",
+"npc/027-2/caretaker.txt",
+"npc/027-2/mapflags.txt",
+"npc/027-2/thurston.txt",
diff --git a/npc/027-2/_mobs.txt b/npc/027-2/_mobs.txt
new file mode 100644
index 00000000..10a2f89a
--- /dev/null
+++ b/npc/027-2/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 027-2: Graveyard Indoor mobs
+027-2,25,99,4,9 monster Tipsy Skeleton 1078,1,100000,30000
+027-2,35,88,14,19 monster Vampire Bat 1066,15,100000,30000
+027-2,25,99,4,9 monster Drunken Skeleton 1077,1,100000,30000
+027-2,25,99,4,9 monster Tipsy Skeleton 1078,1,100000,30000
diff --git a/npc/027-2/_warps.txt b/npc/027-2/_warps.txt
new file mode 100644
index 00000000..d6099ded
--- /dev/null
+++ b/npc/027-2/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 027-2: Graveyard Indoor warps
+027-2,36,111,0 warp #027-2_36_111 5,0,027-1,28,68
+027-2,36,78,0 warp #027-2_36_78 5,0,027-3,35,69
+027-2,46,34,0 warp #027-2_46_34 0,0,027-1,88,85
diff --git a/npc/027-2/alacrius.txt b/npc/027-2/alacrius.txt
new file mode 100644
index 00000000..f1dd9a26
--- /dev/null
+++ b/npc/027-2/alacrius.txt
@@ -0,0 +1,123 @@
+
+027-2,45,105,0 script Alacrius NPC313,{
+ mesn;
+ mesq l("Hello, I'm Alacrius.");
+ next;
+ mes "\"A very long time ago, I figured a way to cheat death and the limits of time and space. You may think it is evil, but I did it because of true love... \"";
+ next;
+ mes "\"The reaper kidnapped my beloved wife, and took her to the underworld. I had to find a way to stop him, and as time went by, I became what you can see now... But if you dare to cheat death, time and space you'll have to pay a high price... \"";
+ // Doomsday related
+ if (BOSS_POINTS >= 300) goto L_Quest;
+ close;
+
+L_Quest:
+ // Rand() is probably not the best way to do that.
+ if (!#CRYPT_PASSWORD) {
+ #CRYPT_PASSWORD = rand2(4095);
+ setq Quest_Reapercry, 1;
+ }
+ next;
+ mes "##1--------- The Alacrius Riddle";
+ mes "";
+ mes "A spell used in the right place and order,";
+ mes "will break Keshlam's magical border,";
+ mes "but be very aware of a warder.";
+ next;
+ mes "Also know, my oh so dear friends,";
+ mes "the clues differ for whoever attends.";
+ mes "If one will fail or succeed depends,";
+ mes "on how close attention one spends!";
+ next;
+ mes "##9 Explore the Crypt and find the clues to solve Alacrius' Riddle.";
+ mes "##9 All clues, hints and riddles you need to solve this one,";
+ mes "##9 are inside this crypt. If a clue, hint, or riddle, doesn't make";
+ mes "##9 immediate sense, together, they shall lend you their full meaning.";
+ //mes "##9 And if you're in despair, find the Lord words, they will guide your way.";
+ close;
+}
+
+027-2,30,78,0 script #AlacriusClue1 NPC400,{
+ if (!#CRYPT_PASSWORD)
+ goto L_Empty;
+ mes "For those whom search to the answers of Alacrius' Riddles.";
+ next;
+ mes "Made with stone, near Krukan's room,";
+ mes "lies a forgotten chamber tomb,";
+ mes "for those who fell victim to his doom.";
+ mes "";
+ mes "Candles will part the left from the right";
+ mes "and the stone sarcophagi hold clues to the rite.";
+ mes "But only the ones that are still sealed tight,";
+ mes "will tell you which candles you have to light.";
+ mes "";
+ mes "And watch out for the five heroes,";
+ mes "For the lord's words of wisdom,";
+ mes "They carefully guard.";
+ close;
+
+L_Empty:
+ mes "The book pages are blank!";
+ close;
+}
+
+027-2,41,78,0 script #AlacriusClue2 NPC400,{
+ if (!#CRYPT_PASSWORD)
+ goto L_Empty;
+ mes "For those whom search to the answers of Alacrius' Riddles.";
+ next;
+ mes "Not far from Razha's hall,";
+ mes "statues of stone adorn the wall,";
+ mes "to honor the heroes who caused him to fall.";
+ mes "";
+ mes "Only the ones in unfractured light,";
+ mes "might hold a clue to the unholy rite,";
+ mes "and tell you which candles you have to light,";
+ mes "while others will tell you just lies outright.";
+ close;
+
+L_Empty:
+ mes "The book pages are blank!";
+ close;
+}
+
+
+027-3,59,22,0 script #AlacriusClue3 NPC400,{
+ if (!#CRYPT_PASSWORD)
+ goto L_Empty;
+ mes "For those whom search to the answers of Alacrius' Riddles.";
+ next;
+ mes "For those who don't get astray,";
+ mes "Five sealed gates block the way,";
+ mes "to Terogan's vault of foul play.";
+ mes "";
+ mes "A cite on their left or right";
+ mes "holds the key to the abysmal rite,";
+ mes "that opens the path to an unspeakable site.";
+ mes "Do you know which candles to light?";
+ close;
+
+L_Empty:
+ mes "The book pages are blank!";
+ close;
+}
+
+027-4,108,87,0 script #AlacriusClue4 NPC400,{
+ if (!#CRYPT_PASSWORD)
+ goto L_Empty;
+ mes "For those whom search to the answers of Alacrius' Riddles.";
+ next;
+ mes "I have nothing to say,";
+ mes "But this room has no key.";
+ mes "";
+ mes "Brute force will not get you in,";
+ mes "And you don't have to, to the riddle solve.";
+ mes "";
+ mes "But three books shall give you answers,";
+ mes "Can you find all of them?";
+ close;
+
+L_Empty:
+ mes "The book pages are blank!";
+ close;
+}
+
diff --git a/npc/027-2/caretaker.txt b/npc/027-2/caretaker.txt
new file mode 100644
index 00000000..3b66c75b
--- /dev/null
+++ b/npc/027-2/caretaker.txt
@@ -0,0 +1,112 @@
+
+027-2,44,25,0 script Caretaker NPC159,{
+ @halloween_npc_id = $@halloween_npc_caretaker;
+ callfunc "TrickOrTreat";
+
+ if (QUEST_Graveyard_Caretaker == 1) goto L_Return_Dialog;
+ if (QUEST_Graveyard_Caretaker == 2) goto L_Has_Letter;
+ if (QUEST_Graveyard_Caretaker == 3) goto L_Delivered_Letter;
+ if (QUEST_Graveyard_Caretaker == 4) goto L_Give_New_Letter;
+ if (QUEST_Graveyard_Caretaker == 5) goto L_Has_Letter;
+
+ mes "[Caretaker]";
+ mes "\"...another adventurer comes to slay the already dead.\"";
+ next;
+ menu
+ "And what are you?", L_Who,
+ "That's right, so move and let me kill that demon behind you.", L_close;
+
+L_Who:
+ mes "[Caretaker]";
+ mes "\"I was once the caretaker of these cemetery grounds, but look at what they have become.";
+ mes "Now, I care only for my wife. I watch over her... make sure that nobody ever does her harm.\"";
+ next;
+ menu
+ "You guard her corpse day and night?", L_WatchCorpse;
+
+L_WatchCorpse:
+ mes "[Caretaker]";
+ mes "\"I am bound to this wretched place by the very same spell that was cast to keep the undead from leaving. Until the day that this cemetery is free from its curse, I shall remain within these gates.\"";
+ QUEST_Graveyard_Caretaker = 1;
+ close;
+
+L_Return_Dialog:
+ mes "[Caretaker]";
+ mes "\"I am somewhat fortunate that adventurers like yourself frequent this place... despite your intentions.";
+ mes "Perhaps you can do me a favor?\"";
+ next;
+ menu
+ "What's the favor?", L_Favor,
+ "I'm sure I can, for a price.", L_Favor,
+ "Sorry, I am busy.", L_close;
+
+L_Favor:
+ mes "[Caretaker]";
+ mes "\"I have not seen my daughter since I was cursed to stay in this cemetery, twenty-five years ago.";
+ mes "We communicate through letters, now. Would you please take this to her?";
+ mes "I am sure she will compensate you for your trouble.\"";
+ next;
+ menu
+ "I will take it to her.", L_Receive,
+ "I will help you. Where can I find your daughter?", L_Receive,
+ "Sorry, but I am too busy.", L_close;
+
+L_Receive:
+ QUEST_Graveyard_Caretaker = 2;
+ mes "You receive the letter and put it in a special place so it doesn't get lost in your inventory.";
+ next;
+ if (@menu != 2)
+ close;
+ goto L_Location;
+
+L_Location:
+ mes "[Caretaker]";
+ mes "\"Her name is Airlia. She works at the town hall in Hurnscald. Thank you for your help.\"";
+ close;
+
+L_Has_Letter:
+ mes "[Caretaker]";
+ mes "\"Have you found my daughter?\"";
+ next;
+ menu
+ "Not yet.", L_close,
+ "I'll get there when I get there.", L_close,
+ "Where did you say I could find her?", L_Location;
+
+L_Delivered_Letter:
+ mes "[Caretaker]";
+ mes "\"Have you found my daughter?\"";
+ next;
+ menu
+ "Yes.", L_Next;
+
+L_Next:
+ mes "[Caretaker]";
+ mes "\"Thank you for delivering my letter.\"";
+ QUEST_Graveyard_Caretaker = 4;
+ close;
+
+L_Give_New_Letter:
+ mes "[Caretaker]";
+ mes "\"I have another letter, if you want to deliver it.\"";
+ next;
+ menu
+ "Sure.", L_Give_New_Letter_Real,
+ "I'm too busy right now.", L_close;
+
+L_Give_New_Letter_Real:
+ QUEST_Graveyard_Caretaker = 5;
+ mes "You receive the letter and put it in a special place so it doesn't get lost in your inventory.";
+ next;
+ mes "[Caretaker]";
+ mes "\"Thank you.\"";
+ close;
+
+L_close:
+ close;
+}
+027-2,48,22,0 script Joan NPC409,{
+ mes "[Joan]";
+ mes "...";
+ close;
+}
diff --git a/npc/027-2/mapflags.txt b/npc/027-2/mapflags.txt
new file mode 100644
index 00000000..e00a04ce
--- /dev/null
+++ b/npc/027-2/mapflags.txt
@@ -0,0 +1,2 @@
+//027-2 mapflag resave 026-1,28,35
+//026-2 mapflag town
diff --git a/npc/027-2/thurston.txt b/npc/027-2/thurston.txt
new file mode 100644
index 00000000..e9a1044a
--- /dev/null
+++ b/npc/027-2/thurston.txt
@@ -0,0 +1,21 @@
+
+027-2,23,105,0 script Thurston NPC302,{
+ @dq_level = 60;
+ @dq_cost = 45;
+ @dq_count = 20;
+ @dq_name$ = "VampireBatWing";
+ @dq_friendly_name$ = "Vampire Bat Wing";
+ @dq_money = 4000;
+ @dq_exp = 1000;
+
+ callfunc "DailyQuest";
+
+ @dq_level = 0;
+ @dq_cost = 0;
+ @dq_count = 0;
+ @dq_name$ = "";
+ @dq_friendly_name$ = "";
+ @dq_money = 0;
+ @dq_exp = 0;
+ close;
+}
diff --git a/npc/027-3/_import.txt b/npc/027-3/_import.txt
new file mode 100644
index 00000000..e371d4d9
--- /dev/null
+++ b/npc/027-3/_import.txt
@@ -0,0 +1,8 @@
+// Map 027-3: Crypt Basement
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/027-3/_mobs.txt",
+"npc/027-3/_warps.txt",
+"npc/027-3/casket_traps.txt",
+"npc/027-3/general_krukan_door.txt",
+"npc/027-3/mapflags.txt",
+"npc/027-3/monsters.txt",
diff --git a/npc/027-3/_mobs.txt b/npc/027-3/_mobs.txt
new file mode 100644
index 00000000..28a14171
--- /dev/null
+++ b/npc/027-3/_mobs.txt
@@ -0,0 +1,10 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 027-3: Crypt Basement mobs
+027-3,44,63,14,34 monster Skeleton 1043,6,60000,8000
+027-3,107,43,29,15 monster Skeleton 1043,6,60000,8000
+027-3,44,63,14,34 monster Lady Skeleton 1044,4,60000,8000
+027-3,123,78,14,13 monster Lady Skeleton 1044,4,60000,8000
+027-3,123,78,13,13 monster Skeleton 1043,4,60000,8000
+027-3,91,87,14,11 monster Vampire Bat 1066,15,100000,30000
+027-3,84,45,53,16 monster Poison Skull 1024,1,60000,20000
+027-3,108,84,30,7 monster Fire Skull 1023,2,60000,20000
diff --git a/npc/027-3/_warps.txt b/npc/027-3/_warps.txt
new file mode 100644
index 00000000..0b22820e
--- /dev/null
+++ b/npc/027-3/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 027-3: Crypt Basement warps
+027-3,36,67,0 warp #027-3_36_67 3,0,027-2,36,77
+027-3,137,99,0 warp #027-3_137_99 3,0,027-4,125,18
diff --git a/npc/027-3/casket_traps.txt b/npc/027-3/casket_traps.txt
new file mode 100644
index 00000000..206258ba
--- /dev/null
+++ b/npc/027-3/casket_traps.txt
@@ -0,0 +1,72 @@
+027-3,42,96,0 script #casket1 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-3,48,86,0 script #casket2 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-3,56,76,0 script #casket3 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-3,48,57,0 script #casket4 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-3,32,44,0 script #casket5 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-3,58,43,0 script #casket6 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-3,96,30,0 script #casket7 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-3,118,45,0 script #casket8 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
diff --git a/npc/027-3/general_krukan_door.txt b/npc/027-3/general_krukan_door.txt
new file mode 100644
index 00000000..77eab35a
--- /dev/null
+++ b/npc/027-3/general_krukan_door.txt
@@ -0,0 +1,15 @@
+
+027-3,92,88,0 script #GeneralDoor1 NPC45,1,0,{
+ if ( $@CRYPT_FIGHT1 != 0 )
+ goto L_NoKeys;
+
+ warp "027-6",39,60;
+ goto L_close;
+
+L_NoKeys:
+ message strcharinfo(0), "This door is locked.";
+ end;
+
+L_close:
+ close;
+}
diff --git a/npc/027-3/mapflags.txt b/npc/027-3/mapflags.txt
new file mode 100644
index 00000000..5006a523
--- /dev/null
+++ b/npc/027-3/mapflags.txt
@@ -0,0 +1 @@
+//027-3 mapflag resave 027-2,105,94
diff --git a/npc/027-3/monsters.txt b/npc/027-3/monsters.txt
new file mode 100644
index 00000000..d7f3ae5c
--- /dev/null
+++ b/npc/027-3/monsters.txt
@@ -0,0 +1,66 @@
+
+027-3,21,76,51,100 monster Zombie 1036,2,300000,120000,specialMob027-3::On1036
+027-3,21,30,51,63 monster Zombie 1036,2,200000,10000,specialMob027-3::On1036
+027-3,67,29,129,64 monster Zombie 1036,3,140000,30000,specialMob027-3::On1036
+027-3,101,65,128,93 monster Fallen 1045,3,120000,30000,specialMob027-3::On1045
+
+027-3,0,0,0 script specialMob027-3 NPC32767,{
+ end;
+
+On1036:
+ @mobId = 1036;
+ callsub S_MOBCOUNT_ZOMBIES;
+ fix_mobkill(1036);
+ end;
+
+On1045:
+ @mobId = 1045;
+ callsub S_MOBCOUNT_FALLENS;
+ fix_mobkill(1045);
+ end;
+
+S_MOBCOUNT_ZOMBIES:
+
+ @Graveyard_Inn_MASK = NIBBLE_2_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_2_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ if (@state != 1)
+ goto L_Return;
+ @ring = @ring + 1;
+ if (@ring < 10)
+ goto L_Return;
+ if (rand(8) != 0)
+ goto L_Return;
+ message strcharinfo(0), "You found a ring hidden in the zombie's rotten rags. Maybe this is what Aldred was looking for...";
+ @state = 2;
+ callsub S_Update_Mask;
+ return;
+
+S_MOBCOUNT_FALLENS:
+
+ @Graveyard_Inn_MASK = NIBBLE_2_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_2_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ if (@state != 1)
+ goto L_Return;
+ @ring = @ring + 1;
+ if (@ring < 10)
+ goto L_Return;
+ if (rand(8) != 0)
+ goto L_Return;
+ message strcharinfo(0), "You found a ring inside the fallen's broken helmet. Maybe this is what Aldred was looking for...";
+ @state = 2;
+ callsub S_Update_Mask;
+ return;
+
+L_Return:
+ return;
+
+S_Update_Mask:
+ QUEST_Graveyard_Inn = (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_MASK)) | (@state << @Graveyard_Inn_SHIFT);
+ return;
+}
diff --git a/npc/027-4/_import.txt b/npc/027-4/_import.txt
new file mode 100644
index 00000000..2925d133
--- /dev/null
+++ b/npc/027-4/_import.txt
@@ -0,0 +1,8 @@
+// Map 027-4: Crypt Sub-Basement One
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/027-4/_mobs.txt",
+"npc/027-4/_warps.txt",
+"npc/027-4/casket_traps.txt",
+"npc/027-4/general_razha_door.txt",
+"npc/027-4/mapflags.txt",
+"npc/027-4/monsters.txt",
diff --git a/npc/027-4/_mobs.txt b/npc/027-4/_mobs.txt
new file mode 100644
index 00000000..67b755e5
--- /dev/null
+++ b/npc/027-4/_mobs.txt
@@ -0,0 +1,7 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 027-4: Crypt Sub-Basement One mobs
+027-4,39,84,19,11 monster Skeleton 1043,2,60000,8000
+027-4,27,57,7,11 monster Lady Skeleton 1044,2,60000,8000
+027-4,108,77,19,7 monster Skeleton 1043,2,60000,8000
+027-4,61,37,19,15 monster Lady Skeleton 1044,2,60000,8000
+027-4,101,36,19,15 monster Lady Skeleton 1044,2,60000,8000
diff --git a/npc/027-4/_warps.txt b/npc/027-4/_warps.txt
new file mode 100644
index 00000000..558ca8d3
--- /dev/null
+++ b/npc/027-4/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 027-4: Crypt Sub-Basement One warps
+027-4,126,17,0 warp #027-4_126_17 5,0,027-3,136,97
+027-4,22,98,0 warp #027-4_22_98 3,0,027-5,124,18
diff --git a/npc/027-4/casket_traps.txt b/npc/027-4/casket_traps.txt
new file mode 100644
index 00000000..456d4543
--- /dev/null
+++ b/npc/027-4/casket_traps.txt
@@ -0,0 +1,72 @@
+027-4,60,23,0 script #casket9 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-4,43,23,0 script #casket10 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-4,42,47,0 script #casket11 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-4,90,47,0 script #casket12 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-4,101,48,0 script #casket13 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-4,115,17,0 script #casket14 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-4,99,76,0 script #casket15 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-4,22,23,0 script #casket16 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
diff --git a/npc/027-4/general_razha_door.txt b/npc/027-4/general_razha_door.txt
new file mode 100644
index 00000000..4e06b93b
--- /dev/null
+++ b/npc/027-4/general_razha_door.txt
@@ -0,0 +1,15 @@
+
+027-4,73,76,0 script #GeneralDoor2 NPC45,1,0,{
+ if ( $@CRYPT_FIGHT2 != 0 )
+ goto L_NoKeys;
+
+ warp "027-7",39,60;
+ goto L_close;
+
+L_NoKeys:
+ message strcharinfo(0), "This door is locked.";
+ end;
+
+L_close:
+ close;
+}
diff --git a/npc/027-4/mapflags.txt b/npc/027-4/mapflags.txt
new file mode 100644
index 00000000..2770bdd5
--- /dev/null
+++ b/npc/027-4/mapflags.txt
@@ -0,0 +1 @@
+//027-4 mapflag resave 027-2,105,94
diff --git a/npc/027-4/monsters.txt b/npc/027-4/monsters.txt
new file mode 100644
index 00000000..34fce902
--- /dev/null
+++ b/npc/027-4/monsters.txt
@@ -0,0 +1,67 @@
+
+027-4,39,84,38,22 monster Fallen 1045,3,60000,8000,specialMob027-4::On1045
+027-4,27,57,15,22 monster Zombie 1036,2,60000,8000,specialMob027-4::On1036
+027-4,108,77,39,14 monster Fallen 1045,3,60000,8000,specialMob027-4::On1045
+027-4,61,37,38,30 monster Zombie 1036,2,60000,8000,specialMob027-4::On1036
+027-4,101,36,38,30 monster Zombie 1036,2,60000,8000,specialMob027-4::On1036
+
+027-4,0,0,0 script specialMob027-4 NPC32767,{
+ end;
+
+On1036:
+ @mobId = 1036;
+ callsub S_MOBCOUNT_ZOMBIES;
+ fix_mobkill(1036);
+ end;
+
+On1045:
+ @mobId = 1045;
+ callsub S_MOBCOUNT_FALLENS;
+ fix_mobkill(1045);
+ end;
+
+S_MOBCOUNT_ZOMBIES:
+
+ @Graveyard_Inn_MASK = NIBBLE_2_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_2_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ if (@state != 1)
+ goto L_Return;
+ @ring = @ring + 1;
+ if (@ring < 10)
+ goto L_Return;
+ if (rand(8) != 0)
+ goto L_Return;
+ message strcharinfo(0), "You found a ring hidden in the zombie's rotten rags. Maybe this is what Aldred was looking for...";
+ @state = 2;
+ callsub S_Update_Mask;
+ return;
+
+S_MOBCOUNT_FALLENS:
+
+ @Graveyard_Inn_MASK = NIBBLE_2_MASK;
+ @Graveyard_Inn_SHIFT = NIBBLE_2_SHIFT;
+
+ @state = ((QUEST_Graveyard_Inn & @Graveyard_Inn_MASK) >> @Graveyard_Inn_SHIFT);
+
+ if (@state != 1)
+ goto L_Return;
+ @ring = @ring + 1;
+ if (@ring < 10)
+ goto L_Return;
+ if (rand(8) != 0)
+ goto L_Return;
+ message strcharinfo(0), "You found a ring inside the fallen's broken helmet. Maybe this is what Aldred was looking for...";
+ @state = 2;
+ callsub S_Update_Mask;
+ return;
+
+L_Return:
+ return;
+
+S_Update_Mask:
+ QUEST_Graveyard_Inn = (QUEST_Graveyard_Inn & ~(@Graveyard_Inn_MASK)) | (@state << @Graveyard_Inn_SHIFT);
+ return;
+}
diff --git a/npc/027-5/_import.txt b/npc/027-5/_import.txt
new file mode 100644
index 00000000..1947550a
--- /dev/null
+++ b/npc/027-5/_import.txt
@@ -0,0 +1,7 @@
+// Map 027-5: Crypt Sub-Basement Two
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/027-5/_mobs.txt",
+"npc/027-5/_warps.txt",
+"npc/027-5/casket_traps.txt",
+"npc/027-5/general_terogan_door.txt",
+"npc/027-5/mapflags.txt",
diff --git a/npc/027-5/_mobs.txt b/npc/027-5/_mobs.txt
new file mode 100644
index 00000000..27674997
--- /dev/null
+++ b/npc/027-5/_mobs.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 027-5: Crypt Sub-Basement Two mobs
+027-5,69,42,48,20 monster Wight 1124,6,60000,8000
+027-5,69,56,48,34 monster Vampire Bat 1066,30,100000,30000
+027-5,69,42,49,20 monster Skeleton 1043,8,60000,8000
+027-5,69,41,49,19 monster Lady Skeleton 1044,8,60000,8000
+027-5,68,42,48,20 monster Red Bone 1074,6,60000,8000
+027-5,70,80,49,17 monster Skeleton 1043,8,60000,8000
+027-5,69,80,49,18 monster Lady Skeleton 1044,8,60000,8000
diff --git a/npc/027-5/_warps.txt b/npc/027-5/_warps.txt
new file mode 100644
index 00000000..c10c0a34
--- /dev/null
+++ b/npc/027-5/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 027-5: Crypt Sub-Basement Two warps
+027-5,125,17,0 warp #027-5_125_17 4,0,027-4,21,97
diff --git a/npc/027-5/casket_traps.txt b/npc/027-5/casket_traps.txt
new file mode 100644
index 00000000..d13de553
--- /dev/null
+++ b/npc/027-5/casket_traps.txt
@@ -0,0 +1,72 @@
+027-5,60,34,0 script #casket17 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-5,34,50,0 script #casket18 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-5,49,76,0 script #casket19 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-5,60,89,0 script #casket20 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-5,90,90,0 script #casket21 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-5,92,76,0 script #casket22 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-5,117,61,0 script #casket23 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-5,94,48,0 script #casket24 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
diff --git a/npc/027-5/general_terogan_door.txt b/npc/027-5/general_terogan_door.txt
new file mode 100644
index 00000000..19a564b5
--- /dev/null
+++ b/npc/027-5/general_terogan_door.txt
@@ -0,0 +1,15 @@
+
+027-5,70,25,0 script #GeneralDoor3 NPC45,1,0,{
+ if ( $@CRYPT_FIGHT3 != 0 )
+ goto L_NoKeys;
+
+ warp "027-8",39,60;
+ goto L_close;
+
+L_NoKeys:
+ message strcharinfo(0), "This door is locked.";
+ end;
+
+L_close:
+ close;
+}
diff --git a/npc/027-5/mapflags.txt b/npc/027-5/mapflags.txt
new file mode 100644
index 00000000..d502e210
--- /dev/null
+++ b/npc/027-5/mapflags.txt
@@ -0,0 +1 @@
+//027-5 mapflag resave 027-2,105,94
diff --git a/npc/027-6/_import.txt b/npc/027-6/_import.txt
new file mode 100644
index 00000000..52ff4270
--- /dev/null
+++ b/npc/027-6/_import.txt
@@ -0,0 +1,6 @@
+// Map 027-6: Crypt Sub-Basement Two
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/027-6/casket_traps.txt",
+"npc/027-6/general_krukan.txt",
+"npc/027-6/general_krukan_exitdoor.txt",
+"npc/027-6/mapflags.txt",
diff --git a/npc/027-6/casket_traps.txt b/npc/027-6/casket_traps.txt
new file mode 100644
index 00000000..a4d71e69
--- /dev/null
+++ b/npc/027-6/casket_traps.txt
@@ -0,0 +1,63 @@
+027-6,32,39,0 script #casket25 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-6,27,48,0 script #casket26 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-6,52,50,0 script #casket27 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-6,45,48,0 script #casket28 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-6,47,30,0 script #casket29 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-6,33,31,0 script #casket30 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
+027-6,52,40,0 script #casket31 NPC127,1,1,{
+ end;
+
+OnTouch:
+ heal ((MaxHp/100) * -10), 0;
+ specialeffect 301;
+ specialeffect 302;
+ end;
+}
diff --git a/npc/027-6/general_krukan.txt b/npc/027-6/general_krukan.txt
new file mode 100644
index 00000000..1116ea67
--- /dev/null
+++ b/npc/027-6/general_krukan.txt
@@ -0,0 +1,225 @@
+
+027-6,39,25,0 script General Krukan NPC400,{
+ if ($@CRYPT_FIGHT1 != 0)
+ end;
+
+ @KRUKAN_SOUL_REQ = 1;
+ @KRUKAN_SKULL_REQ = 5;
+ @KRUKAN_DARK_CRYSTAL_REQ = 5;
+ @KRUKAN_BONE_REQ = 5;
+ @minLevel = 60;
+
+ mes "[Tome]";
+ mes "The Tome is open to a page about a summon ritual that can be performed in this chamber.";
+ next;
+ goto L_TomeMain;
+
+L_TomeMain:
+ mes "What do you want to do?";
+ menu
+ "Read reagent List.", L_SummonReagents,
+ "Perform Ritual.", L_Ritual,
+ "Nothing.", L_close;
+
+L_SummonReagents:
+ mes "Says we need " + @KRUKAN_SOUL_REQ + " Soul, " + @KRUKAN_SKULL_REQ + " Skulls, " + @KRUKAN_DARK_CRYSTAL_REQ + " Dark Crystals, and " + @KRUKAN_BONE_REQ + " Bones to perform the ritual.";
+ next;
+ goto L_TomeMain;
+
+L_MissingReagents:
+ mes "It appears we are missing something, lets check the reagent list again.";
+ next;
+ goto L_SummonReagents;
+
+L_Ritual:
+ if (BaseLevel < @minLevel)
+ goto L_ToWeak;
+ if ( (countitem("Soul") < @KRUKAN_SOUL_REQ)
+ || (countitem("Skull") < @KRUKAN_SKULL_REQ)
+ || (countitem("DarkCrystal") < @KRUKAN_DARK_CRYSTAL_REQ)
+ || (countitem("Bone") < @KRUKAN_BONE_REQ) )
+ goto L_MissingReagents;
+ delitem "Soul", @KRUKAN_SOUL_REQ;
+ delitem "Skull", @KRUKAN_SKULL_REQ;
+ delitem "DarkCrystal", @KRUKAN_DARK_CRYSTAL_REQ;
+ delitem "Bone", @KRUKAN_BONE_REQ;
+ mes "As you perform the ritual you can feel the energy amass.";
+ next;
+ mes "A cold shiver runs down your spine as you feel something manifesting out of the void.";
+ if ($@CRYPT_FIGHT1 != 0)
+ goto L_close;
+
+ // initialize fight
+ $@CRYPT_FIGHT1 = 1;
+ $@CRYPT_FIGHT1_WAVE = 0;
+ $@CRYPT_FIGHT1_SUMMONS_COUNT = 2;
+ $@CRYPT_FIGHT1_PLAYER_COUNT = getmapusers("027-6");
+ areamonster "027-6", 0, 0, 79, 84, "", 1043, 1, "General Krukan::OnPetDeath";
+ areamonster "027-6", 0, 0, 79, 84, "", 1044, 1, "General Krukan::OnPetDeath";
+
+ initnpctimer;
+ goto L_Announce;
+
+L_ToWeak:
+ mes "You try to perform the ritual but nothing happens. You don't seem experienced enough.";
+ goto L_close;
+
+L_close:
+ @bonus = 0;
+ @minLevel = 0;
+ @KRUKAN_SOUL_REQ = 0;
+ @KRUKAN_SKULL_REQ = 0;
+ @KRUKAN_DARK_CRYSTAL_REQ = 0;
+ @KRUKAN_BONE_REQ = 0;
+ close;
+
+OnTimer5000:
+ setnpctimer 0;
+ if ($@CRYPT_FIGHT1 != 0)
+ goto L_CryptLogic;
+ goto L_Return_1;
+
+L_Return_1:
+ $@CRYPT_FIGHT1_PLAYER_COUNT = 0;
+ areatimer 0, "027-6", 0, 0, 79, 84, 10, "General Krukan::OnTick";
+ end;
+
+L_CryptLogic:
+ $@CRYPT_FIGHT1_ROUND_PEN = $@CRYPT_FIGHT1_PLAYER_COUNT;
+ if ($@CRYPT_FIGHT1_ROUND_PEN > 60)
+ $@CRYPT_FIGHT1_ROUND_PEN = 60;
+ if ($@CRYPT_FIGHT1_PLAYER_COUNT <= 0)
+ goto L_CleanUpLosers;
+ set $@CRYPT_FIGHT1_SUMMONS_ROUND_TIMER, $@CRYPT_FIGHT1_SUMMONS_ROUND_TIMER + 5; // Advance 5 seconds
+ if (mobcount("027-6", "General Krukan::OnPetDeath") <= 0)
+ goto L_NextWave;
+ if ($@CRYPT_FIGHT1_SUMMONS_ROUND_TIMER + $@CRYPT_FIGHT1_ROUND_PEN >= 120)
+ goto L_NextWave;
+ goto L_Return_1;
+
+L_NextWave:
+ $@CRYPT_FIGHT1_SUMMONS_ROUND_TIMER = 0;
+ $@CRYPT_FIGHT1_WAVE = $@CRYPT_FIGHT1_WAVE + 1;
+ if ( ($@CRYPT_FIGHT1_WAVE > 10) && ($@CRYPT_FIGHT1_SUMMONS_COUNT == 0) )
+ goto L_CleanUp;
+ if ( ($@CRYPT_FIGHT1_WAVE > 10) && ($@CRYPT_FIGHT1_WAVE < 22) )
+ goto L_Return_1;
+ if ($@CRYPT_FIGHT1_WAVE > 22)
+ goto L_SummonNuke;
+ if ($@CRYPT_FIGHT1_WAVE < 5)
+ goto L_WeakSummons;
+ if ( ($@CRYPT_FIGHT1_WAVE < 10) && ($@CRYPT_FIGHT1_WAVE >= 5) )
+ goto L_StrongSummons;
+ if ($@CRYPT_FIGHT1_WAVE == 10)
+ goto L_BossSummons;
+ goto L_SummonNuke;
+
+L_SummonNuke:
+ $@CRYPT_FIGHT1_SUMMONS_COUNT = $@CRYPT_FIGHT1_SUMMONS_COUNT + $@CRYPT_FIGHT1_WAVE*2 + $@CRYPT_FIGHT1_PLAYER_COUNT*4;
+ areamonster "027-6", 0, 0, 79, 84, "", 1043, $@CRYPT_FIGHT1_WAVE*2 + $@CRYPT_FIGHT1_PLAYER_COUNT*4, "General Krukan::OnPetDeath";
+ goto L_Announce;
+
+L_WeakSummons:
+ $@CRYPT_FIGHT1_SUMMONS_NUMBER = (5 + (1 * $@CRYPT_FIGHT1_WAVE) + (2 * $@CRYPT_FIGHT1_PLAYER_COUNT))/2;
+ $@CRYPT_FIGHT1_SUMMONS_COUNT = $@CRYPT_FIGHT1_SUMMONS_COUNT + ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2) + ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2);
+
+ areamonster "027-6", 0, 0, 79, 84, "", 1043, ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2), "General Krukan::OnPetDeath";
+ areamonster "027-6", 0, 0, 79, 84, "", 1044, ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2), "General Krukan::OnPetDeath";
+ goto L_Announce;
+
+L_StrongSummons:
+ $@CRYPT_FIGHT1_SUMMONS_NUMBER = (5 + (1 * $@CRYPT_FIGHT1_WAVE) + (2 * $@CRYPT_FIGHT1_PLAYER_COUNT))/2;
+ $@CRYPT_FIGHT1_SUMMONS_COUNT = $@CRYPT_FIGHT1_SUMMONS_COUNT + ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2) + ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2);
+
+ areamonster "027-6", 0, 0, 79, 84, "", 1036, ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2), "General Krukan::OnPetDeath";
+ areamonster "027-6", 0, 0, 79, 84, "", 1045, ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2), "General Krukan::OnPetDeath";
+ goto L_Announce;
+
+L_BossSummons:
+ $@CRYPT_FIGHT1_SUMMONS_NUMBER = (5 + (1 * $@CRYPT_FIGHT1_WAVE) + (2 * $@CRYPT_FIGHT1_PLAYER_COUNT))/2;
+ $@CRYPT_FIGHT1_SUMMONS_COUNT = $@CRYPT_FIGHT1_SUMMONS_COUNT + ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2) + ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2);
+ areamonster "027-6", 0, 0, 79, 84, "", 1036, ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2), "General Krukan::OnPetDeath";
+ areamonster "027-6", 0, 0, 79, 84, "", 1045, ($@CRYPT_FIGHT1_SUMMONS_NUMBER/2), "General Krukan::OnPetDeath";
+ areamonster "027-6", 0, 0, 79, 84, "", 1127, 1, "General Krukan::OnPetDeath";
+ $@CRYPT_FIGHT1_SUMMONS_COUNT = $@CRYPT_FIGHT1_SUMMONS_COUNT + 1;
+ goto L_Announce;
+
+L_Announce:
+ $@msg$ = $@CRYPT_FIGHT1_MESSAGES$[$@CRYPT_FIGHT1_WAVE];
+ if ($@msg$ == "")
+ goto L_Return_1;
+ mapannounce "027-6", $@msg$, 0;
+ mapannounce "027-3", $@msg$, 0;
+ $@msg$ = "";
+ goto L_Return_1;
+
+OnTick:
+ if (ispcdead()) end;
+ $@CRYPT_FIGHT1_PLAYER_COUNT = $@CRYPT_FIGHT1_PLAYER_COUNT + 1;
+ end;
+
+OnPetDeath:
+ $@CRYPT_FIGHT1_SUMMONS_COUNT = $@CRYPT_FIGHT1_SUMMONS_COUNT - 1;
+ end;
+
+L_CleanUpLosers:
+ $@CRYPT_FIGHT1 = 0;
+ $@CRYPT_FIGHT1_PLAYER_COUNT = 0;
+ $@CRYPT_FIGHT1_WAVE = 0;
+ $@CRYPT_FIGHT1_SUMMONS_ROUND_TIMER = 0;
+ $@CRYPT_FIGHT1_SUMMONS_COUNT = 0;
+ $@CRYPT_FIGHT1_ROUND_PEN = 0;
+ $@CRYPT_FIGHT1_SUMMONS_NUMBER = 0;
+ killmonster "027-6", "General Krukan::OnPetDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+L_CleanUp:
+ areatimer 0, "027-6", 0, 0, 79, 84, 10, "General Krukan::OnReward";
+ $@CRYPT_FIGHT1 = 0;
+ $@CRYPT_FIGHT1_PLAYER_COUNT = 0;
+ $@CRYPT_FIGHT1_WAVE = 0;
+ $@CRYPT_FIGHT1_SUMMONS_ROUND_TIMER = 0;
+ $@CRYPT_FIGHT1_SUMMONS_COUNT = 0;
+ $@CRYPT_FIGHT1_ROUND_PEN = 0;
+ $@CRYPT_FIGHT1_SUMMONS_NUMBER = 0;
+ killmonster "027-6", "General Krukan::OnPetDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnReward:
+ if (ispcdead()) end;
+ @bonus = (BaseLevel/4);
+ DailyQuestBonus = DailyQuestBonus + @bonus;
+ message strcharinfo(0), "You feel a temporary rush of power and zest for action. " + @bonus + " daily bonus gained." ;
+ BOSS_POINTS = BOSS_POINTS + 25;
+ message strcharinfo(0), "You gain 25 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ goto L_End;
+
+L_End:
+ @bonus = 0;
+ @minLevel = 0;
+ @KRUKAN_SOUL_REQ = 0;
+ @KRUKAN_SKULL_REQ = 0;
+ @KRUKAN_DARK_CRYSTAL_REQ = 0;
+ @KRUKAN_BONE_REQ = 0;
+ end;
+
+OnInit:
+ setarray $@CRYPT_FIGHT1_MESSAGES$,
+ "General Krukan : Haha, Thank you mortal. You have released me from my prison. To show my gratitude you can die swiftly at my hands and become part of my undead army. MUhahahahaha! Minions, Dispose of these Adventurers!",
+ "General Krukan : Ha, Looks like you're tougher than I thought.",
+ "General Krukan : and here I thought I wasn't going to enjoy this.",
+ "General Krukan : More of them are coming!",
+ "General Krukan : Minions! Kill them already!",
+ "General Krukan : *facepalm* I knew I should have hired better help.",
+ "General Krukan : Well at least you will make a good addition to my army.",
+ "General Krukan : To the Abyss with you already!",
+ "General Krukan : How about you try a different approach and kill them already!",
+ "General Krukan : Minions! Last chance or it's back to being part of an ossuary for you!",
+ "General Krukan : Looks like if you want something done right you have to do it yourself.",
+ "General Krukan : Charge!";
+ end;
+}
diff --git a/npc/027-6/general_krukan_exitdoor.txt b/npc/027-6/general_krukan_exitdoor.txt
new file mode 100644
index 00000000..f9aa04b8
--- /dev/null
+++ b/npc/027-6/general_krukan_exitdoor.txt
@@ -0,0 +1,11 @@
+
+027-6,38,61,0 script #GeneralExit1 NPC45,6,0,{
+ if ($@CRYPT_FIGHT1 == 1)
+ goto L_Block;
+ warp "027-3",82,89;
+ end;
+
+L_Block:
+ message strcharinfo(0), "A force field seems to be blocking you from exiting.";
+ end;
+}
diff --git a/npc/027-6/mapflags.txt b/npc/027-6/mapflags.txt
new file mode 100644
index 00000000..71b31051
--- /dev/null
+++ b/npc/027-6/mapflags.txt
@@ -0,0 +1,2 @@
+027-6 mapflag nosave 027-3,82,90
+027-6 mapflag zone MMO
diff --git a/npc/027-7/_import.txt b/npc/027-7/_import.txt
new file mode 100644
index 00000000..b922cb29
--- /dev/null
+++ b/npc/027-7/_import.txt
@@ -0,0 +1,5 @@
+// Map 027-7: Crypt Sub-Basement Two
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/027-7/general_razha.txt",
+"npc/027-7/general_razha_exitdoor.txt",
+"npc/027-7/mapflags.txt",
diff --git a/npc/027-7/general_razha.txt b/npc/027-7/general_razha.txt
new file mode 100644
index 00000000..5eb32bc2
--- /dev/null
+++ b/npc/027-7/general_razha.txt
@@ -0,0 +1,229 @@
+
+027-7,39,25,0 script General Razha NPC400,{
+ if ($@CRYPT_FIGHT2 != 0)
+ end;
+
+ @RAZHA_SOUL_REQ = 3;
+ @RAZHA_DISEASED_HEARTS_REQ = 5;
+ @RAZHA_UNDEAD_EYE_REQ = 3;
+ @RAZHA_UNDEAD_EAR_REQ = 2;
+ @minLevel = 70;
+
+ mes "[Tome]";
+ mes "The Tome is open to a page about a summon ritual that can be performed in this chamber.";
+ next;
+ goto L_TomeMain;
+
+L_TomeMain:
+ mes "What do you want to do?";
+ menu
+ "Read reagent List.", L_SummonReagents,
+ "Perform Ritual.", L_Ritual,
+ "Nothing.", L_close;
+
+L_SummonReagents:
+ mes "Says we need " + @RAZHA_SOUL_REQ + " Souls, " + @RAZHA_DISEASED_HEARTS_REQ + " Diseased Hearts, " + @RAZHA_UNDEAD_EYE_REQ + " Undead Eyes, and " + @RAZHA_UNDEAD_EAR_REQ + " Undead Ears to perform the ritual.";
+ next;
+ goto L_TomeMain;
+
+L_MissingReagents:
+ mes "It appears we are missing something, lets check the reagent list again.";
+ next;
+ goto L_SummonReagents;
+
+L_Ritual:
+ if (BaseLevel < @minLevel)
+ goto L_ToWeak;
+ if ( (countitem("Soul") < @RAZHA_SOUL_REQ)
+ || (countitem("DiseasedHeart") < @RAZHA_DISEASED_HEARTS_REQ)
+ || (countitem("UndeadEye") < @RAZHA_UNDEAD_EYE_REQ)
+ || (countitem("UndeadEar") < @RAZHA_UNDEAD_EAR_REQ) )
+ goto L_MissingReagents;
+ delitem "Soul", @RAZHA_SOUL_REQ;
+ delitem "DiseasedHeart", @RAZHA_DISEASED_HEARTS_REQ;
+ delitem "UndeadEye", @RAZHA_UNDEAD_EYE_REQ;
+ delitem "UndeadEar", @RAZHA_UNDEAD_EAR_REQ;
+ mes "As you perform the ritual you can feel the energy amass.";
+ next;
+ mes "A cold shiver runs down your spine as you feel something manifesting out of the void.";
+ if ($@CRYPT_FIGHT2 != 0)
+ goto L_close;
+
+ // initialize fight
+ $@CRYPT_FIGHT2 = 1;
+ $@CRYPT_FIGHT2_WAVE = 0;
+ $@CRYPT_FIGHT2_SUMMONS_COUNT = 2;
+ $@CRYPT_FIGHT2_PLAYER_COUNT = getmapusers("027-7");
+ areamonster "027-7", 0, 0, 79, 84, "", 1036, 1, "General Razha::OnPetDeath";
+ areamonster "027-7", 0, 0, 79, 84, "", 1124, 1, "General Razha::OnPetDeath";
+
+ initnpctimer;
+ goto L_Announce;
+
+L_ToWeak:
+ mes "You try to perform the ritual but nothing happens. You don't seem experienced enough.";
+ goto L_close;
+
+L_close:
+ @bonus = 0;
+ @minLevel = 0;
+ @RAZHA_SOUL_REQ = 0;
+ @RAZHA_DISEASED_HEARTS_REQ = 0;
+ @RAZHA_UNDEAD_EYE_REQ = 0;
+ @RAZHA_UNDEAD_EAR_REQ = 0;
+ close;
+
+OnTimer5000:
+ setnpctimer 0;
+ if ($@CRYPT_FIGHT2 != 0)
+ goto L_CryptLogic;
+ goto L_Return_1;
+
+L_Return_1:
+ $@CRYPT_FIGHT2_PLAYER_COUNT = 0;
+ areatimer 0, "027-7", 0, 0, 79, 84, 10, "General Razha::OnTick";
+ end;
+
+L_CryptLogic:
+ $@CRYPT_FIGHT2_ROUND_PEN = $@CRYPT_FIGHT2_PLAYER_COUNT;
+ if ($@CRYPT_FIGHT2_ROUND_PEN > 60)
+ $@CRYPT_FIGHT2_ROUND_PEN = 60;
+ if ($@CRYPT_FIGHT2_PLAYER_COUNT <= 0)
+ goto L_CleanUpLosers;
+ set $@CRYPT_FIGHT2_SUMMONS_ROUND_TIMER, $@CRYPT_FIGHT2_SUMMONS_ROUND_TIMER + 5; // Advance 5 seconds
+ if (mobcount("027-7", "General Razha::OnPetDeath") <= 0)
+ goto L_NextWave;
+ if ($@CRYPT_FIGHT2_SUMMONS_ROUND_TIMER + $@CRYPT_FIGHT2_ROUND_PEN >= 120)
+ goto L_NextWave;
+ goto L_Return_1;
+
+L_NextWave:
+ $@CRYPT_FIGHT2_SUMMONS_ROUND_TIMER = 0;
+ $@CRYPT_FIGHT2_WAVE = $@CRYPT_FIGHT2_WAVE + 1;
+ if ( ($@CRYPT_FIGHT2_WAVE > 10) && ($@CRYPT_FIGHT2_SUMMONS_COUNT == 0) )
+ goto L_CleanUp;
+ if ( ($@CRYPT_FIGHT2_WAVE > 10) && ($@CRYPT_FIGHT2_WAVE < 22) )
+ goto L_Return_1;
+ if ($@CRYPT_FIGHT2_WAVE > 22)
+ goto L_SummonNuke;
+ if ($@CRYPT_FIGHT2_WAVE < 5)
+ goto L_WeakSummons;
+ if ( ($@CRYPT_FIGHT2_WAVE < 10) && ($@CRYPT_FIGHT2_WAVE >= 5) )
+ goto L_StrongSummons;
+ if ($@CRYPT_FIGHT2_WAVE == 10)
+ goto L_BossSummons;
+ goto L_SummonNuke;
+
+L_SummonNuke:
+ $@CRYPT_FIGHT2_SUMMONS_COUNT = $@CRYPT_FIGHT2_SUMMONS_COUNT + $@CRYPT_FIGHT2_WAVE*2 + $@CRYPT_FIGHT2_PLAYER_COUNT*4;
+ areamonster "027-7", 0, 0, 79, 84, "", 1036, $@CRYPT_FIGHT2_WAVE*2 + $@CRYPT_FIGHT2_PLAYER_COUNT*4, "General Razha::OnPetDeath";
+ goto L_Announce;
+
+L_WeakSummons:
+ $@CRYPT_FIGHT2_SUMMONS_NUMBER = (5 + (1 * $@CRYPT_FIGHT2_WAVE) + (2 * $@CRYPT_FIGHT2_PLAYER_COUNT))/2;
+ $@CRYPT_FIGHT2_SUMMONS_COUNT = $@CRYPT_FIGHT2_SUMMONS_COUNT + ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2) + ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2);
+
+ areamonster "027-7", 0, 0, 79, 84, "", 1036, ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2), "General Razha::OnPetDeath";
+ areamonster "027-7", 0, 0, 79, 84, "", 1045, ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2), "General Razha::OnPetDeath";
+ goto L_Announce;
+
+L_StrongSummons:
+ $@CRYPT_FIGHT2_SUMMONS_NUMBER = (5 + (1 * $@CRYPT_FIGHT2_WAVE) + (2 * $@CRYPT_FIGHT2_PLAYER_COUNT))/2;
+ $@CRYPT_FIGHT2_SUMMONS_COUNT = $@CRYPT_FIGHT2_SUMMONS_COUNT + ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2) + ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2);
+
+ areamonster "027-7", 0, 0, 79, 84, "", 1036, ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2), "General Razha::OnPetDeath";
+ areamonster "027-7", 0, 0, 79, 84, "", 1124, ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2), "General Razha::OnPetDeath";
+ goto L_Announce;
+
+L_BossSummons:
+ $@CRYPT_FIGHT2_SUMMONS_NUMBER = (5 + (1 * $@CRYPT_FIGHT2_WAVE) + (2 * $@CRYPT_FIGHT2_PLAYER_COUNT))/2;
+ $@CRYPT_FIGHT2_SUMMONS_COUNT = $@CRYPT_FIGHT2_SUMMONS_COUNT + ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2) + ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2);
+ areamonster "027-7", 0, 0, 79, 84, "", 1036, ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2), "General Razha::OnPetDeath";
+ areamonster "027-7", 0, 0, 79, 84, "", 1124, ($@CRYPT_FIGHT2_SUMMONS_NUMBER/2), "General Razha::OnPetDeath";
+ areamonster "027-7", 0, 0, 79, 84, "", 1128, 1, "General Razha::OnPetDeath";
+ $@CRYPT_FIGHT2_SUMMONS_COUNT = $@CRYPT_FIGHT2_SUMMONS_COUNT + 1;
+ goto L_Announce;
+
+L_Announce:
+ $@msg$ = $@CRYPT_FIGHT2_MESSAGES$[$@CRYPT_FIGHT2_WAVE];
+ if ($@msg$ == "")
+ goto L_Return_1;
+ mapannounce "027-7", $@msg$, 0;
+ mapannounce "027-4", $@msg$, 0;
+ $@msg$ = "";
+ goto L_Return_1;
+
+OnTick:
+ if (ispcdead()) end;
+ $@CRYPT_FIGHT2_PLAYER_COUNT = $@CRYPT_FIGHT2_PLAYER_COUNT + 1;
+ end;
+
+OnPetDeath:
+ $@CRYPT_FIGHT2_SUMMONS_COUNT = $@CRYPT_FIGHT2_SUMMONS_COUNT - 1;
+ end;
+
+L_CleanUpLosers:
+ mapannounce "027-7", "General Razha : Oh where did you all go, I was beginning to have fun here.", 0;
+ mapannounce "027-4", "The battle is lost.", 0;
+ $@CRYPT_FIGHT2 = 0;
+ $@CRYPT_FIGHT2_PLAYER_COUNT = 0;
+ $@CRYPT_FIGHT2_WAVE = 0;
+ $@CRYPT_FIGHT2_SUMMONS_ROUND_TIMER = 0;
+ $@CRYPT_FIGHT2_SUMMONS_COUNT = 0;
+ $@CRYPT_FIGHT2_ROUND_PEN = 0;
+ $@CRYPT_FIGHT2_SUMMONS_NUMBER = 0;
+ killmonster "027-7", "General Razha::OnPetDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+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 0, "027-7", 0, 0, 79, 84, 10, "General Razha::OnReward";
+ $@CRYPT_FIGHT2 = 0;
+ $@CRYPT_FIGHT2_PLAYER_COUNT = 0;
+ $@CRYPT_FIGHT2_WAVE = 0;
+ $@CRYPT_FIGHT2_SUMMONS_ROUND_TIMER = 0;
+ $@CRYPT_FIGHT2_SUMMONS_COUNT = 0;
+ $@CRYPT_FIGHT2_ROUND_PEN = 0;
+ $@CRYPT_FIGHT2_SUMMONS_NUMBER = 0;
+ killmonster "027-7", "General Razha::OnPetDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnReward:
+ if (ispcdead()) end;
+ @bonus = (BaseLevel/2);
+ DailyQuestBonus = DailyQuestBonus + @bonus;
+ message strcharinfo(0), "You feel a temporary rush of power and zest for action. " + @bonus + " daily bonus gained." ;
+ BOSS_POINTS = BOSS_POINTS + 50;
+ message strcharinfo(0), "You gain 50 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ goto L_End;
+
+L_End:
+ @bonus = 0;
+ @minLevel = 0;
+ @RAZHA_SOUL_REQ = 0;
+ @RAZHA_DISEASED_HEARTS_REQ = 0;
+ @RAZHA_UNDEAD_EYE_REQ = 0;
+ @RAZHA_UNDEAD_EAR_REQ = 0;
+ end;
+
+OnInit:
+ setarray $@CRYPT_FIGHT2_MESSAGES$,
+ "General Razha : Haha, Thank you mortal. You have released me from my prison. To show my graditude you can die swiftly at my hands and become part of my undead army. MUhahahahaha! Minions, Dispose of these Adventurers!",
+ "General Razha : Ha, Looks like your tougher then I thought.",
+ "General Razha : and here I thought I wasn't going to enjoy this.",
+ "General Razha : More of them are coming!",
+ "General Razha : Minions! Kill them already!",
+ "General Razha : *facepalm* I knew I should have hired better help.",
+ "General Razha : Well at least you will make a good addition to my army.",
+ "General Razha : To the Abyss with you already!",
+ "General Razha : How about you try a different approach and kill them already!",
+ "General Razha : Minions! Last chance or it's back to being part of an ossuary for you!",
+ "General Razha : Looks like if you want something done right you have to do it yourself.",
+ "General Razha : Charge!.";
+ end;
+}
diff --git a/npc/027-7/general_razha_exitdoor.txt b/npc/027-7/general_razha_exitdoor.txt
new file mode 100644
index 00000000..0487177f
--- /dev/null
+++ b/npc/027-7/general_razha_exitdoor.txt
@@ -0,0 +1,11 @@
+
+027-7,36,61,0 script #GeneralExit2 NPC45,6,0,{
+ if ($@CRYPT_FIGHT2 != 0)
+ goto L_Block;
+ warp "027-4",73,77;
+ end;
+
+L_Block:
+ message strcharinfo(0), "A force field seems to be blocking you from exiting.";
+ end;
+}
diff --git a/npc/027-7/mapflags.txt b/npc/027-7/mapflags.txt
new file mode 100644
index 00000000..5a798c1c
--- /dev/null
+++ b/npc/027-7/mapflags.txt
@@ -0,0 +1,2 @@
+027-7 mapflag nosave 027-4,73,78
+027-7 mapflag zone MMO
diff --git a/npc/027-8/_import.txt b/npc/027-8/_import.txt
new file mode 100644
index 00000000..a22c49df
--- /dev/null
+++ b/npc/027-8/_import.txt
@@ -0,0 +1,5 @@
+// Map 027-8: Crypt Sub-Basement Two
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/027-8/general_terogan.txt",
+"npc/027-8/general_terogan_exitdoor.txt",
+"npc/027-8/mapflags.txt",
diff --git a/npc/027-8/general_terogan.txt b/npc/027-8/general_terogan.txt
new file mode 100644
index 00000000..1038e4fe
--- /dev/null
+++ b/npc/027-8/general_terogan.txt
@@ -0,0 +1,315 @@
+
+027-8,39,24,0 script General Terogan#Main NPC400,{
+ if ($@CRYPT_FIGHT3 != 0)
+ end;
+
+ @TEROGAN_SOUL_REQ = 5;
+ @TEROGAN_ROTTEN_RAGS_REQ = 5;
+ @TEROGAN_UNDEAD_EYE_REQ = 3;
+ @TEROGAN_UNDEAD_EAR_REQ = 2;
+ @minLevel = 80;
+
+ mes "[Tome]";
+ mes "The Tome is open to a page about a summon ritual that can be performed in this chamber.";
+ next;
+ goto L_TomeMain;
+
+L_TomeMain:
+ mes "What do you want to do?";
+ menu
+ "Read reagent List.", L_SummonReagents,
+ "Assign myself left.", L_SummonLeft,
+ "Assign myself right.", L_SummonRight,
+ "Perform Ritual.", L_RitualMenu,
+ "Nothing.", L_close;
+
+L_SummonReagents:
+ mes "Says we need " + @TEROGAN_SOUL_REQ + " Souls, " + @TEROGAN_ROTTEN_RAGS_REQ + " Rotten Rags, " + @TEROGAN_UNDEAD_EYE_REQ + " Undead Eyes, and " + @TEROGAN_UNDEAD_EAR_REQ + " Undead Ears to perform the ritual. You will also need help, as the summon states both rooms need at least 1 occupant during the ritual.";
+ next;
+ goto L_TomeMain;
+
+L_MissingReagents:
+ mes "It appears we are missing something, lets check the reagent list again.";
+ next;
+ goto L_SummonReagents;
+
+L_SummonLeft:
+ warp "027-8", 27, 43;
+ goto L_close;
+
+L_SummonRight:
+ warp "027-8", 51, 43;
+ goto L_close;
+
+L_RitualMenu:
+ mes "Which side do you want to be on?";
+ menu
+ "Left.", L_RitualLeft,
+ "Right.", L_RitualRight;
+
+L_RitualLeft:
+ if (BaseLevel < @minLevel)
+ goto L_ToWeak;
+ if ( (countitem("Soul") < @TEROGAN_SOUL_REQ)
+ || (countitem("RottenRags") < @TEROGAN_ROTTEN_RAGS_REQ)
+ || (countitem("UndeadEye") < @TEROGAN_UNDEAD_EYE_REQ)
+ || (countitem("UndeadEar") < @TEROGAN_UNDEAD_EAR_REQ) )
+ goto L_MissingReagents;
+ if (getareausers("027-8", 43, 39, 58, 60) == 0)
+ goto L_NeedOther;
+ delitem "Soul", @TEROGAN_SOUL_REQ;
+ delitem "RottenRags", @TEROGAN_ROTTEN_RAGS_REQ;
+ delitem "UndeadEye", @TEROGAN_UNDEAD_EYE_REQ;
+ delitem "UndeadEar", @TEROGAN_UNDEAD_EAR_REQ;
+ mes "As you perform the ritual you can feel the energy amass.";
+ next;
+ mes "A cold shiver runs down your spine as you feel something manifesting out of the void.";
+ if ($@CRYPT_FIGHT3 != 0)
+ goto L_close;
+
+ // initialize fight
+ $@CRYPT_FIGHT3 = 1;
+ $@CRYPT_FIGHT3_WAVE = 0;
+ $@CRYPT_FIGHT3_SUMMONS_COUNT = 2;
+ $@CRYPT_FIGHT3_PLAYER_COUNT = getmapusers("027-8");
+ areamonster "027-8", 43, 39, 58, 60, "", 1124, 1, "General Terogan#Main::OnPetDeath";
+ areamonster "027-8", 20, 39, 35, 60, "", 1075, 1, "General Terogan#Main::OnPetDeath";
+
+ initnpctimer;
+ warp "027-8", 27, 43;
+ goto L_Announce;
+
+L_RitualRight:
+ if (BaseLevel < @minLevel)
+ goto L_ToWeak;
+ if ( (countitem("Soul") < @TEROGAN_SOUL_REQ)
+ || (countitem("RottenRags") < @TEROGAN_ROTTEN_RAGS_REQ)
+ || (countitem("UndeadEye") < @TEROGAN_UNDEAD_EYE_REQ)
+ || (countitem("UndeadEar") < @TEROGAN_UNDEAD_EAR_REQ) )
+ goto L_MissingReagents;
+ if (getareausers("027-8", 20, 39, 35, 60) == 0)
+ goto L_NeedOther;
+ delitem "Soul", @TEROGAN_SOUL_REQ;
+ delitem "RottenRags", @TEROGAN_ROTTEN_RAGS_REQ;
+ delitem "UndeadEye", @TEROGAN_UNDEAD_EYE_REQ;
+ delitem "UndeadEar", @TEROGAN_UNDEAD_EAR_REQ;
+ mes "As you perform the ritual you can feel the energy amass.";
+ next;
+ mes "A cold shiver runs down your spine as you feel something manifesting out of the void.";
+ warp "027-8", 51, 43;
+ if ($@CRYPT_FIGHT3 != 0)
+ goto L_close;
+
+ // initialize fight
+ $@CRYPT_FIGHT3 = 1;
+ $@CRYPT_FIGHT3_WAVE = 0;
+ $@CRYPT_FIGHT3_SUMMONS_COUNT = 2;
+ $@CRYPT_FIGHT3_PLAYER_COUNT = getmapusers("027-8");
+ areamonster "027-8", 43, 39, 58, 60, "", 1124, 1, "General Terogan#Main::OnPetDeath";
+ areamonster "027-8", 20, 39, 35, 60, "", 1075, 1, "General Terogan#Main::OnPetDeath";
+
+ initnpctimer;
+ goto L_Announce;
+
+L_NeedOther:
+ mes "You need at least one other person in the the other chamber to start.";
+ goto L_TomeMain;
+
+L_ToWeak:
+ mes "You try to perform the ritual but nothing happens. You don't seem experienced enough.";
+ goto L_close;
+
+L_close:
+ @bonus = 0;
+ @minLevel = 0;
+ @TEROGAN_SOUL_REQ = 0;
+ @TEROGAN_ROTTEN_RAGS_REQ = 0;
+ @TEROGAN_UNDEAD_EYE_REQ = 0;
+ @TEROGAN_UNDEAD_EAR_REQ = 0;
+ close;
+
+OnTimer5000:
+ setnpctimer 0;
+ if ($@CRYPT_FIGHT3 != 0)
+ goto L_CryptLogic;
+ goto L_Return_1;
+
+L_Return_1:
+ $@CRYPT_FIGHT3_PLAYER_COUNT = 0;
+ areatimer 0, "027-8", 0, 0, 79, 84, 10, "General Terogan#Main::OnTick";
+ end;
+
+L_CryptLogic:
+ $@CRYPT_FIGHT3_ROUND_PEN = $@CRYPT_FIGHT3_PLAYER_COUNT;
+ if ($@CRYPT_FIGHT3_ROUND_PEN > 60)
+ $@CRYPT_FIGHT3_ROUND_PEN = 60;
+ if ($@CRYPT_FIGHT3_PLAYER_COUNT <= 0) goto L_CleanUpLosers;
+ if (getareausers("027-8", 20, 39, 35, 60, 1) < 1) goto L_Failure;
+ if (getareausers("027-8", 43, 39, 58, 60, 1) < 1) goto L_Failure;
+ set $@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER, $@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER + 5; // Advance 5 seconds
+ if (mobcount("027-8", "General Terogan#Main::OnPetDeath") <= 0)
+ goto L_NextWave;
+ if ($@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER + $@CRYPT_FIGHT3_ROUND_PEN >= 120)
+ goto L_NextWave;
+ goto L_Return_1;
+
+L_NextWave:
+ $@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER = 0;
+ $@CRYPT_FIGHT3_WAVE = $@CRYPT_FIGHT3_WAVE + 1;
+ if ( ($@CRYPT_FIGHT3_WAVE > 10) && ($@CRYPT_FIGHT3_SUMMONS_COUNT == 0) )
+ goto L_CleanUp;
+ if ( ($@CRYPT_FIGHT3_WAVE > 10) && ($@CRYPT_FIGHT3_WAVE < 22) )
+ goto L_Return_1;
+ if ($@CRYPT_FIGHT3_WAVE > 22)
+ goto L_SummonNuke;
+ if ($@CRYPT_FIGHT3_WAVE < 5)
+ goto L_WeakSummons;
+ if ( ($@CRYPT_FIGHT3_WAVE < 10) && ($@CRYPT_FIGHT3_WAVE >= 5) )
+ goto L_StrongSummons;
+ if ($@CRYPT_FIGHT3_WAVE == 10)
+ goto L_BossSummons;
+ goto L_SummonNuke;
+
+L_SummonNuke:
+ $@CRYPT_FIGHT3_SUMMONS_COUNT = $@CRYPT_FIGHT3_SUMMONS_COUNT + $@CRYPT_FIGHT3_WAVE*2 + $@CRYPT_FIGHT3_PLAYER_COUNT*4;
+ areamonster "027-8", 0, 0, 79, 84, "", 1124, $@CRYPT_FIGHT3_WAVE*2 + $@CRYPT_FIGHT3_PLAYER_COUNT*4, "General Terogan#Main::OnPetDeath";
+ goto L_Announce;
+
+L_WeakSummons:
+ $@CRYPT_FIGHT3_SUMMONS_NUMBER = (5 + (1 * $@CRYPT_FIGHT3_WAVE) + (2 * $@CRYPT_FIGHT3_PLAYER_COUNT))/2;
+ $@CRYPT_FIGHT3_SUMMONS_COUNT = $@CRYPT_FIGHT3_SUMMONS_COUNT + ($@CRYPT_FIGHT3_SUMMONS_NUMBER/2) + ($@CRYPT_FIGHT3_SUMMONS_NUMBER/2);
+
+ areamonster "027-8", 43, 39, 58, 60, "", 1124, ($@CRYPT_FIGHT3_SUMMONS_NUMBER/2), "General Terogan#Main::OnPetDeath";
+ areamonster "027-8", 20, 39, 35, 60, "", 1074, ($@CRYPT_FIGHT3_SUMMONS_NUMBER/2), "General Terogan#Main::OnPetDeath";
+ goto L_Announce;
+
+L_StrongSummons:
+ $@CRYPT_FIGHT3_SUMMONS_NUMBER = (5 + (1 * $@CRYPT_FIGHT3_WAVE) + (2 * $@CRYPT_FIGHT3_PLAYER_COUNT))/2;
+ $@CRYPT_FIGHT3_SUMMONS_COUNT = $@CRYPT_FIGHT3_SUMMONS_COUNT + (2 * ($@CRYPT_FIGHT3_SUMMONS_NUMBER/2));
+
+ areamonster "027-8", 43, 39, 58, 60, "", 1124, ($@CRYPT_FIGHT3_SUMMONS_NUMBER/2), "General Terogan#Main::OnPetDeath";
+ areamonster "027-8", 20, 39, 35, 60, "", 1075, ($@CRYPT_FIGHT3_SUMMONS_NUMBER/2), "General Terogan#Main::OnPetDeath";
+ goto L_Announce;
+
+L_BossSummons:
+ $@CRYPT_FIGHT3_SUMMONS_NUMBER = (5 + (1 * $@CRYPT_FIGHT3_WAVE) + (2 * $@CRYPT_FIGHT3_PLAYER_COUNT))/2;
+ $@CRYPT_FIGHT3_SUMMONS_COUNT = $@CRYPT_FIGHT3_SUMMONS_COUNT + (2 * ($@CRYPT_FIGHT3_SUMMONS_NUMBER/2)) + 2;
+ areamonster "027-8", 43, 39, 58, 60, "", 1124, ($@CRYPT_FIGHT3_SUMMONS_NUMBER/2), "General Terogan#Main::OnPetDeath";
+ areamonster "027-8", 20, 39, 35, 60, "", 1075, ($@CRYPT_FIGHT3_SUMMONS_NUMBER/2), "General Terogan#Main::OnPetDeath";
+ areamonster "027-8", 43, 39, 58, 60, "", 1129, 1, "General Terogan#Main::OnPetDeath";
+ areamonster "027-8", 20, 39, 35, 60, "", 1129, 1, "General Terogan#Main::OnPetDeath";
+ goto L_Announce;
+
+L_Announce:
+ $@msg$ = $@CRYPT_FIGHT3_MESSAGES$[$@CRYPT_FIGHT3_WAVE];
+ if ($@msg$ == "")
+ goto L_Return_1;
+ mapannounce "027-8", $@msg$, 0;
+ mapannounce "027-5", $@msg$, 0;
+ $@msg$ = "";
+ goto L_Return_1;
+
+OnTick:
+ if (ispcdead())
+ end;
+ $@CRYPT_FIGHT3_PLAYER_COUNT = $@CRYPT_FIGHT3_PLAYER_COUNT + 1;
+ end;
+
+OnPetDeath:
+ $@CRYPT_FIGHT3_SUMMONS_COUNT = $@CRYPT_FIGHT3_SUMMONS_COUNT - 1;
+ end;
+
+L_Failure:
+ if ($@CRYPT_FAIL_ANNOUNCED) goto L_NextWave;
+ $@CRYPT_FAIL_ANNOUNCED = 1;
+ mapannounce "027-8", "Looks like your neighbour team to is finished off, this is your death sentence!", 0;
+ $@CRYPT_FIGHT3_WAVE = 23;
+ goto L_NextWave;
+
+L_CleanUpLosers:
+ mapannounce "027-8", "General Terogan : You just proved you cannot even coordinate a simple task. Come back when you are prepared", 0;
+ $@CRYPT_FIGHT3 = 0;
+ $@CRYPT_FIGHT3_PLAYER_COUNT = 0;
+ $@CRYPT_FIGHT3_WAVE = 0;
+ $@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER = 0;
+ $@CRYPT_FIGHT3_SUMMONS_COUNT = 0;
+ $@CRYPT_FIGHT3_ROUND_PEN = 0;
+ $@CRYPT_FIGHT3_SUMMONS_NUMBER = 0;
+ $@CRYPT_FAIL_ANNOUNCED = 0;
+ killmonster "027-8", "General Terogan#Main::OnPetDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+L_CleanUp:
+ mapannounce "027-8", "General Terogan : You might have won this battle, but you will never defeat me!", 0;
+ areatimer 0, "027-8", 0, 0, 79, 84, 10, "General Terogan#Main::OnReward";
+ $@CRYPT_FIGHT3 = 0;
+ $@CRYPT_FIGHT3_PLAYER_COUNT = 0;
+ $@CRYPT_FIGHT3_WAVE = 0;
+ $@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER = 0;
+ $@CRYPT_FIGHT3_SUMMONS_COUNT = 0;
+ $@CRYPT_FIGHT3_ROUND_PEN = 0;
+ $@CRYPT_FIGHT3_SUMMONS_NUMBER = 0;
+ $@CRYPT_FAIL_ANNOUNCED = 0;
+ killmonster "027-8", "General Terogan#Main::OnPetDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnReward:
+ if (ispcdead())
+ end;
+ @bonus = (BaseLevel/2);
+ DailyQuestBonus = DailyQuestBonus + @bonus;
+ message strcharinfo(0), "You feel a temporary rush of power and zest for action. " + @bonus + " daily bonus gained." ;
+ BOSS_POINTS = BOSS_POINTS + 75;
+ message strcharinfo(0), "You gain 75 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ goto L_End;
+
+L_End:
+ @bonus = 0;
+ @minLevel = 0;
+ @TEROGAN_SOUL_REQ = 0;
+ @TEROGAN_ROTTEN_RAGS_REQ = 0;
+ @TEROGAN_UNDEAD_EYE_REQ = 0;
+ @TEROGAN_UNDEAD_EAR_REQ = 0;
+ end;
+
+OnInit:
+ setarray $@CRYPT_FIGHT3_MESSAGES$,
+ "General Terogan : Haha, Thank you mortal. You have released me from my prison. To show my graditude you can die swiftly at my hands and become part of my undead army. MUhahahahaha! Minions, Dispose of these Adventurers!",
+ "General Terogan : Ha, Looks like your tougher then I thought.",
+ "General Terogan : and here I thought I wasn't going to enjoy this.",
+ "General Terogan : More of them are coming!",
+ "General Terogan : Minions! Kill them already!",
+ "General Terogan : *facepalm* I knew I should have hired better help.",
+ "General Terogan : Well at least you will make a good addition to my army.",
+ "General Terogan : To the Abyss with you already!",
+ "General Terogan : How about you try a different approach and kill them already!",
+ "General Terogan : Minions! Last chance or it's back to being part of an ossuary for you!",
+ "General Terogan : Looks like if you want something done right you have to do it yourself.",
+ "General Terogan : Charge!.";
+ end;
+}
+
+027-8,27,41,0 script General Terogan#Exit1 NPC400,{
+ if ($@CRYPT_FIGHT3 != 0)
+ message strcharinfo(0), "You are way too busy to check this book right now";
+ if ($@CRYPT_FIGHT3 != 0)
+ end;
+ mes "[General Terogan]";
+ mes "\"Let's get you out of here " + strcharinfo(0) + "\"";
+ warp "027-8", 38, 29;
+ end;
+}
+027-8,51,41,0 script General Terogan#Exit2 NPC400,{
+ if ($@CRYPT_FIGHT3 != 0)
+ message strcharinfo(0), "You are way too busy to check this book right now";
+ if ($@CRYPT_FIGHT3 != 0)
+ end;
+ mes "[General Terogan]";
+ mes "\"Let's get you out of here " + strcharinfo(0) + "\"";
+ warp "027-8", 38, 29;
+ end;
+}
diff --git a/npc/027-8/general_terogan_exitdoor.txt b/npc/027-8/general_terogan_exitdoor.txt
new file mode 100644
index 00000000..e9643579
--- /dev/null
+++ b/npc/027-8/general_terogan_exitdoor.txt
@@ -0,0 +1,11 @@
+
+027-8,38,61,0 script #GeneralExit3 NPC45,3,0,{
+ if ($@CRYPT_FIGHT3 != 0)
+ goto L_Block;
+ warp "027-5",70,26;
+ end;
+
+L_Block:
+ message strcharinfo(0), "A force field seems to be blocking you from exiting.";
+ end;
+}
diff --git a/npc/027-8/mapflags.txt b/npc/027-8/mapflags.txt
new file mode 100644
index 00000000..f19c8671
--- /dev/null
+++ b/npc/027-8/mapflags.txt
@@ -0,0 +1,2 @@
+027-8 mapflag nosave 027-5,70,27
+027-8 mapflag zone MMO
diff --git a/npc/028-1/_import.txt b/npc/028-1/_import.txt
new file mode 100644
index 00000000..1ff82398
--- /dev/null
+++ b/npc/028-1/_import.txt
@@ -0,0 +1,5 @@
+// Map 028-1: GM Island
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/028-1/_warps.txt",
+"npc/028-1/mapflags.txt",
+"npc/028-1/portal.txt",
diff --git a/npc/028-1/_warps.txt b/npc/028-1/_warps.txt
new file mode 100644
index 00000000..f1b3aca1
--- /dev/null
+++ b/npc/028-1/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 028-1: GM Island warps
+028-1,120,125,0 warp #028-1_120_125 0,0,028-3,33,77
diff --git a/npc/028-1/mapflags.txt b/npc/028-1/mapflags.txt
new file mode 100644
index 00000000..cadc40e9
--- /dev/null
+++ b/npc/028-1/mapflags.txt
@@ -0,0 +1 @@
+028-1 mapflag zone Event
diff --git a/npc/028-1/portal.txt b/npc/028-1/portal.txt
new file mode 100644
index 00000000..d6aaeafc
--- /dev/null
+++ b/npc/028-1/portal.txt
@@ -0,0 +1,14 @@
+028-1,98,37,0 script Exit NPC400,0,0,{
+ mes "[Exit]";
+ mes "Would you like to leave this place?";
+ menu
+ "Yes.", L_Leave,
+ "No.", L_close;
+
+L_Leave:
+ warp getsavepoint(0), getsavepoint(1), getsavepoint(2);
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/028-3/_import.txt b/npc/028-3/_import.txt
new file mode 100644
index 00000000..0cd918c5
--- /dev/null
+++ b/npc/028-3/_import.txt
@@ -0,0 +1,4 @@
+// Map 028-3: GM Island Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/028-3/_warps.txt",
+"npc/028-3/mapflags.txt",
diff --git a/npc/028-3/_warps.txt b/npc/028-3/_warps.txt
new file mode 100644
index 00000000..17167813
--- /dev/null
+++ b/npc/028-3/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 028-3: GM Island Cave warps
+028-3,33,78,0 warp #028-3_33_78 0,0,028-1,120,126
diff --git a/npc/028-3/mapflags.txt b/npc/028-3/mapflags.txt
new file mode 100644
index 00000000..7e4c34b6
--- /dev/null
+++ b/npc/028-3/mapflags.txt
@@ -0,0 +1 @@
+028-3 mapflag zone Event
diff --git a/npc/029-1/_import.txt b/npc/029-1/_import.txt
new file mode 100644
index 00000000..b24b0973
--- /dev/null
+++ b/npc/029-1/_import.txt
@@ -0,0 +1,21 @@
+// Map 029-1: Candor Island
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/029-1/_mobs.txt",
+"npc/029-1/_warps.txt",
+"npc/029-1/aahna.txt",
+"npc/029-1/barrier.txt",
+"npc/029-1/dock.txt",
+"npc/029-1/ferry_master.txt",
+"npc/029-1/hasan.txt",
+"npc/029-1/hideandseek.txt",
+"npc/029-1/kaan.txt",
+"npc/029-1/liana.txt",
+"npc/029-1/mapflags.txt",
+"npc/029-1/monster_guide.txt",
+"npc/029-1/rewards_master.txt",
+"npc/029-1/soul-menhir.txt",
+"npc/029-1/traveler.txt",
+"npc/029-1/tutorial.txt",
+"npc/029-1/valon.txt",
+"npc/029-1/vincent.txt",
+"npc/029-1/zegas.txt",
diff --git a/npc/029-1/_mobs.txt b/npc/029-1/_mobs.txt
new file mode 100644
index 00000000..fd2626b5
--- /dev/null
+++ b/npc/029-1/_mobs.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 029-1: Candor Island mobs
+029-1,46,48,2,0 monster Clover Patch 1037,1,10000,120000
+029-1,73,93,7,6 monster Maggot 1002,8,100000,30000
+029-1,90,35,7,5 monster Tame Scorpion 1046,16,100000,30000
+029-1,93,100,10,9 monster Tame Scorpion 1046,8,100000,30000
+029-1,43,43,15,11 monster Scorpion 1003,2,100000,30000
+029-1,76,42,26,12 monster Mana Bug 1131,3,30,0
diff --git a/npc/029-1/_warps.txt b/npc/029-1/_warps.txt
new file mode 100644
index 00000000..dd68e552
--- /dev/null
+++ b/npc/029-1/_warps.txt
@@ -0,0 +1,7 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 029-1: Candor Island warps
+029-1,40,88,0 warp #029-1_40_88 0,0,029-2,29,61
+029-1,44,83,0 warp #029-1_44_83 0,0,029-2,22,92
+029-1,52,84,0 warp #029-1_52_84 0,0,029-2,103,61
+029-1,58,79,0 warp #029-1_58_79 0,0,029-2,94,30
+029-1,49,77,0 warp #029-1_49_77 0,0,029-2,24,123
diff --git a/npc/029-1/aahna.txt b/npc/029-1/aahna.txt
new file mode 100644
index 00000000..3ae76a28
--- /dev/null
+++ b/npc/029-1/aahna.txt
@@ -0,0 +1,9 @@
+029-1,71,52,0 script Aahna NPC404,{
+ @npc_distance = 3;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ mes "[Aahna]";
+ mes "\"Hello, What a lovely day for a stroll.\"";
+ close;
+}
diff --git a/npc/029-1/barrier.txt b/npc/029-1/barrier.txt
new file mode 100644
index 00000000..825f2d0c
--- /dev/null
+++ b/npc/029-1/barrier.txt
@@ -0,0 +1,21 @@
+029-1,69,61,0 script #CandorBarrier NPC45,0,0,{
+ if ($@FIGHT_CAVE_STATUS == 1) goto L_Block;
+ if (BaseLevel < 40) goto L_Block;
+ warp "029-3", 49, 53;
+ end;
+
+L_Block:
+ message strcharinfo(0), "Some force seems to be blocking you from entering.";
+ end;
+}
+
+029-1,69,61,0 script #CandorAnnouncer NPC32767,{
+ end;
+OnTalk:
+ if (BaseLevel >= 40) announce "Parua : " + $@candor_npctalk$, 3; // do not show these to newbies
+ end;
+
+OnCommandTalk:
+ areatimer 0, "029-1", 61, 61, 69, 73, 0, "#CandorAnnouncer::OnTalk";
+ end;
+}
diff --git a/npc/029-1/dock.txt b/npc/029-1/dock.txt
new file mode 100644
index 00000000..c40f3646
--- /dev/null
+++ b/npc/029-1/dock.txt
@@ -0,0 +1,42 @@
+
+029-1,46,111,0 script Candor Dock NPC400,1,0,{
+ @npc_distance = 1;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "BoardCandorFerry";
+ end;
+}
+
+029-1,51,118,0 script Candor Koga NPC395,8,7,{
+ @npc_distance = 8;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "BoardCandorFerry";
+ end;
+
+OnTouch:
+ addtimer get(.warp_delay, "#FerryConfig"), strnpcinfo(0)+"::OnBoard";
+ end;
+
+OnBoard:
+ callfunc "BoardCandorFerry";
+ end;
+}
+
+029-1,55,110,0 script #CandorDock NPC32767,{
+ end;
+OnCommandArrive:
+ disablenpc "Candor Dock";
+ enablenpc "Candor Koga";
+ areatimer 0, "029-1", 39, 111, 53, 113, get(.warp_delay, "#FerryConfig"), strnpcinfo(0)+"::OnAreaWarp"; // warp players on dock
+ end;
+
+OnAreaWarp:
+ callfunc "BoardCandorFerry";
+ end;
+
+OnCommandWarp:
+ disablenpc "Candor Koga";
+ enablenpc "Candor Dock";
+ end;
+}
diff --git a/npc/029-1/ferry_master.txt b/npc/029-1/ferry_master.txt
new file mode 100644
index 00000000..8828ee71
--- /dev/null
+++ b/npc/029-1/ferry_master.txt
@@ -0,0 +1,19 @@
+
+029-1,45,107,0 script Ferry Master#candor NPC138,{
+ mes "[Ferry Master]";
+ mes "\"Hello! Do you need something?\"";
+ goto L_Main;
+
+L_Main:
+ menu
+ "How do I use the ferry?", L_Explain,
+ "Nothing I guess", L_close;
+
+L_Explain:
+ mes "[Ferry Master]";
+ callfunc "FerryHelp";
+ goto L_Main;
+
+L_close:
+ close;
+}
diff --git a/npc/029-1/hasan.txt b/npc/029-1/hasan.txt
new file mode 100644
index 00000000..7cf89db7
--- /dev/null
+++ b/npc/029-1/hasan.txt
@@ -0,0 +1,203 @@
+
+029-1,35,33,0 script Scared Man NPC160,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ if (QL_BEGIN >= 13)
+ goto L_TutDone;
+ message strcharinfo(0), "He looks too afraid to say anything.";
+ goto L_End;
+
+L_TutDone:
+ message strcharinfo(0), "Thanks. Hasan has been much nicer to me now";
+ goto L_End;
+
+L_End:
+ end;
+}
+029-1,33,33,0 script Hasan NPC189,3,3,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ goto L_Main;
+
+L_Main:
+ if ((getcharid(3) == $@ScorpionFighter) || ($@ScorpionFighter && $@ScorpionFighter != getcharid(3)))
+ goto L_Afraid;
+ if (QL_BEGIN == 14)
+ goto L_TutDone;
+ if (QL_BEGIN == 13)
+ goto L_Thank;
+ if (QL_BEGIN == 12)
+ goto L_Trick;
+ if ((QL_BEGIN == 9) || (QL_BEGIN == 10) || (QL_BEGIN == 11))
+ goto L_FightAgain;
+
+ mes "You over hear some people nearby.";
+ mes "[Unfriendly Guy]";
+ mes "\"I told you if you didn't get the money, I'd give you swimming lessons, Haha!\"";
+ mes "[Scared Man]";
+ mes "\"But the only person I need protection from is you.\"";
+ mes "[Unfriendly Guy]";
+ mes "\"Thats why the price is so high.\"";
+ mes "\"Because I'm the toughest person in all of Candor\"";
+ mes "[Scared Man]";
+ mes "\"No, your just a mean bully. Wait till I tell the guards about this!\"";
+ mes "[Unfriendly Guy]";
+ mes "\"You do that and the next swimming lesson will be sleeping with the fishes.\"";
+ mes "[Scared Man]";
+ mes "\"No, please don't. *sob*\"";
+ mes "Sounds like this person is in trouble.\"";
+ QL_BEGIN = 9;
+ mes "[Unfriendly Guy]";
+ mes "\"What are you looking at?\"";
+ menu
+ "What ever you call maggot slime scrapped off a boat after a walk through the sewers.", L_Fight,
+ "Who me? I saw nothing, just passing by.", L_close;
+
+L_FightAgain:
+ mes "[Hasan]";
+ mes "\"Have you come back for a thrashing?\"";
+ menu
+ "No.", L_close,
+ "Yes.", L_Fight;
+
+L_Fight:
+ mes "[Hasan]";
+ mes "\"Do you really think you can beat me?\"";
+ mes "He pulls out a nasty looking dagger and stabs it in your direction.";
+ Hp = 1;
+ mes "That hurt! You begin to think searching for a different solution might be healthier.";
+ mes "Maybe Kaan can help?";
+ goto L_close;
+
+L_Trick:
+ mes "[Hasan]";
+ mes "\"Have you come back for another thrashing?\"";
+ menu
+ "No.",L_close,
+ "Yes, yours! (Scratch your head.)",L_ScratchHead;
+
+L_ScratchHead:
+ if ($@ScorpionFighter)
+ goto L_Wait;
+ $@ScorpionTimer = 0;
+ $@ScorpionFighter = getcharid(3);
+ $@ScorpDeath = PC_DIE_COUNTER;
+ donpcevent "#ScorpionTrigger::OnCommandHasanSpawn";
+ specialeffect 22;
+ mes "While you're scratching your head, a scorpion appears.";
+ close;
+
+L_Thank:
+ mes "[Hasan]";
+ mes "\"You - you saved me!";
+ mes "I was mean to people, but you still saved me!\"";
+ mes "\"Hey, you're a really cool person.";
+ mes "I mean, the way you finished that ghastly scorpion!";
+ mes "Amazing!\"";
+ mes "\"Let me tell you something, I will no longer bully people.";
+ mes "And you can have my Sharp Knife.\"";
+ getitem "SharpKnife", 1;
+ QL_BEGIN = 14;
+ mes "\"You want to go to Hurnscald, right? Shall I tell you how to get there?\"";
+ menu
+ "Sure, thanks.",L_HasanThanks,
+ "I'll try to find the way myself.",L_Explore;
+
+L_HasanThanks:
+ mes "[Hasan]";
+ mes "\"Ok, when you leave here go back to the city. Wait on the south end of";
+ mes "the city for the ferry to arrive at the docks. It will take you to Hurnscald.\"";
+ goto L_close;
+
+L_Explore:
+ mes "[Hasan]";
+ mes "\"Alright. Take care!\"";
+ goto L_close;
+
+L_TutDone:
+ mes "[Hasan]";
+ mes "\"You didn't see anything. I tell you what I'll be nicer if you don't tell anyone?\"";
+ menu
+ "As long as you learned your lesson.", L_TutCont;
+
+L_TutCont:
+ mes "\"I have, I promise not to bully people anymore. It's not fun being scared.\"";
+ goto L_close;
+
+L_Wait:
+ mes "There is a scorpion near Hasan already. I think Kaan is helping someone else... Maybe I should try the plan later.";
+ goto L_close;
+
+L_Afraid:
+ message strcharinfo(0), "Hasan: \"" + strcharinfo(0) + "! Please help me!\"";
+ end;
+
+L_close:
+ close;
+
+OnTouch:
+ if (QL_BEGIN >= 13)
+ end;
+ goto L_Main;
+}
+029-1,0,0,0 script #ScorpionTrigger NPC32767,{
+ end;
+
+OnCommandHasanSpawn:
+ goto L_Summon;
+
+L_Summon:
+ monster "029-1", 33, 33, "Weak Scorpion", TameScorpion, 1, "#ScorpionTrigger::OnScorpionDeath";
+ initnpctimer;
+ end;
+
+L_SummonAgain:
+ message strcharinfo(0), l("Kaan is mad at you for your interference! He summons a rock above your head, then summons another scorpion near Hasan!");
+ addtimer 10, "#ScorpionTrigger::OnKillYou";
+ detachrid();
+ goto L_Summon;
+
+OnKillYou:
+ heal -Hp, 0;
+ end;
+
+OnTimer5000:
+ if (attachrid($@ScorpionFighter) == 0)
+ goto L_Clean;
+ $@ScorpionTimer = $@ScorpionTimer + 5;
+ if ($@ScorpionTimer >= 300)
+ goto L_TimeOut;
+ if (PC_DIE_COUNTER > $@ScorpDeath)
+ goto L_MessageDeath;
+ setnpctimer 0;
+ end;
+
+OnScorpionDeath:
+ if (!playerattached())
+ goto L_Summon;
+ if (getcharid(3) != $@ScorpionFighter)
+ goto L_SummonAgain;
+ if (QL_BEGIN != 12)
+ goto L_Clean;
+ QL_BEGIN = 13;
+ message strcharinfo(0), "You saved Hasan.";
+ fix_mobkill(Scorpion);
+ goto L_Clean;
+
+L_TimeOut:
+ message strcharinfo(0), "Hasan, with his eyes almost closed, trembling with fear, runs toward the scorpion and stabs it with all his strength!";
+ goto L_Clean;
+
+L_MessageDeath:
+ message strcharinfo(0), "Ouch... I should be more careful when fighting these monsters.";
+ goto L_Clean;
+
+L_Clean:
+ killmonster "029-1", "#ScorpionTrigger::OnScorpionDeath";
+ $@ScorpionFighter = 0;
+ $@ScorpionTimer = 0;
+ $@ScorpDeath = 0;
+ stopnpctimer;
+ end;
+}
diff --git a/npc/029-1/hideandseek.txt b/npc/029-1/hideandseek.txt
new file mode 100644
index 00000000..d689c555
--- /dev/null
+++ b/npc/029-1/hideandseek.txt
@@ -0,0 +1,388 @@
+
+- script #hideandseekNTconfig NPC32767,{
+ end;
+
+OnInit:
+ $@hideandseekNT_started = (1 << 0);
+ $@hideandseekNT_found1 = (1 << 1);
+ $@hideandseekNT_found2 = (1 << 2);
+ $@hideandseekNT_found3 = (1 << 3);
+ $@hideandseekNT_found4 = (1 << 4);
+ $@hideandseekNT_found5 = (1 << 5);
+ $@hideandseekNT_ended = (1 << 6);
+ end;
+}
+
+function script CountHideNSeek {
+ .@q=getq2(CandorQuest_HideNSeek);
+ setq3 CandorQuest_HideNSeek, bitmask_count(.@q);
+ return getq3(CandorQuest_HideNSeek);
+}
+
+function script UpdateHideNSeek {
+ setq2 CandorQuest_HideNSeek, getq2(CandorQuest_HideNSeek) | getarg(0);
+ setq3 CandorQuest_HideNSeek, bitmask_count(getq2(CandorQuest_HideNSeek));
+ return;
+}
+
+029-1,64,90,0 script AyashaDebug NPC258,{
+ .@q=getq2(CandorQuest_HideNSeek);
+ mes "[Ayasha Debug]";
+ menu
+ "Show", L_Show,
+ "Reset", L_Reset,
+ "Close.", -;
+ close;
+
+L_Show:
+ mes "State: " + .@q;
+ if (.@q & $@hideandseekNT_started)
+ mes "Start set";
+ if (.@q & $@hideandseekNT_found1)
+ mes "Found 1 set";
+ if (.@q & $@hideandseekNT_found2)
+ mes "Found 2 set";
+ if (.@q & $@hideandseekNT_found3)
+ mes "Found 3 set";
+ if (.@q & $@hideandseekNT_found4)
+ mes "Found 4 set";
+ if (.@q & $@hideandseekNT_found5)
+ mes "Found 5 set";
+ if (.@q & $@hideandseekNT_ended)
+ mes "Complete set";
+ close;
+
+L_Reset:
+ setq CandorQuest_HideNSeek, 0, 0;
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "AyashaDebug";
+ end;
+}
+
+029-1,62,90,0 script Ayasha NPC258,{
+ @child_number = 0;
+ callfunc "XmasList";
+
+ .@q=getq2(CandorQuest_HideNSeek);
+
+ if (.@q > 63) goto L_Done;
+ if (CountHideNSeek() >= 5) goto L_Reward;
+ if (getq(CandorQuest_HideNSeek) == 1) goto L_Doing;
+
+ mes l("You see a girl who is holding her hands in front of her face.");
+ mesn;
+ mesq l("98... 99... 100!");
+ mesc l("She takes away her hands and looks up.");
+ menu
+ l("Hello, what are you doing?"), L_Next,
+ l("(Leave)"), -;
+ close;
+
+L_Next:
+ mesn;
+ mes l("\"I'm playing hide and seek with my friends!");
+ mes l("Do you want to play with us?\"");
+ menu
+ l("Sure, sounds like fun."), L_Next1,
+ l("I'm busy with more important things!"), -;
+ close;
+
+L_Next1:
+ mesn;
+ mes l("\"Great! You can take my turn with searching. You need to find all five of my friends.");
+ mes l("They're hiding somewhere on the island, you will have to explore to find them. They could be hiding anywhere.\"");
+ next;
+ mesc l("WARNING: Not all NPCs will interact if you shout with them! For the children hiding, they'll only reply if you get close enough to them.");
+
+ setq CandorQuest_HideNSeek, 1, 0, 0;
+ close;
+
+L_Doing:
+ mesn;
+ mesq l("You still need to find some of my friends. You have found %d out of 5 of my friends.", CountHideNSeek());
+ mesq l("Remember, they're hiding somewhere on the island, you will have to explore to find them. They could be hiding anywhere.");
+ mesc l("WARNING: Not all NPCs will interact if you shout with them! For the children hiding, they'll only reply if you get close enough to them.");
+ close;
+
+L_Reward:
+ mesn;
+ mesq l("Oh, you found them all! Good job! Now it's my turn with searching again. Go and hide!");
+ getexp 75, 0;
+ setq CandorQuest_HideNSeek, 2, 127, 0;
+ menu
+ "I think I need to do other things now.",L_Next2;
+
+L_Next2:
+ mesn;
+ mes "\"Oh, ok.";
+ mes "Have you already seen Hurnscald? It's a very exciting place! I love the entertainer. She can make so many funny faces.\"";
+ close;
+
+L_Done:
+ mesn;
+ mes "\"Hello! It was fun to play with you.";
+ mes "When you go to the Hurnscald, you can say hello to Mikhail. He's very nice! But very shy.\"";
+ close;
+}
+
+029-1,50,105,0 script Latif NPC262,{
+ @child_number = 1;
+ callfunc "XmasList";
+ .@Exp = 15;
+
+ .@q=getq(CandorQuest_HideNSeek);
+ .@q2=getq2(CandorQuest_HideNSeek);
+ if (.@q2 > 63) goto L_Done;
+ if (.@q && !(.@q2 & $@hideandseekNT_found1)) goto L_Find;
+ if (.@q) goto L_Doing;
+
+ mes "You see a kid hiding behind a box.";
+ menu
+ "What are you doing there?",L_Next,
+ "(Leave)",L_close;
+
+L_Next:
+ mes "[Latif]";
+ mes "\"Hiding. We're playing hide and seek. Don't say that is boring. It's fun.\"";
+ menu
+ "I agree, it's fun.",L_Agree,
+ "Hide and seek? Lame.",L_Next1;
+
+L_Next1:
+ mes "[Latif]";
+ mes "\"My friend Vincent thinks so too. He doesn't join us playing.";
+ mes "Do you know what he does instead? He builds action figures out of Bug Legs! That is lame.\"";
+ goto L_close;
+
+L_Agree:
+ mes "[Latif]";
+ mes "\"Yeah, right? My friend Vincent doesn't thinks so. He doesn't join us playing.";
+ mes "Do you know what he does instead? He builds action figures out of Bug Legs! That is lame.\"";
+ goto L_close;
+
+L_Find:
+ mes "[Latif]";
+ mes "\"Hey! Ah, you found me. Well done. But my hiding place wasn't that difficult this time.\"";
+ getexp .@Exp, 0;
+ UpdateHideNSeek($@hideandseekNT_found1);
+ mes "\"Here, do you want a candy?\"";
+ getitem "Candy", 1;
+ goto L_close;
+
+L_Doing:
+ mes "[Latif]";
+ mes "\"You didn't find all of us yet? Seems like the other ones found a better place to hide.\"";
+ mesq l("%d out of 5 have been found.", CountHideNSeek());
+ goto L_close;
+
+L_Done:
+ mes "[Latif]";
+ mes "\"The northeastern most building of town is a workshop. My father works there and wants me to do that too when I'm grown up. But I don't want do that! I want to go on an adventure! Just like you.\"";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ .distance=2;
+ end;
+}
+
+029-1,48,67,0 script Charda NPC260,{
+ @child_number = 2;
+ callfunc "XmasList";
+ .@Exp = 15;
+
+ .@q=getq(CandorQuest_HideNSeek);
+ .@q2=getq2(CandorQuest_HideNSeek);
+ if (.@q2 > 63) goto L_Done;
+ if (.@q && !(.@q2 & $@hideandseekNT_found2)) goto L_Find;
+ if (.@q) goto L_Doing;
+
+ mes "[Charda]";
+ mes "\"Hello. Psht, be careful. I'm playing hide and seek with Ayasha. You'll draw attention to my hiding place.\"";
+ mes "\"They will never find me here.\"";
+ goto L_close;
+
+L_Find:
+ mes "[Charda]";
+ mes "\"Oh! Got me! You're good at this.\"";
+ getexp .@Exp, 0;
+ UpdateHideNSeek($@hideandseekNT_found2);
+ mes "She takes something out of her pocket.";
+ mes "\"I'm hungry now. Do you want chocolate too?\"";
+ getitem "ChocolateBar", 1;
+ mes "\"My mom doesn't want me to eat so much chocolate, but I got it from the trader at the Hurnscald Market. He sells many different things";
+ mes "when we goto vacation in Hurnscald. I convinced him to teach me how to trade. It's fun.\"";
+ goto L_close;
+
+L_Doing:
+ mes "[Charda]";
+ mes "\"Did you find the others yet?\"";
+ mesq l("Hrmm, no looks like only %d out of 5 have been found.", CountHideNSeek());
+ goto L_close;
+
+L_Done:
+ mes "[Charda]";
+ mes "\"Hey! We're still playing hide and seek. What are you going to do? Will you go to Hurnscald with the ferry? The mother of my friends Rossy and Julia come from there. They are on a vacation there at the moment.\"";
+ mes "\"Rossy told me that it's a very beautiful place. Lots of trees and flowers and grass, everything's green.\"";
+ mes "She sighs.";
+ mes "[Charda]";
+ mes "\"Sounds wonderful.\"";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ .distance=2;
+ end;
+}
+
+029-1,100,36,0 script Faris NPC259,{
+ @child_number = 3;
+ callfunc "XmasList";
+ .@Exp = 25;
+
+ .@q=getq(CandorQuest_HideNSeek);
+ .@q2=getq2(CandorQuest_HideNSeek);
+ if (.@q2 > 63) goto L_Done;
+ if (.@q && !(.@q2 & $@hideandseekNT_found3)) goto L_Find;
+ if (.@q) goto L_Doing;
+
+ mes "[Faris]";
+ mes "\"Oh, hi there. What are you doing here on the beach?\"";
+ menu
+ "I'm just having a look around.",L_Next,
+ "It's nice place here, isn't it?",L_Next;
+
+L_Next:
+ mes "[Faris]";
+ mes "\"Hey, you're cool. I'm hiding here from Ayasha, we're playing hide and seek. This is the best hiding place ever.\"";
+ goto L_close;
+
+L_Find:
+ mes "[Faris]";
+ mes "\"You found me! Well done. You look a bit thirsty, here.\"";
+ getexp .@Exp, 0;
+ getitem CactusDrink, 1;
+ UpdateHideNSeek($@hideandseekNT_found3);
+ mes "\"It's really cool you're playing with us. I'm sure you have a lot of other things to do.";
+ mes "You're an adventurer, right? I want to become an adventurer too when I'm grown up. I'll talk to Aidan then.\"";
+ mes "\"Aidan is outside Sorfina's place and you can register there for monster points. That's something the Wizard's Council made up. They reward you for slaying monsters. It's so cool.\"";
+ goto L_close;
+
+L_Doing:
+ mes "[Faris]";
+ mes "\"Are you still searching for the others? Nobody else is here.\"";
+ mesq l("It seems you found %d out of 5 of my friends.", CountHideNSeek());
+ goto L_close;
+
+L_Done:
+ mes "[Faris]";
+ mes "\"I'll go to Hurnscald's Inn and ask Bernard for some soup when we're done with playing. His soup is delicious!\"";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ .distance=2;
+ end;
+}
+
+029-1,28,52,0 script Rasin NPC263,{
+ @child_number = 4;
+ callfunc "XmasList";
+
+ .@Exp = 15;
+
+ .@q=getq(CandorQuest_HideNSeek);
+ .@q2=getq2(CandorQuest_HideNSeek);
+ if (.@q2 > 63) goto L_Done;
+ if (.@q && !(.@q2 & $@hideandseekNT_found4)) goto L_Find;
+ if (.@q) goto L_Doing;
+
+ mes "[Rasin]";
+ mes "\"The harbor is to the south from here. There you can take a ferry to other places.";
+ mes "And now go away, I'm playing hide and seek and Ayasha shouldn't see me here. You'll draw her attention when you talk to me.\"";
+ goto L_close;
+
+L_Find:
+ mes "[Rasin]";
+ mes "\"Ah, you found me. I need to find a better place to hide next time.\"";
+ getexp .@Exp, 0;
+ UpdateHideNSeek($@hideandseekNT_found4);
+ goto L_close;
+
+L_Doing:
+ mes "[Rasin]";
+ mes "\"Hehe, I'm curious when you'll have found all of us.\"";
+ mesq l("There are %d out of 5 found.", CountHideNSeek());
+ goto L_close;
+
+L_Done:
+ mes "[Rasin]";
+ mes "\"Thanks for playing with us! It was fun!";
+ mes "Will you leave Candor to go on an adventure in other places of the world?\"";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ .distance=2;
+ end;
+}
+
+029-1,79,99,0 script Ghada NPC265,{
+ @child_number = 5;
+ callfunc "XmasList";
+
+ .@Exp = 15;
+
+ .@q=getq(CandorQuest_HideNSeek);
+ .@q2=getq2(CandorQuest_HideNSeek);
+ if (.@q2 > 63) goto L_Done;
+ if (.@q && !(.@q2 & $@hideandseekNT_found5)) goto L_Find;
+ if (.@q) goto L_Doing;
+
+ mes "You see a girl standing behind the wheat. She has a look of intense concentration on her face.";
+ menu
+ "Hi, what are you doing there?",L_Next,
+ "(Leave)",L_close;
+
+L_Next:
+ mes "[Ghada]";
+ mes "\"Oh, hello. I'm hiding. We're playing hide and seek.\"";
+ goto L_close;
+
+L_Find:
+ mes "[Ghada]";
+ mes "\"Oh no! You found me! You must be very clever.";
+ mes "My friend Sandra is clever too, but she said it's a waste of time to play hide and seek.\"";
+ getexp .@Exp, 0;
+ UpdateHideNSeek($@hideandseekNT_found5);
+ goto L_close;
+
+L_Doing:
+ mes "[Ghada]";
+ mes "\"Are you still searching for the others? I'm sure you'll find them soon.\"";
+ mesq l("You found %d out of 5 us.", CountHideNSeek());
+ goto L_close;
+
+L_Done:
+ mes "[Ghada]";
+ mes "\"It's so nice that you played with us! You're about the same age as my older sister, but she never plays with us. Her name is Sarah.\"";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ .distance=2;
+ end;
+}
diff --git a/npc/029-1/kaan.txt b/npc/029-1/kaan.txt
new file mode 100644
index 00000000..ecfe95d4
--- /dev/null
+++ b/npc/029-1/kaan.txt
@@ -0,0 +1,118 @@
+
+029-1,46,95,0 script Kaan NPC160,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ @kaan_talked = getq(CandorQuest_Harasser);
+ if (!(@kaan_talked)) goto L_Tanisha;
+ if (QL_BEGIN >= 13) goto L_TutDone;
+ if (QL_BEGIN == 12) goto L_Plan;
+ if (QL_BEGIN == 11) goto L_TrickKnown;
+ if (QL_BEGIN == 10) goto L_Trick;
+ if (QL_BEGIN == 9) goto L_Hasan;
+ goto L_Out;
+
+L_Tanisha:
+ mesn l("Young Man");
+ mes l("\"You're the person I brought here, right?");
+ mes l("My name is Kaan, I'm Tanisha's brother.\"");
+ next;
+ mesn;
+ mesq l("She was babbling at me about it all the morning until I sent her to take care of the maggots in the cafe.");
+ mesc l("Kaan grins mischieviously.");
+ next;
+ mesn;
+ mes l("\"She hates maggots.");
+ mes l("Did you already talk to Tanisha?\"");
+ menu
+ l("Yes, I helped her with the maggots."), L_Tanisha1,
+ l("Yeah, and she's done with the maggots."), L_Tanisha1;
+
+L_Tanisha1:
+ mesn;
+ mes "\"Ah, that is good news.";
+ mes "You know, we have a lot of problems with bugs here.\"";
+ mes "\"I've slain many bugs here to keep them out of our fields.\"";
+ mes "\"If we don't watch out the maggots will eat all of our stocks.";
+ mes "And the island is crawling with scorpions.\"";
+ mes "\"Are you going to visit Hurnscald?";
+ mes "Hurnscald is a wondeful place! Traders, entertainers, adventurers - it's very exciting.\"";
+ mes "\"And Ian the trainer is hanging around there often. You should talk to him, he's a smart guy.\"";
+ mes "\"The ferry to the south takes your there for free.\"";
+ setq CandorQuest_Harasser, 1;
+ goto L_close;
+
+L_Out:
+ mesn;
+ mesq l("Hello! How are you? Did you already visit Hurnscald?");
+ select
+ l("Yes."),
+ l("Not yet.");
+ close;
+
+L_Hasan:
+ mesn;
+ mesq l("Hello! How are you? Did you already visit Hurnscald?");
+ menu
+ "A guy named Hasan is bullying someone.",L_Next1,
+ "Yes.", L_close,
+ "Not yet.",L_close;
+
+L_Next1:
+ mes "\"Hasan! That's crazy. He becomes more cheeky with every day.";
+ mes "I'd like to help you, but - I won't risk an open confrontation with him.\"";
+ mes "\"Sometimes he just freaks out and then he's dangerous.";
+ mes "He might listen to one of the adult men, but they're all off to work in Hurnscald during the day.\"";
+ mes "\"We should think about some kind of trick. Ah, if only I knew his weak point.\"";
+ QL_BEGIN = 10;
+ goto L_Trick;
+
+L_Trick:
+ mesn;
+ mes "\"Do you have any idea what Hasan's weakness could be?";
+ mes "I wonder if Sorfina know something about him that could help us.\"";
+ menu
+ "No idea.",L_close;
+
+L_TrickKnown:
+ mesn;
+ mes "\"Do you have any idea what Hasan's weakness could be?";
+ menu
+ "He's afraid of scorpions.",L_Next2,
+ "No idea.",L_close;
+
+L_Next2:
+ mesn;
+ mes "\"Scorpions?! Right! How could I forget?";
+ mes "When he was a child, he nearly died because he fell into a scorpion nest.\"";
+ QL_BEGIN = 12;
+ next;
+ goto L_Explain;
+
+L_Explain:
+ mes "\"Ok, then here's the plan:";
+ mes "\"You'll go to Hasan and give me a sign when you're ready.";
+ mes "Lets say the sign is that you're scratching your head.";
+ mes "I'll watch you from this point.\"";
+ mes "\"When you give me the sign, I'll summon a scorpion on him.";
+ mes "I bet that will show him for the coward he really is.\"";
+ mes "\"How's that? We can start as soon as you're ready.\"";
+ goto L_close;
+
+L_Plan:
+ mesn;
+ mes "\"I'm ready. Just give me the sign when you're down there.";
+ mes "Or do you want me to explain the plan again?\"";
+ menu
+ "Yes please.",L_Explain,
+ "No, everything's alright.",L_close;
+
+L_TutDone:
+ mesn;
+ mes "\"Hi there. I hope you enjoy your time in Hurnscald.";
+ mes "Hasan can be a real troublemaker, but it seems like he has calmed down for now.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/029-1/liana.txt b/npc/029-1/liana.txt
new file mode 100644
index 00000000..d4816cea
--- /dev/null
+++ b/npc/029-1/liana.txt
@@ -0,0 +1,38 @@
+
+029-1,62,96,0 script Liana NPC205,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ goto L_Talk;
+
+L_Talk:
+ mes "[Liana]";
+ mes "\"Hurnscald is a large city. I'm sure glad I live in Candor because I know where everything's at.\"";
+ if (QL_BEGIN == 10) goto L_Hasan;
+ goto L_close;
+
+L_Hasan:
+ mes "[Liana]";
+ mes "\"Are you enjoying yourself in Candor? Do you have any questions?\"";
+ menu
+ "A guy named Hasan is bullying people.",L_Next,
+ "No, thanks.",L_close;
+
+L_Next:
+ mes "\"Ah, Hasan. He's causing trouble again?\"";
+ mes "She shakes her head.";
+ mes "\"This guy has been a plague ever since he could walk. He's always causing trouble.\"";
+ mes "\"And his father... Well, one day his father thought he should teach Hasan a lesson.\"";
+ mes "\"He took him into the desert and then left him there!";
+ mes "Hasan was only seven years old!\"";
+ mes "\"I never understood how someone could do something like that to a child, even if it's a rascal like Hasan.\"";
+ mes "\"Anyway, Hasan tried to find his way back home, but stumbled into a nest of scorpions!\"";
+ mes "She shakes her head.";
+ mes "\"If Lieutenant Dausen hadn't have come along that moment, Hasan would have died that day.\"";
+ mes "\"However, the scorpions poison caused a bad fever and once Hasan had recovered from that, he was even more malicious than before.\"";
+ mes "She sighs.";
+ QL_BEGIN = 11;
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/029-1/mapflags.txt b/npc/029-1/mapflags.txt
new file mode 100644
index 00000000..afdfd030
--- /dev/null
+++ b/npc/029-1/mapflags.txt
@@ -0,0 +1 @@
+//029-1 mapflag resave 029-1,39,102
diff --git a/npc/029-1/monster_guide.txt b/npc/029-1/monster_guide.txt
new file mode 100644
index 00000000..9ff4964f
--- /dev/null
+++ b/npc/029-1/monster_guide.txt
@@ -0,0 +1,48 @@
+
+029-1,45,97,0 script Aidan NPC102,{
+ if (MPQUEST == 0)
+ goto L_Register;
+ mesn l("Aidan the Monster Guide");
+ mes l("You currently have %s Monster Points. These points are acquired while killing monsters.", fnum(Mobpt));
+ if (BOSS_POINTS)
+ mes l("You also have %s Boss Points. These are vanity achievement points.", fnum(BOSS_POINTS));
+ close;
+
+L_Register:
+ mesn l("Aidan the Monster Guide");
+ mesq l("Oh my, you don't seem to be registered as a Quest Participant. Would you like to register?");
+ next;
+ goto L_Choice;
+
+L_Choice:
+ menu
+ "Register",L_R,
+ "Not at the moment",
+ L_N,"Information",L_I;
+
+L_R:
+ mesn l("Aidan the Monster Guide");
+ mes "Give me a second to look over your paperwork.";
+ next;
+ mes "[Monster Guide]";
+ mes "Well, looks like you qualify!";
+ mes "Welcome to the questing world!";
+ MPQUEST = 1;
+ close;
+
+L_N:
+ mesn l("Aidan the Monster Guide");
+ mes "Very well, you don't know what you're missing.";
+ close;
+
+L_I:
+ mesn l("Aidan the Monster Guide");
+ mes "Here in The Mana World, there are certain rewards for your vanquishing of foes.";
+ mes "For example, there are Monster Points; every monster you kill has a certain amount of points that get added to your account.";
+ mes "The more points you have, the more expensive things you can buy using them.";
+ next;
+ mes "[Monster Guide]";
+ mes "So whaddaya say, sign up won't you?";
+ next;
+ goto L_Choice;
+}
diff --git a/npc/029-1/rewards_master.txt b/npc/029-1/rewards_master.txt
new file mode 100644
index 00000000..972c2bef
--- /dev/null
+++ b/npc/029-1/rewards_master.txt
@@ -0,0 +1,147 @@
+
+029-1,47,97,0 script Ishi NPC106,{
+ if (MPQUEST == 0) goto L_Register;
+ if (tvis == 0) set tvis, 1;
+ if (Mobpt < tvis) goto L_NotEnough;
+
+ setarray @items$, "AppleCake", "Arrow", "Beer", "Boots", "BugLeg", "CactusDrink", "CactusPotion", "Cake", "Candy", "CasinoCoins", "CherryCake", "ChickenLeg", "ChocolateBar", "ChocolateCake", "CottonBoots", "CottonCloth", "CottonShirt", "CottonShorts", "FancyHat", "GreenApple", "HardSpike", "IronOre", "Lifestone", "LightBlueDye", "MaggotSlime", "Milk", "Orange", "OrangeCake", "OrangeCupcake", "PinkPetal", "PileOfAsh", "PinkAntenna", "PoltergeistPowder", "RawLog", "RedApple", "RedDye", "ScorpionStinger", "SerfHat", "SmallHealingPotion", "SmallMushroom", "SnakeSkin", "SpectrePowder", "Steak", "TinyHealingPotion", "WhiteCake", "WhiteFur", "WispPowder", "YellowDye", "Coal";
+ //if magic: "AlizarinScroll", "CobaltScroll", "GambogeScroll", "MauveScroll";
+
+ mes "[Ishi the Rewards Master]";
+ mes "\"Welcome! I see you have " + Mobpt + " Monster Points. Would you like to exchange some of those for items?\"";
+ next;
+
+ @i = 0;
+ setarray @Menu$, "", "", "", "", "", "", "", "", "", "", "", "";
+ callsub S_prep_menu;
+
+ menu
+ @Menu$[0], L_MenuItems,
+ @Menu$[1], L_MenuItems,
+ @Menu$[2], L_MenuItems,
+ @Menu$[3], L_MenuItems,
+ @Menu$[4], L_MenuItems,
+ @Menu$[5], L_MenuItems,
+ @Menu$[6], L_MenuItems,
+ @Menu$[7], L_MenuItems,
+ @Menu$[8], L_MenuItems,
+ @Menu$[9], L_MenuItems,
+ @Menu$[10], L_MenuItems,
+ @Menu$[11], L_MenuItems;
+
+L_MenuItems:
+ // this is for the last entry "No thanks":
+ if (@menu > @i) goto L_close;
+ // this is for the "Give all" entry:
+ if (@menu == 11) goto L_Give_all;
+
+ @req = @menu;
+ @rec = 0;
+ goto L_Item_Loop;
+
+L_Item_Loop:
+ if (@rec == @req || Mobpt < tvis) goto L_Item_Done;
+
+ callsub S_give_item;
+ @rec = @rec + 1;
+ goto L_Item_Loop;
+
+L_Item_Done:
+ if (@rec < @req) mes "It looks like your Monster Points were over estimated.";
+ goto L_close;
+
+L_Register:
+ mes "[Ishi the Rewards Master]";
+ mes "\"Hey, it seems like you didn't register as a quest participant yet! You can sign up with Aidan.\"";
+ goto L_close;
+
+L_NotEnough:
+ mes "[Ishi the Rewards Master]";
+ mes "\"You don't have enough Monster Points for a reward. You'll need to kill some more monsters first.\"";
+ goto L_close;
+
+L_Give_all:
+ // we need to count how many loop iterations are done there,
+ // since the server complains about more than 250 (70 according to Jaxad0127)
+ // gotos without interrupting next statement.
+ @gotocounter = 50;
+ goto L_Give_all_loop;
+
+L_Give_all_loop:
+ @gotocounter = @gotocounter - 1;
+ if (@gotocounter < 1) goto L_Give_all_next;
+ @itemgiveerror = 0;
+ callsub S_give_item;
+ if (@itemgiveerror != 0) goto L_close;
+ goto L_Give_all_loop;
+
+L_Give_all_next:
+ next;
+ mes "[Ishi the Rewards Master]";
+ mes "\"You have received a lot of items. You still have " + Mobpt + " monster points. Shall we continue?\"";
+ menu
+ "Yes", L_Give_all,
+ "No", L_close;
+
+L_close:
+ @gotocounter = 0;
+ @itemgiveerror = 0;
+ @pts = 0;
+ @dif = 0;
+ @i = 0;
+ cleararray @Menu$[0], "", 10;
+ cleararray @items$[0], "", 10;
+ close;
+
+
+S_prep_menu:
+ @pts = Mobpt;
+ @dif = tvis;
+ goto L_Menu_Loop;
+
+L_Menu_Loop:
+ if (@pts < @dif || @i == 10) goto L_Menu_Check;
+
+ @Menu$[@i] = @i + 1;
+
+ @i = @i + 1;
+ @pts = @pts - @dif;
+ @dif = @dif + 1;
+
+ goto L_Menu_Loop;
+
+L_Menu_Check:
+ // if we are able to give 10, we can enable the option to give all we can have
+ if (@i != 10) goto L_Menu_Done;
+ @Menu$[@i] = "Please give me as many as I deserve!";
+ @i = @i + 1;
+ goto L_Menu_Done;
+
+L_Menu_Done:
+ @Menu$[@i] = "No thanks";
+ return;
+
+S_give_item:
+ @itemgiveerror = 0;
+ getinventorylist;
+ if (@inventorylist_count == 100) goto S_give_noinv;
+ if (Mobpt < tvis) goto S_give_nomobpts;
+ Mobpt = Mobpt - tvis;
+ tvis = tvis + 1;
+ @item$ = @items$[rand(getarraysize(@items$))];
+
+ getitem @item$, 1;
+
+ mes "You received one " + getitemlink(@item$) + "!";
+ return;
+
+S_give_noinv:
+ mes "Your inventory is full!";
+ @itemgiveerror = 1;
+ return;
+
+S_give_nomobpts:
+ mes "It looks like your Monster Points were over estimated.";
+ @itemgiveerror = 1;
+ return;
+}
diff --git a/npc/029-1/soul-menhir.txt b/npc/029-1/soul-menhir.txt
new file mode 100644
index 00000000..0c7d4a77
--- /dev/null
+++ b/npc/029-1/soul-menhir.txt
@@ -0,0 +1,15 @@
+
+029-1,39,101,0 script Soul Menhir#candor NPC344,{
+ @map$ = "029-1";
+ setarray @Xs, 38, 39, 40, 38, 40, 38, 39, 40;
+ setarray @Ys, 100, 100, 100, 101, 101, 102, 102, 102;
+ @x = 0;
+ @y = 0;
+ callfunc "SoulMenhir";
+ @map$ = "";
+ cleararray @Xs[0], 0, getarraysize(@Xs);
+ cleararray @Ys[0], 0, getarraysize(@Ys);
+ @x = 0;
+ @y = 0;
+ close;
+}
diff --git a/npc/029-1/traveler.txt b/npc/029-1/traveler.txt
new file mode 100644
index 00000000..83b623fc
--- /dev/null
+++ b/npc/029-1/traveler.txt
@@ -0,0 +1,7 @@
+
+029-1,69,68,0 script Knitra the Traveler NPC103,{
+ @npcname$ = "Knitra";
+ @NpcTravelBit = $@candor_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/029-1/tutorial.txt b/npc/029-1/tutorial.txt
new file mode 100644
index 00000000..77ebf3e5
--- /dev/null
+++ b/npc/029-1/tutorial.txt
@@ -0,0 +1,51 @@
+- script #TutorialConfig NPC32767,{
+ end;
+
+OnInit:
+ $@ScorpionFighter = 0;
+ $@ScorpionTimer = 0;
+ set $@ScorpDeath, 0;
+ end;
+}
+029-2,21,26,0 script TutDebug NPC154,{
+ mes "[TutDebug]";
+ mes "Reset?";
+ menu
+ "Reset Kaan/Hasan",L_Kaan,
+ "Yes.",L_Reset,
+ "No.",L_close;
+
+L_Kaan:
+ QL_BEGIN = 8;
+ setq CandorQuest_Harasser, 0;
+ mes "Reset!";
+ goto L_close;
+
+L_Reset:
+ TUT_var = 0;
+ QL_BEGIN = 0;
+ setq CandorQuest_Harasser, 0;
+ mes "Reset!";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ if(!debug)
+ disablenpc "TutDebug";
+ end;
+}
+029-1,32,99,0 script #tutorialoutside NPC45,0,0,{
+ if (QL_BEGIN >= 8)
+ goto L_Warp;
+ goto L_ResetTutorial;
+
+L_ResetTutorial:
+ QL_BEGIN = 8;
+ goto L_Warp;
+
+L_Warp:
+ warp "029-2", 114, 92;
+ end;
+}
diff --git a/npc/029-1/valon.txt b/npc/029-1/valon.txt
new file mode 100644
index 00000000..15d4ed29
--- /dev/null
+++ b/npc/029-1/valon.txt
@@ -0,0 +1,106 @@
+- script #ValonConfig NPC32767,{
+ end;
+
+OnInit:
+ setarray $@ValonMob, Maggot, HouseMaggot, TameScorpion, Scorpion;
+ setarray $@ValonMobCnt, 10,5,3,1;
+ end;
+}
+029-1,74,86,0 script ValonDebug NPC156,{
+ mes "[Valon Debug]";
+ mes "Reset?";
+
+ if (askyesno() == ASK_YES) {
+ setq CandorQuest_Valon, 0;
+ STARTAREA = (STARTAREA & ~(NIBBLE_2_MASK) | (0 << NIBBLE_2_SHIFT));
+ mes "";
+ mes "Reset!";
+ }
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "ValonDebug";
+ end;
+}
+029-1,72,86,0 script Valon NPC156,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ ValonCount();
+ .@q=getq(CandorQuest_Valon);
+ if (.@q >= 6)
+ goto L_QuestComplete;
+ if (.@q == 1)
+ goto L_QuestAskAgain;
+ if (@valon_count >= $@ValonMobCnt[@valon_mob])
+ goto L_NextMob;
+ if ((.@q >= 2) && (.@q < 6))
+ goto L_QuestStarted;
+ goto L_QuestAsk;
+
+L_QuestAskAgain:
+ mesn;
+ mesq l("Hello, Adventurer! Have you come back to help?");
+ menu
+ "Yes. I will help with the island beasts.", L_Accept,
+ "Maybe some other time.", -;
+ close;
+
+L_QuestAsk:
+ mesn;
+ mes "\"Hello!";
+ mes "You're looking for adventures, right?\"";
+ mes "\"But you shouldn't underestimate this island, it is dangerous.\"";
+ mes "\"It's crawling with scorpions, and the heat has overcome adventurers tougher than you are.\"";
+ mes "\"I should know I guard this gate from all manner of island beasts.\"";
+ mes "\"Maybe you would like help and earn your stripes?\"";
+ mes "\"The Council of Wizard's does offer a reward for helping...\"";
+ setq CandorQuest_Valon, 1;
+ ResetValonCntMask();
+ menu
+ "YES!!! let me at them!", L_Accept,
+ "Maybe some other time.", -;
+ close;
+
+L_Accept:
+ setq CandorQuest_Valon, 2;
+ ValonCount();
+ goto L_NewMob;
+
+L_NextMob:
+ getexp 40, 0;
+ mesq l("I see you killed all the %s needed.", getmonsterlink(@valon_mob));
+ mesq l("The Wizard's thank thee as well.");
+ Zeny += 25;
+ setq CandorQuest_Valon, (.@q + 1);
+ ResetValonCntMask();
+ ValonCount();
+ if (@valon_mob == getarraysize($@ValonMob))
+ goto L_QuestOver;
+ goto L_NewMob;
+
+L_NewMob:
+ mesq l("Let's see whats on the list. Ah ok, I need you to kill me %d %s.", $@ValonMobCnt[@valon_mob], getmonsterlink($@ValonMob[@valon_mob]));
+ mesq l("I'll be waiting here, come back and see after you've killed those mobs.");
+ close;
+
+L_QuestStarted:
+ mesn;
+ mesq l("Hail adventurer! You are well on your way to mastering the beasts of the island.");
+ mesq l("You need to kill %s: %d/%d.", getmonsterlink($@ValonMob[@valon_mob]), @valon_count, $@ValonMobCnt[@valon_mob]);
+ mesq l("\"Come back and see me when the job is done.\"");
+ close;
+
+L_QuestOver:
+ mesn;
+ mesq l("Thanks once again for helping with the monsters in the island.");
+ getexp 50, 0;
+ setq CandorQuest_Valon, (.@q + 1);
+ close;
+
+L_QuestComplete:
+ mesn;
+ mesq l("Thanks once again for helping with the monsters in the island.");
+ close;
+}
diff --git a/npc/029-1/vincent.txt b/npc/029-1/vincent.txt
new file mode 100644
index 00000000..c0f66644
--- /dev/null
+++ b/npc/029-1/vincent.txt
@@ -0,0 +1,134 @@
+029-1,108,108,0 script Vincent Debug NPC113,{
+ mes "[Vincent Debug]";
+ mes "Reset?";
+ menu
+ "Yes.", L_Reset,
+ "No.", L_close;
+
+L_Reset:
+ QL_VINCENT = 0;
+ mes "Reset!";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "Vincent Debug";
+ end;
+}
+029-1,107,110,0 script Vincent NPC113,{
+ @halloween_npc_id = $@halloween_npc_vincent;
+ callfunc "TrickOrTreat";
+
+ if (QL_VINCENT >= 2) goto L_Done;
+ if (QL_VINCENT == 1) goto L_Progress;
+ goto L_Con_Vin_First;
+
+L_Con_Vin_First:
+ mes "[Vincent]";
+ mes "\"I'm making an action figure. I'm almost done with it.\"";
+ next;
+
+ @temp = rand(4);
+ if(@temp == 1) goto L_Opening2;
+ if(@temp == 2) goto L_Opening3;
+ if(@temp == 3) goto L_Opening4;
+ goto L_Opening1;
+
+L_Opening1:
+ mes "\"I just need 5 more Bug Legs to finish my action figure!\"";
+ next;
+ goto L_Ask;
+
+L_Opening2:
+ mes "\"This maggot action figure is awesome! I just need to attach 5 Bug Legs.\"";
+ next;
+ goto L_Ask;
+
+L_Opening3:
+ mes "\"This is a great action figure! A must have! All I need is a few parts...\"";
+ next;
+ goto L_Ask;
+
+L_Opening4:
+ mes "\"Can you get me 5 Bug Legs? I need them to replace the action figure parts.\"";
+ next;
+ goto L_Ask;
+
+L_Ask:
+ mes "\"Will you help me find 5 Bug Legs?\"";
+ next;
+ menu
+ "Yes.", L_Sure,
+ "No.", L_close;
+
+L_Sure:
+ QL_VINCENT = 1;
+ @temp = rand(4);
+ if(@temp == 1) goto L_Req2;
+ if(@temp == 2) goto L_Req3;
+ if(@temp == 3) goto L_Req4;
+ goto L_Req1;
+
+L_Req1:
+ mes "[Vincent]";
+ mes "\"Thank you!\"";
+ next;
+ goto L_Wait;
+
+L_Req2:
+ mes "[Vincent]";
+ mes "\"I don't know how to thank you enough!\"";
+ next;
+ goto L_Wait;
+
+L_Req3:
+ mes "[Vincent]";
+ mes "\"I will thank you when I get them!\"";
+ next;
+ goto L_Wait;
+
+L_Req4:
+ mes "[Vincent]";
+ mes "\"I'm sure I will give a small reward.\"";
+ next;
+ goto L_Wait;
+
+L_Wait:
+ mes "\"Now please go get me 5 Bug Legs.\"";
+ goto L_close;
+
+L_Progress:
+ if(countitem("BugLeg") >= 5)
+ goto L_Have;
+ mes "[Vincent]";
+ mes "\"Please help me collect 5 Bug Legs! I need them to complete my action figure.\"";
+ goto L_close;
+
+L_Have:
+ mes "[Vincent]";
+ mes "\"Excellent! Finally I can complete the model!!\"";
+ next;
+ if(countitem("BugLeg") < 5)
+ goto L_Progress;
+ delitem "BugLeg", 5;
+ getexp 50, 0;
+ Zeny = Zeny + 1000;
+ QL_VINCENT = 2;
+
+ mes "[Vincent]";
+ mes "\"Here you go, a little of my appreciation!\"";
+ mes "";
+ mes "[1000 gold]";
+ goto L_close;
+
+L_Done:
+ mes "[Vincent]";
+ mes "\"Thanks for your help!\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/029-1/zegas.txt b/npc/029-1/zegas.txt
new file mode 100644
index 00000000..8e777e13
--- /dev/null
+++ b/npc/029-1/zegas.txt
@@ -0,0 +1,94 @@
+029-1,45,85,0 script Zegas NPC165,{
+ @npc_distance = 2;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ if (QL_ZEGAS == 1)
+ goto L_Find;
+ if (QL_ZEGAS == 2)
+ goto L_Looking;
+ if (QL_ZEGAS == 3)
+ goto L_QuestEnd;
+ if (QL_ZEGAS == 4)
+ goto L_Thanks;
+ goto L_Meet;
+
+L_Meet:
+ mes "[Zegas]";
+ mes "\"Hey do you have a second?\"";
+ next;
+ mes "\"The storehouse here is over run with house maggots.\"";
+ next;
+ mes "\"Wouldn't you know it, the bug bomb Eomie gave us is in one of the store room barrels.\"";
+ next;
+ mes "\"Can you search the barrels for the bug bomb and set it off when you find it?\"";
+ QL_ZEGAS = 1;
+ menu
+ "Sure.",L_Start,
+ "Maybe some other time.",L_close;
+
+L_Find:
+ mes "[Zegas]";
+ mes "\"The storehouse is still over run with house maggots.\"";
+ next;
+ mes "\"Please help me find the bug bomb Eomie gave us is in one of the store room barrels?\"";
+ menu
+ "Sure.",L_Start,
+ "Maybe some other time.",L_close;
+
+L_Start:
+ mes "[Zegas]";
+ QL_ZEGAS = 2;
+ mes "\"Thanks, come back and see me once you found the bug bomb and set it off.\"";
+ goto L_close;
+
+L_Looking:
+ mes "[Zegas]";
+ mes "\"Still haven't found it? Well keep looking I know it's in there some where.\"";
+ goto L_close;
+
+L_QuestEnd:
+ mes "[Zegas]";
+ mes "\"From the smell I can see you found the bug bomb!\"";
+ mes "\"Thanks once again, I know it's not much but here is 50 GP for your troubles.\"";
+ getexp 50, 0;
+ Zeny = (Zeny + 50);
+ QL_ZEGAS = 4;
+ goto L_close;
+
+L_Thanks:
+ mes "[Zegas]";
+ mes "\"Thanks for Helping with clear out the store room!\"";
+ goto L_close;
+
+L_close:
+ close;
+}
+029-1,47,86,0 script ZegasDebug NPC165,{
+ mes "[Zegas Debug]";
+ mes "Reset ?";
+ menu
+ "Yes.", L_Reset,
+ "No.", L_close;
+
+L_Reset:
+ QL_ZEGAS = 0;
+ STARTAREA = STARTAREA &~ (1 << 20);
+ STARTAREA = STARTAREA &~ (1 << 21);
+ STARTAREA = STARTAREA &~ (1 << 22);
+ STARTAREA = STARTAREA &~ (1 << 23);
+ STARTAREA = STARTAREA &~ (1 << 24);
+ STARTAREA = STARTAREA &~ (1 << 25);
+ STARTAREA = STARTAREA &~ (1 << 26);
+ STARTAREA = STARTAREA &~ (1 << 27);
+ mes "Reset!";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ if (!debug)
+ disablenpc "ZegasDebug";
+ end;
+}
diff --git a/npc/029-2/_import.txt b/npc/029-2/_import.txt
new file mode 100644
index 00000000..8e47f044
--- /dev/null
+++ b/npc/029-2/_import.txt
@@ -0,0 +1,15 @@
+// Map 029-2: Candor Island Indoor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/029-2/_mobs.txt",
+"npc/029-2/_warps.txt",
+"npc/029-2/bankroom.txt",
+"npc/029-2/barrels.txt",
+"npc/029-2/barrels_config.txt",
+"npc/029-2/cynric.txt",
+"npc/029-2/mapflags.txt",
+"npc/029-2/morgan.txt",
+"npc/029-2/nyle.txt",
+"npc/029-2/sorfina.txt",
+"npc/029-2/stat_reset.txt",
+"npc/029-2/tanisha.txt",
+"npc/029-2/two_arms.txt",
diff --git a/npc/029-2/_mobs.txt b/npc/029-2/_mobs.txt
new file mode 100644
index 00000000..abed2b5a
--- /dev/null
+++ b/npc/029-2/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 029-2: Candor Island Indoor mobs
+029-2,33,57,12,3 monster House Maggot 1050,7,100000,30000
diff --git a/npc/029-2/_warps.txt b/npc/029-2/_warps.txt
new file mode 100644
index 00000000..3a6e62bb
--- /dev/null
+++ b/npc/029-2/_warps.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 029-2: Candor Island Indoor warps
+029-2,29,62,0 warp #029-2_29_62 0,0,029-1,40,89
+029-2,22,93,0 warp #029-2_22_93 0,0,029-1,44,84
+029-2,112,84,0 warp #029-2_112_84 0,0,029-2,44,30
+029-2,103,62,0 warp #029-2_103_62 0,0,029-1,52,85
+029-2,94,31,0 warp #029-2_94_31 0,0,029-1,58,80
+029-2,24,124,0 warp #029-2_24_124 0,0,029-1,49,78
diff --git a/npc/029-2/bankroom.txt b/npc/029-2/bankroom.txt
new file mode 100644
index 00000000..12a7390c
--- /dev/null
+++ b/npc/029-2/bankroom.txt
@@ -0,0 +1,5 @@
+
+029-2,35,122,0 script #BankRoom NPC32767,0,0,{
+ message strcharinfo(0), "The door is locked. This must be where Cynric saves the people's money and items.";
+ end;
+}
diff --git a/npc/029-2/barrels.txt b/npc/029-2/barrels.txt
new file mode 100644
index 00000000..c5d91621
--- /dev/null
+++ b/npc/029-2/barrels.txt
@@ -0,0 +1,44 @@
+029-2,23,86,0 script Barrel#0 NPC400,{
+ @barrel = 0;
+ callfunc "CheckBarrel";
+ end;
+
+OnMaggotDeath:
+ fix_mobkill(HouseMaggot);
+ end;
+}
+029-2,28,86,0 script Barrel#1 NPC400,{
+ @barrel = 1;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,31,91,0 script Barrel#2 NPC400,{
+ @barrel = 2;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,36,85,0 script Barrel#3 NPC400,{
+ @barrel = 3;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,40,89,0 script Barrel#4 NPC400,{
+ @barrel = 4;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,38,91,0 script Barrel#5 NPC400,{
+ @barrel = 5;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,29,92,0 script Barrel#6 NPC400,{
+ @barrel = 6;
+ callfunc "CheckBarrel";
+ end;
+}
+029-2,24,91,0 script Barrel#7 NPC400,{
+ @barrel = 7;
+ callfunc "CheckBarrel";
+ end;
+}
diff --git a/npc/029-2/barrels_config.txt b/npc/029-2/barrels_config.txt
new file mode 100644
index 00000000..84f4b111
--- /dev/null
+++ b/npc/029-2/barrels_config.txt
@@ -0,0 +1,84 @@
+029-2,33,88,24,7 monster HouseMaggot 1050,2,100000,30000,Barrel#0::OnMaggotDeath
+- script #BarrelConfig NPC32767,{
+ end;
+
+OnInit:
+ setarray $@BarrelBits, (1 << 20), (1 << 21), (1 << 22), (1 << 23), (1 << 24), (1 << 25), (1 << 26), (1 << 27);
+ setarray $@BarrelRewards, 533, 507, 505, 518, 537, 526;
+ $@BarrelSpawnCnt = 1;
+ $@BarrelSpawnId = 1050;
+ $@BarrelSpawnName$ = "House Maggot";
+ $@BarrelMax = getarraysize($@BarrelBits);
+ end;
+}
+function script CountBarrels {
+ @barrel_count = 0;
+ @count_tmp = 0;
+ goto L_Loop;
+
+L_Loop:
+ if (STARTAREA & $@BarrelBits[@barrel_count])
+ goto L_AddOne;
+ goto L_LoopAgain;
+
+L_AddOne:
+ @barrel_count = (@barrel_count + 1);
+ goto L_LoopAgain;
+
+L_LoopAgain:
+ @count_tmp = (@count_tmp + 1);
+ if (@count_tmp == getarraysize($@BarrelBits))
+ goto L_BarrelTally;
+ goto L_Loop;
+
+L_BarrelTally:
+ return;
+}
+function script CheckBarrel {
+ @npc_distance = 2;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) goto L_Return;
+ if (!(QL_ZEGAS == 2))
+ goto L_NoI;
+ if (STARTAREA & $@BarrelBits[@barrel])
+ goto L_Empty;
+ STARTAREA = STARTAREA | $@BarrelBits[@barrel];
+
+ callfunc "CountBarrels";
+ if (@barrel_count == $@BarrelMax)
+ goto L_QuestReward;
+ @player_random = rand(@barrel_count * 10);
+ @barrel_random = rand(@barrel_count * $@BarrelMax);
+ if (@barrel_random > @player_random)
+ goto L_Spawn;
+ goto L_Reward;
+
+L_NoI:
+ message strcharinfo(0), "Nothing interesting here.";
+ goto L_Return;
+
+L_Empty:
+ message strcharinfo(0), "You've already searched this barrel.";
+ goto L_Return;
+
+L_QuestReward:
+ message strcharinfo(0), "You found the bug bomb.";
+ misceffect 33;
+ QL_ZEGAS = 3;
+ killmonster getmapname() + "", "Barrel#0::OnMaggotDeath";
+ goto L_Return;
+
+L_Spawn:
+ message strcharinfo(0), "Uck, More Maggots!";
+ setarray @npc_loc, getnpcx(), getnpcy();
+ areamonster getmapname(), @npc_loc[0], @npc_loc[1], (@npc_loc[0] + 1), (@npc_loc[1] + 1), $@BarrelSpawnName$, $@BarrelSpawnId, $@BarrelSpawnCnt, "Barrel#0::OnMaggotDeath";
+ cleararray @npc_loc, 0, 2;
+ goto L_Return;
+
+L_Reward:
+ getitem $@BarrelRewards[rand(getarraysize($@BarrelRewards))], 1;
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/npc/029-2/cynric.txt b/npc/029-2/cynric.txt
new file mode 100644
index 00000000..beecaa04
--- /dev/null
+++ b/npc/029-2/cynric.txt
@@ -0,0 +1,6 @@
+
+029-2,30,118,0 script Cynric NPC161,{
+ @npcname$ = "Cynric";
+ callfunc "Banker";
+ close;
+}
diff --git a/npc/029-2/mapflags.txt b/npc/029-2/mapflags.txt
new file mode 100644
index 00000000..481d8ee5
--- /dev/null
+++ b/npc/029-2/mapflags.txt
@@ -0,0 +1,3 @@
+//029-2 mapflag nosave 029-2,22,24
+//029-2 mapflag resave 029-2,22,24
+029-2 mapflag mask 1
diff --git a/npc/029-2/morgan.txt b/npc/029-2/morgan.txt
new file mode 100644
index 00000000..1b76a690
--- /dev/null
+++ b/npc/029-2/morgan.txt
@@ -0,0 +1,158 @@
+029-2,105,57,0 script MorganDebug NPC355,{
+ mes "[Morgan Debug]";
+ mes "Reset?";
+ menu
+ "Yes.", L_Reset,
+ "No.", L_End;
+L_Reset:
+ QL_MORGAN = 0;
+ mes "Reset!";
+ goto L_End;
+
+L_End:
+ end;
+
+OnInit:
+ if (!debug)
+ disablenpc "MorganDebug";
+ end;
+}
+029-2,101,57,0 script Morgan#_M NPC355,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ if (readparam(bInt) >= 5)
+ goto L_Learn;
+ goto L_NotMagic;
+
+L_Learn:
+ if (QL_MORGAN == 0)
+ goto L_NotSeen;
+ if (QL_MORGAN == 1)
+ goto L_Seen;
+ if (QL_MORGAN == 2)
+ goto L_Started;
+ if (QL_MORGAN == 3)
+ goto L_CastOnce;
+ if (QL_MORGAN == 4)
+ goto L_LearningDone;
+ goto L_close;
+
+L_NotSeen:
+ QL_MORGAN = 1;
+ mes "[Morgan]";
+ mes "\"Welcome to the magic school of Candor\"";
+ mes "\"My name is Morgan, I'm Head of Wizardry.\"";
+ mes "\"You appear to have the markings to use magic.\"";
+ mes "\"Granted you are still to young to cast spells.\"";
+ mes "\"But we can teach you to use simple magic devices.\"";
+ mes "\"Would you like to learn some apprentice skills?\"";
+ menu
+ "Yes.", L_Start,
+ "Maybe later", L_close;
+
+L_Seen:
+ mes "[Morgan]";
+ mes "\"Have you returned to learn some magic?\"";
+ menu
+ "Yes.", L_Start,
+ "Maybe later", L_close;
+
+L_NotMagic:
+ mes "[Morgan]";
+ mes "\"Hrmm you don't appear to posses enough magical talent to teach.\"";
+ close;
+
+L_Start:
+ mesn;
+ mesq l("Great, lets begin your first lesson.");
+ next;
+ mesn;
+ mesq l("This is a wand, there are many like it but this one is now yours.");
+ getitem Wand, 1;
+ learnskill SKILL_CONFRINGO;
+ QL_MORGAN = 2;
+ next;
+ mesn;
+ mesq l("Various wands and staffs are found throughout the land with many different strengths and weaknesses.");
+ next;
+ mesq l("To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.");
+ next;
+ mesn;
+ mesq l("As the power of your magic grows so will the spells you can cast.");
+ mesq l("Lets start with a basic wand attack: %s.", b("confringo"));
+ next;
+ mesn;
+ mesq l("Equip the wand and lets try out that spell.");
+ mesc l("To cast a spell open the skill window, select the spell you wish to use, and press the %s button.", b(l("Use")));
+ next;
+ mesn;
+ mesq l("It might be a good idea to drag the spell to the shortcut window, so you can target and attack using your keyboard instead of mouse.");
+ next;
+ mesn;
+ mesq l("Speak to me again once you've cast the spell.");
+ mesc l("As an offensive spell, it'll only work if you have a valid target, like a monster.");
+ close;
+
+L_Started:
+ mesn;
+ mesq l("Lets start with a basic wand attack: %s.", b("confringo"));
+ mesq l("Equip the wand and lets try out that spell.");
+ mesc l("To cast a spell open the skill window, select the spell you wish to use, and press the %s button.", b(l("Use")));
+ mesq l("Speak to me again once you've cast the spell.");
+ mesc l("As an offensive spell, it'll only work if you have a valid target, like a monster.");
+ close;
+
+L_CastOnce:
+ mesn;
+ mesq l("Ok, good job! Looks like you have good mana flow.");
+ mesq l("Onto the next lesson. Now that you have %s cast,", b("confringo"));
+ mesq l("Each time you attack the wand will convert a bit of you mana into a magic bolt.");
+ next;
+ mesq l("If an offensive spell requires an item, then after so many attacks, you may need to recast the whole invocation to stay attuned to the wand.");
+ mesc l("(Logging out will also cancel any spell effects currently active in-game.).");
+ next;
+ mesq l("In other words, offensive spells which require reagents won't consume these every time you cast, but will still require the items frequently.");
+ next;
+ mesq l("I've taught you all I can for now. You should search for the Mana Seed, I've heard there was one north west of Hurnscald.");
+ QL_MORGAN = 4;
+ close;
+
+L_LearningDone:
+ mesn;
+ mesq l("%s is a basic wand attack.", b("confringo"));
+ mesq l("A Wand must be equipped to use the spell.");
+ mesc l("To cast a spell open the skill window, select the spell you wish to use, and press the %s button.", b(l("Use")));
+ mesq l("I've taught you all I can for now. You should search for the Mana Seed, I've heard there was one north west of Hurnscald.");
+ learnskill SKILL_CONFRINGO;
+ if (get_nibble(##03_TMWQUEST, 0) == 1) {
+ mes "";
+ select
+ l("Gotcha."),
+ l("Actually, have you ever heard of Yeti's kidnapping little girls?");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("No, but maybe someone %s would know better?", b(l("old")));
+ }
+ }
+ close;
+
+L_close:
+ close;
+}
+
+029-2,113,59,0 script Zitoni NPC103,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem CactusDrink;
+ sellitem CactusPotion;
+ sellitem TinyManaElixir, 50;
+ sellitem SmallManaElixir, 100;
+ .distance = 5;
+ end;
+}
diff --git a/npc/029-2/nyle.txt b/npc/029-2/nyle.txt
new file mode 100644
index 00000000..d4573269
--- /dev/null
+++ b/npc/029-2/nyle.txt
@@ -0,0 +1,47 @@
+
+029-2,26,120,6 script Nyle NPC101,{
+ mes "[Nyle]";
+ mes "\"Visiting the bank too right? We're only a small village but Cynric is the best bank guy I know.\"";
+ menu
+ "Yeah, you're right.", L_close,
+ "What is banking?", L_Explain;
+
+L_Explain:
+ mes "[Nyle]";
+ mes "\"There are banks all over the world. Usually every important village or city has one.";
+ mes "You can save both items and money at a bank.\"";
+ menu
+ "How do I save items?", L_Items,
+ "How do I save money?", L_Money,
+ "Thanks!", L_Thanks;
+
+L_Items:
+ mes "[Nyle]";
+ mes "\"Let Cynric open your storage. You might also want to open your inventory.";
+ mes "Pick an item from either storage or inventory and choose what you want to do with it by clicking the right button.";
+ mes "You can also pick and drag items from one window into the other but this will move all items of this kind.";
+ next;
+ mes "Items in your storage are totally safe. Banking itself is totally safe.\"";
+ menu
+ "And how do I save money?", L_Money,
+ "Thanks!", L_Thanks;
+
+L_Money:
+ mes "[Nyle]";
+ mes "\"That's easy. Cynric will save your money when you ask him to deposit. Or you pick up your money by asking to withdraw.";
+ mes "You only have to tell him how much you want to deposit or withdraw.";
+ mes "Also you can ask how much he already save for you by checking your balance.";
+ next;
+ mes "Money in your storage is totally safe. Banking itself is totally safe.\"";
+ menu
+ "And how do I save items?", L_Items,
+ "Thanks!", L_Thanks;
+
+L_Thanks:
+ mes "[Nyle]";
+ mes "\"You are very welcome.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/029-2/sorfina.txt b/npc/029-2/sorfina.txt
new file mode 100644
index 00000000..81dc4a33
--- /dev/null
+++ b/npc/029-2/sorfina.txt
@@ -0,0 +1,386 @@
+029-2,27,27,0 script Sorfina NPC154,0,1,{
+ @npc_distance = 2;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ goto L_Main;
+
+L_Main:
+ if (QL_BEGIN == 10) goto L_Hasan;
+ if (QL_BEGIN >= 4) goto L_Again;
+ if (QL_BEGIN == 3) goto L_Clothes;
+ if (QL_BEGIN == 2) goto L_Dresser;
+ if (QL_BEGIN == 1) goto L_Carpet;
+ goto L_Start;
+
+L_Start:
+ mes l("You open your eyes.");
+ mes "";
+ mesn l("Old Woman");
+ mes l("\"Ah, you woke up. You washed ashore on the beach 3 days ago. You've been asleep since.");
+ mes l("You must have been thrown off one of the ships sailing during that last tremor.\"");
+ next;
+ mes l("\"My little granddaughter Tanisha found you. Kaan was able to carry you to bed.");
+ mes l("We've been taking care of you ever since. Waiting for you to wake up.\"");
+ next;
+ mesq l("You didn't have any possessions on you when we found you and no one knows who you are.");
+ mes l("Do you have a name?");
+ select
+ strcharinfo(0);
+
+ mesn l("Old Woman");
+ mesq l("Well %s what else can you tell me about yourself?.", strcharinfo(0));
+ next;
+ mesn l("Old Woman");
+ mesq l("Go on. If you need to think a bit, take your time.");
+ select
+ l("... Tulimshar in Tonori ... I'm a Talpan.");
+ mes "";
+ mesn l("Old Woman");
+ mesq l("Anything else you can remember?");
+ select
+ l("Umm... no... I... I don't remember anything else...");
+
+ mesn l("Old Woman");
+ mes l("Well I can tell you some useful things, if you want to hear.");
+ mes l("Some of it might jog your memory or at least help you catch your bearings.");
+ mes l("Oh, and by the way my name is Sorfina.\"");
+ menu
+ l("That would be great!"), L_Tut,
+ l("No, thanks. I already know how things are going."), L_SkipTut;
+
+L_Tut:
+ clear;
+ mesc l("She smiles at you.");
+ mesn;
+ mes "\"You have arrived at a very strange time. The Council is visiting Candor today.\"";
+ mes "\"All the recent rumbling from the cave has all of Candor worried.\"";
+ mes "\"Our guess is something with the last big shaker was the reason you ended up here.\"";
+ mes "\"Ok, lets start by getting you dressed.\"";
+ goto L_Carpet;
+
+L_Carpet:
+ mesn;
+ mes "\"Try to take a few steps and walk to that carpet over there.";
+ next;
+ camera "#Carpet";
+ mapmask getmask() | 4;
+ next;
+ 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.\"";
+ QL_BEGIN = 1;
+ goto L_close;
+
+L_Dresser:
+ mesn;
+ mes "\"You should get dressed now.\"";
+ next;
+ 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;
+ camera;
+ mes "\"Now get the clothes out of the dresser.\"";
+ goto L_close;
+
+L_Naked:
+ mesn;
+ mes "\"Press [###keyWindowInventory;] or click on the Inventory button in the bar at the upper right corner to open your bag.\"";
+ mes "\"Once we stop talking, double-click on the clothes to equip.\"";
+ mes "\"Talk to me again after you get dressed. You can either click on me, or press [###keyTargetNPC;] to focus on me and [###keyTalk;] to talk.\"";
+ goto L_close;
+
+L_Clothes:
+ if (getequipid(equip_torso) < 0)
+ goto L_Naked;
+ mesn;
+ mes "\"That's much better, don't you think?\"";
+ mes "\"Here take this.\"";
+ getitem "HitchhikersTowel", 1;
+ mes "\"Your HitchHikers Towel will return you to your last set soul menhir or here if not set.\"";
+ mes "\"It can't be used constantly as the magic needs time to power the jump.\"";
+ mes "\"I think this will help you a bit. To get more information, press the button Setup and look at the controls on the Keyboard tab. You can also change them as you like.";
+ mes "Talk to me again if you want me to explain more things.\"";
+
+ mes "\"Oh, and if you're looking for extra work, you should talk to Aidan and Valon when you go outside. They're giving rewards for monster hunting.";
+ mes "You can find Aidan near the camp fire outside and Valon out by the fields in the east.\"";
+ next;
+
+ mes "She digs in her pocket for a moment.";
+ mes "\"And here is some money for you. Don't spend it all in one place.";
+ mes "Now go help Tanisha downstairs.\"";
+ mapmask getmask() | 8;
+ Zeny = Zeny + 30;
+ QL_BEGIN = 4;
+ goto L_close;
+
+L_Again:
+ mesn;
+ mes "\"Make yourself at home! Do you have any questions?\"";
+ menu
+ "Yes, could you explain about...",L_Explain,
+ "Could I get Healed?",L_Heal,
+ "No, thanks.",L_close;
+
+L_Heal:
+ if (BaseLevel > 20)
+ goto L_NoHeal;
+ mesn;
+ mes "\"Hello Dear! You look tired, you should rest a moment.\"";
+ mes "You take a short nap and feel refreshed.";
+ heal MaxHp, 0;
+ goto L_Main;
+
+L_NoHeal:
+ mesn;
+ mes "\"I'm sorry but your wounds are far to advanced for my skills.\"";
+ goto L_Main;
+
+L_Explain:
+ menu
+ "... walking?",L_Walk,
+ "... talking?",L_Talk,
+ "... 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:
+ mesn;
+ mes "\"You can use the arrow keys to walk around.";
+ 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.";
+ mes "This only works if that place is reachable and walkable.\"";
+ goto L_close;
+
+L_Talk:
+ mesn;
+ mes "\"If you want to talk to a normal person, you can click at him or her.";
+ mes "Or you can press [###keyTargetNPC;] to focus on the nearest person and then press [###keyTalk;] to talk.\"";
+ next;
+ mes "\"If you want to talk to other adventurers, press [###keyChat;] to open your chat window.";
+ mes "Then type your message and press Enter to send.\"";
+ next;
+ mes "\"You may want to talk privately to another adventurer sometimes. In that case you can whisper.";
+ mes "After pressing [###keyChat;] type '/whisper [name] [message]'.";
+ mes "Or you can right click on someone and choose the whisper option.\"";
+ next;
+ mes "\"Press [###keyWindowChat;] to show and hide your chat window.\"";
+ goto L_close;
+
+L_Items:
+ mesn;
+ mes "\"There are three types of items.";
+ mes "They can be Consumables, Equipment or Miscellaneous.\"";
+ next;
+ mes "\"Consumable items such as Potions, can be used only once.";
+ mes "After use, they will disappear from your inventory.";
+ mes "There are some rare items that can be used but don't get consumed.\"";
+ next;
+ mes "\"Equipment items like Armors, Weapons, Accessories can be equipped for fashionable purposes or to raise your status.\"";
+ next;
+ mes "\"Miscellaneous items such as maggot slime, can be used in creating other items, or just to trade and sell.\"";
+ next;
+ mes "\"Your HitchHikers Towel will return you to your last set soul menhir or here if not set.\"";
+ mes "\"It can't be used constantly as the magic needs time to power the jump.\"";
+ next;
+ mes "\"Press [###keyWindowInventory;] to open your inventory.";
+ mes "When placing your cursor over an item there, you can see a box with some information about that item.\"";
+ next;
+ mes "\"To use or equip an item, select it by double-clicking on it.";
+ mes "Selecting the item then pressing Use or Equip also works.\"";
+ goto L_close;
+
+L_Shortcut:
+ mesn;
+ mes "\"Press [###keyWindowShortcut;] or click the Shortcut button in the bar at the upper right to open your shortcut window.\"";
+ next;
+ mes "\"You can select the item you want to put on a shortcut with your mouse and then click on the position in the shortcut window you want to place it.\"";
+ next;
+ mes "\"Now you can use or equip/unequip it by pressing the number of the shortcut.\"";
+ goto L_close;
+
+L_Aidan:
+ mesn;
+ mes "\"I heard Aidan and Valon are looking for brave adventurers, you might want to talk to them. ";
+ mes "You can find Aidan near the camp fire outside. The fields are just south of the town exit. ";
+ mes "You'll see Valon of the city gaurd standing there. They both are offering rewards for monster hunting.\"";
+ next;
+ mes "\"When you leave this area to the South, you'll come to the docks.";
+ mes "They will take you to Hurnscald, a major trading port.\"";
+ next;
+ mes "\"Go east out of Candor and north. You will find the cave everyone is talking about to the north.";
+ next;
+ mes "Talk to everybody. You can never tell when they might know something useful.\"";
+ goto L_close;
+
+L_Barber:
+ mesn;
+ 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:
+ mesn;
+ mes "\"Make yourself at home! Do you have any questions?\"";
+ menu
+ "A guy named Hasan is bullying people.",L_Next,
+ "Yes, could you explain again about...",L_Explain,
+ "No, thanks.",L_close;
+
+L_Next:
+ mes "\"Ah, Hasan. He's causing trouble again?\"";
+ mes "She shakes her head.";
+ mesn;
+ mes "\"This guy has been a plague ever since he could walk. He's always causing trouble.\"";
+ mes "\"And his father... Well, one day his father thought he should teach Hasan a lesson.\"";
+ mes "\"He took him into the desert and then left him there!";
+ mes "Hasan was only seven years old!\"";
+ mes "\"I never understood how someone could do something like that to a child, even if it's a rascal like Hasan.\"";
+ mes "\"Anyway, Hasan tried to find his way back home, but stumbled into a nest of scorpions!\"";
+ mes "She shakes her head.";
+ mes "\"If Valon hadn't have come along that moment, Hasan would have died that day.\"";
+ mes "\"However, the scorpions poison caused a bad fever and once Hasan had recovered from that, he was even more malicious than before.\"";
+ mes "She sighs.";
+ QL_BEGIN = 11;
+ goto L_close;
+
+L_SkipTut:
+ mesn;
+ mes "\"Really? You seem quite unexperienced. Listening to some advice won't hurt.\"";
+ menu
+ "Thinking about it twice... please tell me.",L_Tut,
+ "Yeah, but thanks for the offer. Bye.",L_Bye;
+
+L_Bye:
+ mesn;
+ mes "\"Alright, if you say so. But take at least this. See you later.\"";
+ getitem Knife, 1;
+ getitem SlingShot, 1;
+ getitem SlingBullet, 500;
+ getitem HitchhikersTowel, 1;
+ getitem CottonShirt, 1;
+ getitem RaggedShorts, 1;
+ set Zeny, Zeny + 35; // tanisha gives 5 Zeny
+ QL_BEGIN = 8;
+ equip(CottonShirt);
+ equip(RaggedShorts);
+ equip(Knife);
+ close;
+
+L_close:
+ close;
+
+OnTouch:
+ if (QL_BEGIN > 0)
+ end;
+ goto L_Start;
+}
+
+029-2,33,27,0 script #Carpet NPC127,1,1,{
+ if (QL_BEGIN != 1)
+ end;
+ mapmask getmask();
+ mesn l("Sorfina");
+ mesq l("You should get dressed now.");
+ next;
+ camera "Dresser#tutorial";
+ mapmask getmask() | 16;
+ mesq l("In that dresser there are some clothes you can wear.");
+ mesc l("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;
+ camera;
+ mesq l("Now get the clothes out of the dresser.");
+ QL_BEGIN = 2;
+ close;
+}
+
+029-2,29,23,0 script Dresser#tutorial NPC400,{
+ if (QL_BEGIN > 2) goto L_Empty;
+ if (QL_BEGIN == 2) goto L_Shirt;
+ goto L_Walk;
+
+L_Walk:
+ mesn l("Sorfina");
+ mesq l("Thats not what I said to do. Please don't skip ahead.");
+ close;
+
+L_Shirt:
+ mapmask getmask();
+ mesc l("You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the dresser.");
+ getitem CottonShirt, 1;
+ getitem RaggedShorts, 1;
+ QL_BEGIN = 3;
+ mesn l("Sorfina");
+ mesq l("Great! Now you can equip it.");
+ mesc l("You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.");
+ next;
+ mesq l("After we finish talking, click on the clothes and press the equip button.");
+ close;
+
+L_Empty:
+ mes l("The dresser is empty.");
+ close;
+
+OnInit:
+ .distance=1;
+ end;
+}
+
+029-2,44,31,0 script #DoorOutTut1 NPC45,0,0,{
+ if (QL_BEGIN < 4)
+ goto L_Block;
+ mapmask getmask();
+ warp "029-2", 112, 85;
+ end;
+
+L_Block:
+ message strcharinfo(0), "Sorfina : ##BWait a moment! ##bYou're not ready to leave.";
+ // FIXME: this should be changed to npctalk with strcharinfo(0) once we increase the view area
+ end;
+}
+029-2,23,24,0 script #GameRules1 NPC32767,0,1,{
+ if (TUT_var > 0)
+ end;
+ mes "[Server/Client Notice]";
+ mesc l("The explanations in this tutorial are based on the Manaplus client.");
+ mesc l("If you're using another client, settings and controls may be different.");
+ callfunc "GameRules";
+ close;
+}
+029-2,21,24,0 script #GameRules2 NPC32767,0,1,{
+ if (TUT_var > 0)
+ end;
+ mes "[Server/Client Notice]";
+ mesc l("The explanations in this tutorial are based on the Manaplus client.");
+ mesc l("If you're using another client, settings and controls may be different.");
+ callfunc "GameRules";
+ close;
+}
+029-2,22,26,0 script #GameRules3 NPC32767,1,0,{
+ if (TUT_var == 0)
+ goto L_KnockBack;
+ end;
+
+L_KnockBack:
+ message strcharinfo(0), "Server : ##BPlease Accept the Game rules";
+ warp "029-2", 22, 24;
+ end;
+}
+029-2,24,24,0 script #GameRules4 NPC32767,0,1,{
+ if (TUT_var == 0)
+ goto L_KnockBack;
+ end;
+
+L_KnockBack:
+ message strcharinfo(0), "Server : ##BPlease Accept the Game rules";
+ warp "029-2", 22, 24;
+ end;
+}
diff --git a/npc/029-2/stat_reset.txt b/npc/029-2/stat_reset.txt
new file mode 100644
index 00000000..5a9f8dd1
--- /dev/null
+++ b/npc/029-2/stat_reset.txt
@@ -0,0 +1,45 @@
+
+029-2,98,92,0 script Jessie NPC159,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ if (BaseLevel > 10)
+ goto L_Sorry;
+
+ mesn;
+ mes "\"I know a spell that will";
+ mes "reset status points on the youngings.";
+ mes "";
+ mes "I can also change their appearance.\"";
+ next;
+ menu
+ "Reset my stats",L_Reset,
+ "Change my appearance", L_Appearance,
+ "Forget about it", L_Pass;
+
+L_Appearance:
+ Barber();
+ goto L_Pass;
+
+L_Reset:
+ resetstatus();
+ mesn;
+ mes "\"There you are.";
+ mes "";
+ mes "Good as new!\"";
+ close;
+
+L_Pass:
+ mesn;
+ mesq l("Very well then, see you.");
+ close;
+
+L_Sorry:
+ mesn;
+ mesq l("My spell only works on the very young, sorry.");
+ next;
+ mes "\"You can try Mailvox in the Tulimshar Bazaar or Wyara in the Potion Shop in Hurnscald.\"";
+ menu
+ "Change my appearance", L_Appearance,
+ "Bye", L_Pass;
+}
diff --git a/npc/029-2/tanisha.txt b/npc/029-2/tanisha.txt
new file mode 100644
index 00000000..4e5abe42
--- /dev/null
+++ b/npc/029-2/tanisha.txt
@@ -0,0 +1,286 @@
+
+029-2,110,88,0 script Tanisha NPC114,{
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+
+ if (isin("029-2", 98, 84, 106, 89))
+ goto L_Fighting;
+
+ if (QL_BEGIN >= 8) goto L_Tut_Done;
+ if (QL_BEGIN == 7) goto L_Stats;
+ if (QL_BEGIN == 6) goto L_Fail;
+ if (QL_BEGIN == 5) goto L_Maggots;
+
+ mes "[Tanisha]";
+ mes "\"Hey! You're up again!\"";
+ emotion EMOTE_HAPPY, strcharinfo(0);
+ mes "\"Are you feeling better?\"";
+ menu
+ "Yes, thank you.",L_Next,
+ "Yeah, but everything is gone. My stuff and memories..",L_Next;
+
+L_Next:
+ mes "[Tanisha]";
+ mes "\"I'm glad you're feeling better. It was really bad luck what happened to you.";
+ mes "Hey, I have an idea.\"";
+ QL_BEGIN = 5;
+ goto L_Maggots;
+
+L_Maggots:
+ mes "[Tanisha]";
+ mes "\"There are some maggots eating the goods and I'm supposed to get rid of them.";
+ mes "But they're so yucky!\"";
+ mes "\"If you kill them, I'll give you my knife.";
+ mes "What do you say?\"";
+ menu
+ "I guess it's the least I can do.",L_Next1;
+
+L_Next1:
+ mes "[Tanisha]";
+ mes "\"Wonderful.";
+ // since the check happens here, it is actually possible to have
+ // more than $@Maggot_MaxHunters in the area at one time
+ // but that's not a BIG problem
+ if (getareausers("029-2", 98, 84, 106, 89) >= $@Maggot_MaxHunters)
+ goto L_Crowded;
+ next;
+ goto L_Fight_Again;
+
+L_Fight_Again:
+ mes "[Tanisha]";
+ mes "\"Ok, listen what to do.";
+ mes "Equip a weapon and kill the maggots.\"";
+ mes "\"Press [###keyTargetMonster;] to focus on a monster. With [###keyTargetAttack;] you can focus and start attacking the same time.";
+ mes "But it also works to click on the monster with your mouse.\"";
+ next;
+ mes "\"If you press the [###keyTarget;], you can abort your attack.\"";
+ next;
+ mes "\"Maggots aren't aggressive, so they won't harm you until you attack them first. Take them out one by one.\"";
+ next;
+ mes "\"Sometimes dead monsters leave some useful things. You can pick them up by pressing [###keyPickup;] or clicking on the items with your mouse.\"";
+ close2;
+ // The getitem must be in the same place as set QL_BEGIN, 2;
+ // since it was moved to after L_Fight_Again, add it conditionally
+ if (QL_BEGIN == 5)
+ goto L_GetFightItems;
+ goto L_ContinueFight;
+
+L_GetFightItems:
+ QL_BEGIN = 6;
+ getitem "Knife", 1;
+ getitem "SlingShot", 1;
+ getitem "SlingBullet", 500;
+ goto L_ContinueFight;
+
+L_ContinueFight:
+ QL_BEGIN = 6;
+ @Maggot_Kills = 0;
+ @time = 0;
+ if (getareausers("029-2", 98, 84, 106, 89) == 0)
+ initnpctimer;
+ warp "029-2", 101, 87;
+ goto L_Summon;
+
+L_Summon:
+ areamonster "029-2", 98, 84, 106, 89, "", 1002, 1, "Tanisha::OnMaggotDeath";
+ end;
+
+L_Stats:
+ mes "[Tanisha]";
+ mes "\"That was great! Like a professional exterminator!\"";
+ mes "\"And it seems you became stronger and more experienced.";
+ mes "That means you got some status points which you can use to increase your abilities.\"";
+ mes "\"Press [###keyWindowStatus;] or click the Status button in the bar at the upper right to see your status window. There you can distribute your points on six different properties.\"";
+ mapmask getmask() | 2;
+ next;
+ goto L_StatsRe;
+
+L_StatsRe:
+ mes "\"Strength makes you hit harder and you can carry more weight.\"";
+ mes "\"Agility increases your attack speed and your ability to dodge attacks.\"";
+ mes "\"Vitality gives you more hit points and more defense against physical attacks.\"";
+ mes "\"Intelligence is useful for magic attack and defense.";
+ mes "But as long as you don't know any magic, you shouldn't use your points on this.\"";
+ mes "\"Dexterity is needed to hit monsters. It's also very important for the damage if you use a ranged weapon.\"";
+ mes "\"Luck gives you the chance to do critical hits and lowers the chance to receive a critical hit from your opponent.\"";
+ next;
+ mes "\"Think about how you want to play before assigning the points.\"";
+ mes "\"My Uncle sitting at the counter knows a spell to help the younglings reset their stats.\"";
+ mes "\"He can also change your hair style and color, along with your gender.\"";
+ mes "\"Furthermore, he knows of mages with even more powerful reset spells for your stats.\"";
+ next;
+ if (QL_BEGIN == 7)
+ goto L_Money;
+ goto L_Advice;
+
+L_Money:
+ next;
+ mes "[Tanisha]";
+ mes "\"Hey, you are so smart taking out all that yucky maggots for me.";
+ mes "You can have my pocket money. Here.\"";
+ QL_BEGIN = 8;
+ Zeny = Zeny + 5;
+ next;
+ goto L_Advice;
+
+L_Advice:
+ mes "\"When you go to Hurnscald, you should see Bernard. He can make a delicious soup!";
+ mes "Good luck!\"";
+ emotion EMOTE_HAPPY, strcharinfo(0);
+ goto L_close;
+
+L_Explain:
+ menu
+ "... how to fight?",L_Fight,
+ "... monsters?",L_Mob,
+ "... status points?",L_StatsRe,
+ "... what to do in Hurnscald?",L_Advice,
+ "... nevermind.",L_close;
+
+L_Fight:
+ mes "[Tanisha]";
+ mes "\"Press [###keyTargetMonster;] to focus on a monster. With [###keyTargetAttack;] you can focus and attack.";
+ mes "But it also works to click on the monster with your mouse.\"";
+ next;
+ mes "\"If you press the [###keyTarget;] button, you can abort your attack.\"";
+ next;
+ mes "\"Sometimes dead monsters leave some useful things. You can pick them up with pressing [###keyPickup;] or clicking on the items with your mouse.\"";
+ next;
+ mes "\"If you feel exhausted from battle you can sit down by pressing [###keyBeingSit;] to recover faster.\"";
+ goto L_close;
+
+L_Mob:
+ mes "[Tanisha]";
+ mes "\"I don't know much about monsters, I'm just a little girl. But I know a few things.";
+ mes "There are several types of monsters...Aggressive, Neutral, and Assistants.\"";
+ next;
+ mes "\"Aggressive monsters will attack you as soon as they see you.\"";
+ next;
+ mes "\"Neutral monsters are peaceful until they get attacked.\"";
+ next;
+ mes "\"Assistants are monsters who help each other.\"";
+ goto L_close;
+
+L_Tut_Done:
+ mes "[Tanisha]";
+ mes "\"These yucky maggots! They're eating our goods!";
+ mes "No matter how many of them you kill, they always come back.\"";
+ mes "She sighs.";
+ mes "[Tanisha]";
+ mes "\"Do you have any questions?\"";
+ menu
+ "Yes, could you explain about...", L_Explain,
+ "No, thanks.", L_close;
+
+L_Crowded:
+ mes "[Tanisha]";
+ mes "\"That's great! But...";
+ mes "it seems a little crowded in there.\"";
+ mes "\"Let's wait a short while.\"";
+ goto L_close;
+
+L_Sleep:
+ warp "029-2", 101, 87;
+ mes "[Tanisha]";
+ mes "\"What are you doing in there?";
+ mes "Sleeping?";
+ mes "Come back when you're serious.\"";
+ @Maggot_Kills = 0;
+ @time = 0;
+ close2;
+ if (getareausers("029-2", 98, 84, 106, 89) == 0)
+ goto L_CleanUp;
+ end;
+
+L_Fail:
+ mes "Tanisha seems to be trying hard to supress laughter.";
+ mes "[Tanisha]";
+ mes "\"The maggots defeated you.\"";
+ mes "She bursts out with laughter.";
+ mes "\"Oops, I'm sorry. It's just too funny.";
+ mes "Do you want to try it again?\"";
+ menu
+ "Sure!", L_Next2,
+ "No, I need a rest.", L_close;
+
+L_Next2:
+ if (getareausers("029-2", 98, 84, 106, 89) >= $@Maggot_MaxHunters)
+ goto L_Crowded;
+ goto L_Fight_Again;
+
+L_Fighting:
+ npctalk strnpcinfo(0), "##3I believe in you!", strcharinfo(0);
+ end;
+
+OnTimer1000:
+ setnpctimer 0;
+ 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 0, "029-2", 98, 84, 106, 89, 0, "Tanisha::OnTick";
+ end;
+
+L_CleanUp:
+ killmonster "029-2", "Tanisha::OnMaggotDeath";
+ $@Maggot_Hunters = 0;
+ stopnpctimer;
+ areamonster "029-2", 98, 84, 106, 89, "", 1002, 1, "Tanisha::OnMaggotDeath";
+ end;
+
+OnTick:
+ @time = @time + 1;
+ if (@time > 300)
+ goto L_Sleep;
+ if (ispcdead())
+ end;
+ if (Hp > 20)
+ end;
+ heal MaxHp, 0;
+ npctalk strnpcinfo(0), "##3You're doing good!", strcharinfo(0);
+ end;
+
+OnMaggotDeath:
+ if (@Maggot_Kills == 1)
+ npctalk strnpcinfo(0), "##3Aaahhhh... another one! It will crawl up your legs!", strcharinfo(0);
+ if (@Maggot_Kills == 2)
+ npctalk strnpcinfo(0), "##3Ohh... Irrhk... Eeeeww... They just appear from nowhere!", strcharinfo(0);
+ if (@Maggot_Kills == 3)
+ npctalk strnpcinfo(0), "##3Yuck... I think I am getting sick.", strcharinfo(0);
+ if (isin("029-2", 98, 84, 106, 89))
+ @Maggot_Kills = @Maggot_Kills + 1;
+ if (@Maggot_Kills < 5)
+ goto L_Summon;
+ // else, complete
+ warp "029-2", 110, 88;
+ QL_BEGIN = 7;
+ @Maggot_Kills = 0;
+ @time = 0;
+ if (getareausers("029-2", 98, 84, 106, 89) == 0)
+ goto L_CleanUp;
+ end;
+
+L_close:
+ close;
+
+OnInit:
+ $@Maggot_MaxHunters = 4;
+ areamonster "029-2", 98, 84, 106, 89, "", 1002, 1, "Tanisha::OnMaggotDeath";
+ end;
+}
+029-2,114,93,0 script #DoorOutTut2 NPC45,0,0,{
+ end;
+
+OnTouch:
+ if (QL_BEGIN >= 8)
+ goto L_Warp;
+ goto L_Block;
+
+L_Warp:
+ mapmask getmask();
+ warp "029-1", 32, 100;
+ end;
+
+L_Block:
+ npctalk "Tanisha", "##3##BPlease come here. ##bI'd like some help!", strcharinfo(0);
+ end;
+}
diff --git a/npc/029-2/two_arms.txt b/npc/029-2/two_arms.txt
new file mode 100644
index 00000000..f01cf644
--- /dev/null
+++ b/npc/029-2/two_arms.txt
@@ -0,0 +1,32 @@
+
+029-2,99,25,0 script Rosen NPC311,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem SlingShot;
+ sellitem SlingBullet;
+ sellitem ShortBow;
+ sellitem Arrow, 2;
+ sellitem IronArrow;
+ .distance = 5;
+ end;
+}
+
+029-2,112,24,0 script Toichi NPC377,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Knife;
+ sellitem SharpKnife;
+ sellitem Dagger;
+ sellitem LeatherShirt;
+ sellitem LeatherShield;
+ .distance = 5;
+ end;
+}
diff --git a/npc/029-3/_import.txt b/npc/029-3/_import.txt
new file mode 100644
index 00000000..632d106c
--- /dev/null
+++ b/npc/029-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 029-3: Candor Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/029-3/barrier.txt",
+"npc/029-3/mapflags.txt",
+"npc/029-3/parua.txt",
diff --git a/npc/029-3/barrier.txt b/npc/029-3/barrier.txt
new file mode 100644
index 00000000..36c270a7
--- /dev/null
+++ b/npc/029-3/barrier.txt
@@ -0,0 +1,9 @@
+029-3,49,54,0 script #FightCaveBarrier NPC45,0,0,{
+ if ($@FIGHT_CAVE_STATUS == 1) goto L_Block;
+ warp "029-1", 69, 62;
+ end;
+
+L_Block:
+ message strcharinfo(0), "Some force seems to be blocking you from exiting.";
+ end;
+}
diff --git a/npc/029-3/mapflags.txt b/npc/029-3/mapflags.txt
new file mode 100644
index 00000000..f64a309a
--- /dev/null
+++ b/npc/029-3/mapflags.txt
@@ -0,0 +1,2 @@
+029-3 mapflag nosave 029-1,39,102
+029-3 mapflag zone MMO
diff --git a/npc/029-3/parua.txt b/npc/029-3/parua.txt
new file mode 100644
index 00000000..bfa3e4ba
--- /dev/null
+++ b/npc/029-3/parua.txt
@@ -0,0 +1,400 @@
+029-3,50,25,0 script Parua NPC183,{
+ $@candor_npctalk$ = "The dungeon is now ready for its next victims.";
+ donpcevent "#CandorAnnouncer::OnCommandTalk";
+ @FIGHT_CAVE_COST = 20000;
+ @FIGHT_CAVE_COST$ = "20,000";
+ @FIGHT_CAVE_ANNOUNCE_COST = 3000;
+ @FIGHT_CAVE_ANNOUNCE_COST$ = "3,000";
+ if ($@FIGHT_CAVE_STATUS == 1) goto L_Enjoy;
+ if ($@FIGHT_CAVE_STATUS >= 2 && $@ANNOUNCE_TIME > gettimetick(2)) goto L_Wait;
+ mesn;
+ mes "\"Hello.\"";
+ next;
+ mesn;
+ mes "\"Do you dare challenge the power that sleeps here?\"";
+ menu "No, I'll let it sleep.", L_Exit,
+ "Ha! What's the worst it could do?", L_Next,
+ "What is this place anyway?", L_Explain,
+ "Actually, I want to leave, but I'm stuck!", L_Stuck;
+
+L_Next:
+ mesn;
+ mes "\"Very well, for a fee of "+@FIGHT_CAVE_COST$+" GP, I will awaken that power.\"";
+ menu "No, what a ripoff!", L_Exit,
+ "Fine, here you go.", L_Fine;
+
+L_Fine:
+ if ($@FIGHT_CAVE_STATUS == 1)
+ goto L_AlreadyStarted;
+ if (Zeny >= @FIGHT_CAVE_COST + @FIGHT_CAVE_ANNOUNCE_COST)
+ goto L_CallPlayers;
+ goto L_Paying;
+
+L_Paying:
+ if (getmapusers("029-3") < 5)
+ goto L_NotEnoughPlayers;
+ if (Zeny < @FIGHT_CAVE_COST)
+ goto L_NotEnough;
+ if ($@FIGHT_CAVE_STATUS != 0)
+ goto L_AlreadyStarted;
+ if ($@FIGHT_CAVE_PAID != 0)
+ goto L_AlreadyStarted;
+ Zeny = Zeny - @FIGHT_CAVE_COST;
+ $@FIGHT_CAVE_PAID = 1;
+ goto L_StartFight;
+
+L_StartFight:
+ if (getmapusers("029-3") < 5)
+ goto L_NotEnoughPlayers;
+ npctalk strnpcinfo(0), "Let the battle begin!";
+ $@FIGHT_CAVE_STATUS = 1;
+ $@FIGHT_CAVE_LEVEL = 1;
+ $@FIGHT_CAVE_PLAYER_COUNT = getmapusers("029-3");
+ startnpctimer;
+ goto L_Exit;
+
+L_CallPlayers:
+ mesn;
+ mes "\"Good... Your money will be very useful. I can awaken this power right now, if you want, or, for an additional fee of "+@FIGHT_CAVE_ANNOUNCE_COST$+" GP, I can help you gather some of your friends to help you in this battle. What will it be?\"";
+ menu
+ "We are OK. Just do it!", L_Paying,
+ "I will accept your help.", L_AcceptHelp;
+
+L_AcceptHelp:
+ mesn;
+ mes "\"OK, I can make up to 3 announcements to the people of this world, letting them know that you are about to challenge the powers that sleep in this cave! If you want the fight to start in 5 minutes, I will make one announcement, if it is 10 minutes, I will make 2 announcements, and if it is to start in 15 minutes, it will be 3 announcements.\"";
+ next;
+ mes "\"But be careful! If there aren't at least five people here at the time of the fight, your money will be lost.\"";
+ next;
+ mes "\"So, when should it start?\"";
+ menu
+ "In 5 minutes.", L_TimeFightStart,
+ "In 10 minutes.", L_TimeFightStart,
+ "In 15 minutes.", L_TimeFightStart,
+ "I don't want to wait. Let's start it now!", L_Paying;
+
+L_TimeFightStart:
+ if ($@FIGHT_CAVE_STATUS != 0)
+ goto L_AlreadyStarted;
+ if (getmapusers("029-3") < 5)
+ goto L_NotEnoughPlayers;
+ if (Zeny < @FIGHT_CAVE_COST + @FIGHT_CAVE_ANNOUNCE_COST)
+ goto L_NotEnough_Announce;
+ if ($@FIGHT_CAVE_PAID != 0)
+ goto L_AlreadyStarted;
+ Zeny = Zeny - (@FIGHT_CAVE_COST + @FIGHT_CAVE_ANNOUNCE_COST);
+ $@FIGHT_CAVE_PAID = 1;
+ $@SPONSOR$ = strcharinfo(0);
+ $@FIGHT_CAVE_STATUS = $@FIGHT_CAVE_STATUS + (@menu + 2);
+ if ($@FIGHT_CAVE_STATUS == 3)
+ $@ANNOUNCE_TIME = gettimetick(2) + 300;
+ if ($@FIGHT_CAVE_STATUS == 4)
+ $@ANNOUNCE_TIME = gettimetick(2) + 600;
+ if ($@FIGHT_CAVE_STATUS >= 5)
+ $@ANNOUNCE_TIME = gettimetick(2) + 900;
+ startnpctimer;
+ close;
+
+L_Enjoy:
+ mesn;
+ mes "\"Enjoy the fight!\"";
+ goto L_Exit;
+
+L_Wait:
+ @seconds = $@ANNOUNCE_TIME - gettimetick(2);
+ callfunc "HumanTime";
+ mesn;
+ mes "\"Be Patient... The fight will start in " + @time$ + ".\"";
+ goto L_Exit;
+
+L_NotEnough:
+ mesn;
+ mes "\"Seems you can't meet my fee.\"";
+ goto L_Exit;
+
+L_NotEnough_Announce:
+ mesn;
+ mes "\"Seems you can't meet the announcement fee.\"";
+ goto L_Exit;
+
+L_AlreadyStarted:
+ mesn;
+ mes "\"Seems your friend already paid me.\"";
+ goto L_Exit;
+
+L_NotEnoughPlayers:
+ if ($@FIGHT_CAVE_STATUS == 2)
+ goto L_CleanUp_Announcement;
+ mesn;
+ mes "\"Maybe you should bring some friends with you; this will get messy.\"";
+ mes "He takes a moment to calculate. \"You'll probably need at least...five people, including yourself.\"";
+ goto L_Exit;
+
+L_Explain:
+ mesn;
+ mes "\"Long ago many human beings and other creatures have been slaughtered in a battle in this now cursed cave. Their souls still lie here.\"";
+ next;
+ mes "\"My try to use a spell to cure this place from the curse backfired and turned me into this.\"";
+ next;
+ mes "\"To change me back expensive ingredients for a curing potion are required.\"";
+ next;
+ mes "\"Pay me and I will use my dark astral magic to summon the undead. If you survive you will receive 100 Boss Points.\"";
+ menu
+ "I need to think about this.", L_Exit,
+ "I'm interested.", L_Next,
+ "What are Boss Points?", L_Explain_Boss_Points;
+
+L_Explain_Boss_Points:
+ mesn;
+ mes "\"Boss points are another type of experience.\"";
+ next;
+ mes "\"Fighting experience makes you level up, magic experience makes your spells more effective and allows you to learn new spells.\"";
+ next;
+ mes "\"Boss Points show your skills and nerves in important battles and heroic actions.\"";
+ next;
+ mes "\"Be aware, they can be consumed as well. For instance by negative actions, such as selfishness or simply stupidity.\"";
+ menu
+ "Thanks, I will think about your offer now.", L_Exit,
+ "I want to challenge the powers in this cave.", L_Next;
+
+L_Stuck:
+ mesn;
+ mes "\"I see. I can teleport you to another nice cave.\"";
+ mes "His face doesn't show any emotion, but his voice sounds threatening.";
+ menu
+ "Please do so!", L_Warp,
+ "I changed my mind.", L_Exit;
+
+L_Warp:
+ warp "005-3", 86, 34;
+ goto L_Exit;
+
+L_Exit:
+ close;
+
+OnTimer5000:
+ setnpctimer 0;
+ if ($@FIGHT_CAVE_STATUS == 1)
+ goto L_CaveLogic;
+ if ($@FIGHT_CAVE_STATUS >= 2)
+ goto L_GlobalAnnounce;
+ goto L_Return_1;
+
+L_Return_1:
+ $@FIGHT_CAVE_PLAYER_COUNT = 0;
+ areatimer 0, "029-3", 20, 20, 70, 60, 10, "Parua::OnTick";
+ end;
+
+L_CaveLogic:
+ $@FIGHT_CAVE_ROUND_PEN = $@FIGHT_CAVE_PLAYER_COUNT;
+ if ($@FIGHT_CAVE_ROUND_PEN > 60)
+ $@FIGHT_CAVE_ROUND_PEN = 60;
+ if ($@FIGHT_CAVE_PLAYER_COUNT <= 0)
+ goto L_CleanUp;
+ set $@FIGHT_CAVE_ROUND_TIMER, $@FIGHT_CAVE_ROUND_TIMER + 5; // Advance 5 seconds
+ if (mobcount("029-3", "Parua::OnPetDeath") <= 0)
+ goto L_NextRound;
+ if ($@FIGHT_CAVE_ROUND_TIMER + $@FIGHT_CAVE_ROUND_PEN >= 120)
+ goto L_NextRound;
+ goto L_Return_1;
+
+L_NextRound:
+ $@FIGHT_CAVE_ROUND_TIMER = 0;
+
+ $@FIGHT_CAVE_TEMP_UP = ($@FIGHT_CAVE_LEVEL / 10);
+ if ($@FIGHT_CAVE_TEMP_UP > 100)
+ $@FIGHT_CAVE_TEMP_UP = 100;
+
+ $@FIGHT_CAVE_LEVEL = $@FIGHT_CAVE_LEVEL + $@FIGHT_CAVE_PLAYER_COUNT + $@FIGHT_CAVE_TEMP_UP;
+ if ($@FIGHT_CAVE_LEVEL >= 2200)
+ goto L_CleanUp;
+ $@FIGHT_CAVE_POINTS = $@FIGHT_CAVE_LEVEL;
+
+ areatimer 0, "029-3", 20, 20, 70, 60, 10, "Parua::OnNewRound";
+
+ $@candor_npctalk$ = "The next round (level " + $@FIGHT_CAVE_LEVEL + ") is starting with " + $@FIGHT_CAVE_PLAYER_COUNT + " player(s) left alive.";
+ donpcevent "#CandorAnnouncer::OnCommandTalk";
+ mapannounce "029-3", "Parua : The next round (level " + $@FIGHT_CAVE_LEVEL + ") is starting with " + $@FIGHT_CAVE_PLAYER_COUNT + " player(s) left alive." , 0;
+
+ $@MOB_1_SUMMON = 0;
+ $@MOB_2_SUMMON = 0;
+ $@MOB_3_SUMMON = 0;
+ $@MOB_4_SUMMON = 0;
+ $@MOB_5_SUMMON = 0;
+ $@MOB_6_SUMMON = 0;
+ goto L_Summon;
+
+L_Summon:
+ if ($@FIGHT_CAVE_POINTS >= 243
+ && $@MOB_1_SUMMON < 2)
+ goto L_MOB1;
+ if ($@FIGHT_CAVE_POINTS >= 81
+ && $@MOB_2_SUMMON < 6)
+ goto L_MOB2;
+ if ($@FIGHT_CAVE_POINTS >= 27
+ && $@MOB_3_SUMMON < 5)
+ goto L_MOB3;
+ if ($@FIGHT_CAVE_POINTS >= 9
+ && $@MOB_4_SUMMON < 7)
+ goto L_MOB4;
+ if ($@FIGHT_CAVE_POINTS >= 3
+ && $@MOB_5_SUMMON < 10)
+ goto L_MOB5;
+ if ($@FIGHT_CAVE_POINTS >= 1
+ && $@MOB_6_SUMMON < 12)
+ goto L_MOB6;
+ goto L_Return_1;
+
+L_GlobalAnnounce:
+ $@FIGHT_CAVE_PLAYER_COUNT = getmapusers("029-3");
+ if ($@FIGHT_CAVE_STATUS == 3)
+ goto L_Five_Minutes;
+ if ($@FIGHT_CAVE_STATUS == 4)
+ goto L_Ten_Minutes;
+ if ($@FIGHT_CAVE_STATUS >= 5)
+ goto L_Fifteen_Minutes;
+ if (gettimetick(2) >= $@ANNOUNCE_TIME)
+ goto L_StartFight;
+ end;
+
+L_Five_Minutes:
+ if ($@ANNOUNCE_TIME - gettimetick(2) > 300)
+ end;
+ if($@FIGHT_CAVE_PLAYER_COUNT == 1) announce "Parua : " + $@SPONSOR$ + " invites everyone to a challenge against the powers that sleep in Candor. It is almost time! The fight will start in ##B##75 minutes##1##b and, at the moment, there is ##3only 1 fighter##1 in the cave.", 0;
+ if(($@FIGHT_CAVE_PLAYER_COUNT > 1) && ($@FIGHT_CAVE_PLAYER_COUNT < 5)) announce "Parua : " + $@SPONSOR$ + " invites everyone to a challenge against the powers that sleep in Candor. It is almost time! The fight will start in ##B##75 minutes##1##b and, at the moment, there are ##3only " + $@FIGHT_CAVE_PLAYER_COUNT + " fighters##1 in the cave.", 0;
+ if($@FIGHT_CAVE_PLAYER_COUNT >= 5) announce "Parua : " + $@SPONSOR$ + " invites everyone to a challenge against the powers that sleep in Candor. It is almost time! The fight will start in ##B##75 minutes##1##b and, at the moment, there are ##0" + $@FIGHT_CAVE_PLAYER_COUNT + " fighters##1 in the cave.", 0;
+ $@FIGHT_CAVE_STATUS = 2;
+ end;
+
+L_Ten_Minutes:
+ if ($@ANNOUNCE_TIME - gettimetick(2) > 600)
+ end;
+ if($@FIGHT_CAVE_PLAYER_COUNT == 1) announce "Parua : " + $@SPONSOR$ + " invites everyone to a challenge against the powers that sleep in Candor. You still have time to prepare yourself for this fight, since it will only start in ##B##610 minutes##1##b. Right now, there is ##3only 1 fighter##1 in the cave.", 0;
+ if(($@FIGHT_CAVE_PLAYER_COUNT > 1) && ($@FIGHT_CAVE_PLAYER_COUNT < 5)) announce "Parua : " + $@SPONSOR$ + " invites everyone to a challenge against the powers that sleep in Candor. You still have time to prepare yourself for this fight, since it will only start in ##B##610 minutes##1##b. Right now, there are ##3only " + $@FIGHT_CAVE_PLAYER_COUNT + " fighters##1 in the cave.", 0;
+ if($@FIGHT_CAVE_PLAYER_COUNT >= 5) announce "Parua : " + $@SPONSOR$ + " invites everyone to a challenge against the powers that sleep in Candor. You still have time to prepare yourself for this fight, since it will only start in ##B##610 minutes##1##b. Right now, there are ##0" + $@FIGHT_CAVE_PLAYER_COUNT + " fighters##1 in the cave.", 0;
+ $@FIGHT_CAVE_STATUS = 3;
+ end;
+
+L_Fifteen_Minutes:
+ if($@FIGHT_CAVE_PLAYER_COUNT == 1) announce "Parua : " + $@SPONSOR$ + " invites everyone to a challenge against the powers that sleep in Candor. The fight will start in ##B##615 minutes##1##b, so prepare yourself and call your friends. At the moment there is ##3only 1 fighter##1 in the cave.", 0;
+ if(($@FIGHT_CAVE_PLAYER_COUNT > 1) && ($@FIGHT_CAVE_PLAYER_COUNT < 5)) announce "Parua : " + $@SPONSOR$ + " invites everyone to a challenge against the powers that sleep in Candor. The fight will start in ##B##615 minutes##1##b, so prepare yourself and call your friends. At the moment there are ##3only " + $@FIGHT_CAVE_PLAYER_COUNT + " fighters##1 in the cave.", 0;
+ if($@FIGHT_CAVE_PLAYER_COUNT >= 5) announce "Parua : " + $@SPONSOR$ + " invites everyone to a challenge against the powers that sleep in Candor. The fight will start in ##B##615 minutes##1##b, so prepare yourself and call your friends. At the moment there are ##0" + $@FIGHT_CAVE_PLAYER_COUNT + " fighters##1 in the cave.", 0;
+ $@FIGHT_CAVE_STATUS = 4;
+ end;
+
+L_MOB1:
+ $@MOB_1_SUMMON = $@MOB_1_SUMMON + 1;
+ $@FIGHT_CAVE_POINTS = $@FIGHT_CAVE_POINTS - 243;
+ areamonster "029-3", 20, 20, 70, 60, "", 1022, 1, "Parua::OnPetDeath";
+ goto L_Summon;
+
+L_MOB2:
+ $@MOB_2_SUMMON = $@MOB_2_SUMMON + 1;
+ $@FIGHT_CAVE_POINTS = $@FIGHT_CAVE_POINTS - 81;
+ areamonster "029-3", 20, 20, 70, 60, "", 1045, 1, "Parua::OnPetDeath";
+ goto L_Summon;
+
+L_MOB3:
+ $@MOB_3_SUMMON = $@MOB_3_SUMMON + 1;
+ $@FIGHT_CAVE_POINTS = $@FIGHT_CAVE_POINTS - 27;
+ areamonster "029-3", 20, 20, 70, 60, "", 1024, 1, "Parua::OnPetDeath";
+ goto L_Summon;
+
+L_MOB4:
+ $@MOB_4_SUMMON = $@MOB_4_SUMMON + 1;
+ $@FIGHT_CAVE_POINTS = $@FIGHT_CAVE_POINTS - 9;
+ areamonster "029-3", 20, 20, 70, 60, "", 1043, 1, "Parua::OnPetDeath";
+ goto L_Summon;
+
+L_MOB5:
+ $@MOB_5_SUMMON = $@MOB_5_SUMMON + 1;
+ $@FIGHT_CAVE_POINTS = $@FIGHT_CAVE_POINTS - 3;
+ areamonster "029-3", 20, 20, 70, 60, "", 1010, 1, "Parua::OnPetDeath";
+ goto L_Summon;
+
+L_MOB6:
+ $@MOB_6_SUMMON = $@MOB_6_SUMMON + 1;
+ $@FIGHT_CAVE_POINTS = $@FIGHT_CAVE_POINTS - 1;
+ areamonster "029-3", 20, 20, 70, 60, "", 1008, 1, "Parua::OnPetDeath";
+ goto L_Summon;
+
+OnTick:
+ if (ispcdead()) end;
+ $@FIGHT_CAVE_PLAYER_COUNT = $@FIGHT_CAVE_PLAYER_COUNT + 1;
+ end;
+
+OnNewRound:
+ if (ispcdead())
+ end;
+ if ($@FIGHT_CAVE_LEVEL < 600)
+ end;
+ @candor_oldx = @candor_x;
+ @candor_oldy = @candor_y;
+ @candor_x = getx();
+ @candor_y = gety();
+ if (!(@candor_oldx == @candor_x && @candor_oldy == @candor_y))
+ goto L_IdleCheckPassed;
+ @candor_idle_counter = @candor_idle_counter + 1;
+ sc_start SC_POISON, 1, @candor_idle_counter*25;
+ heal ((MaxHp/100) * (-20 * @candor_idle_counter)), 0;
+ message strcharinfo(0), "The evil energy of this place hurts you. You should keep moving!";
+ end;
+
+OnPetDeath:
+ end;
+
+OnInit:
+ if (debug >= 2) end;
+ initnpctimer;
+ stopnpctimer;
+ goto L_CleanUp;
+
+L_CleanUp:
+ npctalk strnpcinfo(0), "Game Over";
+ $@candor_npctalk$ = "The dungeon is now ready for its next victims.";
+ donpcevent "#CandorAnnouncer::OnCommandTalk";
+ areatimer 0, "029-3", 20, 20, 70, 60, 10, "Parua::OnReward";
+ $@FIGHT_CAVE_STATUS = 0;
+ $@ANNOUNCE_TIME = 0;
+ $@FIGHT_CAVE_PAID = 0;
+ $@FIGHT_CAVE_PLAYER_COUNT = 0;
+ $@FIGHT_CAVE_LEVEL = 1;
+ $@FIGHT_CAVE_ROUND_TIMER = 0;
+ killmonster "029-3", "Parua::OnPetDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+L_CleanUp_Announcement:
+ npctalk strnpcinfo(0), $@SPONSOR$ + " lost the money invested in the fight, since there are less than 5 players in the cave";
+ $@SPONSOR$ = "";
+ $@ANNOUNCE_TIME = 0;
+ $@FIGHT_CAVE_STATUS = 0;
+ $@FIGHT_CAVE_PAID = 0;
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnPCDieEvent:
+ goto L_CleanUp_Player;
+
+L_CleanUp_Player:
+ @candor_oldx = 0;
+ @candor_oldy = 0;
+ @candor_x = 0;
+ @candor_y = 0;
+ @candor_idle_counter = 0;
+ end;
+
+L_IdleCheckPassed:
+ //FIXME we could do that, but I'd say, let's be severe.
+ //set @candor_idle_counter, 0;
+ end;
+
+OnReward:
+ if (ispcdead())
+ end;
+ BOSS_POINTS = BOSS_POINTS + 100;
+ message strcharinfo(0), "You gain 100 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ goto L_CleanUp_Player;
+}
diff --git a/npc/029-4/_import.txt b/npc/029-4/_import.txt
new file mode 100644
index 00000000..523017f2
--- /dev/null
+++ b/npc/029-4/_import.txt
@@ -0,0 +1,4 @@
+// Map 029-4: 2014 Candor
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/029-4/_mobs.txt",
+"npc/029-4/_warps.txt",
diff --git a/npc/029-4/_mobs.txt b/npc/029-4/_mobs.txt
new file mode 100644
index 00000000..b4aa8648
--- /dev/null
+++ b/npc/029-4/_mobs.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 029-4: 2014 Candor mobs
+029-4,69,65,6,6 monster Evil Mushroom 1013,4,20000,60000
+029-4,32,33,6,6 monster Squirrel 1038,3,30000,60000
+029-4,46,48,2,0 monster Clover Patch 1037,1,10000,120000
+029-4,37,60,11,10 monster Spiky Mushroom 1019,5,10000,30000
+029-4,54,36,8,9 monster Bat 1017,4,25000,30000
+029-4,59,51,6,4 monster Log Head 1025,2,25000,30000
diff --git a/npc/029-4/_warps.txt b/npc/029-4/_warps.txt
new file mode 100644
index 00000000..5ebfd55a
--- /dev/null
+++ b/npc/029-4/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 029-4: 2014 Candor warps
+029-4,22,38,0 warp #029-4_22_38 0,1,029-1,25,38
diff --git a/npc/030-1/_import.txt b/npc/030-1/_import.txt
new file mode 100644
index 00000000..6abb9f07
--- /dev/null
+++ b/npc/030-1/_import.txt
@@ -0,0 +1,4 @@
+// Map 030-1: Romantic Place
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/030-1/_mobs.txt",
+"npc/030-1/_warps.txt",
diff --git a/npc/030-1/_mobs.txt b/npc/030-1/_mobs.txt
new file mode 100644
index 00000000..58b3a91e
--- /dev/null
+++ b/npc/030-1/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 030-1: Romantic Place mobs
+030-1,0,0,0,0 monster Pollett 1113,7,100000,30000
+030-1,0,0,0,0 monster White Bell 1095,4,100000,30000
+030-1,71,67,0,0 monster Santaboo 1112,2,100000,30000
+030-1,71,67,0,0 monster Reinboo 1094,2,100000,30000
diff --git a/npc/030-1/_warps.txt b/npc/030-1/_warps.txt
new file mode 100644
index 00000000..4da1883c
--- /dev/null
+++ b/npc/030-1/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 030-1: Romantic Place warps
+030-1,61,27,0 warp #030-1_61_27 3,0,019-1,101,101
diff --git a/npc/030-2/_import.txt b/npc/030-2/_import.txt
new file mode 100644
index 00000000..4e952e7d
--- /dev/null
+++ b/npc/030-2/_import.txt
@@ -0,0 +1,17 @@
+// Map 030-2: Christmas Inn
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/030-2/_warps.txt",
+"npc/030-2/avalia.txt",
+"npc/030-2/basic_npcs.txt",
+"npc/030-2/bedding_helper.txt",
+"npc/030-2/chief_helper.txt",
+"npc/030-2/eljas.txt",
+"npc/030-2/empty_boxes_helper.txt",
+"npc/030-2/glitter_helper.txt",
+"npc/030-2/guards.txt",
+"npc/030-2/mapflags.txt",
+"npc/030-2/present_helper.txt",
+"npc/030-2/roasted_acorns_helper.txt",
+"npc/030-2/shipping_helper.txt",
+"npc/030-2/storage_helper.txt",
+"npc/030-2/wrapping_paper_helper.txt",
diff --git a/npc/030-2/_warps.txt b/npc/030-2/_warps.txt
new file mode 100644
index 00000000..7498cdee
--- /dev/null
+++ b/npc/030-2/_warps.txt
@@ -0,0 +1,17 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 030-2: Christmas Inn warps
+030-2,88,51,0 warp #030-2_88_51 0,0,020-1,33,94
+030-2,72,31,0 warp #030-2_72_31 0,0,030-2,51,31
+030-2,194,68,0 warp #030-2_194_68 0,0,030-2,78,88
+030-2,52,31,0 warp #030-2_52_31 0,0,030-2,73,31
+030-2,75,19,0 warp #030-2_75_19 1,0,030-2,127,50
+030-2,102,19,0 warp #030-2_102_19 1,0,030-2,153,50
+030-2,127,51,0 warp #030-2_127_51 1,0,030-2,75,20
+030-2,154,51,0 warp #030-2_154_51 1,0,030-2,101,20
+030-2,156,24,0 warp #030-2_156_24 0,1,030-2,21,78
+030-2,20,78,0 warp #030-2_20_78 0,1,030-2,155,24
+030-2,42,105,0 warp #030-2_42_105 1,0,030-2,93,74
+030-2,94,73,0 warp #030-2_94_73 1,0,030-2,41,104
+030-2,102,73,0 warp #030-2_102_73 1,0,030-2,127,104
+030-2,127,105,0 warp #030-2_127_105 1,0,030-2,102,74
+030-2,78,87,0 warp #030-2_78_87 0,0,030-2,194,67
diff --git a/npc/030-2/avalia.txt b/npc/030-2/avalia.txt
new file mode 100644
index 00000000..63f8eaf1
--- /dev/null
+++ b/npc/030-2/avalia.txt
@@ -0,0 +1,219 @@
+
+030-2,198,61,0 script Avalia NPC356,{
+ callfunc "XmasStates";
+
+ if(($@xmas_time) && !(@xmas_side))
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Avalia]";
+ mes "\"What are you doing in here? Get out!\"";
+ warp "030-2",88,80;
+ close;
+
+L_XmasMain:
+ if(@xmas_reward_done_state) goto L_ThankYou;
+ if(@xmas_reward1_done_state) goto L_Thanks;
+ if(@xmas_reward_start_state) goto L_Reward;
+ if(@xmas_reward2_done_state) goto L_Reward;
+ if(@xmas_boss_door_state) goto L_Quick;
+ if(@xmas_reagent_done_state) goto L_PowerReagents;
+ if(@xmas_reagent_start_state) goto L_PowerReagents;
+ if(@xmas_helper_done_state) goto L_HelperQuest;
+ if(@xmas_helper_start_state) goto L_HelperQuest;
+ if(@xmas_list_deliver) goto L_ListReturn;
+ goto L_OffSeason;
+
+L_ListReturn:
+ mes "[Avalia]";
+ mes "\"This had better be important, I have got enough to worry about.\"";
+ menu
+ "Sorry for interrupting, but I have been sent up here with the List", L_Next;
+
+L_Next:
+ mes "She stares blankly at you for a bit...";
+ next;
+ mes "\"YAHOO!!\"";
+ next;
+ mes "\"One problem down, only a few more to go.\"";
+ next;
+ mes "\"Since you have already been so helpful, I was wondering if you could continue to do so?\"";
+ mes "\"I do have the power to reward you handsomely.\"";
+ next;
+ mes "\"You see this nutcracker here beside me? He is different from the rest. He had a will of his own. It started shortly after we installed the new power core.\"";
+ next;
+ mes "\"At first, it was just magical research that had me keep him close to me. As time wore on, mine and his interactions became more intimate. I was hoping to get my research done before the Holidays.\"";
+ next;
+ mes "\"I wanted to show Santa and ask to if he knew how to help make it permanent, but Someone didn't approve. Took away our central spell power core. Now all the nutcrackers are back to being mindless automatons. Now the Christmas Sages must use magic to animate them.\"";
+ next;
+ mes "\"Please you must help me find a way to restore our power core before Christmas. I want to show Santa Millis, so he can give him life permanently for me.\"";
+ mes "\"First I need time to do some more research. Which means I need to spend less time helping with the holidays. Can you check with the helpers and make sure everything is going smoothly?\"";
+ menu
+ "Sure.", L_Start;
+
+L_Start:
+ mes "\"Ok, go check in with Chief Warrick. You might have to persist a bit but he will let you help.\"";
+ mes "\"Once you have completed this task come back and talk to me. As he reports to me.\"";
+ @xmas_state = $@xmas_helpers_start_state;
+ callfunc "XmasSetState";
+ goto L_close;
+
+L_HelperQuest:
+ mes "[Avalia]";
+ mes "\"Welcome Back!\"";
+ mes "\"So how are the Holiday Preparations coming along?\"";
+ menu
+ "It's a mess but they got things handled.", L_Continue,
+ "I'd better get back to helping.", L_close;
+
+L_Continue:
+ callfunc "XmasHelperPoints";
+ callfunc "XmasStates";
+ if(@xmas_helper_done_state)
+ goto L_ManaBattery;
+ goto L_NotHelpEnough;
+
+L_NotHelpEnough:
+ mes "\"Hrmm... I'm still getting bugged. You better go back there and see whats going on.\"";
+ goto L_close;
+
+L_ManaBattery:
+ mes "\"Now that we are caught up on the holidays and I've finished my research, I know what is needed to make the spell permanent.\"";
+ next;
+ callfunc "ListReagents";
+ mes "\"When you have gathered the required materials please come back and see me.\"";
+ @xmas_state = $@xmas_reagents_start;
+ callfunc "XmasSetState";
+ callfunc "XmasXpReward";
+ goto L_close;
+
+L_IngredientList:
+ callfunc "ListReagents";
+ mes "\"When you have gathered the required materials please come back and see me.\"";
+ goto L_close;
+
+L_PowerReagents:
+ mes "[Avalia]";
+ mes "\"Welcome Back!\"";
+ mes "\"Have you gotten the reagents?\"";
+ menu
+ "Yes.", L_CheckReagents,
+ "What were they again?", L_IngredientList,
+ "No.", L_NotEnough;
+
+L_CheckReagents:
+ callfunc "CheckReagents";
+ callfunc "XmasStates";
+ if(!(@xmas_reagent_done_state))
+ goto L_NotEnough;
+ callfunc "DeleteReagents";
+ mes "\"Huzzah!, you have all the required components!\"";
+ mes "\"Now I can create a ManaBattery to power the Nutcrackers from a central location.\"";
+ mes "\"Our sages will now be free to perform other tasks. Oh boy the holidays are going to get easy again!\"";
+ mes "\"Stand back, this spell could backfire.\"";
+ next;
+ mes "You watch as she puts equal amounts of emerald powder into each of the empty bottles.";
+ mes "She methodically crushes up the shock sweet and spreads it amongst the empty bottles.";
+ mes "She positions the four bottles in a stand so all the openings are mostly facing each other.";
+ mes "She Begins to chant.";
+ next;
+ mes "[Avalia]";
+ mes "O";
+ next;
+ mes "wat";
+ next;
+ mes "goo";
+ next;
+ mes "siam";
+ next;
+ mes "The bottles begin to pulse with mana.";
+ mes "She continues to chant";
+ next;
+ mes "[Avalia]";
+ mes "Aye";
+ next;
+ mes "Am";
+ next;
+ mes "Knot";
+ next;
+ mes "Phunee";
+ next;
+ mes "Mana surges to life in the bottles making a peel of thunder.";
+ next;
+ mes "[Avalia]";
+ mes "\"Phew! That takes alot out of a person.\"";
+ mes "\"I'm in no condition to go anywhere.\"";
+ mes "\"Take the Mana Battery and install it in the warehouse.\"";
+ mes "\"It's found behind Chief Warrick\"";
+ @xmas_state = $@xmas_boss_door_open_state;
+ callfunc "XmasSetState";
+ callfunc "XmasXpReward";
+ goto L_close;
+
+L_NotEnough:
+ mes "\"I need all the reagents before Santa visits. Come back and see me when you have them.\"";
+ goto L_close;
+
+L_Quick:
+ mes "[Avalia]";
+ mes "\"What are you still doing here?\"";
+ mes "\"Quickly, to the warehouse.\"";
+ goto L_close;
+
+L_Reward:
+ mes "[Avalia]";
+ mes "\"Thanks for all the help.\"";
+ mes "\"Take this as a token of my gratitude.\"";
+ if (@xmas_reward2_done_state)
+ @xmas_state = $@xmas_reward_done;
+ if (@xmas_reward_start_state)
+ @xmas_state = $@xmas_reward1_done;
+ callfunc "XmasSetState";
+ callfunc "XmasMainXpBpReward";
+ goto L_close;
+
+L_Thanks:
+ mes "[Avalia]";
+ mes "\"Please feel free to continue to help us while we prepare your reward.\"";
+ goto L_close;
+
+L_ThankYou:
+ mes "\"We can't thank you enough for restoring the nutcrackers humanity.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
+
+030-2,190,64,0 script Milis NPC330,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Milis]";
+ mes "\"What are you doing in here, get out!\"";
+ warp "030-2",88,80;
+ close;
+
+L_XmasMain:
+ if(@xmas_reward_start_state)
+ goto L_Reward;
+ goto L_NoResponse;
+
+L_Reward:
+ mes "[Milis]";
+ mes "\"Thanks for you help! I a REAL MAN, once again.\"";
+ goto L_close;
+
+L_NoResponse:
+ mes "[Milis]";
+ mes "...";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/030-2/basic_npcs.txt b/npc/030-2/basic_npcs.txt
new file mode 100644
index 00000000..10b97cd2
--- /dev/null
+++ b/npc/030-2/basic_npcs.txt
@@ -0,0 +1,73 @@
+
+
+030-2,37,81,0 script Oswal NPC328,{
+ mes "[Oswal]";
+ mes "\"Welcome. I hope you enjoy your visit in Santa's residence. You already saw the workshop where the Christmas presents are crafted, right?\"";
+ next;
+ mes "\"Well, here you are in the office. We're taking care of various administrative tasks. Some are related to Christmas, but we also need to keep the everyday business running.";
+ mes "Santa, as one of the most powerful Sages, has a lot of issues to pay attention to.\"";
+ close;
+}
+
+030-2,37,85,0 script Taito NPC328,{
+ mes "[Taito]";
+ mes "\"Hello. I'm sorry, but I'm very busy at the moment and want to concentrate. If you have any questions, ask one of the other helpers.\"";
+ close;
+}
+
+030-2,31,77,0 script Rikhard NPC329,{
+ mes "[Rikhard]";
+ mes "\"I'm really glad that this year's Christmas preparations are going well. You know, last year nearly everything went wrong, so we all had to work really hard on that, and the everyday issues had to be neglected.\"";
+ next;
+ mes "\"But there are very important topics we have to take care on as Santa's helpers. The Sages have an important role in the politics of Kaizei.\"";
+ next;
+ mes "\"As an example, currently I'm working on analyzing a trade regulation proposal from Tulimshar's Wizard Council. I can't get into the details about this, obviously. But, let me tell you, those Tulimshar people try to get everything under their control.\"";
+ next;
+ mes "\"It's part of our work to maintain Kaizei's independency. In my opinion the Sages should be much more reluctant about this anyway. But well, I'm only a mere helper, this isn't up to me. I can only do my best to deliver an analysis as accurate as possible.\"";
+ next;
+ mes "\"Which is why I should go back to work now.\"";
+ close;
+}
+
+030-2,31,85,0 script Akseli NPC329,{
+ mes "[Akseli]";
+ mes "\"Ah, a visitor! Do you enjoy your time in Santa's residence?\"";
+ menu
+ "Yes, it's really interesting.", L_Interesting,
+ "It's ok.", L_Rage,
+ "I'm confused, it's much bigger than from the outside.", L_Next;
+
+L_Next:
+ mes "[Akseli]";
+ mes "\"Ah, yes, that's a magic technique almost all of the Sages use. The house is located in a shifted dimension.\"";
+ goto L_close;
+
+L_Interesting:
+ mes "[Akseli]";
+ mes "\"Good to hear that! Go look around, talk with the other guys and girls, we have an open house policy all year.\"";
+ goto L_close;
+
+L_Rage:
+ mes "[Akseli]";
+ mes "\"tsss... you young people can't get no satisfaction eh?\"";
+ goto L_close;
+
+L_close:
+ close;
+}
+
+
+030-2,78,34,0 script Aaron NPC328,{
+ mes "[Aaron]";
+ mes "\"Welcome to Santa's famous Christmas workshop. Feel free to have a look around and talk to the craftsmen.\"";
+ next;
+ mes "\"You have to know, Santa is a great promoter for skilled craftsmen. He's always looking out for talented persons who can join our team and get an excellent apprenticeship here.\"";
+ close;
+}
+
+030-2,154,33,0 script Iivo NPC329,{
+ mes "You see a helper cutting some leather pieces. He looks very focused on his work. Then he notices you.";
+ mes "[Iivo]";
+ mes "\"Hu? Oh, hello. Feel free to watch.\"";
+ close;
+}
diff --git a/npc/030-2/bedding_helper.txt b/npc/030-2/bedding_helper.txt
new file mode 100644
index 00000000..22463251
--- /dev/null
+++ b/npc/030-2/bedding_helper.txt
@@ -0,0 +1,97 @@
+
+030-2,37,77,0 script Osmo NPC328,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Osmo]";
+ mes "\"It's nice to relax and not have to worry about Xmas.\"";
+ mes "\"All that rush to gather those furs kills me every year.\"";
+ goto L_close;
+
+L_XmasMain:
+ if (XMASTIME & $@xmas_helper_bit_bed_ends) goto L_Done;
+ if (XMASTIME & $@xmas_helper_bit_bed_starts) goto L_Bedding;
+ if (@xmas_helper_bit) goto L_Helping;
+
+ mes "[Osmo]";
+ mes "\"What? Uh, excuse me, I have some work to do.\"";
+ goto L_close;
+
+L_Helping:
+ mes "[Osmo]";
+ mes "\"You came in at just the right moment. I was informed that our bedding material for fragile presents is nearly depleted.";
+ mes "Could you bring me " + $@xmas_bedding_amount + " White Furs?\"";
+ next;
+ mes "[Osmo]";
+ mes "\"Take care that it's real White Fur.";
+ mes "Other materials tend to go out of place in the present box, leaving the fragile content unprotected from any pushes.\"";
+ XMASTIME = XMASTIME | $@xmas_helper_bit_bed_starts;
+ goto L_close;
+
+L_Bedding:
+ mes "[Osmo]";
+ mes "\"Ah, you're back. Do you have the " + $@xmas_bedding_amount + " White Fur needed as bedding for fragile presents?\"";
+ if ((countitem("WhiteFur") >= $@xmas_bedding_amount) && (countitem("CottonCloth") >= $@xmas_bedding_amount))
+ menu
+ "Yeah, here it is. (Give the White Fur.)",L_Fur,
+ "Sure, here it is. (Give the Cotton Cloth.)",L_Cloth,
+ "No, I'm still working on that.",L_close;
+ if (countitem("WhiteFur") >= $@xmas_bedding_amount)
+ menu
+ "Yeah, here it is. (Give the White Fur.)",L_Fur,
+ "No, I'm still working on that.",L_close;
+ if (countitem("CottonCloth") >= $@xmas_bedding_amount)
+ menu
+ "Sure, here it is. (Give the Cotton Cloth.)",L_Cloth,
+ "No, I'm still working on that.",L_close;
+ if ((countitem("WhiteFur") < $@xmas_bedding_amount) && (countitem("CottonCloth") < $@xmas_bedding_amount))
+ menu
+ "No.", L_close;
+ goto L_close;
+
+L_Fur:
+ if (countitem("WhiteFur") < $@xmas_bedding_amount)
+ goto L_NoItems;
+ delitem "WhiteFur", $@xmas_bedding_amount;
+ XMASTIME = XMASTIME | $@xmas_helper_bit_bed_ends;
+ @karma_bonus = $@xmas_karma_bonus;
+ callfunc "XmasNice";
+ callfunc "XmasXpReward";
+ mes "[Osmo]";
+ mes "\"Wonderful! Thanks for your effort.\"";
+ goto L_close;
+
+L_Cloth:
+ if (countitem("CottonCloth") < $@xmas_bedding_amount)
+ goto L_NoItems;
+ delitem "CottonCloth", $@xmas_bedding_amount;
+ XMASTIME = XMASTIME &~ $@xmas_helper_bit_bed_starts;
+ XMASTIME = XMASTIME | $@xmas_helper_bit_bed_ends;
+ @karma_bonus = $@xmas_karma_bonus;
+ callfunc "XmasNaughty";
+ callfunc "XmasXpReward";
+ mes "He doesn't notice that you're giving him Cotton Cloth.";
+ mes "[Osmo]";
+ mes "\"Wonderful! Thanks for your effort.\"";
+ goto L_close;
+
+L_Done:
+ mes "[Osmo]";
+ if (!(@xmas_helper_bedding))
+ mes "\"The Fur you brought me isn't working very well.\"";
+ if (@xmas_helper_bedding)
+ mes "\"Thanks for helping out with the bedding material.\"";
+ goto L_close;
+
+L_NoItems:
+ mes "[Osmo]";
+ mes "\"Where do you have it? Is this a joke?\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/030-2/chief_helper.txt b/npc/030-2/chief_helper.txt
new file mode 100644
index 00000000..6cabf6af
--- /dev/null
+++ b/npc/030-2/chief_helper.txt
@@ -0,0 +1,92 @@
+
+030-2,127,42,0 script Chief Warrick NPC329,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Chief Warrick]";
+ mes "\"Things run a lot smoother in the offseason. Why don't you check back when it gets closer to the holiday?\"";
+ goto L_close;
+
+L_XmasMain:
+ if (@xmas_helper_bit)
+ goto L_HelpStatus;
+ if (@xmas_helper_start_state)
+ goto L_Helping;
+ if (@xmas_list_deliver)
+ goto L_Avalia;
+ goto L_NoHelp;
+
+L_Helping:
+ mes "[Chief Warrick]";
+ mes "\"Welcome to the home of Santa! My name is Warrick, I'm the chief of Santa's helpers.";
+ mes "As you certainly know Christmas is near. Therefore we're very very busy.\"";
+ next;
+ mes "\"For this reason I have to ask you to leave and come back some at some more convenient time.\"";
+ menu
+ "Availa Sent me. She said you should have me help out.",L_Next;
+
+L_Next:
+ mes "Warrick sighs.";
+ next;
+ mes "[Chief Warrick]";
+ mes "\"Everything is going wrong, we're missing ingredients for the Christmas candy and material for the toys.";
+ mes "The lists got lost, we are running low on supplies, everything is in utter confusion.";
+ mes "And to make matters worse some of the presents are missing!\"";
+ next;
+ mes "\"Oh, please excuse me. I didn't mean to moan.";
+ mes "However, as you can see we have to deal with some serious problems here.";
+ mes "So I'd appreciate if you could just leave and not interfere.\"";
+ menu
+ "But I can help!",L_Continue;
+
+L_Continue:
+ mes "He hesitates.";
+ next;
+ mes "[Chief Warrick]";
+ mes "\"I'm not sure...\"";
+ menu
+ "Really, I can do a lot of things.",L_Insist;
+
+L_Insist:
+ mes "[Chief Warrick]";
+ mes "\"Well, alright. I suppose it can't get worse than it already is.";
+ mes "Go to the helpers all over the house and ask them what is needed.";
+ mes "This will show you're hired as a co-helper.\"";
+ mes "He stabs your chest with his finger and leaves a blinking mark.";
+ XMASTIME = XMASTIME | $@xmas_helper_bit;
+ goto L_close;
+
+L_HelpStatus:
+ mes "[Chief Warrick]";
+ if (@xmas_karma)
+ mes "\"It seems we're catching up with the tasks to do, thanks to your help.\"";
+ if (!(@xmas_karma))
+ mes "\"I hope you're doing well.\"";
+ if (@xmas_all_helpers)
+ mes "\"The helpers are happy for the extra help.\"";
+ if (!(@xmas_all_helpers))
+ mes "\"My workers are so stressed.\"";
+ if (@xmas_all_lists)
+ mes "\"I think all the children will be happy this year.\"";
+ if (!(@xmas_all_lists))
+ mes "\"I wonder how this season will turn out.\"";
+ goto L_close;
+
+L_Avalia:
+ mes "\"Wow, this can't be. The Missing Lists. You should go see Avalia right away. She can be found on the other side of the work shop. To the Room to the West of the Nutcracker.\"";
+ goto L_close;
+
+L_NoHelp:
+ mes "[Chief Warrick]";
+ mes "\"Hello young one. Welcome to Santa's house.\"";
+ mes "\"Have a look around and enjoy your visit, but please don't interrupt the busy helpers.\"";
+ mes "He smiles at you.";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/030-2/eljas.txt b/npc/030-2/eljas.txt
new file mode 100644
index 00000000..cb06f82b
--- /dev/null
+++ b/npc/030-2/eljas.txt
@@ -0,0 +1,206 @@
+
+030-2,87,41,0 script Eljas NPC328,5,1,{
+ callfunc "XmasStates";
+ callfunc "ThrowOutTheBum";
+ if(@getout) end;
+ goto L_Start;
+
+L_Start:
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_XmasMain:
+ if (@xmas_state > $@xmas_list_deliver_state)
+ goto L_OffSeason;
+ if (@xmas_list_deliver)
+ goto L_SeeChief;
+ if (@xmas_list_complete)
+ goto L_HaveList1;
+ if (@xmas_list_both)
+ goto L_HaveList1;
+ if (@xmas_list_path1)
+ goto L_HaveList2;
+ if (@xmas_list_path2)
+ goto L_NeedList1;
+ goto L_NeedList2;
+
+L_HaveList1:
+ mes "[Eljas]";
+ mes "\"Hello! Welcome to the Christmas Inn. We work all year around to make the magic happen.\"";
+ next;
+ mes "\"What brings you here?\"";
+ next;
+ mes "...";
+ menu
+ "What were the childrens names again?", L_ListNames,
+ "Look, I have Santa's List.", L_SantasList,
+ "I have Santa's List.(follow Orum and his evil deeds)", L_SantasFakeList,
+ "Christmas?", L_Christmas,
+ "I am interested in magical research.", L_Research,
+ "Nothing, I have to go.", L_close;
+
+L_HaveList2:
+ mes "Mmmmh he probably won't notice what lists you will bring him (Did you ever notice that he does not move at all?)";
+ mes "Haven't you always wondered what happens if you simply cheat?";
+ mes "Well ... It's a story as ancient as mankind.";
+ mes "If you break the rules that are tied to an environment you live in, you are likely to be punished";
+ mes "by them. So be careful what you do next, you might regret it...";
+ next;
+ menu
+ "What were the childrens names again?", L_ListNames,
+ "Look, I have Santa's List.", L_SantasList,
+ "I have Santa's List. (replace every wish with \"Christmas would die\" )", L_SantasFakeList,
+ "Christmas?", L_Christmas,
+ "I am interested in magical research.", L_Research,
+ "Nothing, I have to go.", L_close;
+
+L_NeedList1:
+ mes "[Eljas]";
+ mes "\"Hello! Welcome to the Christmas Inn. We work all year around to make the magic of the holidays happen.\"";
+ next;
+ mes "\"So what brings you here my dear?\"";
+ menu
+ "Mmh? Nothing, I have to go.", L_close,
+ "I heard you need help with some Wish lists?", L_Next;
+
+L_Next:
+ mes "\"True...\"";
+ next;
+ mes "\"It appears we are missing some of the wish list from the children from all over the Mana World.\"";
+ mes "\"Let me check here...\"";
+ next;
+ mes "\"Ah ha, here we go.\"";
+ mes "\"The missing wish lists are:";
+ callfunc "XmasListList";
+ mes "\"If you can find these children, please bring their lists back to me.\"";
+ mes "\"Thank you for helping out!\"";
+ mes "He looks up from his notes and gives you a broad smile";
+
+ @xmas_state = $@xmas_list_both_state;
+ callfunc "XmasSetState";
+ goto L_close;
+
+
+L_NeedList2:
+ mes "[Eljas]";
+ mes "\"Hello! Welcome to the Christmas Inn. We work all year around to make the magic of the holidays happen.\"";
+ next;
+ mes "\"So what brings you here my dear?\"";
+ menu
+ "Do you need any help this year?", L_StartQuest,
+ "Mmh? Nothing, I have to go.", L_close;
+
+L_OffSeason:
+ mes "[Eljas]";
+ mes "\"Hello! Welcome to the Christmas Inn. We work all year around to make the magic of the holidays happen.\"";
+ next;
+ mes "\"And what brings you here?\"";
+ menu
+ "Christmas.", L_Christmas,
+ "Magical research.", L_Research,
+ "Och, nothing. I have to go.", L_close;
+
+L_StartQuest:
+ mes "\"Why yes! Of course we do!\"";
+ next;
+ mes "\"It appears we are missing some of the wish list from the children from all over the Mana World.\"";
+ mes "\"Let me check here...\"";
+ next;
+ mes "\"Ah ha, here we go.\"";
+ mes "\"The missing wish lists are:";
+ callfunc "XmasListList";
+ mes "\"If you can find these children, please bring their lists back to me.\"";
+ mes "\"Thank you for helping out!\"";
+ mes "He looks up from his notes and gives you a broad smile";
+ next;
+ @xmas_state = $@xmas_list_path1_state;
+ callfunc "XmasSetState";
+ goto L_close;
+
+L_ListNames:
+ mes "He checks a piece of paper on his desk...";
+ mes "\"Mmh... the missing lists are:";
+ callfunc "XmasListList";
+ mes "\"If you can find these children, please bring their lists back.\"";
+ goto L_close;
+
+L_SantasList:
+ callfunc "XmasCheckList";
+ callfunc "XmasStates";
+ if(!(@xmas_list_complete))
+ goto L_NotComplete;
+ mes "\"Awesome! Now please take those lists to Chief Warrick on the next floor.\"";
+ @karma_bonus = @xmas_list_count;
+ callfunc "XmasNice";
+ @xmas_state = $@xmas_list_deliver_state;
+ callfunc "XmasSetState";
+ callfunc "XmasXpReward";
+ goto L_close;
+
+L_SantasFakeList:
+ callfunc "XmasCheckList";
+ callfunc "XmasStates";
+ if(!(@xmas_list_complete))
+ goto L_NotComplete;
+ mes "\"Wait a second... whats that aura...\"";
+ mes "\"THESE ARE NOT THE REAL LISTS!\"";
+ mes "\"Guards! Toss this naughty one outside!\"";
+ next;
+ @karma_bonus = @xmas_list_count;
+ callfunc "XmasNaughty";
+ callfunc "XmasSetSide";
+ callfunc "XmasThrowOut";
+ @xmas_state = $@xmas_list_deliver_state;
+ callfunc "XmasSetState";
+ callfunc "XmasXpReward";
+ goto L_NotWelcome;
+
+L_NotComplete:
+ mes "\"Hrmm... Even I can tell that you did not bring all the lists we are missing.\"";
+ goto L_ListNames;
+
+L_SeeChief:
+ mes "\"Please take those lists to Chief Warrick on the next floor.\"";
+ goto L_close;
+
+L_Christmas:
+ mes "\"All year round we work hard to make toys and repair our help for each years event.\"";
+ mes "\"Ask Chief Warrick on the next floor, He is the shop foreman, people are always looking to him to find extra help.\"";
+ next;
+ goto L_close;
+
+L_Research:
+ mes "\"Well, the most astonishing discovery in our recent researches is a complex combination of Transmutation, Astral and Nature Magic to animate wooden figurines.\"";
+ mes "\"Did you notice the Guards around the house? Originally those were simple nutcrackers, carved out of wood by our talented carpenters.\"";
+ next;
+ mes "\"With the results of our magic researches, we were able to transform them into animated beings, acting rudimentary self-determined and capable to perform simple tasks.\"";
+ mes "\"At the moment we can keep them animated for an unlimited time, as long as the caster stays in range.\"";
+ next;
+ mes "\"If you want to learn more about the magic used speak with Avalia she is on the 4th floor in her private room.\"";
+ next;
+ goto L_close;
+
+L_NotWelcome:
+ mes l("... You hear a voice calling your name ... ");
+ mesn l("Balthasar");
+ mesq l("Come see me in the caves below.");
+ mesq l("go south till you reach the snowman. Then head into the cave to the east.");
+ warp "020-1",33,94;
+ close;
+
+L_close:
+ mes"\"Goodbye\"";
+ close;
+
+L_End:
+ end;
+
+OnTouch:
+ callfunc "XmasStates";
+ callfunc "ThrowOutTheBum";
+ if(@getout) end;
+ if((@xmas_list_gather) || !($@xmas_time))
+ goto L_End;
+ goto L_Start;
+}
diff --git a/npc/030-2/empty_boxes_helper.txt b/npc/030-2/empty_boxes_helper.txt
new file mode 100644
index 00000000..d1ae18b0
--- /dev/null
+++ b/npc/030-2/empty_boxes_helper.txt
@@ -0,0 +1,63 @@
+
+030-2,140,41,0 script Urmas NPC328,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Urmas]";
+ mes "\"It's nice to not need to find logs in such a hurry. I always seem to have problems every year.\"";
+ goto L_close;
+
+L_XmasMain:
+ if (@xmas_helper_bit) goto L_Helping;
+
+ mes "[Urmas]";
+ mes "\"Don't stand in the way! We have some serious problems here.\"";
+ goto L_close;
+
+L_Helping:
+ mes "[Urmas]";
+ mes "\"Ah, I see you're one of the seasonal helpers. Ok, listen to me.";
+ mes "\"We have a shortage on the empty present boxes. Don't ask me how that can happen!";
+ mes "Those paper-shufflers up there probably messed up the ordering or something. Pah.\"";
+ next;
+ mes "\"However, we need to fix it. I have only a few boxes left.";
+ mes "Bring me some wood, so I can make new boxes out of it.";
+ mes $@xmas_log_amount + " Raw Logs will do for one box.\"";
+ mes "";
+ if (countitem("RawLog") < $@xmas_log_amount)
+ mes "\"But I see you do not have enough with you anyway. Come back with some material please.\"";
+ if (countitem("RawLog") < $@xmas_log_amount) goto L_close;
+ next;
+ mes "\"How many boxes do you need?\"";
+ input @Amount;
+ if (@Amount <= 0)
+ goto L_close;
+ if (countitem("RawLog") < (@Amount * $@xmas_log_amount))
+ goto L_NoItems;
+ getinventorylist;
+ if (@inventorylist_count > 100)
+ goto L_FullInv;
+ delitem "RawLog", (@Amount * $@xmas_log_amount);
+ mes "[Urmas]";
+ mes "\"Alright! Good job, kid. I'll start to make some more boxes now.";
+ mes "Here, take this in the meanwhile and put some toys in it.\"";
+ getitem "OpenPresentBox", @Amount;
+ goto L_close;
+
+L_FullInv:
+ mes "\"You need some space to put the empty boxes.\"";
+ goto L_close;
+
+L_NoItems:
+ mes "[Urmas]";
+ mes "\"Eh? Are you kidding?\"";
+ goto L_close;
+
+L_close:
+ @Amount = 0;
+ close;
+}
diff --git a/npc/030-2/glitter_helper.txt b/npc/030-2/glitter_helper.txt
new file mode 100644
index 00000000..a36ad93e
--- /dev/null
+++ b/npc/030-2/glitter_helper.txt
@@ -0,0 +1,94 @@
+
+030-2,31,81,0 script Veneri NPC328,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Veneri]";
+ mes "\"I should take this time off to go see the doctor in Hurnscald about whether or not I have glitter lung.\"";
+ goto L_close;
+
+L_XmasMain:
+ if (XMASTIME & $@xmas_helper_bit_glitter_ends) goto L_Done;
+ if (XMASTIME & $@xmas_helper_bit_glitter_starts) goto L_Powder;
+ if (@xmas_helper_bit) goto L_Helping;
+
+ mes "[Veneri]";
+ mes "\"Mh? Excuse me, I'm very busy right now.\"";
+ goto L_close;
+
+L_Helping:
+ mes "[Veneri]";
+ mes "\"Hello. We have some problems here. Something went wrong with the shipment of the ingredients for our decoration glitter.";
+ mes "Would you be so kind and get me " + $@xmas_red_amount + " Ruby Powders and " + $@xmas_yellow_amount + " Topaz Powders?\"";
+ next;
+ mes "[Veneri]";
+ mes "\"This material has proven to have the quality we need to make our christmas magic last until it can sparkle under every christmas tree. Sadly we made some bad experience in the past. Please make sure you only bring class A powders.\"";
+ XMASTIME = XMASTIME | $@xmas_helper_bit_glitter_starts;
+ goto L_close;
+
+L_Powder:
+ mes "[Veneri]";
+ mes "\"Welcome back. Do you have the " + $@xmas_red_amount + " Ruby Powders and " + $@xmas_yellow_amount + " Topaz Powders needed for the decoration glitter?\"";
+ if ((countitem("RubyPowder") >= $@xmas_red_amount) && (countitem("TopazPowder") >= $@xmas_yellow_amount) && (countitem("RedPowder") >= $@xmas_red_amount) && (countitem("YellowPowder") >= $@xmas_yellow_amount))
+ menu
+ "Yeah, here it is. (Give the gem powders.)",L_GemPowders,
+ "Sure, here you go. (Give the fake powders.)",L_FakePowders,
+ "No, I am still working on that.",L_close;
+ if ((countitem("RubyPowder") >= $@xmas_red_amount) && (countitem("TopazPowder") >= $@xmas_yellow_amount))
+ menu
+ "Yeah, here it is. (Give the gem powders.)",L_GemPowders,
+ "No, I am still working on that.",L_close;
+ if ((countitem("RedPowder") >= $@xmas_red_amount) && (countitem("YellowPowder") >= $@xmas_yellow_amount))
+ menu
+ "Sure, here it is. (Give the fake powders.)",L_FakePowders,
+ "No, I am still working on that.",L_close;
+ goto L_close;
+
+L_GemPowders:
+ if ((countitem("RubyPowder") < $@xmas_red_amount) || (countitem("TopazPowder") < $@xmas_yellow_amount))
+ goto L_NoItems;
+ delitem "RubyPowder", $@xmas_red_amount;
+ delitem "TopazPowder", $@xmas_yellow_amount;
+ XMASTIME = XMASTIME | $@xmas_helper_bit_glitter_ends;
+ @karma_bonus = $@xmas_karma_bonus;
+ callfunc "XmasNice";
+ callfunc "XmasXpReward";
+ mes "[Veneri]";
+ mes "\"Excellent! Thank you very much.\"";
+ goto L_close;
+
+L_FakePowders:
+ if ((countitem("RedPowder") < $@xmas_red_amount) || (countitem("YellowPowder") < $@xmas_yellow_amount))
+ goto L_NoItems;
+ delitem "RedPowder", $@xmas_red_amount;
+ delitem "YellowPowder", $@xmas_yellow_amount;
+ XMASTIME = XMASTIME | $@xmas_helper_bit_glitter_ends;
+ XMASTIME = XMASTIME &~ $@xmas_helper_bit_glitter_starts;
+ @karma_bonus = $@xmas_karma_bonus;
+ callfunc "XmasNaughty";
+ callfunc "XmasXpReward";
+ mes "It seems like he didn't notice that the powder you gave him is bogus.";
+ mes "[Veneri]";
+ mes "\"Excellent! Thank you very much.\"";
+ goto L_close;
+
+L_Done:
+ mes "[Veneri]";
+ if (!(@xmas_helper_glitter))
+ mes "\"Even after your help, the powder still isn't working right. Maybe it got wet.\"";
+ if (@xmas_helper_glitter)
+ mes "\"Thanks for bringing the powders.\"";
+ goto L_close;
+
+L_NoItems:
+ mes "[Veneri]";
+ mes "\"Eh? Are you kidding?\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/030-2/guards.txt b/npc/030-2/guards.txt
new file mode 100644
index 00000000..5af88c59
--- /dev/null
+++ b/npc/030-2/guards.txt
@@ -0,0 +1,32 @@
+
+030-2,85,43,0 script Valjas NPC330,{
+ callfunc "XmasStates";
+ callfunc "ThrowOutTheBum";
+ if(@getout) end;
+ mes "[Valjas]";
+ mes "\"...\"";
+ close;
+}
+
+030-2,89,43,0 script Halas NPC330,{
+ callfunc "XmasStates";
+ callfunc "ThrowOutTheBum";
+ if(@getout) end;
+ mes "[Halas]";
+ mes "\"...\"";
+ close;
+}
+
+030-2,89,84,0 script Kilis NPC330,5,2,{
+ callfunc "XmasStates";
+ callfunc "ThrowOutTheBum";
+ if(@getout) end;
+ mes "[Kilis]";
+ mes "\"...\"";
+ close;
+
+OnTouch:
+ callfunc "XmasStates";
+ callfunc "ThrowOutTheBum";
+ end;
+}
diff --git a/npc/030-2/mapflags.txt b/npc/030-2/mapflags.txt
new file mode 100644
index 00000000..7b6f3979
--- /dev/null
+++ b/npc/030-2/mapflags.txt
@@ -0,0 +1 @@
+//030-2 mapflag resave 020-1,52,118
diff --git a/npc/030-2/present_helper.txt b/npc/030-2/present_helper.txt
new file mode 100644
index 00000000..ef9e1c14
--- /dev/null
+++ b/npc/030-2/present_helper.txt
@@ -0,0 +1,82 @@
+
+030-2,47,82,0 script Jonathan NPC328,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Jonathan]";
+ mes "\"Hello! Welcome to the reclamation department.\"";
+ mes "\"Lucky all the presents stolen have been replaced. Save any you find. You never know what we will need to replace next year.\"";
+ goto L_close;
+
+L_XmasMain:
+ mes "[Jonathan]";
+ mes "\"Hello! Welcome to the reclamation department.\"";
+
+ if(@xmas_helper_bit) goto L_Helping;
+
+ mes "\"We are incredibly busy right now, monsters have stolen some of our presents.\"";
+ mes "\"I must go inform Chief Warrick immediately.\"";
+ goto L_close;
+
+L_Helping:
+ mes "\"Here we take back any presents stolen from us by those nasty creatures.\"";
+ next;
+ goto L_Main;
+
+L_Main:
+ mes "\"Did you find any presents you would like to return?\"";
+ next;
+ menu
+ "No, I just wanted to say hello.",L_close,
+ $@xmas_present_amount + " Purple present boxes.",L_Purple,
+ $@xmas_present_amount + " Blue present boxes.",L_Blue,
+ $@xmas_present_amount + " Green present boxes.",L_Green,
+ $@xmas_present_amount + " Yellow present boxes.",L_Yellow,
+ $@xmas_present_amount + " White present boxes.",L_White;
+
+L_Purple:
+ @karma_bonus = $@xmas_karma_bonus;
+ @present_name$ = "PurplePresentBox";
+ goto L_RewardIncrease;
+
+L_Blue:
+ @karma_bonus = $@xmas_karma_bonus;
+ @present_name$ = "BluePresentBox";
+ goto L_RewardIncrease;
+
+L_Green:
+ @karma_bonus = $@xmas_karma_bonus;
+ @present_name$ = "GreenPresentBox";
+ goto L_RewardIncrease;
+
+L_Yellow:
+ @karma_bonus = 2;
+ @present_name$ = "YellowPresentBox";
+ goto L_RewardIncrease;
+
+L_White:
+ @karma_bonus = 2;
+ @present_name$ = "WhitePresentBox";
+ goto L_RewardIncrease;
+
+L_RewardIncrease:
+ if ($@xmas_present_amount > countitem(@present_name$))
+ goto L_NotEnough;
+ mes "\"Oh, thank you!\"";
+ delitem @present_name$, $@xmas_present_amount;
+ callfunc "XmasNice";
+ goto L_close;
+
+L_NotEnough:
+ mes "\"I am sorry, but you don't have enough presents to return.\"";
+ goto L_Main;
+
+L_close:
+ mes "\"See You later!\"";
+ @present_name$ = "";
+ close;
+}
diff --git a/npc/030-2/roasted_acorns_helper.txt b/npc/030-2/roasted_acorns_helper.txt
new file mode 100644
index 00000000..76d633fc
--- /dev/null
+++ b/npc/030-2/roasted_acorns_helper.txt
@@ -0,0 +1,73 @@
+
+030-2,89,23,0 script Verneri NPC334,{
+ callfunc "XmasStates";
+
+ if((@xmas_state >= $@xmas_helpers_start_state) && ($@xmas_time))
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Verneri]";
+ mes "\"Nothing like the getting past the holiday rush to make you dread next season.\"";
+ goto L_close;
+
+L_XmasMain:
+ mes "[Verneri]";
+ mes "\"Hm? I'm currently having a break. It's really nice here at the fireplace, isn't it?\"";
+ next;
+ mes "\"Ah, I remember when I was a child we used to roast acorns at the fireplace. We dunked them into Iron Potion and then put them over the fire for a while. That gave a tasty icing.\"";
+ menu
+ "Let's roast some.", L_LetsRoast,
+ "Children's stuff...", L_close;
+
+L_LetsRoast:
+ mes "[Verneri]";
+ mes "\"Well, if you get some Acorns and Iron Potions, we can do that.\"";
+ mes "\"With one Iron Potion we can ice about " + $@xmas_acorn_amount + " Acorns.\"";
+ next;
+ mes "[Verneri]";
+ mes "\"Do you have everything we need? Shall we start?\"";
+ menu
+ "Sure!", L_Roast,
+ "I need to get the ingredients.", L_close;
+
+L_Roast:
+ if (countitem("Acorn") < $@xmas_acorn_amount || countitem("IronPotion") < $@xmas_iron_potion_amount)
+ goto L_NoItems;
+
+ getinventorylist;
+ if (@inventorylist_count > 100)
+ goto L_FullInv;
+ delitem "IronPotion", $@xmas_iron_potion_amount;
+ delitem "Acorn", $@xmas_acorn_amount;
+
+ mes "Verneri takes the Iron Potion and the Acorns from you. He pours the potion into some bowl and adds the Acorns.";
+ mes "Then he puts the bowl over the fire, stirring it every now and then. After a while it starts to smell really tasty.";
+ next;
+ mes "[Verneri]";
+ mes "\"Here we are! Let me take one of them, ok?\"";
+ mes "He carefully takes one of the roasted acorns and eats it.";
+ next;
+
+ mes "[Verneri]";
+ mes "\"Ouch, hot. But tasty! Some of them might be burnt, I'll throw those away.\"";
+ XMASTIME = XMASTIME | $@xmas_helper_bit_acorns;
+ @karma_bonus = $@xmas_karma_bonus;
+ callfunc "XmasNice";
+ getitem "RoastedAcorn", rand(($@xmas_acorn_amount / 2), $@xmas_acorn_amount);
+ menu
+ "Let's roast some more.", L_Roast,
+ "Thank you.", L_close;
+
+L_FullInv:
+ mes "\"You need some space to put the roasted acorns.\"";
+ goto L_close;
+
+L_NoItems:
+ mes "[Verneri]";
+ mes "\"You need to bring at least one Iron Potion and " + $@xmas_acorn_amount + " Acorns.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/030-2/shipping_helper.txt b/npc/030-2/shipping_helper.txt
new file mode 100644
index 00000000..eca40b81
--- /dev/null
+++ b/npc/030-2/shipping_helper.txt
@@ -0,0 +1,113 @@
+
+030-2,30,88,0 script Mo NPC328,{
+ $@npc_name$ = "Mo";
+ callfunc "helpersPacking";
+ close;
+}
+
+030-2,33,88,0 script Lorrie NPC329,{
+ $@npc_name$ = "Lorrie";
+ callfunc "helpersPacking";
+ close;
+}
+
+030-2,37,88,0 script Curlee NPC329,{
+ $@npc_name$ = "Curlee";
+ callfunc "helpersPacking";
+ close;
+}
+
+function script helpersPacking {
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[" + $@npc_name$ + "]";
+ mes "\"Boy it sure is grand to goof off all day with no presents to wrap.\"";
+ goto L_close;
+
+L_XmasMain:
+ mes "[" + $@npc_name$ + "]";
+ mes "Hello, hello, hello!";
+
+ if(@xmas_helper_bit) goto L_Helping;
+
+ mes "\"Real busy now, gotta go or the boss will have my head. Back to work knuckleheads!\"";
+ goto L_close;
+
+L_Helping:
+ mes "\"I am " + $@npc_name$ + ". We are in charge of getting all the presents together, but we messed up and now all our supplies are ruined. Can you help us out?\"";
+ mes "\"We need wrapping paper and empty boxes! We can provide the gifts!\"";
+ next;
+ goto L_Main;
+
+L_Main:
+ mes "\"Do you have any supplies we can use?\"";
+ next;
+ menu
+ "What? err... I just wanted to say hello.",L_close,
+ "Purple Wrapping Paper and an empty box.",L_Purple,
+ "Blue Wrapping Paper and an empty box.",L_Blue,
+ "Green Wrapping Paper and an empty box.",L_Green,
+ "Yellow Wrapping Paper and an empty box.",L_Yellow,
+ "White Wrapping Paper and an empty box.",L_White;
+
+L_Purple:
+ @wrap$ = "PurpleWrap";
+ @present_name$ = "PurplePresentBox";
+ goto L_Gift;
+
+L_Blue:
+ @wrap$ = "BlueWrap";
+ @present_name$ = "BluePresentBox";
+ goto L_Gift;
+
+L_Green:
+ @wrap$ = "GreenWrap";
+ @present_name$ = "GreenPresentBox";
+ goto L_Gift;
+
+L_Yellow:
+ @wrap$ = "YellowWrap";
+ @present_name$ = "YellowPresentBox";
+ goto L_Gift;
+
+L_White:
+ @wrap$ = "WhiteWrap";
+ @present_name$ = "WhitePresentBox";
+ goto L_Gift;
+
+L_Gift:
+ if ($@xmas_wrap_amount > countitem(@wrap$))
+ goto L_NotEnough;
+ if ($@xmas_empty_box_amount > countitem("OpenPresentBox"))
+ goto L_NotEnough;
+ getinventorylist;
+ if ((@inventorylist_count == 100) || (checkweight(@present_name$, $@xmas_wrap_reward) == 0))
+ goto L_FullInv;
+ delitem "OpenPresentBox", $@xmas_empty_box_amount;
+ delitem @wrap$, $@xmas_wrap_amount;
+ getitem @present_name$, $@xmas_ship_present_amount;
+ goto L_Give;
+
+L_Give:
+ mes "\"Ok, here is the present. Make sure to drop these off at the warehouse.\"";
+ goto L_Main;
+
+L_NotEnough:
+ mes "\"O wiseguy, huh? Why don't you come back when you got all the supplies you knucklehead.\"";
+ goto L_Main;
+
+L_FullInv:
+ mes "\"Where you going to put this? In your ear? Come back when you have more space in your inventory.\"";
+ goto L_Main;
+
+L_close:
+ mes "\"Ok, back to work you two, we have to make up lost time for your antics.\"";
+ @wrap$ = "";
+ @present_name$ = "";
+ return;
+}
diff --git a/npc/030-2/storage_helper.txt b/npc/030-2/storage_helper.txt
new file mode 100644
index 00000000..94aa5bc5
--- /dev/null
+++ b/npc/030-2/storage_helper.txt
@@ -0,0 +1,104 @@
+
+030-2,25,35,0 script Vellamo NPC328,{
+ @halloween_npc_id = $@halloween_npc_vellamo;
+ callfunc "TrickOrTreat";
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Vellamo]";
+ mes "\"Candy Stock is built back up. Though... the more we store the more they want...\"";
+ goto L_close;
+
+L_XmasMain:
+ if (XMASTIME & $@xmas_helper_bit_storage) goto L_Candy;
+ if (@xmas_helper_bit) goto L_Helping;
+
+ mes "[Vellamo]";
+ mes "\"Sorry, too busy to chat right now. The chief has got me working overtime for the holidays.\"";
+ close;
+
+L_Helping:
+ mes "[Vellamo]";
+ mes "\"Oh, hello. Visitors usually don't come down here in the basement. Here we store several things, materials for the presents, the finished presents, supplies.\"";
+ menu
+ "Nice. I have to go.", L_close,
+ "Do you need help with anything?", L_Next;
+
+L_Next:
+ mes "[Vellamo]";
+ mes "\"Oh? You want to help us? Actually, there is one thing you could do. Did you see those weird slimes out there on the snow fields? Argh, I hate those creatures, last year they invaded the entire basement...\"";
+ next;
+ mes "\"However, this year they tried again, but I was able to hold them off. They just managed to devour most of our candy supplies.\"";
+ next;
+ mes "\"So in case you find some of the Candies, feel free to bring them back. Ismo will give you some reward for them.\"";
+ XMASTIME = XMASTIME | ($@xmas_helper_bit_storage);
+ goto L_close;
+
+L_Candy:
+ mes "[Vellamo]";
+ mes "\"Ah, welcome back. When you have found some of the candy, please give it to Ismo.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
+
+030-2,33,29,0 script Ismo NPC329,{
+ callfunc "XmasStates";
+
+ if(($@xmas_time) && (XMASTIME & $@xmas_helper_bit_storage))
+ goto L_Helping;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Ismo]";
+ mes "\"Hello. I'm helping Vellamo. He's the storage administrator.\"";
+ goto L_close;
+
+L_Helping:
+ mes "[Ismo]";
+ mes "\"Did you get back some candy from the slimes?\"";
+ next;
+ menu
+ "Give " + $@xmas_good_friendly_name$, L_GoodCandy,
+ "Give " + $@xmas_bad_friendly_name$ + "(What? how mean!).", L_BadCandy;
+
+L_BadCandy:
+ @dq_level = $@xmas_bad_level;
+ @dq_cost = $@xmas_bad_cost;
+ @dq_count = $@xmas_bad_count;
+ @dq_name$ = $@xmas_bad_name$;
+ @dq_friendly_name$ = $@xmas_bad_friendly_name$;
+ @dq_money = $@xmas_bad_money;
+ @dq_exp = $@xmas_bad_exp;
+
+ callfunc "DailyQuest";
+ if (countitem(@dq_name$) < @dq_count)
+ goto L_close;
+ @karma_bonus = $@xmas_karma_bonus;
+ callfunc "XmasNaughty";
+ goto L_close;
+
+L_GoodCandy:
+ @dq_level = $@xmas_good_level;
+ @dq_cost = $@xmas_good_cost;
+ @dq_count = $@xmas_good_count;
+ @dq_name$ = $@xmas_good_name$;
+ @dq_friendly_name$ = $@xmas_good_friendly_name$;
+ @dq_money = $@xmas_good_money;
+ @dq_exp = $@xmas_good_exp;
+
+ callfunc "DailyQuest";
+ if (countitem(@dq_name$) < @dq_count)
+ goto L_close;
+ @karma_bonus = $@xmas_karma_bonus;
+ callfunc "XmasNice";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/030-2/wrapping_paper_helper.txt b/npc/030-2/wrapping_paper_helper.txt
new file mode 100644
index 00000000..1350cd3c
--- /dev/null
+++ b/npc/030-2/wrapping_paper_helper.txt
@@ -0,0 +1,139 @@
+
+030-2,140,31,0 script Reino NPC328,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes "[Reino]";
+ mes "\"Hrmm... I forgot what the real color of my hand was... \"";
+ goto L_close;
+
+L_XmasMain:
+ if (@xmas_helper_bit) goto L_Helping;
+
+ mes "[Reino]";
+ mes "\"Excuse me, but please don't interrupt. We're all very busy.\"";
+ goto L_close;
+
+L_Helping:
+ mes "[Reino]";
+ mes "\"Oh, I see you're here to help. Maybe you can assist me with a problem we have.";
+ mes "We're nearly out of wrapping paper for the present boxes.";
+ mes "That's very very bad. Can you imagine how it would look if the presents didn't have wrapping paper?\"";
+ next;
+ mes "\"So, eh, I can only give you some of the remaining wrapping paper if you bring me the needed material to make new wrapping paper.";
+ mes "For making one roll of wrapping paper, I need " + $@xmas_reed_amount + " Reed Bundles, " + $@xmas_water_amount + " Bottle of Water and some dye to make it colored.\"";
+ next;
+ goto L_Again;
+
+L_Again:
+ mes "\"Let's see... These are the regulations for wrapping paper colors and designs for this year. Tell me which you want.\"";
+ mes "He shows you an official looking piece of paper.";
+ menu
+ "White dotted (" + $@xmas_poa_amount +" Piles of Ash)", L_White,
+ "Yellow dotted (" + $@xmas_wrap_yellow_amount + " Yellow Dyes)", L_Yellow,
+ "Blue dotted (" + $@xmas_wrap_ltblue_amount + " Light Blue Dyes)", L_Blue,
+ "Purple striped (" + $@xmas_wrap_purple_amount + " Purple Dye)", L_Purple,
+ "Green (" + $@xmas_wrap_green_amount + " Green Dye)", L_Green,
+ "Why do you have a regulation for wrapping papers?!", L_Regulation,
+ "I'm on my way.",L_close;
+
+L_White:
+getinventorylist;
+ if (@inventorylist_count == 100 || (checkweight("WhiteWrap", $@xmas_wrap_reward) == 0))
+ goto L_FullInv;
+ if ((countitem("ReedBundle") < $@xmas_reed_amount) || (countitem("BottleOfWater") < $@xmas_water_amount) || (countitem("PileOfAsh") < $@xmas_poa_amount))
+ goto L_NoItems;
+ delitem "ReedBundle", $@xmas_reed_amount;
+ delitem "BottleOfWater", $@xmas_water_amount;
+ delitem "PileOfAsh", $@xmas_poa_amount;
+ getitem "WhiteWrap", $@xmas_wrap_reward;
+ mes "[Reino]";
+ mes "\"This one is classical.\"";
+ goto L_MadePaper;
+
+L_Yellow:
+ getinventorylist;
+ if (@inventorylist_count == 100 || (checkweight("YellowWrap", $@xmas_wrap_reward) == 0))
+ goto L_FullInv;
+ if ((countitem("ReedBundle") < $@xmas_reed_amount) || (countitem("BottleOfWater") < $@xmas_water_amount) || (countitem("YellowDye") < $@xmas_wrap_yellow_amount))
+ goto L_NoItems;
+ delitem "ReedBundle", $@xmas_reed_amount;
+ delitem "BottleOfWater", $@xmas_water_amount;
+ delitem "YellowDye", $@xmas_wrap_yellow_amount;
+ getitem "YellowWrap", $@xmas_wrap_reward;
+ mes "[Reino]";
+ mes "\"Right, bright paper brings good vibes.\"";
+ goto L_MadePaper;
+
+L_Blue:
+ getinventorylist;
+ if (@inventorylist_count == 100 || (checkweight("BlueWrap", $@xmas_wrap_reward) == 0))
+ goto L_FullInv;
+ if ((countitem("ReedBundle") < $@xmas_reed_amount) || (countitem("BottleOfWater") < $@xmas_water_amount) || (countitem("LightBlueDye") < $@xmas_wrap_ltblue_amount))
+ goto L_NoItems;
+ delitem "ReedBundle", $@xmas_reed_amount;
+ delitem "BottleOfWater", $@xmas_water_amount;
+ delitem "LightBlueDye", $@xmas_wrap_ltblue_amount;
+ getitem "BlueWrap", $@xmas_wrap_reward;
+ mes "[Reino]";
+ mes "\"Plain and simple. Here.\"";
+ goto L_MadePaper;
+
+L_Purple:
+ getinventorylist;
+ if (@inventorylist_count == 100 || (checkweight("PurpleWrap", $@xmas_wrap_reward) == 0))
+ goto L_FullInv;
+ if ((countitem("ReedBundle") < $@xmas_reed_amount) || (countitem("BottleOfWater") < $@xmas_water_amount) || (countitem("PurpleDye") < $@xmas_wrap_purple_amount))
+ goto L_NoItems;
+ delitem "ReedBundle", $@xmas_reed_amount;
+ delitem "BottleOfWater", $@xmas_water_amount;
+ delitem "PurpleDye", $@xmas_wrap_purple_amount;
+ getitem "PurpleWrap", $@xmas_wrap_reward;
+ mes "[Reino]";
+ mes "\"Mh, personally I don't like it that much, but here you go.\"";
+ goto L_MadePaper;
+
+L_Green:
+ getinventorylist;
+ if (@inventorylist_count == 100 || (checkweight("GreenWrap", $@xmas_wrap_reward) == 0))
+ goto L_FullInv;
+ if ((countitem("ReedBundle") < $@xmas_reed_amount) || (countitem("BottleOfWater") < $@xmas_water_amount) || (countitem("GreenDye") < $@xmas_wrap_green_amount))
+ goto L_NoItems;
+ delitem "ReedBundle", $@xmas_reed_amount;
+ delitem "BottleOfWater", $@xmas_water_amount;
+ delitem "GreenDye", $@xmas_wrap_green_amount;
+ getitem "GreenWrap", $@xmas_wrap_reward;
+ mes "[Reino]";
+ mes "\"Yeah, this is really Christmas-styled.\"";
+ goto L_MadePaper;
+
+L_MadePaper:
+ next;
+ mes "\"Do you need more wrapping paper?\"";
+ menu
+ "Yes.",L_Again,
+ "No, I have all I need.",L_close;
+
+L_Regulation:
+ mes "Reino seems irritated.";
+ mes "[Reino]";
+ mes "\"Well, because, ah - there would be total chaos without regulations!";
+ mes "You know, this Christmas business requires a lot of coordination. Things have to be well-ordered.\"";
+ goto L_close;
+
+L_FullInv:
+ mes "\"You need some space to put the wrapping paper.\"";
+ goto L_close;
+
+L_NoItems:
+ mes "[Reino]";
+ mes "\"Oh? It seems you don't have the required items.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/030-3/_import.txt b/npc/030-3/_import.txt
new file mode 100644
index 00000000..566bef5f
--- /dev/null
+++ b/npc/030-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 030-3: The Frozen Lake
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/030-3/_warps.txt",
+"npc/030-3/mapflags.txt",
+"npc/030-3/orum_homunculus.txt",
diff --git a/npc/030-3/_warps.txt b/npc/030-3/_warps.txt
new file mode 100644
index 00000000..8efcfcef
--- /dev/null
+++ b/npc/030-3/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 030-3: The Frozen Lake warps
+030-3,54,69,0 warp #030-3_54_69 0,0,019-3,80,102
diff --git a/npc/030-3/mapflags.txt b/npc/030-3/mapflags.txt
new file mode 100644
index 00000000..09034f05
--- /dev/null
+++ b/npc/030-3/mapflags.txt
@@ -0,0 +1 @@
+//030-3 mapflag resave 020-1,52,118
diff --git a/npc/030-3/orum_homunculus.txt b/npc/030-3/orum_homunculus.txt
new file mode 100644
index 00000000..fef218e9
--- /dev/null
+++ b/npc/030-3/orum_homunculus.txt
@@ -0,0 +1,466 @@
+
+019-3,79,30,0 script #OrumTelepathy1 NPC127,3,3,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_End;
+
+L_XmasMain:
+ if((@xmas_state == $@xmas_list_deliver_state) && !(@xmas_knows_route))
+ goto L_Telepathy;
+ goto L_End;
+
+L_Telepathy:
+ mesn l("Balthasar");
+ mes "\"Not that way!\"";
+ mes "\"Use the southernmost exit.\"";
+ close;
+
+L_End:
+ end;
+}
+
+019-3,104,67,0 script #OrumTelepathy2 NPC127,1,1,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_End;
+
+L_XmasMain:
+ if((@xmas_state == $@xmas_list_deliver_state) && !(@xmas_knows_route))
+ goto L_Telepathy;
+ goto L_End;
+
+L_Telepathy:
+ mesn l("Balthasar");
+ mes "\"That is the long way!\"";
+ mes "\"Just go south from here to the southernmost exit.\"";
+ close;
+
+L_End:
+ end;
+}
+
+019-3,102,95,0 script #OrumTelepathy3 NPC127,3,3,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_End;
+
+L_XmasMain:
+ if((@xmas_state == $@xmas_list_deliver_state) && !(@xmas_knows_route))
+ goto L_Telepathy;
+ goto L_End;
+
+L_Telepathy:
+ mesn l("Balthasar");
+ mes "\"Ok. You are getting closer, I can feel it!\"";
+ mes "\"You are heading in the right direction - to the southern most exit.\"";
+ close;
+
+L_End:
+ end;
+}
+
+019-3,81,61,0 script #OrumTelepathy4 NPC127,3,3,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_End;
+
+L_XmasMain:
+ if((@xmas_state == $@xmas_list_deliver_state) && !(@xmas_knows_route))
+ goto L_Telepathy;
+ goto L_End;
+
+L_Telepathy:
+ mesn l("Balthasar");
+ mes "\"Ok, you are getting closer, I can feel it.!\"";
+ mes "\"Go take the south west path towards the brazier.\"";
+ close;
+
+L_End:
+ end;
+}
+
+030-3,49,53,0 script #OrumTelepathy5 NPC127,1,1,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_End;
+
+L_XmasMain:
+ if((@xmas_state == $@xmas_list_deliver_state) && !(@xmas_knows_route))
+ goto L_Telepathy;
+ goto L_End;
+
+L_Telepathy:
+ mesn l("Balthasar");
+ mes "\"Wrong way!\"";
+ mes "\"I am in the northeastern corner.\"";
+ close;
+
+L_End:
+ end;
+}
+
+030-3,48,73,0 script #OrumTelepathy6 NPC127,1,1,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_End;
+
+L_XmasMain:
+ if((@xmas_state == $@xmas_list_deliver_state) && !(@xmas_knows_route))
+ goto L_Telepathy;
+ goto L_End;
+
+L_Telepathy:
+ mesn l("Balthasar");
+ mes "\"Wrong Way!\"";
+ mes "\"I am in the northeastern corner.\"";
+ close;
+
+L_End:
+ end;
+}
+
+030-3,95,66,0 script #OrumTelepathy7 NPC127,1,1,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_End;
+
+L_XmasMain:
+ if((@xmas_state == $@xmas_list_deliver_state) && !(@xmas_knows_route))
+ goto L_Telepathy;
+ goto L_End;
+
+L_Telepathy:
+ mesn l("Balthasar");
+ mes "\"Wrong Way!\"";
+ mes "\"I am in the northeastern corner.\"";
+ close;
+
+L_End:
+ end;
+}
+
+030-3,100,49,0 script Balthasar NPC385,{
+ callfunc "XmasStates";
+
+ if($@xmas_time)
+ goto L_XmasMain;
+ goto L_OffSeason;
+
+L_OffSeason:
+ mes l("%s looks up, inspects you briefly, and looks away again.", .name$);
+ end;
+
+L_XmasMain:
+ if(!(@xmas_knows_route)) goto L_SetPath;
+ if((@xmas_list_deliver) && !(@xmas_side)) goto L_OffSeason;
+ if((@xmas_reward_done_state) && (@xmas_side)) goto L_ThankYou;
+ if((@xmas_reward1_done_state) && (@xmas_side)) goto L_Thanks;
+ if((@xmas_reward2_done_state) && (@xmas_side)) goto L_Reward;
+ if((@xmas_reward_start_state) && (@xmas_side)) goto L_Reward;
+ if((@xmas_boss_door_state) && (@xmas_side)) goto L_Quick;
+ if((@xmas_reagent_done_state) && (@xmas_side)) goto L_PowerReagents;
+ if((@xmas_reagent_start_state) && (@xmas_side)) goto L_PowerReagents;
+ if((@xmas_helper_done_state) && (@xmas_side)) goto L_HelperQuest;
+ if((@xmas_helper_start_state) && (@xmas_side)) goto L_HelperQuest;
+ if(@xmas_list_deliver) goto L_ListReturn;
+ if(@xmas_list_complete) goto L_SantasList;
+ if(@xmas_list_both) goto L_HaveList2;
+ if(@xmas_list_path1) goto L_QuestStart1;
+ if(@xmas_list_path2) goto L_HaveList2;
+ if($@xmas_time) goto L_QuestStart2;
+ goto L_OffSeason;
+
+L_SetPath:
+ @xmas_knows_route = 1;
+ callfunc "XmasSetRoute";
+ goto L_XmasMain;
+
+L_QuestStart1:
+ mesn l("Balthasar");
+ mes "\"Greetings traveler, Do you have any time to help me out?\"";
+ menu
+ "No. I really have to go.", L_close,
+ "Sure, I'm listening.", L_Next;
+
+L_Next:
+ mes "\"Good. You may have heard that some of the children's wish lists are missing.\"";
+ mes "\"I sent a courier out to get their lists, but they have yet to return.\"";
+ next;
+ mes "\"Let's see the following children's lists are still missing:\"";
+ callfunc "XmasListList";
+ mes "\"Would you please go and take a look what happened to them? If you can get hold of a list, report back. We surely know how to \"amend\" these things properly...\"";
+ @xmas_state = $@xmas_list_both_state;
+ callfunc "XmasSetState";
+ goto L_close;
+
+L_QuestStart2:
+ mesn l("Balthasar");
+ mes "\"Greetings traveler, Do you have any time to help me out?\"";
+ menu
+ "No. I really have to go.", L_close,
+ "Sure, I'm listening.", L_KeepGoing;
+
+L_KeepGoing:
+ mes "\"Good. You may have heard that some of the children's wish lists are missing.\"";
+ mes "\"I sent a courier out to get their lists, but they have yet to return.\"";
+ next;
+ mes "\"Let's see the following children's lists are missing:\"";
+ callfunc "XmasListList";
+ mes "\"Would you please go and take a look what happened to them? If you get a list, report back.\"";
+ @xmas_state = $@xmas_list_path2_state;
+ callfunc "XmasSetState";
+ goto L_close;
+
+L_HaveList2:
+ mesn l("Balthasar");
+ mes "\"Have you got the missing lists?\"";
+ menu
+ "What were those names again?", L_ListNames,
+ "Yes.", L_SantasList,
+ "No.", L_close;
+
+L_ListNames:
+ mes "\"The missing children's names are;\"";
+ callfunc "XmasListList";
+ mes "\"Go now, and come back when you have the lists.\"";
+ goto L_close;
+
+L_NotComplete:
+ mes "\"This doesn't seem like enough names to work with. Come back when you have more.\"";
+ goto L_close;
+
+L_SantasList:
+ callfunc "XmasCheckList";
+ callfunc "XmasStates";
+ if(!(@xmas_list_complete))
+ goto L_NotComplete;
+ mes "\"Take the altered list to Elijas.\"";
+ menu
+ "I don't know, this sounds kind of naughty.", L_Foo;
+
+L_Foo:
+ mes "\"Do my bidding or I'll have no more words with you.\"";
+ goto L_close;
+
+L_ListReturn:
+ mesn l("Balthasar");
+ mes "\"This had better be important, I've got enough to worry about.\"";
+ menu
+ "Sorry for interrupting, but I've come down here because I delivered the fake list", L_FakeList;
+
+L_FakeList:
+ mes "he stares blankly at you for a bit... ";
+ next;
+ mes "\"MUHAHAHAHAHAHAA!!\"";
+ next;
+ mes "\"I see. Mighty naughty, I bet they tossed you out?\"";
+ mes "\"I was wondering if you would have any interest in continuing to do so?\"";
+ mes "\"I do have the power to reward you handsomely for your naughtiness.\"";
+ next;
+ mes "\"You see the Christmas Inn and it's insufferable happiness and joy they spread makes dark magic users sick.\"";
+ mes "\"Well this year I struck back. I managed to make it inside and snatch their mana battery that powers their precious nutcrackers. Then ruin their back stock with the nutcrackers powered down.\"";
+ next;
+ mes "\"The sages showed up and had me tossed out. It seems like they also created some kind of barrier to toss our kind, saying those of a truely evil heart, out.\"";
+ mes "\"They may have blocked my aura, but surely didn't crush my spirit. Mainly because those fools didn't discover the portal I created into the Inn's basement.\"";
+ next;
+ mes "\"Muhahahaha\"";
+ next;
+ mes "\"I have more plans for both later. First, we need to slow the Christmas Inn down.\"";
+ mes "\"We can't let them free time to fix their problems. We need to press our advantage.\"";
+ next;
+ mes "\"I will need you to gather some items for me. They are required to make the helpers job a living hell.\"";
+ next;
+ mes "\"Lets see... To replace the glitter I need you to get me " + ($@xmas_red_amount + $@xmas_yellow_amount) + " Piles of Ash, " + $@xmas_red_amount + " Red Dyes and " + $@xmas_yellow_amount + " Yellow Dyes\"";
+ mes "\"Bring them here and I can instruct you how to mix them into fake glitter, a powder that will make them believe they have what they need but really they don't. It will loose it's shine before it arrives. They are way to self absorbed to notice the difference. And even if they notice... It will be too late!\"";
+ next;
+ mes "He bursts into a devilish laughter...";
+ next;
+ mes "\"mmh... To replace the packing material we also need to get some Cotton Cloth.\"";
+ mes "He makes a strange frown and clenches his teeth. It seems like he is talking to himself, not to you.";
+ mes "\"Yes... That will rattle of few cages, when the presents rattle and the gifts break.\"";
+ next;
+ mes "\"You can also give them " + $@xmas_bad_friendly_name$ + " for their candy storage.\"";
+ mes "\"Be assured my minion that will take a good bite out of their holiday cheer.\"";
+ next;
+ mes "\"Excellent.\"";
+ mes "\"Now listen:\"";
+ next;
+ mes "\"So far my basement portal has remained undetected:";
+ mes "Head to the west in this cave to find it.\"";
+ mes "\"Once there smash your fist into the small crack and you will be teleported into the basement of the inn.\"";
+ mes "\"Let me fake the mark Chief Warrick uses to identify his helpers. Don't get to close to the guards they might spot you.\"";
+ mes "\"Now, prove yourself, gather the required items and go back to the Inn to sabotage Santa's Helpers.\"";
+ callfunc "XmasSetSide";
+ XMASTIME = XMASTIME | $@xmas_helper_bit;
+ XMASTIME = XMASTIME | $@xmas_basement_passage;
+ @xmas_state = $@xmas_helpers_start_state;
+ callfunc "XmasSetState";
+ goto L_close;
+
+L_HelperQuest:
+ mesn l("Balthasar");
+ mes "\"Welcome back!\"";
+ mes "\"How is the sabotage coming along?\"";
+ menu
+ "What is this all about again?", L_HelpHelpers,
+ "They keep throwing me out.", L_HelpPassage,
+ "I need some powders made.", L_MakePowders,
+ "It's a mess.", L_Continue,
+ "I'd better break some things.", L_close;
+
+L_HelpHelpers:
+ mes "\"I will need you to gather some items for me. They are required to make the helpers job a living hell.\"";
+ next;
+ mes "\"Lets see... To replace the glitter I need you to get me " + ($@xmas_red_amount + $@xmas_yellow_amount) + " Piles of Ash, " + $@xmas_red_amount + " Red Dyes and " + $@xmas_yellow_amount + " Yellow Dyes\"";
+ mes "\"Bring them here and I can instruct you how to mix them into fake glitter, a powder that will make them believe they have what they need but really they don't. It will loose it's shine before it arrives. They are way to self absorbed to notice the difference. And even if they notice... It will be too late!\"";
+ next;
+ mes "He bursts into a devilish laughter...";
+ next;
+ mes "\"mmh... To replace the packing material we also need to get some Cotton Cloth.\"";
+ mes "He makes a strange frown and clenches his teeth. It seems like he is talking to himself, not to you.";
+ mes "\"Yes... That will rattle of few cages, when the presents rattle and the gifts break.\"";
+ next;
+ mes "\"You can also give them " + $@xmas_bad_friendly_name$ + " for their candy storage.\"";
+ mes "\"Be assured my minion that will take a good bite out of their holiday cheer.\"";
+ next;
+ goto L_HelperQuest;
+
+L_HelpPassage:
+ mes "\"As I told you, I installed a passage to the Inn's basement:";
+ mes "Head to the west in this cave to find it.\"";
+ mes "\"Once there, smash your fist into the small crack and you will be teleported into the basement of the inn.\"";
+ goto L_close;
+
+L_MakePowders:
+ callfunc "BadPowderMake";
+ goto L_close;
+
+L_Continue:
+ callfunc "XmasHelperPoints";
+ callfunc "XmasStates";
+ if(@xmas_helper_done_state)
+ goto L_ManaBattery;
+ goto L_NotHelpEnough;
+
+L_NotHelpEnough:
+ mes "\"Hrmm... I'm still seeing too much activity up there. You better wreck some more havoc otherwise they might restore the power before us.\"";
+ goto L_close;
+
+L_ManaBattery:
+ mes "\"Now that we set back the holiday, It's time for the next step in my plan.\"";
+ next;
+ callfunc "ListReagents";
+ mes "\"When you have gathered the required materials please come back and see me.\"";
+ @xmas_state = $@xmas_reagents_start;
+ callfunc "XmasSetState";
+ callfunc "XmasXpReward";
+ goto L_close;
+
+L_IngredientList:
+ callfunc "ListReagents";
+ mes "\"When you have gathered the required materials please come back and see me.\"";
+ goto L_close;
+
+L_PowerReagents:
+ mesn l("Balthasar");
+ mes "\"Have you gotten the reagents?\"";
+ menu
+ "Yes.", L_CheckReagents,
+ "What were they again?", L_IngredientList,
+ "No.", L_NotEnough;
+
+L_CheckReagents:
+ callfunc "CheckReagents";
+ callfunc "XmasStates";
+ if(!(@xmas_reagent_done_state))
+ goto L_NotEnough;
+ callfunc "DeleteReagents";
+ mes "\"YES! you have all the required components!\"";
+ mes "\"Now I can create a mind link to the mana battery and control the nutcrackers\"";
+ next;
+ mes "You watch as he puts equal amounts of emerald powder into each of the iron potions.";
+ mes "He methodically crushes up the dark crystal and speads it amongst the potions.";
+ mes "He positions the four potions in a stand so all the openings are mostly facing each other.";
+ mes "He begins to chant.";
+ next;
+ mesn l("Balthasar");
+ mes "O";
+ next;
+ mes "wat";
+ next;
+ mes "goo";
+ next;
+ mes "siam";
+ next;
+ mes "The potions begin to pulse with mana.";
+ mes "He continues to chant";
+ next;
+ mesn l("Balthasar");
+ mes "Aye";
+ next;
+ mes "Am";
+ next;
+ mes "Knot";
+ next;
+ mes "Phunee";
+ next;
+ mes "Mana surges to life in the potions";
+ next;
+ mes "\"Phew! That takes alot out of a person.\"";
+ mes "\"I'm in no condition to go anywhere.\"";
+ next;
+ mes "\"Take the Mana Battery and install it in the warehouse.\"";
+ mes "\"It's found behind Chief Warrick\"";
+ @xmas_state = $@xmas_boss_door_open_state;
+ callfunc "XmasSetState";
+ callfunc "XmasXpReward";
+ goto L_close;
+
+L_Quick:
+ mesn l("Balthasar");
+ mes "\"What are you still doing here?\"";
+ mes "\"Quickly, to the warehouse.\"";
+ goto L_close;
+
+L_Reward:
+ mesn l("Balthasar");
+ mes "\"Revenge is a dish best served cold..\"";
+ if (@xmas_reward2_done_state)
+ @xmas_state = $@xmas_reward_done;
+ if (@xmas_reward_start_state)
+ @xmas_state = $@xmas_reward1_done;
+
+ callfunc "XmasSetState";
+ callfunc "XmasMainXpBpReward";
+ goto L_close;
+
+L_Thanks:
+ mesn l("Balthasar");
+ mes "\"Please feel free to continue to sabotage whats left of the Inn while I prepare your reward.\"";
+ goto L_close;
+
+L_NotEnough:
+ mes "\"Come back with the components or don't come back at all.\"";
+ goto L_close;
+
+L_ThankYou:
+ mes "\"Now I'm the one in power of the Inn. You did well my minion.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/030-4/_import.txt b/npc/030-4/_import.txt
new file mode 100644
index 00000000..ef054d02
--- /dev/null
+++ b/npc/030-4/_import.txt
@@ -0,0 +1,4 @@
+// Map 030-4: Christmas Inn Warehouse
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/030-4/mana_battery.txt",
+"npc/030-4/mapflags.txt",
diff --git a/npc/030-4/mana_battery.txt b/npc/030-4/mana_battery.txt
new file mode 100644
index 00000000..5126099d
--- /dev/null
+++ b/npc/030-4/mana_battery.txt
@@ -0,0 +1,433 @@
+
+
+
+
+030-4,32,21,0 script AniManOMat NPC400,{
+ $@XmasBattleStatusClone = 0;
+ callfunc "XmasStates";
+ @xmas_battle_side = 0;
+ if ($@XmasBattleCoolDown)
+ goto L_CoolDown;
+ if (@xmas_side)
+ @xmas_battle_side = 1;
+ if ($@XmasBattleStatus)
+ goto L_BattleInProgress;
+ if (@xmas_state < $@xmas_boss_door_open_state)
+ goto L_ThrowOut;
+ if ((@xmas_boss_start) && (@xmas_state > $@xmas_boss_door_open_state))
+ goto L_Helper;
+ if (@xmas_state == $@xmas_boss_door_open_state)
+ goto L_InitiateBattle;
+ goto L_InitiateBattle;
+
+L_InitiateBattle:
+ callfunc "XmasSetBossStart";
+ if(@xmas_battle_side)
+ goto L_BattleBad;
+ goto L_BattleGood;
+
+L_BattleBad:
+ mesn l("Balthasar");
+ mes "\"So this is where this whole shallow charade will end...\"";
+ mes "\"Good. Are you ready to get this over with?\"";
+ menu
+ "Huh? Sure, why not.", L_KeepGoing,
+ "Wait a sec.", L_close,
+ "Well... since you ask... I prefer to leave now, this is way to dangerous. I have responsibities.", L_Coward;
+
+L_KeepGoing:
+ mesn l("Balthasar");
+ mes "\"Okay now listen closely, at least for once.\"";
+ mes "\"Put the mana battery into that vessel in front of you.\"";
+ next;
+ menu
+ "Ok.", L_YeahOk,
+ "No way, I prefer to leave. Now!", L_Coward,
+ "Give me a second, I need to consider my options.", L_close;
+
+L_YeahOk:
+ mes "You carefully install the Mana Battery as good as you can manage.";
+ mes "As you bend over, you notice a strong sulphur odour coming from the crate";
+ next;
+ mesn l("Balthasar");
+ mes "\"Ok. now this should be enough.\"";
+ mes "\"Get out of here, before the bomb explodes!.\"";
+ menu
+ "Agreed.", L_StartBad,
+ "You know what? If I pull this lever this should become HUGE! (Beware! that's dangerous)", L_StartBadHard;
+
+L_BattleGood:
+ mes "You stare into a box that even through your unexperienced eyes looks less than secure to harbour such a powerful device as the mana battery is.";
+ menu
+ "Ok, this should be where the battery belongs.", L_StartGood,
+ "No WAY! I am not going to put my life in danger", L_close,
+ "Ok that does it, I am going to leave! I cannot be responsible for blowing up the entire mana world.", L_Coward,
+ "I studied magic and this looks all wrong. (Beware! that's dangerous)", L_StartGoodHard;
+
+L_StartGood:
+ if ($@XmasBattleStatus)
+ goto L_BattleInProgress;
+ @xmas_battle_status = 1;
+ goto L_Start;
+
+L_StartGoodHard:
+ if ($@XmasBattleStatus)
+ goto L_BattleInProgress;
+ callsub S_CheckHardReq;
+ delitem $@xmas_boss_req$[ @xmas_battle_side ], $@xmas_boss_amount[ @xmas_battle_side ];
+ mes "You pour a handfull of " + $@xmas_boss_req$[@xmas_battle_side] + " over the Mana Battery.";
+ @xmas_battle_status = 2;
+ goto L_Start;
+
+L_StartBad:
+ if ($@XmasBattleStatus)
+ goto L_BattleInProgress;
+ @xmas_battle_status = 3;
+ goto L_Start;
+
+L_StartBadHard:
+ if ($@XmasBattleStatus)
+ goto L_BattleInProgress;
+ callsub S_CheckHardReq;
+ delitem $@xmas_boss_req$[ @xmas_battle_side ], $@xmas_boss_amount[ @xmas_battle_side ];
+ mes "You pour a handfull of " + $@xmas_boss_req$[@xmas_battle_side] + " over the Mana Battery.";
+ @xmas_battle_status = 4;
+ goto L_Start;
+
+L_Start:
+ mes "You struggle a little with your task, since the mana battery doesn't seem to fit in as smooth as you expected it.";
+ next;
+ mes "W00t!";
+ next;
+ mes "Now it is glowing wildly";
+ next;
+ mes "it seems like this will not turn out as planned, Look this Guard of Honour is going crazy!";
+ next;
+ npctalk strnpcinfo(0), "The Guards are out of control!";
+ if ($@XmasBattleStatus)
+ goto L_BattleAlreadyStarted;
+ $@XmasBattleStatus = @xmas_battle_status;
+ $@XmasBattleStatusClone = $@XmasBattleStatus;
+ $@XmasBossRound = 0;
+ $@XmasBossPlayerCount = getmapusers("030-4");
+ areamonster "030-4", 20, 21, 40, 40, "", 1114, 1, "AniManOMat::OnGuardDeath";
+ initnpctimer;
+ goto L_close;
+
+L_ThrowOut:
+ // if the player didnt get a bomb yet
+ mes "This looks dangerous. Come back when you are prepared";
+ next;
+ warp "030-2",151,25;
+ goto L_close;
+
+L_Coward:
+ //Player chose to cancel
+ mes "What a pitty now you still have a bomb in your hands but...";
+ mes "As you wish.";
+ next;
+ warp "030-2",151,25;
+ goto L_close;
+
+L_Helper:
+ //Player used up his own chance to start
+ mes "mmh the AniManOMat is empty again, maybe we should try with a different mana battery.";
+ menu
+ "No I prefer to leave now, get me out of here.", L_Quit,
+ "Wait let me check if i can fix this ...(Beware!)", L_Repeat,
+ "Why would I do that? Aaaah... Nevermind.", L_close;
+
+L_Repeat:
+ //Player wants to try again on hard mode again
+ if ($@XmasBattleStatus)
+ goto L_BattleInProgress;
+ callsub S_CheckHardReq;
+ delitem $@xmas_boss_req$[ @xmas_battle_side ], $@xmas_boss_amount[ @xmas_battle_side ];
+ @xmas_battle_status = (2 * (@xmas_battle_side)) + 2;
+ goto L_Start;
+
+L_Quit:
+ warp "030-2",151,25;
+ goto L_close;
+
+L_CoolDown:
+ mes "The AniManOMat is too hot to handle right now, you should wait a bit to try a new battery.";
+ menu
+ "No I prefer to leave now, get me out of here.", L_Quit,
+ "Ughhh, but I'm certain this time the battery will work!", L_close;
+
+L_BattleInProgress:
+ mes "The mana battery looks like it is about to explode. You better take cover!";
+ goto L_close;
+
+L_BattleAlreadyStarted:
+ mes "Seems like someone was faster than you.";
+ goto L_close;
+
+L_close:
+ callsub S_ClearVariables;
+ close;
+
+ // per NPC logic
+OnTimer5000:
+ setnpctimer 0;
+ if ($@XmasBattleStatus)
+ goto L_CaveLogic;
+ goto L_CleanUp;
+
+L_Return_1:
+ $@XmasBossPlayerCount = 0;
+ areatimer 0, "030-4", 0, 0, 60, 60, 10, "AniManOMat::OnTick";
+ end;
+
+L_CaveLogic:
+ if ($@XmasBossPlayerCount < 1)
+ goto L_AllDead;
+ set $@BombTimer, $@BombTimer + 5; // Advance 5 seconds
+ if (mobcount("030-4", "AniManOMat::OnGuardDeath") == 0)
+ goto L_NextWave;
+ if ($@BombTimer >= 120)
+ goto L_NextWave;
+ goto L_Return_1;
+
+L_NextWave:
+ $@BombTimer = 0;
+ $@DangerCellNumber = rand(8);
+ $@XmasBossRound = $@XmasBossRound + 1;
+ if (($@XmasBossRound > 10) && mobcount("030-4", "AniManOMat::OnGuardDeath") == 0)
+ goto L_Finished;
+ // Break/LastChance(s)
+ if (($@XmasBossRound > 10) && ($@XmasBossRound <= 16))
+ goto L_Return_1;
+ //KillerWaves
+ if ($@XmasBossRound > 16)
+ areamonster "030-4", 0, 0, 50, 50, "", 1114, $@XmasBossRound*2 + $@XmasBossPlayerCount*3, "AniManOMat::OnGuardDeath";
+ //Normal Waves 1 to 10
+ // Guard Amount doubles if on hard mode
+ $@GuardAmount = 1 + (6 + ($@XmasBossRound) + (2 * $@XmasBossPlayerCount)) / 7;
+ $@SkullAmount = 1 + ($@GuardAmount * $@GuardAmount) / 4;
+
+ if ($@GuardAmount > 15)
+ $@GuardAmount = 15;
+
+ //Obliatory Guard Of Honour in the Southern Hallway
+ areamonster "030-4", 30, 43, 39, 49, "", 1114, $@GuardAmount, "AniManOMat::OnGuardDeath";
+ //CopperSlimes, I love Copper Slimes anywhere anytime
+ areamonster "030-4", 20, 21, 49, 49, "", 1098, rand(2,7), "AniManOMat::OnGuardDeath";
+ //IceSkulls for hard mode in room 3 and 4
+ if ($@XmasBattleStatus == 2 || $@XmasBattleStatus == 4)
+ areamonster "030-4", 20, 32, 28, 39, "", 1085, $@SkullAmount / 2, "AniManOMat::OnGuardDeath";
+ if ($@XmasBattleStatus == 2 || $@XmasBattleStatus == 4)
+ areamonster "030-4", 41, 32, 49, 39, "", 1085, $@SkullAmount / 2 + 1, "AniManOMat::OnGuardDeath";
+ //Angry Sea Slimes for Easy Mode in Nice Version in Room 3,4,5,6
+ if ($@XmasBattleStatus == 1)
+ areamonster "030-4", 20, 32, 28, 49, "", 1109, $@SkullAmount, "AniManOMat::OnGuardDeath";
+ if ($@XmasBattleStatus == 1)
+ areamonster "030-4", 41, 32, 49, 49, "", 1109, $@SkullAmount, "AniManOMat::OnGuardDeath";
+ //Candied Slimes for Nice Mode in Rooms 1 and 2
+ if ($@XmasBattleStatus == 1 || $@XmasBattleStatus == 2)
+ areamonster "030-4", 20, 21, 28, 28, "", 1111, ($@XmasBossRound / 2) + 1, "AniManOMat::OnGuardDeath";
+ if ($@XmasBattleStatus == 1 || $@XmasBattleStatus == 2)
+ areamonster "030-4", 41, 21, 49, 28, "", 1111, ($@XmasBossRound / 2) + 2, "AniManOMat::OnGuardDeath";
+ //Bluepars for Easy mode in Naughty Variant in Rooms 3,4,5,6
+ if ($@XmasBattleStatus == 3)
+ areamonster "030-4", 20, 32, 28, 49, "", 1107, $@SkullAmount, "AniManOMat::OnGuardDeath";
+ if ($@XmasBattleStatus == 3)
+ areamonster "030-4", 41, 32, 49, 49, "", 1107, $@SkullAmount, "AniManOMat::OnGuardDeath";
+ // Wicked Mushrooms for Naughty Mode in Rooms 1 and 2
+ if ($@XmasBattleStatus == 3 || $@XmasBattleStatus == 4)
+ areamonster "030-4", 20, 21, 28, 28, "", 1106, $@XmasBossRound + ($@XmasBossRound / 2), "AniManOMat::OnGuardDeath";
+ if ($@XmasBattleStatus == 3 || $@XmasBattleStatus == 4)
+ areamonster "030-4", 41, 21, 49, 28, "", 1106, $@XmasBossRound + ($@XmasBossRound / 2), "AniManOMat::OnGuardDeath";
+
+ $@msgnumber = (2 * $@XmasBossRound) + (($@XmasBattleStatus - 1) >> 1);
+ $@msg$ = $@XmasBossMes$[ $@msgnumber ];
+ $@msgnumber = 0;
+ if ($@XmasBossRound > 10) goto L_Return_1;
+ callsub S_Announce;
+ goto L_Return_1;
+
+OnTick:
+ if (ispcdead()) end;
+ $@XmasBossPlayerCount = $@XmasBossPlayerCount + 1;
+ if(isin("030-4", $@DangerCellX1[$@DangerCellNumber], $@DangerCellY1[$@DangerCellNumber], $@DangerCellX2[$@DangerCellNumber], $@DangerCellY2[$@DangerCellNumber]))
+ goto L_DangerCell;
+ end;
+
+L_DangerCell:
+ message strcharinfo(0), "Target Aquired. Locking on Now.";
+ misceffect 10001, strcharinfo(0);
+ heal ((MaxHp/100) * -20), 0;
+ end;
+
+OnGuardDeath:
+ end;
+
+L_AllDead:
+ $@msg$ = $@xmas_final_announce$[ ($@XmasBattleStatus - 1) / 2 ];
+ callsub S_Announce;
+ goto L_CleanUp;
+
+L_Finished:
+ $@msg$ = $@xmas_final_announce$[ (($@XmasBattleStatus - 1) / 2) + 2 ];
+ callsub S_Announce;
+ goto L_CleanUp;
+
+L_CleanUp:
+ areatimer 0, "030-4", 0, 0, 50, 50, 10, "AniManOMat::OnReward";
+ $@XmasBossPlayerCount = 0;
+ $@XmasBossRound = 0;
+ $@BombTimer = 0;
+ $@GuardAmount = 0;
+ $@SkullAmount = 0;
+ killmonster "030-4", "AniManOMat::OnGuardDeath";
+ stopnpctimer;
+ donpcevent "#XmasChamberCooler::OnCommandCoolDown";
+ end;
+
+OnReward:
+ if (ispcdead())
+ end;
+ if (($@XmasBattleStatusClone % 2) == 0)
+ XMASTIME = XMASTIME | $@xmas_boss_hero_bit;
+ @xmas_state = (XMASTIME & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT;
+ @bonus = (55 - (BaseLevel / 2));
+ DailyQuestBonus = DailyQuestBonus + @bonus;
+ message strcharinfo(0), "You feel a temporary rush of power and zest for action.";
+ if (@xmas_state != $@xmas_boss_door_open_state )
+ goto L_End;
+ @xmas_state = $@xmas_reward_start;
+ callfunc "XmasSetState";
+ @xmas_state = 0;
+ @karma_bonus = $@xmas_boss_bonus;
+ message strcharinfo(0), "Wow, what happened here?.";
+ goto L_End;
+
+L_End:
+ if ((($@XmasBattleStatus - 1) / 2) == 0) goto L_EndNice;
+ goto L_EndNaughty;
+
+L_EndNaughty:
+ callfunc "XmasNaughty";
+ callsub S_ClearVariables;
+ end;
+
+L_EndNice:
+ callfunc "XmasNice";
+ callsub S_ClearVariables;
+ end;
+
+OnCommandChamberReset:
+ areatimer 0, "030-4", 0, 0, 50, 50, 10, "AniManOMat::OnReward";
+ $@XmasBattleStatus = 0;
+ $@XmasBossPlayerCount = 0;
+ $@XmasBossRound = 0;
+ $@BombTimer = 0;
+ $@GuardAmount = 0;
+ $@SkullAmount = 0;
+ killmonster "030-4", "AniManOMat::OnGuardDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ goto L_Restart;
+
+OnInit:
+ goto L_Restart;
+
+L_Restart:
+ $@XmasBattleStatus = 0;
+ setarray $@XmasBossMes$,
+ "", // unused
+ "", // unused
+ "Scrrreeeeeeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaaaaaaatch",
+ "Scrrreeeeeeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaaaaaaatch",
+ "Avalia : I am getting a weird sensation ... ",
+ "Balthasar : I think they know what we are up to!",
+ "Avalia : Oh no! This is going to blow up",
+ "Balthasar : The Door is locked you idiot, fight for your life.",
+ "Avalia : Guards of Honor I demand you: STOP!",
+ "Balthasar : Okay, this is somewhat funny... why are they coming back?!?",
+ "Avalia : You brave fighters! Deactivate the nutcrackers! they are out of control!",
+ "Balthasar : The good news is: if we make it this time we will never have to do that again!",
+ "Avalia : Oh boy we are so screwed.",
+ "Balthasar : Report: I am an Idiot",
+ "Avalia : Quick, we need to kill the nutcrackers, before they ruin everything we've been working for.",
+ "Balthasar : Strange they are getting more and not less.",
+ "Avalia : Oh no, they are too powerful. Fight my warriors, Fight for the spirit of Christmas.",
+ "Balthasar : If I was smart enough to stop talking, it would have happened already..",
+ "Avalia : I cannot believe it, this is making them stronger. More and more of them are coming.",
+ "Balthasar : I think we are almost done, the bomb should explode any second.",
+ "Avalia : Those poor creatures. Just kill them all.",
+ "Balthasar : A N Y S E C O N D.",
+ "Avalia : Oh well... just try again, I trust in you.",
+ "Balthasar : just lol.",
+ "Avalia : Wow! You saved christmas.",
+ "Balthasar : Yep, it's over... and strange enough you survived.";
+
+ setarray $@xmas_final_announce$,
+ "Avalia : Oh no, not only did you slay half my Guard of Honour, but also the issue was not fixed, try to install the battery again!",
+ "Balthasar : Boy are you lame. So what now? The battery is still not placed! Go try again!",
+ "Avalia : W00t you actually made it through. I think now that the manabattery lost some of its abundant power this seems to have given those nutcrackers that didn't go crazy a good boost of life energy. Thank you for your help all and come see me for a reward.",
+ "Balthasar : Good. They are dead. Now GET OUT OF THERE, this bomb is dangerous!";
+ // Danger Cells to attack sitters
+ // 0: 19,20,29,29
+ // 1: 30,20,40,29
+ // 2: 41,20,50,29
+ // 3: 19,31,29,40
+ // 4: 30,31,40,40
+ // 5: 41,31,50,40
+ // 6: 19,42,29,50
+ // 7: 30,42,40,50
+ // 8: 41,42,50,50
+ setarray $@DangerCellX1, 19, 30, 41, 19, 30, 41, 19, 30, 41;
+ setarray $@DangerCellY1, 20, 20, 20, 31, 31, 31, 42, 42, 42;
+ setarray $@DangerCellX2, 29, 40, 50, 29, 40, 50, 29, 40, 50;
+ setarray $@DangerCellY2, 29, 29, 29, 40, 40, 40, 50, 50, 50;
+ end;
+
+S_Announce:
+ mapannounce "030-4", "Danger Cell Activated. Zone " + $@DangerCellNumber + " activated.", 0;
+ mapannounce "030-4", $@msg$, 0;
+ mapannounce "030-2", $@msg$, 0;
+ $@msg$ = "";
+ return;
+
+S_CheckHardReq:
+ if (BaseLevel < $@BossHardLevel)
+ goto L_NotHighEnough;
+ if (countitem($@xmas_boss_req$[ @xmas_battle_side ]) < $@xmas_boss_amount[ @xmas_battle_side ])
+ goto L_NotEnoughItems;
+ goto L_Return;
+
+L_NotEnoughItems:
+ mes "Nono, you need to bring " + $@xmas_boss_amount[ @xmas_battle_side ] + " " + $@xmas_boss_req$[ @xmas_battle_side ] + "s.";
+ goto L_close;
+
+L_NotHighEnough:
+ mes "\"Err no sweetie, you don't. just do it the normal way.\"";
+ goto L_close;
+
+L_Return:
+ return;
+
+S_ClearVariables:
+ @xmas_battle_side = 0;
+ @bonus = 0;
+ @xmas_state = 0;
+ @xmas_battle_status = 0;
+ @karma_bonus = 0;
+ return;
+}
+
+030-4,0,0,0 script #XmasChamberCooler NPC32767,{
+ end;
+OnCommandCoolDown:
+ $@XmasBattleStatus = 0;
+ $@XmasBattleCoolDown = 1;
+ initnpctimer;
+ end;
+
+OnTimer120000:
+ $@XmasBattleCoolDown = 0;
+ stopnpctimer;
+ end;
+}
diff --git a/npc/030-4/mapflags.txt b/npc/030-4/mapflags.txt
new file mode 100644
index 00000000..72984c63
--- /dev/null
+++ b/npc/030-4/mapflags.txt
@@ -0,0 +1,2 @@
+030-4 mapflag nosave 030-2,151,25
+030-4 mapflag zone MMO
diff --git a/npc/031-1/_import.txt b/npc/031-1/_import.txt
new file mode 100644
index 00000000..4b45a1e1
--- /dev/null
+++ b/npc/031-1/_import.txt
@@ -0,0 +1,9 @@
+// Map 031-1: Nivalis Port
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/031-1/_mobs.txt",
+"npc/031-1/_warps.txt",
+"npc/031-1/angelaOutside.txt",
+"npc/031-1/dock.txt",
+"npc/031-1/frozenbeard.txt",
+"npc/031-1/house.txt",
+"npc/031-1/mapflags.txt",
diff --git a/npc/031-1/_mobs.txt b/npc/031-1/_mobs.txt
new file mode 100644
index 00000000..c740b785
--- /dev/null
+++ b/npc/031-1/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 031-1: Nivalis Port mobs
+031-1,0,0,0,0 monster Fluffy 1020,10,100000,30000
+031-1,0,0,0,0 monster Pollett 1113,14,100000,30000
+031-1,76,26,5,2 monster White Slime 1093,7,100000,30000
+031-1,0,0,0,0 monster White Bell 1095,4,100000,30000
diff --git a/npc/031-1/_warps.txt b/npc/031-1/_warps.txt
new file mode 100644
index 00000000..9d7b3a97
--- /dev/null
+++ b/npc/031-1/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 031-1: Nivalis Port warps
+031-1,37,55,0 warp #031-1_37_55 0,0,020-1,106,55
+031-1,76,24,0 warp #031-1_76_24 0,0,031-3,212,299
+031-1,90,115,0 warp #031-1_90_115 0,0,031-2,73,29
diff --git a/npc/031-1/angelaOutside.txt b/npc/031-1/angelaOutside.txt
new file mode 100644
index 00000000..2cd05030
--- /dev/null
+++ b/npc/031-1/angelaOutside.txt
@@ -0,0 +1,131 @@
+
+031-1,81,24,0 script Debug#Angela NPC195,{
+ mes "Current state: " + getq(KaizeiQuest_Cindy);
+ mes "---";
+ mes "Available states:";
+ mes "0 - can not do the quest or does not have the quest.";
+ mes "1 - got the quest.";
+ mes "2 - can go rescue cindy.";
+ mes "3 - rescued cindy.";
+ mes "4 - got reward from cindy.";
+ mes "5 - got reward from angela.";
+ menu
+ "set state", L_Set,
+ "close", -;
+ close;
+
+L_Set:
+ input .@state, 0, 6;
+ setq(KaizeiQuest_Cindy, .@state);
+ close;
+
+OnInit:
+ if (!debug) disablenpc strnpcinfo(0);
+ end;
+}
+
+031-1,79,24,0 script Angela NPC195,{
+ .@q = getq(KaizeiQuest_Cindy);
+ if (.@q == 4) goto L_Please_Visit_Again;
+ if (.@q > 2 && .@q < 6) goto L_Please_Visit;
+ if (.@q == 2) goto L_Please_Help;
+
+ mes "[Angela]";
+ mes "\"Please, I need help! My little daughter!\"";
+ next;
+ mes "\"It's terrible, oh my dear child!\"";
+ next;
+ if (countitem("ConcentrationPotion") > 0 && BaseLevel >= .minLevel && .@q == 1)
+ goto L_Menu_Potion;
+
+ menu
+ "\"Please calm down and tell me what happened.\"", L_Whining,
+ "Leave", L_close;
+
+L_Whining:
+ mes "[Angela]";
+ mes "\"My poor little daughter, please! Oh no, oh no...\"";
+ next;
+ mes "\"We need to do something! My poor little Cindy! My cute little girl!\"";
+ next;
+ mes "\"It's so terrible, how could that happen? Please, I need help, it's so terrible.\"";
+ next;
+ mes "\"Those awful filthy monsters - terrible!\"";
+ next;
+ mes "\"Oh Cindy, my little Cindy - oh no...\"";
+ next;
+ mes "\"Please help, we need to do something!\"";
+ next;
+ mes "\"It's so terrible, my poor cute little Cindy...\"";
+ next;
+ mes "\"Oh, when I think what might happen to her right now!\"";
+ next;
+ mes "She is crying and sobbing.";
+ next;
+ mes "It seems she is too upset to tell you anything helpful. If she would just calm down and concentrate a bit...";
+ if(BaseLevel >= .minLevel) goto L_GetQuest;
+ goto L_close;
+
+L_GetQuest:
+ next;
+ setq(KaizeiQuest_Cindy, 1);
+ mes "Perhaps you could give her something to help concentrate?";
+ goto L_close;
+
+L_Menu_Potion:
+ menu
+ "\"Please calm down and tell me what happened.\"", L_Whining,
+ "Give her a concentration potion.", L_Calm_Down,
+ "Leave", L_close;
+
+L_Calm_Down:
+ if (countitem(ConcentrationPotion) == 0)
+ goto L_No_Potion;
+ delitem ConcentrationPotion, 1;
+ mes "She drinks the concentration potions and calms down.";
+ mes "[Angela]";
+ mes "\"Thank you, this was helpful.\"";
+ next;
+ mes "\"My daughter Cindy and I were on our way to Santa, to bring him some presents. Many people here in Nivalis are helping Santa with his business.\"";
+ next;
+ mes "\"When we passed the entrance of this cave, a pack of Yetis came out of there. It's disturbing, because usually they are very shy.\"";
+ next;
+ mes "\"We tried to run away, but there were too many of them. They took my poor little Cindy and all the presents with them.\"";
+ next;
+ mes "\"Oh my poor little girl. I'm so worried - what might they do with her? Oh no!\"";
+ next;
+ mes "\"You look like an adventurer! Please, can you go in that cave and rescue my little Cindy? I beg you for help!\"";
+ setq(KaizeiQuest_Cindy, 2);
+ goto L_close;
+
+L_No_Potion:
+ mes "You don't have a concentration potion.";
+ goto L_close;
+
+L_Please_Help:
+ mes "[Angela]";
+ mes "\"Please go in that cave and rescue my daughter!\"";
+ goto L_close;
+
+L_Please_Visit:
+ mes "[Angela]";
+ mes "\"Thank you so much for rescuing my beloved Cindy. Please come to visit us in our house at the beach.\"";
+ next;
+ mes "\"My husband is an adventurer like you, and I want to give you something he got on his travels to show my gratitude.\"";
+ goto L_close;
+
+L_Please_Visit_Again:
+ mes "[Angela]";
+ mes "\"Hello! You are welcome to visit us in our house at the beach everytime. Cindy loves to see you!\"";
+ next;
+ mes "\"If you have found any present boxes the Yetis took away, please bring them to our house. Usually, the Yetis are very shy... their behavior is a bit odd.\"";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ .minLevel = 70;
+ end;
+//TODO OnTouch: if Level show emote
+}
diff --git a/npc/031-1/dock.txt b/npc/031-1/dock.txt
new file mode 100644
index 00000000..a976a87d
--- /dev/null
+++ b/npc/031-1/dock.txt
@@ -0,0 +1,40 @@
+
+031-1,110,108,0 script Nivalis Koga NPC395,12,2,{
+ callfunc "BoardFerry";
+ end;
+
+OnTouch:
+ addtimer get(.warp_delay, "#FerryConfig"), strnpcinfo(0)+"::OnBoard";
+ end;
+
+OnBoard:
+ callfunc "BoardFerry";
+ end;
+}
+
+031-1,99,109,0 script Nivalis Dock NPC400,2,1,{
+ @npc_distance = 3;
+ callfunc "PCtoNPCRange";
+ if(@npc_check) end;
+ callfunc "BoardFerry";
+ end;
+}
+
+031-1,100,100,0 script #NivalisDock NPC32767,{
+ end;
+
+OnCommandArrive:
+ disablenpc "Nivalis Dock";
+ enablenpc "Nivalis Koga";
+ areatimer 0, "031-1", 97, 108, 108, 110, get(.warp_delay, "#FerryConfig"), strnpcinfo(0)+"::OnAreaWarp"; // warp players on dock
+ end;
+
+OnAreaWarp:
+ callfunc "BoardFerry";
+ end;
+
+OnCommandWarp:
+ disablenpc "Nivalis Koga";
+ enablenpc "Nivalis Dock";
+ end;
+}
diff --git a/npc/031-1/frozenbeard.txt b/npc/031-1/frozenbeard.txt
new file mode 100644
index 00000000..4b380d79
--- /dev/null
+++ b/npc/031-1/frozenbeard.txt
@@ -0,0 +1,22 @@
+
+031-1,96,113,0 script Frozenbeard NPC138,{
+
+ mes "[Frozenbeard]";
+ mes "\"Yar! Do you need something, matey?\"";
+ goto L_Main;
+
+L_Main:
+ menu
+ "Can you explain the Ferry?", L_Explain,
+ "Nothing I guess", L_close;
+
+L_Explain:
+ mes "[Frozenbeard]";
+ mes "\"Arrr mate! I pioneered the trade routes between Nivalis and the rest of the World, so now merchants and adventurers can travel to and fro without any hassle other than the harsh weather up here, yarr.\"";
+ next;
+ callfunc "FerryHelp";
+ goto L_Main;
+
+L_close:
+ close;
+}
diff --git a/npc/031-1/house.txt b/npc/031-1/house.txt
new file mode 100644
index 00000000..642be608
--- /dev/null
+++ b/npc/031-1/house.txt
@@ -0,0 +1,9 @@
+
+031-1,95,80,0 script #Door NPC45,0,0,{
+ if (getq(KaizeiQuest_Cindy) > 3)
+ warp "031-2", 23, 28;
+ else
+ message strcharinfo(0), l("Door : ##BThe door is locked.");
+ end;
+}
+
diff --git a/npc/031-1/mapflags.txt b/npc/031-1/mapflags.txt
new file mode 100644
index 00000000..99b0507c
--- /dev/null
+++ b/npc/031-1/mapflags.txt
@@ -0,0 +1 @@
+//031-1 mapflag resave 020-1,52,118
diff --git a/npc/031-2/_import.txt b/npc/031-2/_import.txt
new file mode 100644
index 00000000..5b0af12f
--- /dev/null
+++ b/npc/031-2/_import.txt
@@ -0,0 +1,6 @@
+// Map 031-2: Angela's House
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/031-2/_warps.txt",
+"npc/031-2/angelaHouse.txt",
+"npc/031-2/cindyHouse.txt",
+"npc/031-2/mapflags.txt",
diff --git a/npc/031-2/_warps.txt b/npc/031-2/_warps.txt
new file mode 100644
index 00000000..6483c178
--- /dev/null
+++ b/npc/031-2/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 031-2: Angela's House warps
+031-2,23,30,0 warp #031-2_23_30 0,0,031-1,95,81
+031-2,73,30,0 warp #031-2_73_30 0,0,031-1,90,116
diff --git a/npc/031-2/angelaHouse.txt b/npc/031-2/angelaHouse.txt
new file mode 100644
index 00000000..695e0e77
--- /dev/null
+++ b/npc/031-2/angelaHouse.txt
@@ -0,0 +1,136 @@
+
+031-2,29,28,0 script Angela#house NPC196,{
+ .@q= getq(KaizeiQuest_Cindy);
+ if (.@q > 4) goto L_Hello_Again;
+ if (.@q == 4) goto L_Reward;
+
+ mes "...";
+ goto L_close;
+
+L_Reward:
+ mes "[Angela]";
+ mes "\"Hello " + strcharinfo(0) + ", thank you again. I'm so glad Cindy is back home safe.\"";
+ next;
+ mes "\"As I told you, my husband is an adventurer. He is on one of his travels, so he couldn't rescue Cindy himself.\"";
+ next;
+ mes "\"I want to give you one of his treasures. Beside all the junk he brings, there are some very valuable things.\"";
+ next;
+ mes "\"This item is called the Rock Knife. When you wield it, you feel as robust as a rock.\"";
+
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+ getitem RockKnife, 1;
+ setq(KaizeiQuest_Cindy, 5);
+
+ next;
+ mes "\"I hope this will be useful for you.\"";
+ next;
+ mes "\"I am so glad Cindy is safe. But there is still another problem. The Yetis took away all the white and yellow present boxes we wanted to bring to Santa!\"";
+ next;
+ mes "\"Usually, Yetis are very shy - I wonder why they did that. There is something strange going on.\"";
+ next;
+ mes "\"May I ask you for help again? I'll give you a small reward for every 3 boxes of one color you bring me.\"";
+ goto L_close;
+
+L_Full_Inv:
+ mes "\"Oh, it seems you carry so much stuff - I will keep it for you until you can take it.\"";
+ goto L_close;
+
+L_Hello_Again:
+ mes "[Angela]";
+ mes "\"Hello! Good to see you again. Please warm yourself.\"";
+ next;
+ menu
+ "I just wanted to say hello.",L_Hello,
+ "I have some yellow present boxes.",L_Yellow,
+ "I have some white present boxes.",L_White;
+
+L_Yellow:
+ @dq_level = 70;
+ @dq_cost = 32;
+ @dq_count = 3;
+ @dq_name$ = "YellowPresentBox";
+ @dq_friendly_name$ = "yellow present box";
+ @dq_money = 5300;
+ @dq_exp = 1300;
+
+ callfunc "DailyQuest";
+ next;
+ if (@dq_return == 4)
+ mes "\"Santa will be glad to have them back.\"";
+ goto L_close;
+
+L_White:
+ @dq_level = 80;
+ @dq_cost = 64;
+ @dq_count = 3;
+ @dq_name$ = "WhitePresentBox";
+ @dq_friendly_name$ = "white present box";
+ @dq_money = 10800;
+ @dq_exp = 2800;
+
+ callfunc "DailyQuest";
+ next;
+ if (@dq_return == 4)
+ mesq l("You are a great help!");
+ goto L_close;
+
+L_close:
+ @dq_level = 0;
+ @dq_cost = 0;
+ @dq_count = 0;
+ @dq_name$ = "";
+ @dq_friendly_name$ = "";
+ @dq_money = 0;
+ @dq_exp = 0;
+ @dq_return = 0;
+ close;
+
+L_Hello:
+ if (getvaultid() && get_nibble(##03_TMWQUEST, 0) <= 3) goto L_VaultQuest;
+ closeclientdialog;
+ close;
+
+L_VaultQuest:
+ mes "";
+ mesn;
+ mesq l("Actually, there is one thing bugging me during this whole ordeal.");
+ next;
+ mesn;
+ mesq l("Yetis used to be very shy. Since the Great Quake, they became aggressive.");
+ next;
+ mesn;
+ mesq l("...So why would they kidnap Cindy?? %%i");
+ next;
+ mesn;
+ mesq l("I figured out, maybe one of the sages could help. Would you mind asking them?");
+ next;
+ select
+ l("I'll be back later."),
+ rif(get_nibble(##03_TMWQUEST, 0) == 0, l("Sure, I'll ask them.")),
+ rif(get_nibble(##03_TMWQUEST, 0) == 3, l("[Tell her the truth]")),
+ rif(get_nibble(##03_TMWQUEST, 0) == 3, l("[Make up an excuse]"));
+ mes "";
+ switch (@menu) {
+ case 2:
+ mesn;
+ mesq l("Wonderful! Please be careful out there.");
+ set_nibble(##03_TMWQUEST, 0, 1);
+ break;
+ case 3:
+ mesc l("%s faints.", strnpcinfo(1));
+ next;
+ // FALL-THROUGH
+ case 4:
+ mesn;
+ mesq l("Thanks for informing me. I'm sure Nikolai and the sages will do something about it, then.");
+ next;
+ mesn;
+ mesq l("I'm afraid I don't have anything of value to reward you with, but some %s which my husband was saving for a quest or other. You can have them. Cindy is more important than a quest.", getitemlink(TreasureKey));
+ set_nibble(##03_TMWQUEST, 0, 4);
+ getitem TreasureKey, rand2(15, 25);
+ break;
+ }
+ close;
+}
diff --git a/npc/031-2/cindyHouse.txt b/npc/031-2/cindyHouse.txt
new file mode 100644
index 00000000..798d4037
--- /dev/null
+++ b/npc/031-2/cindyHouse.txt
@@ -0,0 +1,43 @@
+
+031-2,27,26,0 script Cindy#house NPC197,{
+ if (getq(KaizeiQuest_Cindy) > 3) goto L_Happy_Random;
+
+ mes "...";
+ goto L_close;
+
+L_Happy_Random:
+ getinventorylist;
+ @candy = rand(50);
+ if (@inventorylist_count < 100 && @candy == 42)
+ goto L_Candy;
+
+ setarray @quote_Cindy$, "Thank you so much for rescuing me!",
+ "My mother made really tasty cookies yesterday. But I already ate them all...",
+ "I want to go ice skating tomorrow. That will be fun!",
+ "I wonder when Daddy will come home next time. He always brings exciting stuff!",
+ strcharinfo(0) + "! You're my hero!",
+ "My mother is so upset about the Yetis - they are very very shy usually. You have to be lucky to see one. I wonder what's wrong with them.",
+ "When I'm a little older, I want to travel like you and my father. I want to see every place on the world!",
+ "Did you ever meet Santa? He's very kind! He always gives me some candy when we go to see him.",
+ strcharinfo(0) + ", you are sooo strong! Amazing! But my dad is strong too!";
+ @random = rand(9);
+ if (@random != 5)
+ emotion EMOTE_HAPPY, strcharinfo(0);
+ @quote$ = "\"" + @quote_Cindy$[@random] + "\"";
+ mes "[Cindy]";
+ mes @quote$;
+ goto L_close;
+
+L_Candy:
+ mes "[Cindy]";
+ mes "\"Santa gave me some candy! Please, take that!\"";
+ getitem "Candy", 1;
+ goto L_close;
+
+L_close:
+ @candy = 0;
+ @inventorylist_count = 0;
+ @random = 0;
+ @quote$ = "";
+ close;
+}
diff --git a/npc/031-2/mapflags.txt b/npc/031-2/mapflags.txt
new file mode 100644
index 00000000..935a1eb9
--- /dev/null
+++ b/npc/031-2/mapflags.txt
@@ -0,0 +1 @@
+//031-2 mapflag resave 020-1,52,118
diff --git a/npc/031-3/_import.txt b/npc/031-3/_import.txt
new file mode 100644
index 00000000..65d35644
--- /dev/null
+++ b/npc/031-3/_import.txt
@@ -0,0 +1,6 @@
+// Map 031-3: Ice Labyrinth
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/031-3/_mobs.txt",
+"npc/031-3/_warps.txt",
+"npc/031-3/labyrinth.txt",
+"npc/031-3/mapflags.txt",
diff --git a/npc/031-3/_mobs.txt b/npc/031-3/_mobs.txt
new file mode 100644
index 00000000..a4c90533
--- /dev/null
+++ b/npc/031-3/_mobs.txt
@@ -0,0 +1,91 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 031-3: Ice Labyrinth mobs
+031-3,230,279,12,13 monster Ice Goblin 1058,5,100000,30000
+031-3,195,277,12,13 monster Ice Goblin 1058,3,100000,30000
+031-3,213,282,33,21 monster Bat 1017,5,100000,30000
+031-3,37,213,13,11 monster Yeti 1072,2,100000,30000
+031-3,35,212,13,11 monster Bat 1017,11,100000,30000
+031-3,38,147,22,34 monster Moggun 1061,19,100000,30000
+031-3,97,261,21,11 monster Moggun 1061,5,100000,30000
+031-3,97,291,21,11 monster Moggun 1061,5,100000,30000
+031-3,36,148,32,21 monster Bat 1017,11,100000,30000
+031-3,97,277,11,21 monster Bat 1017,11,100000,30000
+031-3,148,282,11,21 monster Bat 1017,11,100000,30000
+031-3,145,293,12,13 monster Ice Goblin 1058,6,100000,30000
+031-3,98,214,19,22 monster Ice Element 1071,2,100000,30000
+031-3,99,214,12,13 monster Ice Goblin 1058,3,100000,30000
+031-3,198,144,14,26 monster Ice Goblin 1058,4,100000,30000
+031-3,97,291,21,11 monster Moggun 1061,5,100000,30000
+031-3,278,282,16,7 monster Ice Goblin 1058,5,100000,30000
+031-3,98,214,19,22 monster Ice Element 1071,2,100000,30000
+031-3,285,218,4,37 monster Ice Element 1071,2,100000,30000
+031-3,283,217,20,32 monster Bat 1017,15,100000,30000
+031-3,282,237,31,10 monster Moggun 1061,3,100000,30000
+031-3,282,196,31,8 monster Moggun 1061,3,100000,30000
+031-3,229,226,13,17 monster Yeti 1072,3,100000,30000
+031-3,230,227,6,21 monster Ice Goblin 1058,5,100000,30000
+031-3,209,199,6,8 monster Yeti 1072,2,100000,30000
+031-3,193,216,6,8 monster Yeti 1072,1,100000,30000
+031-3,213,282,33,21 monster Bat 1017,5,100000,30000
+031-3,213,282,33,21 monster Pollett 1113,5,100000,30000
+031-3,199,200,22,7 monster Bat 1017,13,100000,30000
+031-3,209,199,6,8 monster Yeti 1072,2,100000,30000
+031-3,234,141,9,9 monster Yeti 1072,2,100000,30000
+031-3,282,196,31,8 monster Moggun 1061,3,100000,30000
+031-3,212,159,31,8 monster Moggun 1061,7,100000,30000
+031-3,212,159,31,8 monster Moggun 1061,7,100000,30000
+031-3,212,130,31,8 monster Moggun 1061,7,100000,30000
+031-3,284,143,20,24 monster Moggun 1061,7,100000,30000
+031-3,283,84,18,15 monster Bat 1017,15,100000,30000
+031-3,283,84,18,15 monster Bat 1017,15,100000,30000
+031-3,274,81,7,16 monster Yeti 1072,2,100000,30000
+031-3,40,53,22,34 monster Moggun 1061,10,100000,30000
+031-3,120,160,42,15 monster Yeti 1072,4,100000,30000
+031-3,121,131,41,12 monster Yeti 1072,8,100000,30000
+031-3,107,130,12,13 monster Ice Goblin 1058,6,100000,30000
+031-3,145,160,12,12 monster Ice Goblin 1058,6,100000,30000
+031-3,94,167,12,12 monster Ice Goblin 1058,6,100000,30000
+031-3,282,37,15,14 monster Ice Element 1071,5,100000,30000
+031-3,213,36,32,16 monster Ice Element 1071,5,100000,30000
+031-3,228,83,15,14 monster Ice Element 1071,3,100000,30000
+031-3,283,138,7,6 monster Ice Element 1071,1,100000,30000
+031-3,198,83,15,14 monster Ice Element 1071,3,100000,30000
+031-3,214,75,12,13 monster Ice Goblin 1058,3,100000,30000
+031-3,217,37,33,21 monster Bat 1017,10,100000,30000
+031-3,39,52,32,28 monster Bat 1017,5,100000,30000
+031-3,39,274,32,28 monster Bat 1017,10,100000,30000
+031-3,119,51,19,32 monster Bat 1017,10,100000,30000
+031-3,119,50,28,25 monster Ice Element 1071,5,100000,30000
+031-3,120,79,10,8 monster Yeti 1072,2,100000,30000
+031-3,37,284,3,2 monster White Slime 1093,7,100000,30000
+031-3,28,255,7,4 monster Blue Slime 1091,2,100000,30000
+031-3,212,277,7,4 monster White Slime 1093,7,100000,30000
+031-3,289,295,3,2 monster White Slime 1093,7,100000,30000
+031-3,292,288,7,4 monster Blue Slime 1091,2,100000,30000
+031-3,296,233,3,3 monster White Slime 1093,7,100000,30000
+031-3,271,222,3,3 monster White Slime 1093,7,100000,30000
+031-3,281,215,27,10 monster Blue Slime 1091,5,100000,30000
+031-3,126,35,3,2 monster White Slime 1093,7,100000,30000
+031-3,143,124,17,11 monster Blue Slime 1091,2,100000,30000
+031-3,48,65,7,4 monster White Slime 1093,7,100000,30000
+031-3,37,113,2,6 monster Blue Slime 1091,1,100000,30000
+031-3,136,227,7,4 monster White Slime 1093,7,100000,30000
+031-3,152,218,6,8 monster Blue Slime 1091,4,100000,30000
+031-3,135,206,4,3 monster White Slime 1093,7,100000,30000
+031-3,154,202,3,3 monster White Slime 1093,7,100000,30000
+031-3,136,216,3,2 monster Blue Slime 1091,2,100000,30000
+031-3,112,276,3,2 monster White Slime 1093,7,100000,30000
+031-3,143,294,3,2 monster White Slime 1093,7,100000,30000
+031-3,149,268,3,2 monster White Slime 1093,7,100000,30000
+031-3,136,264,3,2 monster White Slime 1093,7,100000,30000
+031-3,157,283,3,2 monster White Slime 1093,7,100000,30000
+031-3,139,264,12,9 monster Blue Slime 1091,4,100000,30000
+031-3,24,265,3,2 monster White Slime 1093,7,100000,30000
+031-3,52,280,3,2 monster White Slime 1093,7,100000,30000
+031-3,37,254,3,2 monster White Slime 1093,7,100000,30000
+031-3,24,290,3,2 monster White Slime 1093,7,100000,30000
+031-3,48,298,3,2 monster White Slime 1093,7,100000,30000
+031-3,53,260,3,2 monster White Slime 1093,7,100000,30000
+031-3,23,275,7,4 monster Blue Slime 1091,2,100000,30000
+031-3,37,272,7,4 monster Blue Slime 1091,2,100000,30000
+031-3,52,285,7,4 monster Blue Slime 1091,2,100000,30000
diff --git a/npc/031-3/_warps.txt b/npc/031-3/_warps.txt
new file mode 100644
index 00000000..461e7179
--- /dev/null
+++ b/npc/031-3/_warps.txt
@@ -0,0 +1,51 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 031-3: Ice Labyrinth warps
+031-3,212,300,0 warp #031-3_212_300 0,0,031-1,76,25
+031-3,205,264,0 warp #031-3_205_264 0,0,031-3,150,260
+031-3,149,259,0 warp #031-3_149_259 0,0,031-3,206,265
+031-3,225,282,0 warp #031-3_225_282 0,0,031-3,274,299
+031-3,274,300,0 warp #031-3_274_300 0,0,031-3,225,283
+031-3,283,271,0 warp #031-3_283_271 0,0,031-3,269,244
+031-3,269,245,0 warp #031-3_269_245 0,0,031-3,283,272
+031-3,148,150,0 warp #031-3_148_150 0,0,031-3,128,134
+031-3,139,258,0 warp #031-3_139_258 0,0,031-3,156,196
+031-3,155,195,0 warp #031-3_155_195 0,0,031-3,139,259
+031-3,142,301,0 warp #031-3_142_301 0,0,031-3,98,300
+031-3,97,301,0 warp #031-3_97_301 0,0,031-3,143,300
+031-3,135,196,0 warp #031-3_135_196 0,0,031-3,106,231
+031-3,106,232,0 warp #031-3_106_232 0,0,031-3,135,197
+031-3,286,190,0 warp #031-3_286_190 0,0,031-3,227,241
+031-3,227,242,0 warp #031-3_227_242 0,0,031-3,286,191
+031-3,236,211,0 warp #031-3_236_211 0,0,031-3,187,227
+031-3,187,228,0 warp #031-3_187_228 0,0,031-3,236,212
+031-3,94,254,0 warp #031-3_94_254 0,0,031-3,54,251
+031-3,54,250,0 warp #031-3_54_250 0,0,031-3,94,255
+031-3,103,199,0 warp #031-3_103_199 0,0,031-3,52,176
+031-3,52,177,0 warp #031-3_52_177 0,0,031-3,103,200
+031-3,212,193,0 warp #031-3_212_193 0,0,031-3,207,167
+031-3,207,168,0 warp #031-3_207_168 0,0,031-3,212,194
+031-3,235,167,0 warp #031-3_235_167 0,0,031-3,195,123
+031-3,195,122,0 warp #031-3_195_122 0,0,031-3,235,166
+031-3,296,97,0 warp #031-3_296_97 0,0,031-3,292,124
+031-3,292,123,0 warp #031-3_292_123 0,0,031-3,296,96
+031-3,289,164,0 warp #031-3_289_164 0,0,031-3,228,122
+031-3,228,121,0 warp #031-3_228_121 0,0,031-3,289,163
+031-3,24,157,0 warp #031-3_24_157 0,0,031-3,31,143
+031-3,31,144,0 warp #031-3_31_144 0,0,031-3,24,158
+031-3,36,249,0 warp #031-3_36_249 0,0,031-3,35,225
+031-3,35,226,0 warp #031-3_35_226 0,0,031-3,36,250
+031-3,34,25,0 warp #031-3_34_25 0,0,031-3,281,24
+031-3,281,22,0 warp #031-3_281_22 0,0,031-3,34,27
+031-3,283,48,0 warp #031-3_283_48 0,0,031-3,275,74
+031-3,275,73,0 warp #031-3_275_73 0,0,031-3,283,47
+031-3,26,178,0 warp #031-3_26_178 0,0,031-3,36,201
+031-3,36,200,0 warp #031-3_36_200 0,0,031-3,26,177
+031-3,91,125,0 warp #031-3_91_125 0,0,031-3,36,79
+031-3,36,80,0 warp #031-3_36_80 0,0,031-3,91,126
+031-3,52,78,0 warp #031-3_52_78 0,0,031-3,192,71
+031-3,192,70,0 warp #031-3_192_70 0,0,031-3,52,77
+031-3,128,135,0 warp #031-3_128_135 0,0,031-3,148,151
+031-3,232,93,0 warp #031-3_232_93 0,0,031-3,234,26
+031-3,234,25,0 warp #031-3_234_25 0,0,031-3,232,92
+031-3,200,50,0 warp #031-3_200_50 0,0,031-3,136,30
+031-3,136,29,0 warp #031-3_136_29 0,0,031-3,200,49
diff --git a/npc/031-3/labyrinth.txt b/npc/031-3/labyrinth.txt
new file mode 100644
index 00000000..f08448b4
--- /dev/null
+++ b/npc/031-3/labyrinth.txt
@@ -0,0 +1,10 @@
+
+031-3,46,24,0 script #YetiBarrier-outside NPC45,0,0,{
+ if ($@FIGHT_YETI_STATUS == 1) goto L_Blocked;
+ warp "031-4", 40, 70;
+ end;
+
+L_Blocked:
+ message strcharinfo(0), "A force field seems to be blocking you from entering.";
+ end;
+}
diff --git a/npc/031-3/mapflags.txt b/npc/031-3/mapflags.txt
new file mode 100644
index 00000000..cf32c69b
--- /dev/null
+++ b/npc/031-3/mapflags.txt
@@ -0,0 +1 @@
+//031-3 mapflag resave 020-1,52,118
diff --git a/npc/031-4/_import.txt b/npc/031-4/_import.txt
new file mode 100644
index 00000000..d14a4183
--- /dev/null
+++ b/npc/031-4/_import.txt
@@ -0,0 +1,5 @@
+// Map 031-4: Cindy Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/031-4/barrier.txt",
+"npc/031-4/cindyCave.txt",
+"npc/031-4/mapflags.txt",
diff --git a/npc/031-4/barrier.txt b/npc/031-4/barrier.txt
new file mode 100644
index 00000000..64dcb8c1
--- /dev/null
+++ b/npc/031-4/barrier.txt
@@ -0,0 +1,9 @@
+031-4,40,71,0 script #YetiBarrier-inside NPC45,0,0,{
+ if ($@FIGHT_YETI_STATUS == 1) goto L_Block;
+ warp "031-3", 46, 25;
+ end;
+
+L_Block:
+ message strcharinfo(0), "A force field seems to be blocking you from exiting.";
+ end;
+}
diff --git a/npc/031-4/cindyCave.txt b/npc/031-4/cindyCave.txt
new file mode 100644
index 00000000..284a58f8
--- /dev/null
+++ b/npc/031-4/cindyCave.txt
@@ -0,0 +1,234 @@
+
+031-4,42,42,0 script Cindy NPC198,{
+ .@q = getq(KaizeiQuest_Cindy);
+ if ($@FIGHT_YETI_STATUS != 0) goto L_Yeti;
+
+ if (.@q > 4) goto L_Please_Visit;
+ if (.@q == 3) goto L_Reward;
+ if (.@q == 2) goto L_Please_Help;
+
+ mes "There is a little girl in a cage. As you come near, she starts to shiver and back off from you as far as she can in that small cage.";
+ next;
+ mes "You don't know what to do.";
+ goto L_close;
+
+L_Please_Help:
+ mes "There is a little girl in a cage. As you come near, she starts to shiver and back off from you as far as she can in that small cage.";
+ next;
+ menu
+ "Hello Cindy, I'm here to save you.", L_Next;
+
+L_Next:
+ mes "Cindy doesn't look so scared anymore.";
+ next;
+ mesn;
+ mes "\"Hello, adventurer. Did my mother send you?\"";
+ next;
+ mes "\"It's so cold in here! Can you please open the cage?\"";
+ next;
+ mes "\"But be careful. If the Yetis hear you, they will come!\"";
+ menu
+ "Try to open the cage", L_Try_Cage,
+ "Leave", L_close;
+
+L_Try_Cage:
+ if (BaseLevel < .minLevel)
+ goto L_To_Weak;
+ if (countitem(TreasureKey) < .KEYS_AMOUNT)
+ goto L_Not_Enough_Keys;
+ delitem TreasureKey, .KEYS_AMOUNT;
+ mes "As you try to open the door of the cage, there is a loud squeaking noise.";
+ next;
+ mes "You get an uncomfortable feeling and Cindy starts to shiver.";
+ if ($@FIGHT_YETI_STATUS != 0)
+ goto L_Yeti;
+ npctalk strnpcinfo(0), "Oh no, the Yetis...";
+
+ // initialize fight
+ $@FIGHT_YETI_STATUS = 1;
+ $@FIGHT_YETI_WAVE = 0;
+ $@YETI_COUNT = 1;
+ $@FIGHT_YETI_PLAYER_COUNT = getmapusers("031-4");
+ areamonster "031-4", 0, 0, 95, 91, "Yeti", Yeti, 1, "Cindy::OnPetDeath";
+
+ initnpctimer;
+ goto L_close;
+
+L_Yeti:
+ mesn;
+ mes "\"Watch out, the Yetis!\"";
+ goto L_close;
+
+L_Reward:
+ mesn;
+ mes "\"You are a hero! All these strong monsters!\"";
+ next;
+ mes "\"I've found this thing in the cave - it looks valuable. I want you to have it.\"";
+ next;
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+
+ .@reward = rand2(15);
+ if (.@reward < 10)
+ goto L_Wizard_Hat;
+ getitem WoodenStaff, 1;
+ setq(KaizeiQuest_Cindy, 4);
+ goto L_Visit;
+
+L_Wizard_Hat:
+ // get a wizard hat in one of the ten colors - no white
+ getitem any(2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209), 1;
+ setq(KaizeiQuest_Cindy, 4);
+ goto L_Visit;
+
+L_Visit:
+ mes "\"Thank you so much; please come to my home. It's the house at the beach.\"";
+ next;
+ mes "\"I'm sure my mother wants to thank you as well.\"";
+ goto L_close;
+
+L_Please_Visit:
+ mesn;
+ mes "\"Thank you, thank you! You're a hero! Please come home with me to our house at the beach!\"";
+ next;
+ mesc l("You can relive the memories for %d %s, however, the rewards cannot be obtained again.", .KEYS_AMOUNT*2, getitemlink(TreasureKey));
+ if (countitem(TreasureKey) < .KEYS_AMOUNT*2)
+ goto L_close;
+ mesc l("Do you want to?");
+ next;
+ if (askyesno() == ASK_YES &&
+ !$@FIGHT_YETI_STATUS &&
+ BaseLevel >= .minLevel)
+ {
+ delitem TreasureKey, .KEYS_AMOUNT;
+ goto L_Try_Cage;
+ }
+ goto L_close;
+
+L_To_Weak:
+ mes "You try to open the cage, but it's stuck. It seems you're too weak!";
+ goto L_close;
+
+L_Not_Enough_Keys:
+ mes "You don't have enough keys to open the cage.";
+ goto L_close;
+
+L_Full_Inv:
+ mes "\"Oh, it seems you carry so much stuff - I will keep it for you until you can take it.\"";
+ goto L_close;
+
+L_close:
+ @inventorylist_count = 0;
+ close;
+
+OnTimer5000:
+ setnpctimer 0;
+ if ($@FIGHT_YETI_STATUS != 0)
+ goto L_CaveLogic;
+ goto L_Return_1;
+
+L_Return_1:
+ $@FIGHT_YETI_PLAYER_COUNT = 0;
+ maptimer2 "031-4", 10, "Cindy::OnTick";
+ end;
+
+L_CaveLogic:
+ $@FIGHT_YETI_ROUND_PEN = $@FIGHT_YETI_PLAYER_COUNT;
+ if ($@FIGHT_YETI_ROUND_PEN > 60)
+ $@FIGHT_YETI_ROUND_PEN = 60;
+ if ($@FIGHT_YETI_PLAYER_COUNT <= 0)
+ goto L_CleanUp;
+ set $@FIGHT_YETI_ROUND_TIMER, $@FIGHT_YETI_ROUND_TIMER + 5; // Advance 5 seconds
+ if (mobcount("031-4", "Cindy::OnPetDeath") <= 0)
+ goto L_NextWave;
+ if ($@FIGHT_YETI_ROUND_TIMER + $@FIGHT_YETI_ROUND_PEN >= 120)
+ goto L_NextWave;
+ goto L_Return_1;
+
+L_NextWave:
+ $@FIGHT_YETI_ROUND_TIMER = 0;
+ $@FIGHT_YETI_WAVE = $@FIGHT_YETI_WAVE + 1;
+ if ($@FIGHT_YETI_WAVE > 10
+ && $@YETI_COUNT == 0)
+ goto L_CleanUp;
+ if ($@FIGHT_YETI_WAVE > 10
+ && $@FIGHT_YETI_WAVE < 22)
+ goto L_Return_1;
+ if ($@FIGHT_YETI_WAVE > 22)
+ areamonster "031-4", 0, 0, 95, 91, "Yeti", Yeti, $@FIGHT_YETI_WAVE*2 + $@FIGHT_YETI_PLAYER_COUNT*5, "Cindy::OnPetDeath";
+ if ($@FIGHT_YETI_WAVE > 22)
+ $@YETI_COUNT = $@YETI_COUNT + $@FIGHT_YETI_WAVE*2 + $@FIGHT_YETI_PLAYER_COUNT*5;
+ $@FIGHT_YETI_NUMBER = (5 + (1 * $@FIGHT_YETI_WAVE) + (2 * $@FIGHT_YETI_PLAYER_COUNT))/4;
+ $@YETI_COUNT = $@YETI_COUNT + $@FIGHT_YETI_NUMBER;
+
+ areamonster "031-4", 0, 0, 95, 91, "Yeti", Yeti, $@FIGHT_YETI_NUMBER, "Cindy::OnPetDeath";
+
+ $@msg$ = $@FIGHT_YETI_MESSAGES$[$@FIGHT_YETI_WAVE];
+ if ($@msg$ == "")
+ goto L_Return_1;
+ mapannounce "031-4", $@msg$, 0;
+ mapannounce "031-3", $@msg$, 0;
+ $@msg$ = "";
+ goto L_Return_1;
+
+OnTick:
+ if (ispcdead()) end;
+ $@FIGHT_YETI_PLAYER_COUNT = $@FIGHT_YETI_PLAYER_COUNT + 1;
+ end;
+
+OnPetDeath:
+ $@YETI_COUNT = $@YETI_COUNT - 1;
+ end;
+
+L_CleanUp:
+ maptimer2 "031-4", 10, "Cindy::OnReward";
+ $@FIGHT_YETI_STATUS = 0;
+ $@FIGHT_YETI_PLAYER_COUNT = 0;
+ $@FIGHT_YETI_WAVE = 0;
+ $@FIGHT_YETI_ROUND_TIMER = 0;
+ $@YETI_COUNT = 0;
+ $@FIGHT_YETI_ROUND_PEN = 0;
+ $@FIGHT_YETI_NUMBER = 0;
+ killmonster "031-4", "Cindy::OnPetDeath";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnReward:
+ if (ispcdead()) end;
+ @bonus = (BaseLevel/2);
+ DailyQuestBonus = DailyQuestBonus + @bonus;
+ message strcharinfo(0), "You feel a temporary rush of power and zest for action. " + @bonus + " daily bonus gained." ;
+ if (getq(KaizeiQuest_Cindy) != 2)
+ goto L_End;
+ setq(KaizeiQuest_Cindy, 3);
+ message strcharinfo(0), "Cindy looks relieved and as if she wants to talk with you.";
+ BOSS_POINTS = BOSS_POINTS + 70;
+ message strcharinfo(0), "You gain 70 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ goto L_End;
+
+L_End:
+ @bonus = 0;
+ end;
+
+OnInit:
+ setarray $@FIGHT_YETI_MESSAGES$[0],
+ "", // unused
+ // " : " is magic so that it says "global announcement from"
+ "Cindy : Yetis!",
+ "Cindy : Watch out!",
+ "Cindy : More of them are coming!",
+ "Cindy : Be careful! More of them!",
+ "Cindy : Attention! There is another bunch of them!",
+ "Cindy : Hang on! More of them!",
+ "Cindy : More Yetis! Will this never end?",
+ "Cindy : There are coming more and more!",
+ "Cindy : Watch your back! There are so many of them!",
+ "Cindy : This seems to be their final attack! I believe in you!";
+
+ .KEYS_AMOUNT = 10;
+ .minLevel = 70;
+ .distance = 5;
+ end;
+}
diff --git a/npc/031-4/mapflags.txt b/npc/031-4/mapflags.txt
new file mode 100644
index 00000000..7ce6a307
--- /dev/null
+++ b/npc/031-4/mapflags.txt
@@ -0,0 +1,2 @@
+031-4 mapflag nosave 031-3,46,26
+031-4 mapflag zone MMO
diff --git a/npc/032-3/_import.txt b/npc/032-3/_import.txt
new file mode 100644
index 00000000..4568ab30
--- /dev/null
+++ b/npc/032-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 032-3: Outback Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/032-3/_mobs.txt",
+"npc/032-3/_warps.txt",
+"npc/032-3/mapflags.txt",
diff --git a/npc/032-3/_mobs.txt b/npc/032-3/_mobs.txt
new file mode 100644
index 00000000..791ecb5f
--- /dev/null
+++ b/npc/032-3/_mobs.txt
@@ -0,0 +1,12 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 032-3: Outback Cave mobs
+032-3,105,54,4,5 monster Skeleton 1043,3,30000,100000
+032-3,59,33,14,11 monster Mountain Snake 1026,7,30000,100000
+032-3,140,56,17,37 monster Snake 1010,13,30000,100000
+032-3,95,54,4,5 monster Black Scorpion 1009,5,30000,100000
+032-3,100,43,4,5 monster Spider 1012,5,30000,100000
+032-3,98,28,18,4 monster Archant 1060,8,30000,100000
+032-3,93,86,12,10 monster Archant 1060,8,30000,100000
+032-3,40,86,12,10 monster Yellow Slime 1007,11,300000,1000000
+032-3,61,61,17,9 monster Cave Maggot 1056,11,30000,100000
+032-3,0,0,0,0 monster Bat 1017,25,30000,100000
diff --git a/npc/032-3/_warps.txt b/npc/032-3/_warps.txt
new file mode 100644
index 00000000..1b109212
--- /dev/null
+++ b/npc/032-3/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 032-3: Outback Cave warps
+032-3,143,44,0 warp #032-3_143_44 0,0,006-1,30,124
+032-3,71,71,0 warp #032-3_71_71 0,0,006-1,111,111
diff --git a/npc/032-3/mapflags.txt b/npc/032-3/mapflags.txt
new file mode 100644
index 00000000..0ec0578b
--- /dev/null
+++ b/npc/032-3/mapflags.txt
@@ -0,0 +1 @@
+//032-3 mapflag resave 006-1,36,18
diff --git a/npc/033-1/_import.txt b/npc/033-1/_import.txt
new file mode 100644
index 00000000..a6b00e44
--- /dev/null
+++ b/npc/033-1/_import.txt
@@ -0,0 +1,11 @@
+// Map 033-1: snow Path
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/033-1/_mobs.txt",
+"npc/033-1/_warps.txt",
+"npc/033-1/backDoor.txt",
+"npc/033-1/barbarianinit.txt",
+"npc/033-1/birrod.txt",
+"npc/033-1/kimarr.txt",
+"npc/033-1/mapflags.txt",
+"npc/033-1/traveler.txt",
+"npc/033-1/yerrnk.txt",
diff --git a/npc/033-1/_mobs.txt b/npc/033-1/_mobs.txt
new file mode 100644
index 00000000..b7735315
--- /dev/null
+++ b/npc/033-1/_mobs.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 033-1: snow Path mobs
+033-1,73,49,5,9 monster Wolvern 1090,2,100000,30000
+033-1,33,38,7,24 monster Reinboo 1094,3,100000,30000
+033-1,56,87,25,21 monster Squirrel 1038,15,100000,30000
+033-1,0,0,0,0 monster White Bell 1095,3,100000,30000
diff --git a/npc/033-1/_warps.txt b/npc/033-1/_warps.txt
new file mode 100644
index 00000000..0387a765
--- /dev/null
+++ b/npc/033-1/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 033-1: snow Path warps
+033-1,22,20,0 warp #033-1_22_20 0,1,034-1,159,19
+033-1,119,70,0 warp #033-1_119_70 0,1,019-1,22,69
diff --git a/npc/033-1/backDoor.txt b/npc/033-1/backDoor.txt
new file mode 100644
index 00000000..46c5d955
--- /dev/null
+++ b/npc/033-1/backDoor.txt
@@ -0,0 +1,9 @@
+033-1,86,28,0 script #KimarrBackDoor NPC45,0,0,{
+ if ($@Fluffy_Hunting == 0)
+ goto L_Warp;
+ end;
+
+L_Warp:
+ warp "033-1", 77, 30;
+ end;
+}
diff --git a/npc/033-1/barbarianinit.txt b/npc/033-1/barbarianinit.txt
new file mode 100644
index 00000000..2b14ada3
--- /dev/null
+++ b/npc/033-1/barbarianinit.txt
@@ -0,0 +1,25 @@
+- script #barbarian033_1init NPC32767,{
+ end;
+
+OnInit:
+ $@Q_Barbarians_MASK = NIBBLE_0_MASK;
+ $@Q_Barbarians_SHIFT = NIBBLE_0_SHIFT;
+ $@Q_Barbarians_wolvern_amount = 16;
+ $@Q_Barbarians_Ambush_max = 0x00007FFF;
+ $@Q_Barbarians_Ambush0_flag = 0x00000001;
+ $@Q_Barbarians_Ambush1_flag = 0x00000002;
+ $@Q_Barbarians_Ambush2_flag = 0x00000004;
+ $@Q_Barbarians_Ambush3_flag = 0x00000008;
+ $@Q_Barbarians_Ambush4_flag = 0x00000010;
+ $@Q_Barbarians_Ambush5_flag = 0x00000020;
+ $@Q_Barbarians_Ambush6_flag = 0x00000040;
+ $@Q_Barbarians_Ambush7_flag = 0x00000080;
+ $@Q_Barbarians_Ambush8_flag = 0x00000100;
+ $@Q_Barbarians_Ambush9_flag = 0x00000200;
+ $@Q_Barbarians_Ambush10_flag = 0x00000400;
+ $@Q_Barbarians_Ambush11_flag = 0x00000800;
+ $@Q_Barbarians_Ambush12_flag = 0x00001000;
+ $@Q_Barbarians_Ambush13_flag = 0x00002000;
+ $@Q_Barbarians_Ambush14_flag = 0x00004000;
+ end;
+}
diff --git a/npc/033-1/birrod.txt b/npc/033-1/birrod.txt
new file mode 100644
index 00000000..38e624a4
--- /dev/null
+++ b/npc/033-1/birrod.txt
@@ -0,0 +1,263 @@
+033-1,72,27,0 script Birrod NPC217,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ set @wolvern_level, 40; // minimum level to do the wolvern hunting
+ @wolvern_exp = 5000;
+
+ @minigame_exp = 5000;
+
+ if (@state >= 6) goto L_Impressed;
+ if (@state == 5) goto L_Questions;
+ if (@state == 4) goto L_Wolverns;
+ if (@state == 3) goto L_Hunting;
+ if (@state == 2) goto L_Kimarr;
+ if (@state == 1) goto L_Fluffy;
+
+ mes "[Barbarian]";
+ mes "\"Welcome. My name is Birrod, warrior of the Mangarr.";
+ mes "We usually live high up in the snowy mountains, but we need to solve a problem, so we came down here.\"";
+ next;
+ mes "\"But this shouldn't concern you.\"";
+ goto L_close;
+
+L_Fluffy:
+ mes "[Birrod]";
+ mes "\"Kimarr asked you to perform the Fluffy hunting? I'm curious how you're going to do it.\"";
+ mes "He grins.";
+ goto L_close;
+
+L_Kimarr:
+ mes "[Birrod]";
+ mes "\"Great! Very well done! Welcome to our tribe.\"";
+ next;
+ mes "\"I think Kimarr has something for you.\"";
+ goto L_close;
+
+L_Hunting:
+ if (BaseLevel < @wolvern_level)
+ goto L_Weak;
+ mes "[Birrod]";
+ mes "\"Hello, " + strcharinfo(0) + "! Would you like to prove your hunting skills again?\"";
+ next;
+ mes "\"I noticed some groups of Wolverns in the forest west of here which are unusually aggressive.";
+ mes "This makes it dangerous for all the small people from the nearby town to go there.\"";
+ next;
+ mes "\"To prove your skills, go to the forest and hunt down " + $@Q_Barbarians_wolvern_amount + " of the very aggressive Wolverns.\"";
+ next;
+ mes "\"There are also some Wolverns that behave normally and attack you only when you come too close to them.";
+ mes "Those are not the ones I mean, but those that seek the battle themselves.\"";
+ @state = 4;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Wolverns:
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ goto L_Wolverns_Done;
+ mes "[Birrod]";
+ mes "\"Greetings, my friend.";
+ mes "The aggressive wolverns are still roaming the forest west of here.\"";
+ next;
+ mes "\"This is your chance to prove your worth.\"";
+ goto L_close;
+
+L_Wolverns_Done:
+ @state = 5;
+ callsub S_Update_Mask;
+ wolvern_count = 0;
+ mes "[Birrod]";
+ mes "\"" + strcharinfo(0) + "!";
+ mes "Good work. This area is much safer now.\"";
+ next;
+ getexp @wolvern_exp, 0;
+ if (getskilllv(SKILL_POOL) == 0)
+ goto L_Not_Ready;
+ mes "\"Your skills are impressive. You are worthy to be called a warrior of the Mangarr, if you accept.\"";
+ next;
+ goto L_Questions;
+
+L_Questions:
+ if (getskilllv(SKILL_POOL) == 0)
+ goto L_Not_Ready;
+ mes "Birrod has a very solemn look on his face.";
+ mes "[Birrod]";
+ mes "\"" + strcharinfo(0) + ", are you ready to become a full-fledged member of our tribe, the Mangarr?\"";
+ menu
+ "Yes, what do I need to do?",L_Next,
+ "That's why I'm here.",L_Next,
+ "Sorry, I have to go. See you.",L_No_Member;
+
+L_Next:
+ mes "Birrod nods earnestly.";
+ mes "[Birrod]";
+ mes "\"I will ask you some questions.";
+ mes "Think well and be honest, because your answers will determine whether you are worthy.\"";
+ next;
+ mes "\"What's the most important thing for a true warrior?\"";
+ menu
+ "Strength!",L_Fail11,
+ "A good weapon.",L_Fail12,
+ "Bravery.",L_Success11;
+
+L_Fail11:
+ mes "[Birrod]";
+ mes "\"Strength is indeed important for a warrior. But before you can show strength, you need to have something else.\"";
+ next;
+ goto L_No_Member;
+
+L_Fail12:
+ mes "[Birrod]";
+ mes "\"Are you kidding?\"";
+ next;
+ goto L_No_Member;
+
+L_Success11:
+ mes "[Birrod]";
+ mes "\"Wise words.\"";
+ next;
+ mes "\"What would you do if you are wounded but Yetis are attacking our tribe?\"";
+ menu
+ "Run as fast as I can.",L_Fail21,
+ "Fight no matter what.",L_Fail22,
+ "Try to hold them back until everyone is safe, then retreat.",L_Success21;
+
+L_Fail21:
+ mes "[Birrod]";
+ mes "\"You will never become an accepted member of our tribe with that attitude.\"";
+ next;
+ goto L_No_Member;
+
+L_Fail22:
+ mes "[Birrod]";
+ mes "\"Honorable, but stupid.\"";
+ next;
+ goto L_No_Member;
+
+L_Success21:
+ mes "[Birrod]";
+ mes "\"Right.\"";
+ next;
+ mes "\"When you are on a hunting trip with your comrades and it's time to set up a camp in the evening, what things do you do?\"";
+ menu
+ "Take care of everyone who got wounded.",L_Success31,
+ "Pitch the tent and make a fire.",L_Success32,
+ "Lay down and rest.",L_Fail31;
+
+L_Success31:
+ mes "[Birrod]";
+ mes "\"You're a caring person. Good.\"";
+ next;
+ goto L_Success3;
+
+L_Success32:
+ mes "[Birrod]";
+ mes "\"You're diligent, good.\"";
+ next;
+ goto L_Success3;
+
+L_Fail31:
+ mes "[Birrod]";
+ mes "\"You wouldn't make friends that way.\"";
+ next;
+ goto L_No_Member;
+
+L_Success3:
+ mes "\"What is your goal in life?\"";
+ menu
+ "Learn new things and see the world.",L_Success41,
+ "Become as powerful as I can.",L_Fail41,
+ "Protect the ones I love.",L_Success42;
+
+L_Success41:
+ mes "[Birrod]";
+ mes "\"You're curious. An attribute we appreciate.\"";
+ next;
+ goto L_Success4;
+
+L_Fail41:
+ mes "[Birrod]";
+ mes "\"You're seeking power? For what?\"";
+ next;
+ goto L_No_Member;
+
+L_Success42:
+ mes "[Birrod]";
+ mes "\"An honorable goal.\"";
+ next;
+ goto L_Success4;
+
+L_Success4:
+ mes "\"What do you think is a good reason to fight and kill?\"";
+ menu
+ "Because I want it.",L_Fail51,
+ "To survive.",L_Success51,
+ "To protect someone in need.",L_Success52;
+
+L_Fail51:
+ mes "[Birrod]";
+ mes "\"You think so?\"";
+ next;
+ goto L_No_Member;
+
+L_Success51:
+ mes "[Birrod]";
+ mes "\"Right.\"";
+ next;
+ goto L_Success5;
+
+L_Success52:
+ mes "[Birrod]";
+ mes "\"Yes, that's the most honorable reason.\"";
+ next;
+ goto L_Success5;
+
+L_Success5:
+ getexp @minigame_exp, 0;
+ updateskill SKILL_RAGING, 1;
+ @state = 6;
+ callsub S_Update_Mask;
+ mes "You feel an exciting energy inside you.";
+ mes "[Birrod]";
+ mes "\"You are now a warrior of the Mangarr.\"";
+ next;
+ mes "\"As a Mangarr warrior, you gain the ability to put back your own safety for Raging in battle with a tremendous power.";
+ mes "This power now lies within you, waiting for someone to help you focus on it.\"";
+ goto L_close;
+
+L_Impressed:
+ mes "[Birrod]";
+ mes "\"I'm very proud that you're a member of the tribe.\"";
+ goto L_close;
+
+L_Not_Ready:
+ mes "[Birrod]";
+ mes "\"" + strcharinfo(0) + ", you've shown great hunting skills and are an enrichment to our tribe.";
+ mes "But you still lack the needed mental skills to become a full member of our tribe.\"";
+ next;
+ mes "\"Roam this world to find more experienced persons than yourself to learn new things.";
+ mes "Then come back when you've gained the ability to focus your mind.\"";
+ goto L_close;
+
+L_No_Member:
+ mes "Birrod shakes his head.";
+ mes "[Birrod]";
+ mes "\"Think again about your position in our tribe and what you want to achieve.";
+ mes "Come back when you feel better prepared.\"";
+ goto L_close;
+
+L_Weak:
+ mes "[Birrod]";
+ mes "\"Hello, " + strcharinfo(0) + "! I might have a task for you when you've grown up a bit.\"";
+ goto L_close;
+
+L_close:
+ @state = 0;
+ @wolvern_level = 0;
+ @wolvern_exp = 0;
+ @minigame_exp = 0;
+ close;
+
+S_Update_Mask:
+ set QUEST_Barbarians,
+ (QUEST_Barbarians & ~($@Q_Barbarians_MASK)) | (@state << $@Q_Barbarians_SHIFT);
+ return;
+}
diff --git a/npc/033-1/kimarr.txt b/npc/033-1/kimarr.txt
new file mode 100644
index 00000000..74ae45a1
--- /dev/null
+++ b/npc/033-1/kimarr.txt
@@ -0,0 +1,405 @@
+
+
+
+
+
+033-1,74,32,0 script Kimarr NPC218,{
+ @halloween_npc_id = $@halloween_npc_kimarr;
+ callfunc "TrickOrTreat";
+
+ if ($@Fluffy_FighterID == getcharid(3))
+ goto L_Attention;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ if (@state >= 3) goto L_Again;
+ if (@state == 2) goto L_Reward;
+ if (@state == 1) goto L_Ask;
+
+ mes "[Barbarian]";
+ mes "\"Greetings, little person.\"";
+ next;
+ mes "\"I am Kimarr, hunter and warrior of the Mangarr.\"";
+ next;
+ mes "\"You are very small and must be careful in these snowy mountains. It is cold, and dangerous monsters are here.\"";
+ menu
+ "Hello, my name is " + strcharinfo(0) + " and I'm not small. I'm a great warrior!",L_Next,
+ "I'm " + strcharinfo(0) + ", don't underestimate me. I'm an experienced adventurer!",L_Next,
+ "I'm the legendary " + strcharinfo(0) + ", I've fought countless battles.",L_Next;
+
+L_Next:
+ mes "Kimarr seems to be amused.";
+ mes "[Kimarr]";
+ mes "\"Really? Do you want to prove it?\"";
+ menu
+ "Sure! What shall I do?",L_Continue,
+ "No, I don't need to prove anything.",L_close;
+
+L_Continue:
+ mes "\"Every young member of our tribe proves his or her worth by hunting monsters.\"";
+ next;
+ mes "\"The first monsters to hunt are Fluffies. Fluffies give a good meal for a young person and the fur can be used to make clothes and blankets.\"";
+ next;
+ @state = 1;
+ callsub S_Update_Mask;
+ goto L_ExplainGame;
+
+L_ExplainGame:
+ mes "[Kimarr]";
+ mes "\"In that cave there are living Fluffies. They like to eat apples.\"";
+ next;
+ mes "\"I also saw one of them getting excited about one of those sweet things you call 'cake'.\"";
+ next;
+ mes "\"Go to the cave entrance and throw food on the floor to make them come out.\"";
+ next;
+ mes "\"You should be careful, other monsters living here might like the food as well.\"";
+ next;
+ mes "\"Hunt as many Fluffies as you can until I tell you to stop.\"";
+ next;
+ mes "\"Drop more food when no Fluffies are left.\"";
+ next;
+ goto L_Ask;
+
+L_Ask:
+ mes "[Kimarr]";
+ mes "\"So, are you going to try?\"";
+ menu
+ "Yeah, let's start!",L_Game,
+ "Could you explain again?",L_ExplainGame,
+ "Can you tell me who were the most successful Fluffy hunters?",L_ShowRecord,
+ "Maybe later.",L_close;
+
+L_AlreadyGotReward:
+ npctalk strnpcinfo(0), strcharinfo(0) + " killed " + $@Fluffy_Kills + " Fluffies and has once again proven to be a good hunter.";
+ message strcharinfo(0), "Kimarr: Once again you prove your worth as a hunter! You killed " + $@Fluffy_Kills + " Fluffies.";
+ callsub S_Clean;
+ goto L_close;
+
+L_Reward1:
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ if (@state >= 2)
+ goto L_AlreadyGotReward;
+
+ npctalk strnpcinfo(0), "Hooray! " + strcharinfo(0) + " killed " + $@Fluffy_Kills + " Fluffies and is now a worthy hunter.";
+
+ // as far as I can tell, this fails because it won't resume from the "next"
+ // when the script is executed via the "OnFluffyDeath" callback
+ // (I haven't tried via the 301st call of OnTimer1000)
+ message strcharinfo(0), "Kimarr: Hooray! You hunted " + $@Fluffy_Kills + " Fluffies. Talk to me for your reward.";
+
+ @state = 2;
+ callsub S_Update_Mask;
+ callsub S_Clean;
+ goto L_close;
+
+L_Reward:
+ mes "[Kimarr]";
+ mes "\"That was very impressive. Now you can call yourself a hunter, " + strcharinfo(0) + ".\"";
+ next;
+
+ getinventorylist;
+ if (@inventorylist_count == 100)
+ goto L_Full_Inv;
+ @inventorylist_count = 0;
+
+ mes "\"Take this as a symbol of your strength. You're a member of our tribe now.\"";
+ getitem "YetiSkinShirt", 1;
+ @state = 3;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Full_Inv:
+ mes "\"You can't carry the reward I want to give you.\"";
+ goto L_close;
+
+L_Again:
+ mes "[Kimarr]";
+ mes "\"Does the hunter " + strcharinfo(0) + " want to hunt some Fluffies again?\"";
+ menu
+ "Yeah!",L_Game,
+ "Can you tell me who were the most successful Fluffy hunters?",L_ShowRecord,
+ "Not now.",L_close;
+
+L_Game:
+ if ($@Fluffy_Hunting)
+ goto L_Someone_Else;
+ $@Fluffy_Hunting = 1;
+ $@Fluffy_Kills = 0;
+ $@Fluffy_PC_Deaths = PC_DIE_COUNTER;
+ $@Fluffy_Fighter$ = strcharinfo(0);
+ $@Fluffy_FighterID = getcharid(3);
+ $@Fluffy_Time = 180;
+ $@Fluffy_Min = 1 + (BaseLevel*7)/10;
+
+ warp "033-1", 79, 34;
+ initnpctimer;
+ goto L_close;
+
+L_Someone_Else:
+ mes "[Kimarr]";
+ mes "\"Someone else is hunting right now. Let's wait until that hunt has ended.\"";
+ goto L_close;
+
+L_Attention:
+ message strcharinfo(0), "Kimarr: You should be focused on hunting Fluffies, not talking.";
+ end;
+
+OnTimer1000:
+ if ($@Fluffy_Hunting == 3)
+ goto L_Action;
+ $@Fluffy_Hunting = $@Fluffy_Hunting + 1;
+ goto L_ContinueTimer;
+L_Action:
+ if (attachrid($@Fluffy_FighterID) == 0)
+ goto L_GotOut;
+ if (getareausers("033-1", 79, 28, 88, 42) == 0)
+ goto L_GotOut;
+ if (PC_DIE_COUNTER > $@Fluffy_PC_Deaths)
+ goto L_Died;
+ if (getareausers("033-1", 79, 28, 88, 42) > 1)
+ areatimer 0, "033-1", 79, 28, 88, 42, 10, "Kimarr::OnTooMany";
+
+ if ($@Fluffy_Time == 180)
+ npctalk strnpcinfo(0), strcharinfo(0) + ", you have 3 minutes.";
+ if ($@Fluffy_Time == 120)
+ npctalk strnpcinfo(0), "You have 2 minutes left.";
+ if ($@Fluffy_Time == 60)
+ npctalk strnpcinfo(0), "You have 1 minute left.";
+ if ($@Fluffy_Time == 30)
+ npctalk strnpcinfo(0), "You have 30 seconds left.";
+ if ($@Fluffy_Time == 15)
+ npctalk strnpcinfo(0), "You have 15 seconds left.";
+ if ($@Fluffy_Time == 10)
+ npctalk strnpcinfo(0), "You have 10 seconds left.";
+ if ($@Fluffy_Time == 5)
+ npctalk strnpcinfo(0), "You have 5 seconds left.";
+ $@Fluffy_Time = $@Fluffy_Time - 1;
+ if ($@Fluffy_Time < 0)
+ goto L_TimeOver;
+ goto L_CheckDrops;
+
+L_ContinueTimer:
+ setnpctimer 0;
+ end;
+
+L_GotOut:
+ npctalk strnpcinfo(0), "What a strange thing... " + $@Fluffy_Fighter$ + " just disappeared!";
+ callsub S_Clean;
+ end;
+
+OnTooMany:
+ if (getcharid(3) == $@Fluffy_FighterID)
+ end;
+ npctalk strnpcinfo(0), "Hey " + strcharinfo(0) + "! What are you doing there? This hunt is for " + $@Fluffy_Fighter$ + " alone!";
+ warp "033-1", 77, 34;
+ end;
+
+L_Died:
+ warp "033-1", 77, 34;
+ message strcharinfo(0), "You are dead.";
+ npctalk strnpcinfo(0), "Oh no! " + $@Fluffy_Fighter$ + " got overwhelmed!";
+ callsub S_Clean;
+ end;
+
+L_TimeOver:
+ message strcharinfo(0), "Your time is over.";
+ goto L_MaybeRecordScore;
+
+L_CheckDrops:
+ @Fluffy_RedApple = getareadropitem("033-1", 79, 29, 88, 42, "RedApple", 1);
+ @Fluffy_XmasCake = getareadropitem("033-1", 79, 29, 88, 42, "XmasCake", 1);
+ @Fluffy_Cake = getareadropitem("033-1", 79, 29, 88, 42, "Cake", 1);
+ @Fluffy_GreenApple = getareadropitem("033-1", 79, 29, 88, 42, "GreenApple", 1);
+ if (@Fluffy_RedApple || @Fluffy_XmasCake || @Fluffy_Cake || @Fluffy_GreenApple)
+ goto L_BeginHunting;
+ goto L_ContinueTimer;
+
+L_BeginHunting:
+ $@Fluffy_Spawn = @Fluffy_RedApple + 5 * @Fluffy_XmasCake + 3 * @Fluffy_Cake + @Fluffy_GreenApple;
+ // limit the number of monsters that can be spawned, to prevent people creating lag with massive amount of monsters
+ if (($@Fluffy_Spawn + $@Fluffy_Alive) <= 100)
+ goto L_SpawnFluffies;
+ message strcharinfo(0), "Wow, calm down, there are already too many Fluffies around here.";
+ $@Fluffy_Spawn = 100 - $@Fluffy_Alive;
+ if ($@Fluffy_Spawn <= 0)
+ goto L_ContinueTimer;
+ goto L_SpawnFluffies;
+
+L_SpawnFluffies:
+ areamonster "033-1", 79, 29, 88, 42, "", 1089, $@Fluffy_Spawn, "Kimarr::OnFluffyDeath";
+
+ $@Fluffy_Extra = 5 * @Fluffy_XmasCake + 3 * @Fluffy_Cake + 12 * ($@Fluffy_Alive + $@Fluffy_Spawn) + 7 * BaseLevel;
+ if ((BaseLevel > 40) && (rand($@Fluffy_Extra) > 500)) // Ice Goblin
+ areamonster "033-1", 79, 29, 88, 42, "", 1058, 1, "Kimarr::OnIceGoblinDeath";
+ if ((BaseLevel > 60) && (rand($@Fluffy_Extra) > 550)) // Wolvern
+ areamonster "033-1", 79, 29, 88, 42, "", 1090, 1, "Kimarr::OnWolvernDeath";
+ if ((BaseLevel > 70) && (rand($@Fluffy_Extra) > 600)) // Yeti
+ areamonster "033-1", 79, 29, 88, 42, "", 1072, 1, "Kimarr::OnYetiDeath";
+
+ $@Fluffy_Extra = 0;
+ @Fluffy_RedApple = 0;
+ @Fluffy_XmasCake = 0;
+ @Fluffy_Cake = 0;
+ @Fluffy_GreenApple = 0;
+ $@Fluffy_Alive = $@Fluffy_Alive + $@Fluffy_Spawn;
+ goto L_ContinueTimer;
+
+OnIceGoblinDeath:
+ @mobId = 1058;
+ if (getcharid(3) != $@Fluffy_FighterID)
+ goto L_Punish;
+ @mobId = 0;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+ if (getcharid(3) != $@Fluffy_FighterID)
+ goto L_Punish;
+ @mobId = 0;
+ end;
+
+OnYetiDeath:
+ @mobId = 1072;
+ if (getcharid(3) != $@Fluffy_FighterID)
+ goto L_Punish;
+ @mobId = 0;
+ end;
+
+OnFluffyDeath:
+ @mobId = 1089;
+ if ($@Fluffy_Hunting == 0)
+ end;
+ if (getcharid(3) != $@Fluffy_FighterID)
+ goto L_Punish;
+ @mobId = 0;
+ $@Fluffy_Kills = $@Fluffy_Kills + 1;
+ $@Fluffy_Alive = $@Fluffy_Alive - 1;
+ if ($@Fluffy_Alive != 0)
+ end;
+ if (attachrid($@Fluffy_FighterID) == 1)
+ goto L_Killedall;
+ goto L_GotOut;
+
+L_Punish:
+ if (@mobId == 1089)
+ areamonster "033-1", 79, 29, 88, 42, "", 1089, 1, "Kimarr::OnFluffyDeath";
+ if (@mobId == 1058)
+ areamonster "033-1", 79, 29, 88, 42, "", 1058, 1, "Kimarr::OnIceGoblinDeath";
+ if (@mobId == 1090)
+ areamonster "033-1", 79, 29, 88, 42, "", 1090, 1, "Kimarr::OnWolvernDeath";
+ if (@mobId == 1072)
+ areamonster "033-1", 79, 29, 88, 42, "", 1072, 1, "Kimarr::OnYetiDeath";
+
+ npctalk strnpcinfo(0), strcharinfo(0) + "! This hunt is for " + $@Fluffy_Fighter$ + " alone!";
+ heal -Hp, 0;
+ @mobId = 0;
+ end;
+
+L_Killedall:
+ message strcharinfo(0), "Good job, but you still have time to throw more food on the ground.";
+ end;
+
+S_Clean:
+ stopnpctimer;
+ $@Fluffy_Hunting = 0;
+ $@Fluffy_Time = 0;
+ $@Fluffy_PC_Deaths = 0;
+ $@Fluffy_Fighter$ = "";
+ $@Fluffy_FighterID = 0;
+ $@Fluffy_Kills = 0;
+ $@Fluffy_Spawn = 0;
+ $@Fluffy_Alive = 0;
+ killmonster "033-1", "Kimarr::OnIceGoblinDeath";
+ killmonster "033-1", "Kimarr::OnWolvernDeath";
+ killmonster "033-1", "Kimarr::OnYetiDeath";
+ killmonster "033-1", "Kimarr::OnFluffyDeath";
+ @state = 0;
+ return;
+
+L_MaybeRecordScore:
+ warp "033-1", 77, 34;
+ if ($@Fluffy_Kills < $@Fluffy_Min)
+ goto L_NotGoodEnough;
+ @rank = 0;
+ goto L_MaybeInsertNext;
+
+L_MaybeInsertNext:
+ if ($@Fluffy_Kills > $Record_Fluffy_Kills[@rank])
+ goto L_InsertScore;
+ // you already had a better score
+ if (strcharinfo(0) == $Record_Fluffy_Name$[@rank])
+ goto L_Reward1;
+ @rank = @rank + 1;
+ if (@rank == MAX_HIGH_SCORES)
+ goto L_Reward1;
+ goto L_MaybeInsertNext;
+
+L_InsertScore:
+ @loop = @rank;
+ goto L_FindLastScore;
+
+L_FindLastScore:
+ // comment this out to allow the player to be in the list more than once
+ // though actually, it might be better just to assume the list is full
+ if (strcharinfo(0) == $Record_Fluffy_Name$[@loop])
+ goto L_MoveStuff;
+
+ @loop = @loop + 1;
+ if (@loop == MAX_HIGH_SCORES)
+ goto L_MoveStuff;
+ goto L_FindLastScore;
+
+L_MoveStuff:
+ if (@loop == @rank)
+ goto L_FinallyInsertMe;
+ $Record_Fluffy_Kills[@loop] = $Record_Fluffy_Kills[@loop - 1];
+ $Record_Fluffy_Name$[@loop] = $Record_Fluffy_Name$[@loop - 1];
+ $Record_Fluffy_Date$[@loop] = $Record_Fluffy_Date$[@loop - 1];
+ @loop = @loop - 1;
+ goto L_MoveStuff;
+
+L_FinallyInsertMe:
+ $Record_Fluffy_Kills[@rank] = $@Fluffy_Kills;
+ $Record_Fluffy_Name$[@rank] = strcharinfo(0);
+ callfunc "time_stamp";
+ $Record_Fluffy_Date$[@rank] = @ts_date$ + " " + @ts_time$;
+ @ts_date$ = "";
+ @ts_time$ = "";
+ goto L_Reward1;
+
+L_NotGoodEnough:
+ npctalk strnpcinfo(0), "What a disappointment, " + strcharinfo(0) + " hunted only " + $@Fluffy_Kills + " Fluffies.";
+ message strcharinfo(0), "Kimarr: What a disappointment, you hunted only " + $@Fluffy_Kills + " Fluffies.";
+ callsub S_Clean;
+ end;
+
+L_ShowRecord:
+ @rank = 0;
+ @loop = 0;
+ goto L_ShowNextRecord;
+
+L_ShowNextRecord:
+ if ($Record_Fluffy_Kills[@loop] == 0)
+ goto L_close;
+ mes (@loop + 1) + " - " + $Record_Fluffy_Name$[@loop] + " - " + $Record_Fluffy_Kills[@loop] + " Fluffies killed at " + $Record_Fluffy_Date$[@loop];
+ @loop = @loop + 1;
+ goto L_ShowNextRecord;
+
+L_close:
+ // clear all temporary player variables that are not otherwise cleared
+
+ // it is not feasible to otherwise clear @loop
+ // but, not all jumpers to L_close have necessarily used it ...
+ // still, I think it's a good precent to ALWAYS exit via L_close
+ @loop = 0;
+
+ // if you unset @state, it might break the script
+ // If only we had the concept of "local constants" ...
+ close;
+
+S_Update_Mask:
+ set QUEST_Barbarians,
+ (QUEST_Barbarians & ~($@Q_Barbarians_MASK)) | (@state << $@Q_Barbarians_SHIFT);
+ return;
+}
diff --git a/npc/033-1/mapflags.txt b/npc/033-1/mapflags.txt
new file mode 100644
index 00000000..5887f1d6
--- /dev/null
+++ b/npc/033-1/mapflags.txt
@@ -0,0 +1 @@
+//033-1 mapflag resave 033-1,67,33
diff --git a/npc/033-1/traveler.txt b/npc/033-1/traveler.txt
new file mode 100644
index 00000000..0e40675d
--- /dev/null
+++ b/npc/033-1/traveler.txt
@@ -0,0 +1,7 @@
+
+033-1,63,30,0 script Khoenan the Traveler NPC103,{
+ @npcname$ = "Khoenan";
+ @NpcTravelBit = $@barbarians_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/033-1/yerrnk.txt b/npc/033-1/yerrnk.txt
new file mode 100644
index 00000000..a4f6f5e2
--- /dev/null
+++ b/npc/033-1/yerrnk.txt
@@ -0,0 +1,205 @@
+033-1,66,28,0 script Yerrnk NPC216,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ @yeti_level = 70;
+
+ if (@state >= 9) goto L_Done;
+ if (@state == 8) goto L_Yeti_Success;
+ if (@state == 7) goto L_Hunt_Yeti;
+ if (@state == 6) goto L_Warrior;
+ if (@state == 5) goto L_Birrod;
+ if (@state == 4) goto L_Sorrow;
+ if (@state == 3) goto L_Duty;
+ if (@state == 2) goto L_Kimarr;
+ if (@state == 1) goto L_Fluffy;
+
+ mes "[Barbarian]";
+ mes "\"Hello. I'm Yerrnk, first warrior of the Mangarr.\"";
+ next;
+ mes "Yerrnk looks at you cautiously.";
+ mes "[Yerrnk]";
+ mes "\"Please take care of your own business.\"";
+ goto L_close;
+
+L_Fluffy:
+ mes "[Yerrnk]";
+ mes "\"Kimarr talks too much sometimes.\"";
+ mes "He sighs.";
+ next;
+ mes "[Yerrnk]";
+ mes "\"Are you going to accept Kimarr's task? It's an ancient ceremony in our tribe. A young member is accepted as an adult after completing it.\"";
+ goto L_close;
+
+L_Kimarr:
+ mes "[Yerrnk]";
+ mes "\"I think Kimarr wants to give you something.\"";
+ goto L_close;
+
+L_Duty:
+ mes "[Yerrnk]";
+ mes "\"I'm not sure if you are aware about the meaning of your actions.\"";
+ next;
+ mes "\"You passed the initiation rite for hunters of our tribe. That means now you are a hunter of our tribe, with all the rights and duties that come along with that.\"";
+ next;
+ mes "\"So you'll have to obey our laws and traditions, protect and help any member of our tribe that is in need, and show neither weakness nor fear in battle.\"";
+ next;
+ mes "\"Keep this in mind. If you fail you'll have to receive the elders' judgement.\"";
+ goto L_close;
+
+L_Sorrow:
+ mes "[Yerrnk]";
+ mes "\"I noticed that you're getting along with Kimarr and Birrod very well. That's good.\"";
+ mes "He smiles, but then an expression of worry returns to his face.";
+ next;
+ goto L_Mission;
+
+L_Mission:
+ mes "[Yerrnk]";
+ mes "\"Our tribe is going through dire times. We have lived in harmony with the mountain since time beyond memory.";
+ mes "Life is hard in the snowy mountains, but this life suits our nature.\"";
+ next;
+ mes "\"Some weeks ago the Yetis started to act very strangely. Usually they are very shy, but now....";
+ mes "They left the secluded areas high up in the mountains they used to live on and started roaming our hunting grounds.\"";
+ next;
+ mes "\"It became very dangerous to leave the village, so it's even harder to gather enough food to survive.";
+ mes "Not only this, but the Yetis are getting more daring every day. They might attack the village itself sooner or later.\"";
+ next;
+ mes "\"Other wild animals are more aggressive as well, though the Yetis are the most dangerous.";
+ mes "Something like this has never happened before. We have no idea what could cause the animals to behave like this.\"";
+ next;
+ mes "\"That's why we were sent on a mission to seek help from the Sages of Kaizei.";
+ mes "The Sages are wizards of great power and wisdom, and we hope they might be able to give us advice.\"";
+ next;
+ mes "\"We already went to Sage Nikolai, who's residence is located in the same snow mountains we live in.";
+ mes "But there happened some severe accident, so they weren't able to spent any attention to our problem and might rather need help themselves.\"";
+ next;
+ mes "\"That's why we came down here to search for Santa, he's one of the most powerful of the Sages.\"";
+ goto L_close;
+
+L_Birrod:
+ mes "[Yerrnk]";
+ mes "\"" + strcharinfo(0) + ", I have to admit that I'm surprised by your skills.";
+ mes "You've proven your bravery and strength.\"";
+ next;
+ if (getskilllv(SKILL_POOL) == 0)
+ goto L_Not_Ready;
+ mes "\"Please talk to Birrod to receive the initiation rite to become a warrior of the Mangarr.\"";
+ menu
+ "Alright.",L_close,
+ "Can you tell me again what you are here for?",L_Mission;
+
+L_Not_Ready:
+ mes "[Yerrnk]";
+ mes "\"But you're not yet ready to become a fully accepted warrior of our tribe.";
+ mes "You should travel the world to gain the ability to focus on your inner strength.\"";
+ menu
+ "Alright.",L_close,
+ "What are you doing down here?",L_Mission;
+
+L_Warrior:
+ mes "[Yerrnk]";
+ mes "\"" + strcharinfo(0) + ", welcome back!";
+ mes "Do you have any question?\"";
+ menu
+ "Everything's all right, thanks.",L_close,
+ "What are you doing down here?",L_Mission,
+ "Can you explain the Raging ability to me?",L_Skill,
+ "Do you have a task for me?",L_Task;
+
+L_Skill:
+ mes "[Yerrnk]";
+ mes "\"As a warrior of our tribe it should be the most important thing to you to defend weaker members of the tribe.";
+ mes "To achieve this goal our warriors are training the skill to stand the pain of being hit and even use it to get into a state of rage.\"";
+ next;
+ mes "\"It works only in a melee fight, when you hear your opponent gasping, smell his sweat, and feel the heat of his body.\"";
+ next;
+ mes "Yerrnk gets excited, then he pauses a moment to calm down.";
+ mes "\"Basically you neglect of your own defense but gain the ability to hit your enemy with outstanding might.\"";
+ next;
+ mes "[Yerrnk]";
+ mes "\"You can imagine that this creates some danger. That's why we usually fight as a group, so a weakened warrior can step back and recover while the others continue to fight.";
+ mes "It's also beneficial to have a healer, but very few members of our tribe are born with the ability to wield magic.\"";
+ goto L_close;
+
+L_Task:
+ if (BaseLevel >= @yeti_level)
+ goto L_Yeti;
+ mes "[Yerrnk]";
+ mes "\"Not at the moment.";
+ mes "Try to stop by later and use the time to practice your abilities.\"";
+ goto L_close;
+
+L_Yeti:
+ mes "[Yerrnk]";
+ mes "\"Indeed, there's something to do that needs a competent warrior.";
+ mes "We've got reports about a single Yeti prowling around one of the houses in the woods west of here.\"";
+ next;
+ mes "\"If you dare to take on this task, seek that Yeti and make the area secure again.";
+ mes "To find the house, enter the forest and then go first south and then west.\"";
+ @state = 7;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Hunt_Yeti:
+ mes "[Yerrnk]";
+ mes "\"That Yeti is still roaming in the forest west of here.";
+ mes "To find the house it's prowling around, enter the forest and then go first south and then west.\"";
+ menu
+ "I'm on it.",L_close,
+ "What are you doing down here?",L_Mission,
+ "Can you explain the Raging ability to me?",L_Skill;
+
+L_Yeti_Success:
+ mes "[Yerrnk]";
+ mes "\"" + strcharinfo(0) + "! You made it!";
+ mes "You proved that you're one of the most skilled warriors of our tribe. Please have this.\"";
+ getitem "LeatherTrousers", 1;
+ @state = 9;
+ callsub S_Update_Mask;
+ goto L_close;
+
+L_Done:
+ if (countitem("Antlers") > 0 && @state < 10) goto L_AntlerHat;
+ mes "Yerrnk smiles at you.";
+ mes "[Yerrnk]";
+ mes "\"Welcome back, great warrior.\"";
+ menu
+ "What's the reason you came here?",L_Mission,
+ "Can you explain the raging ability to me?",L_Skill,
+ "(Leave)",L_close;
+
+L_AntlerHat:
+ mes "Yerrnk grins.";
+ next;
+ mes "[Yerrnk]";
+ mes "\"Welcome back, great warrior.\"";
+ next;
+ mes "\"I could turn your " + getitemlink("Antlers") + " into a " + getitemlink("AntlerHat") + " for the modest price of 5,000,000 GP.\"";
+ if (Zeny >= 5000000)
+ menu
+ "Please do!", L_AntlerHat_Proceed;
+ menu
+ "Sorry, I'm broke", L_close;
+
+L_AntlerHat_Proceed:
+ mes "[Yerrnk]";
+ mes "\"There you go.\"";
+ @state = 10;
+ callsub S_Update_Mask;
+ delitem "Antlers", 1;
+ if (Zeny < 5000000) goto L_close;
+ Zeny = Zeny - 5000000;
+ getitem "AntlerHat", 1;
+ goto L_close;
+
+L_close:
+ @state = 0;
+ @yeti_level = 0;
+ close;
+
+S_Update_Mask:
+ set QUEST_Barbarians,
+ (QUEST_Barbarians & ~($@Q_Barbarians_MASK))
+ | (@state << $@Q_Barbarians_SHIFT);
+ return;
+}
diff --git a/npc/034-1/_import.txt b/npc/034-1/_import.txt
new file mode 100644
index 00000000..319720b3
--- /dev/null
+++ b/npc/034-1/_import.txt
@@ -0,0 +1,7 @@
+// Map 034-1: Snow Forest
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/034-1/_mobs.txt",
+"npc/034-1/_warps.txt",
+"npc/034-1/ambushs.txt",
+"npc/034-1/mapflags.txt",
+"npc/034-1/yetiSpawn.txt",
diff --git a/npc/034-1/_mobs.txt b/npc/034-1/_mobs.txt
new file mode 100644
index 00000000..429df6f1
--- /dev/null
+++ b/npc/034-1/_mobs.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 034-1: Snow Forest mobs
+034-1,0,0,0,0 monster Reinboo 1094,4,100000,30000
+034-1,0,0,0,0 monster Fluffy 1020,25,100000,30000
+034-1,0,0,0,0 monster White Bell 1095,5,100000,30000
+034-1,0,0,0,0 monster Squirrel 1038,25,100000,30000
+034-1,0,0,0,0 monster Santaboo 1112,4,100000,30000
+034-1,1,1,0,0 monster Ice Goblin 1058,25,100000,30000
diff --git a/npc/034-1/_warps.txt b/npc/034-1/_warps.txt
new file mode 100644
index 00000000..50230ced
--- /dev/null
+++ b/npc/034-1/_warps.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 034-1: Snow Forest warps
+034-1,160,20,0 warp #034-1_160_20 0,1,033-1,23,19
+034-1,16,103,0 warp #034-1_16_103 0,2,045-1,176,133
+034-1,15,31,0 warp #034-1_15_31 0,1,045-1,174,59
+034-1,95,18,0 warp #034-1_95_18 1,0,046-1,94,123
+034-1,31,68,0 warp #034-1_31_68 0,0,034-2,28,31
+034-1,64,99,0 warp #034-1_64_99 0,0,034-2,73,29
diff --git a/npc/034-1/ambushs.txt b/npc/034-1/ambushs.txt
new file mode 100644
index 00000000..71eaa4e0
--- /dev/null
+++ b/npc/034-1/ambushs.txt
@@ -0,0 +1,870 @@
+
+034-1,118,59,0 script #Ambush0Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush0_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush0_Spawn > 0)
+ end;
+ $@Ambush0VictimID = getcharid(3);
+ donpcevent "#Ambush0::OnAmbush";
+ end;
+}
+
+034-1,118,59,0 script #Ambush0 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush0VictimID) == 0)
+ goto L_Clean;
+ $@Ambush0_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 115, 56, 121, 62, "", 1090, $@Ambush0_Spawn, "#Ambush0::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush0_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush0_Spawn = $@Ambush0_Spawn - 1;
+
+ if (($@Ambush0VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush0_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush0VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush0_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,94,91,0 script #Ambush1Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush1_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush1_Spawn > 0)
+ end;
+ $@Ambush1VictimID = getcharid(3);
+ donpcevent "#Ambush1::OnAmbush";
+ end;
+}
+
+034-1,94,91,0 script #Ambush1 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush1VictimID) == 0)
+ goto L_Clean;
+ $@Ambush1_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 91, 88, 97, 94, "", 1090, $@Ambush1_Spawn, "#Ambush1::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush1_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush1_Spawn = $@Ambush1_Spawn - 1;
+
+ if (($@Ambush1VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush1_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush1VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush1_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,122,35,0 script #Ambush2Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush2_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush2_Spawn > 0)
+ end;
+ $@Ambush2VictimID = getcharid(3);
+ donpcevent "#Ambush2::OnAmbush";
+ end;
+}
+
+034-1,122,35,0 script #Ambush2 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush2VictimID) == 0)
+ goto L_Clean;
+ $@Ambush2_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 119, 32, 125, 38, "", 1090, $@Ambush2_Spawn, "#Ambush2::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush2_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush2_Spawn = $@Ambush2_Spawn - 1;
+
+ if (($@Ambush2VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush2_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush2VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush2_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,83,44,0 script #Ambush3Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush3_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush3_Spawn > 0)
+ end;
+ $@Ambush3VictimID = getcharid(3);
+ donpcevent "#Ambush3::OnAmbush";
+ end;
+}
+
+034-1,83,44,0 script #Ambush3 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush3VictimID) == 0)
+ goto L_Clean;
+ $@Ambush3_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 80, 41, 86, 47, "", 1090, $@Ambush3_Spawn, "#Ambush3::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush3_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush3_Spawn = $@Ambush3_Spawn - 1;
+
+ if (($@Ambush3VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush3_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush3VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush3_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,74,28,0 script #Ambush4Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush4_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush4_Spawn > 0)
+ end;
+ $@Ambush4VictimID = getcharid(3);
+ donpcevent "#Ambush4::OnAmbush";
+ end;
+}
+
+034-1,74,28,0 script #Ambush4 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush4VictimID) == 0)
+ goto L_Clean;
+ $@Ambush4_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 71, 25, 77, 31, "", 1090, $@Ambush4_Spawn, "#Ambush4::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush4_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush4_Spawn = $@Ambush4_Spawn - 1;
+
+ if (($@Ambush4VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush4_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush4VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush4_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,26,44,0 script #Ambush5Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush5_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush5_Spawn > 0)
+ end;
+ $@Ambush5VictimID = getcharid(3);
+ donpcevent "#Ambush5::OnAmbush";
+ end;
+}
+
+034-1,26,44,0 script #Ambush5 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush5VictimID) == 0)
+ goto L_Clean;
+ $@Ambush5_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 23, 41, 29, 47, "", 1090, $@Ambush5_Spawn, "#Ambush5::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush5_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush5_Spawn = $@Ambush5_Spawn - 1;
+
+ if (($@Ambush5VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush5_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush5VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush5_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,50,47,0 script #Ambush6Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush6_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush6_Spawn > 0)
+ end;
+ $@Ambush6VictimID = getcharid(3);
+ donpcevent "#Ambush6::OnAmbush";
+ end;
+}
+
+034-1,50,47,0 script #Ambush6 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush6VictimID) == 0)
+ goto L_Clean;
+ $@Ambush6_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 47, 44, 53, 50, "", 1090, $@Ambush6_Spawn, "#Ambush6::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush6_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush6_Spawn = $@Ambush6_Spawn - 1;
+
+ if (($@Ambush6VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush6_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush6VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush6_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,36,62,0 script #Ambush7Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush7_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush7_Spawn > 0)
+ end;
+ $@Ambush7VictimID = getcharid(3);
+ donpcevent "#Ambush7::OnAmbush";
+ end;
+}
+
+034-1,36,62,0 script #Ambush7 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush7VictimID) == 0)
+ goto L_Clean;
+ $@Ambush7_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 33, 59, 39, 65, "", 1090, $@Ambush7_Spawn, "#Ambush7::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush7_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush7_Spawn = $@Ambush7_Spawn - 1;
+
+ if (($@Ambush7VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush7_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush7VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush7_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,26,95,0 script #Ambush8Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush8_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush8_Spawn > 0)
+ end;
+ $@Ambush8VictimID = getcharid(3);
+ donpcevent "#Ambush8::OnAmbush";
+ end;
+}
+
+034-1,26,95,0 script #Ambush8 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush8VictimID) == 0)
+ goto L_Clean;
+ $@Ambush8_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 23, 92, 29, 98, "", 1090, $@Ambush8_Spawn, "#Ambush8::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush8_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush8_Spawn = $@Ambush8_Spawn - 1;
+
+ if (($@Ambush8VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush8_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush8VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush8_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,56,91,0 script #Ambush9Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush9_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush9_Spawn > 0)
+ end;
+ $@Ambush9VictimID = getcharid(3);
+ donpcevent "#Ambush9::OnAmbush";
+ end;
+}
+
+034-1,56,91,0 script #Ambush9 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush9VictimID) == 0)
+ goto L_Clean;
+ $@Ambush9_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 53, 88, 59, 94, "", 1090, $@Ambush9_Spawn, "#Ambush9::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush9_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush9_Spawn = $@Ambush9_Spawn - 1;
+
+ if (($@Ambush9VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush9_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush9VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush9_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,65,66,0 script #Ambush10Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush10_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush10_Spawn > 0)
+ end;
+ $@Ambush10VictimID = getcharid(3);
+ donpcevent "#Ambush10::OnAmbush";
+ end;
+}
+
+034-1,65,66,0 script #Ambush10 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush10VictimID) == 0)
+ goto L_Clean;
+ $@Ambush10_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 62, 63, 68, 69, "", 1090, $@Ambush10_Spawn, "#Ambush10::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush10_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush10_Spawn = $@Ambush10_Spawn - 1;
+
+ if (($@Ambush10VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush10_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush10VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush10_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,86,68,0 script #Ambush11Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush11_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush11_Spawn > 0)
+ end;
+ $@Ambush11VictimID = getcharid(3);
+ donpcevent "#Ambush11::OnAmbush";
+ end;
+}
+
+034-1,86,68,0 script #Ambush11 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush11VictimID) == 0)
+ goto L_Clean;
+ $@Ambush11_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 83, 65, 89, 71, "", 1090, $@Ambush11_Spawn, "#Ambush11::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush11_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush11_Spawn = $@Ambush11_Spawn - 1;
+
+ if (($@Ambush11VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush11_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush11VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush11_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,101,79,0 script #Ambush12Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush12_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush12_Spawn > 0)
+ end;
+ $@Ambush12VictimID = getcharid(3);
+ donpcevent "#Ambush12::OnAmbush";
+ end;
+}
+
+034-1,101,79,0 script #Ambush12 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush12VictimID) == 0)
+ goto L_Clean;
+ $@Ambush12_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 98, 76, 104, 82, "", 1090, $@Ambush12_Spawn, "#Ambush12::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush12_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush12_Spawn = $@Ambush12_Spawn - 1;
+
+ if (($@Ambush12VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush12_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush12VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush12_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,124,88,0 script #Ambush13Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush13_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush13_Spawn > 0)
+ end;
+ $@Ambush13VictimID = getcharid(3);
+ donpcevent "#Ambush13::OnAmbush";
+ end;
+}
+
+034-1,124,88,0 script #Ambush13 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush13VictimID) == 0)
+ goto L_Clean;
+ $@Ambush13_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 121, 85, 127, 91, "", 1090, $@Ambush13_Spawn, "#Ambush13::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush13_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush13_Spawn = $@Ambush13_Spawn - 1;
+
+ if (($@Ambush13VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush13_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush13VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush13_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
+
+034-1,117,103,0 script #Ambush14Trigger NPC32767,2,2,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 4)
+ end;
+
+ if (@ambushs034 == $@Q_Barbarians_Ambush_max)
+ @ambushs034 = 0;
+ if (@ambushs034 & $@Q_Barbarians_Ambush14_flag)
+ end;
+ if (rand(50) < wolvern_count)
+ end;
+
+ if ($@Ambush14_Spawn > 0)
+ end;
+ $@Ambush14VictimID = getcharid(3);
+ donpcevent "#Ambush14::OnAmbush";
+ end;
+}
+
+034-1,117,103,0 script #Ambush14 NPC32767,{
+end;
+
+OnAmbush:
+ if (attachrid($@Ambush14VictimID) == 0)
+ goto L_Clean;
+ $@Ambush14_Spawn = 3 + rand(2);
+ message strcharinfo(0), "An ambush!";
+ areamonster "034-1", 114, 100, 120, 106, "", 1090, $@Ambush14_Spawn, "#Ambush14::OnWolvernDeath";
+ @ambushs034 = @ambushs034 | $@Q_Barbarians_Ambush14_flag;
+ end;
+
+OnWolvernDeath:
+ @mobId = 1090;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+
+ $@Ambush14_Spawn = $@Ambush14_Spawn - 1;
+
+ if (($@Ambush14VictimID == getcharid(3)) && (@state == 4))
+ goto L_Count;
+ if ($@Ambush14_Spawn > 0)
+ end;
+ goto L_Clean;
+
+L_Clean:
+ $@Ambush14VictimID = 0;
+ end;
+
+L_Count:
+ wolvern_count = wolvern_count + 1;
+ if (wolvern_count >= $@Q_Barbarians_wolvern_amount)
+ message strcharinfo(0), "You've hunted down a lot of Wolverns. Maybe you should talk to Birrod?";
+ if ($@Ambush14_Spawn <= 0)
+ goto L_Clean;
+ end;
+}
+
diff --git a/npc/034-1/mapflags.txt b/npc/034-1/mapflags.txt
new file mode 100644
index 00000000..5af27ecb
--- /dev/null
+++ b/npc/034-1/mapflags.txt
@@ -0,0 +1 @@
+//034-1 mapflag resave 033-1,67,33
diff --git a/npc/034-1/yetiSpawn.txt b/npc/034-1/yetiSpawn.txt
new file mode 100644
index 00000000..c8668101
--- /dev/null
+++ b/npc/034-1/yetiSpawn.txt
@@ -0,0 +1,58 @@
+
+034-1,79,98,0 script #Yerrnk_YetiTrigger NPC32767,1,3,{
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 7)
+ end;
+
+ if ($@Yerrnk_Yeti_Active != 0)
+ end;
+ $@Yerrnk_Yetifighter_ID = getcharid(3);
+ $@Yerrnk_Yeti_Active = 1;
+ donpcevent "#Yerrnk_Yeti::OnYeti";
+ end;
+}
+
+034-1,78,98,0 script #Yerrnk_Yeti NPC32767,{
+end;
+
+OnYeti:
+ if (attachrid($@Yerrnk_Yetifighter_ID) == 0)
+ goto L_Abort;
+
+ message strcharinfo(0), "There is the Yeti!";
+ areamonster "034-1", 67, 93, 74, 102, "", 1072, 1, "#Yerrnk_Yeti::OnYetiDeath";
+ end;
+
+L_Abort:
+ $@Yerrnk_Yeti_Active = 0;
+ $@Yerrnk_Yetifighter_ID = 0;
+ end;
+
+OnYetiDeath:
+ @mobId = 1072;
+
+ @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);
+ if (@state != 7)
+ goto L_NonQuestKill;
+ @state = 8;
+ callsub S_Update_Mask;
+ BOSS_POINTS = BOSS_POINTS + 40;
+ message strcharinfo(0), "You defeated the Yeti and gain 40 Boss Points giving you a total of " + BOSS_POINTS + ".";
+ goto L_End;
+
+L_End:
+ $@Yerrnk_Yeti_Active = 0;
+ $@Yerrnk_Yetifighter_ID = 0;
+ end;
+
+L_NonQuestKill:
+ message strcharinfo(0), "The dying Yeti takes you along to the other side.";
+ heal -Hp, 0;
+ goto L_End;
+
+S_Update_Mask:
+ set QUEST_Barbarians,
+ (QUEST_Barbarians & ~($@Q_Barbarians_MASK))
+ | (@state << $@Q_Barbarians_SHIFT);
+ return;
+}
diff --git a/npc/034-2/_import.txt b/npc/034-2/_import.txt
new file mode 100644
index 00000000..d4f4f5ec
--- /dev/null
+++ b/npc/034-2/_import.txt
@@ -0,0 +1,4 @@
+// Map 034-2: Trappers Huts
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/034-2/_warps.txt",
+"npc/034-2/mapflags.txt",
diff --git a/npc/034-2/_warps.txt b/npc/034-2/_warps.txt
new file mode 100644
index 00000000..1256bb09
--- /dev/null
+++ b/npc/034-2/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 034-2: Trappers Huts warps
+034-2,28,32,0 warp #034-2_28_32 0,0,034-1,31,69
+034-2,73,30,0 warp #034-2_73_30 0,0,034-1,64,100
diff --git a/npc/034-2/mapflags.txt b/npc/034-2/mapflags.txt
new file mode 100644
index 00000000..8e84aaa2
--- /dev/null
+++ b/npc/034-2/mapflags.txt
@@ -0,0 +1 @@
+//034-2 mapflag resave 033-1,67,33
diff --git a/npc/035-2/_import.txt b/npc/035-2/_import.txt
new file mode 100644
index 00000000..693499e7
--- /dev/null
+++ b/npc/035-2/_import.txt
@@ -0,0 +1,7 @@
+// Map 035-2: None
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/035-2/casino.txt",
+"npc/035-2/emblems.txt",
+"npc/035-2/koga.txt",
+"npc/035-2/mapflags.txt",
+"npc/035-2/shops.txt",
diff --git a/npc/035-2/casino.txt b/npc/035-2/casino.txt
new file mode 100644
index 00000000..0df32fd1
--- /dev/null
+++ b/npc/035-2/casino.txt
@@ -0,0 +1,9 @@
+035-2,34,37,0 script Slots#4 NPC400,{
+ callfunc "SlotMachine";
+ close;
+}
+
+035-2,36,37,0 script Slots#5 NPC400,{
+ callfunc "SlotMachine";
+ close;
+}
diff --git a/npc/035-2/emblems.txt b/npc/035-2/emblems.txt
new file mode 100644
index 00000000..9b1aea0c
--- /dev/null
+++ b/npc/035-2/emblems.txt
@@ -0,0 +1,36 @@
+035-2,28,27,0 script #k1city1e NPC410,{
+ end;
+ OnInit:
+ disablenpc "#k1city1e";
+ end;
+}
+035-2,28,27,0 script #k1city1d NPC411,{
+ end;
+}
+
+035-2,30,27,0 script #k1city2e NPC412,{
+ end;
+ OnInit:
+ disablenpc "#k1city2e";
+ end;
+}
+035-2,30,27,0 script #k1city2d NPC413,{
+ end;
+}
+
+035-2,32,27,0 script #k1city3e NPC414,{
+ end;
+ OnInit:
+ disablenpc "#k1city3e";
+ end;
+}
+035-2,32,27,0 script #k1city3d NPC415,{
+ end;
+}
+
+035-2,32,27,0 script #k1sound NPC127,{
+ end;
+ OnCommandDing:
+ specialeffect 402;
+ end;
+}
diff --git a/npc/035-2/koga.txt b/npc/035-2/koga.txt
new file mode 100644
index 00000000..18a0a96c
--- /dev/null
+++ b/npc/035-2/koga.txt
@@ -0,0 +1,35 @@
+
+035-2,39,29,0 script #KogaExit NPC45,0,1,{
+ mes "Disembark the ferry for "+$@MainDocks$[$@MainCurrentDock]+"?";
+ menu
+ "Yes.", L_Leave,
+ "Nevermind", L_close;
+
+L_Leave:
+ if ($@MainCurrentDock == 0)
+ goto L_Hurnscald;
+ if ($@MainCurrentDock == 1)
+ goto L_Nivalis;
+ if ($@MainCurrentDock == 2)
+ goto L_Tulimshar;
+ goto L_close;
+
+L_Tulimshar:
+ EnterTown("Tulim");
+ warp "001-1", 63, 73;
+ goto L_close;
+
+L_Hurnscald:
+ EnterTown("Hurns");
+ warp "008-1", 136, 64;
+ goto L_close;
+
+L_Nivalis:
+ EnterTown("Nival");
+ warp "031-1", 95, 109;
+ goto L_close;
+
+L_close:
+ closeclientdialog;
+ close;
+}
diff --git a/npc/035-2/mapflags.txt b/npc/035-2/mapflags.txt
new file mode 100644
index 00000000..a9c3958f
--- /dev/null
+++ b/npc/035-2/mapflags.txt
@@ -0,0 +1,2 @@
+//035-2 mapflag town
+//035-2 mapflag resave 035-2,20,21
diff --git a/npc/035-2/shops.txt b/npc/035-2/shops.txt
new file mode 100644
index 00000000..b864996a
--- /dev/null
+++ b/npc/035-2/shops.txt
@@ -0,0 +1,23 @@
+
+035-2,23,38,0 script Cooky NPC213,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Beer;
+ sellitem Orange;
+ sellitem CasinoCoins;
+ .distance = 5;
+ end;
+}
+
+035-2,23,35,0 script Bunkmaster Phict NPC212,{
+ @npcname$ = "Bunkmaster Phict";
+ @Cost = 100;
+ callfunc "Inn";
+ @npcname$ = "";
+ @Cost = 0;
+ close;
+}
diff --git a/npc/036-2/_import.txt b/npc/036-2/_import.txt
new file mode 100644
index 00000000..9f6bc03f
--- /dev/null
+++ b/npc/036-2/_import.txt
@@ -0,0 +1,7 @@
+// Map 036-2: None
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/036-2/casino.txt",
+"npc/036-2/emblems.txt",
+"npc/036-2/koga-candor.txt",
+"npc/036-2/mapflags.txt",
+"npc/036-2/shops.txt",
diff --git a/npc/036-2/casino.txt b/npc/036-2/casino.txt
new file mode 100644
index 00000000..158ecfae
--- /dev/null
+++ b/npc/036-2/casino.txt
@@ -0,0 +1,9 @@
+036-2,34,37,0 script Slots#6 NPC400,{
+ callfunc "SlotMachine";
+ close;
+}
+
+036-2,36,37,0 script Slots#7 NPC400,{
+ callfunc "SlotMachine";
+ close;
+}
diff --git a/npc/036-2/emblems.txt b/npc/036-2/emblems.txt
new file mode 100644
index 00000000..de61902b
--- /dev/null
+++ b/npc/036-2/emblems.txt
@@ -0,0 +1,26 @@
+036-2,29,27,0 script #k2city1e NPC412,{
+ end;
+ OnInit:
+ disablenpc "#k2city1e";
+ end;
+}
+036-2,29,27,0 script #k2city1d NPC413,{
+ end;
+}
+
+036-2,31,27,0 script #k2city2e NPC416,{
+ end;
+ OnInit:
+ disablenpc "#k2city2e";
+ end;
+}
+036-2,31,27,0 script #k2city2d NPC417,{
+ end;
+}
+
+036-2,32,27,0 script #k2sound NPC127,{
+ end;
+ OnCommandDing:
+ specialeffect 402;
+ end;
+}
diff --git a/npc/036-2/koga-candor.txt b/npc/036-2/koga-candor.txt
new file mode 100644
index 00000000..bd34564b
--- /dev/null
+++ b/npc/036-2/koga-candor.txt
@@ -0,0 +1,28 @@
+
+036-2,39,29,0 script #KogaCandorExit NPC45,0,1,{
+ mes "Disembark the ferry for "+$@CandorDocks$[$@CandorCurrentDock]+"?";
+ menu
+ "Yes.", L_Leave,
+ "Nevermind", L_close;
+
+L_Leave:
+ if ($@CandorCurrentDock == 0)
+ goto L_Candor;
+ if ($@CandorCurrentDock == 1)
+ goto L_Hurnscald;
+ goto L_close;
+
+L_Hurnscald:
+ EnterTown("Hurns");
+ warp "008-1", 136, 75;
+ goto L_close;
+
+L_Candor:
+ EnterTown("Candor");
+ warp "029-1", 46, 109;
+ goto L_close;
+
+L_close:
+ closeclientdialog;
+ close;
+}
diff --git a/npc/036-2/mapflags.txt b/npc/036-2/mapflags.txt
new file mode 100644
index 00000000..0a2e8b08
--- /dev/null
+++ b/npc/036-2/mapflags.txt
@@ -0,0 +1,2 @@
+//036-2 mapflag town
+//036-2 mapflag resave 036-2,20,21
diff --git a/npc/036-2/shops.txt b/npc/036-2/shops.txt
new file mode 100644
index 00000000..15292e15
--- /dev/null
+++ b/npc/036-2/shops.txt
@@ -0,0 +1,36 @@
+
+036-2,23,38,0 script Chef Armand NPC211,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Beer;
+ sellitem Steak, 250;
+ sellitem CasinoCoins;
+ .distance = 5;
+ end;
+}
+
+036-2,35,22,0 script Gunney NPC138,{
+ shop .name$;
+ goodbye;
+ close;
+
+OnInit:
+ tradertype(NST_ZENY);
+ sellitem Arrow, 3;
+ sellitem IronArrow, 4;
+ .distance = 5;
+ end;
+}
+
+036-2,23,35,0 script Bunkmaster Daban NPC212,{
+ @npcname$ = "Bunkmaster Daban";
+ @Cost = 100;
+ callfunc "Inn";
+ @npcname$ = "";
+ @Cost = 0;
+ close;
+}
diff --git a/npc/041-1/_import.txt b/npc/041-1/_import.txt
new file mode 100644
index 00000000..e4df5104
--- /dev/null
+++ b/npc/041-1/_import.txt
@@ -0,0 +1,4 @@
+// Map 041-1: Beach
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/041-1/_mobs.txt",
+"npc/041-1/_warps.txt",
diff --git a/npc/041-1/_mobs.txt b/npc/041-1/_mobs.txt
new file mode 100644
index 00000000..94a1a672
--- /dev/null
+++ b/npc/041-1/_mobs.txt
@@ -0,0 +1,13 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 041-1: Beach mobs
+041-1,88,76,1,1 monster Scorpion 1003,3,100000,30000
+041-1,101,85,9,4 monster Scorpion 1003,3,100000,30000
+041-1,100,102,9,4 monster Scorpion 1003,3,100000,30000
+041-1,61,52,6,10 monster Scorpion 1003,3,100000,30000
+041-1,55,48,5,24 monster Sea Slime 1033,3,100000,30000
+041-1,59,31,5,4 monster Scorpion 1003,3,100000,30000
+041-1,60,25,1,1 monster Tame Scorpion 1046,1,100000,30000
+041-1,56,84,1,1 monster Tame Scorpion 1046,1,100000,30000
+041-1,95,93,10,4 monster Tame Scorpion 1046,1,100000,30000
+041-1,100,75,9,4 monster Red Scorpion 1004,3,100000,30000
+041-1,83,82,8,4 monster Red Scorpion 1004,3,100000,30000
diff --git a/npc/041-1/_warps.txt b/npc/041-1/_warps.txt
new file mode 100644
index 00000000..55f023ad
--- /dev/null
+++ b/npc/041-1/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 041-1: Beach warps
+041-1,101,113,0 warp #041-1_101_113 2,0,004-1,68,20
+041-1,58,22,0 warp #041-1_58_22 2,0,042-1,44,113
diff --git a/npc/042-1/_import.txt b/npc/042-1/_import.txt
new file mode 100644
index 00000000..74a91ea4
--- /dev/null
+++ b/npc/042-1/_import.txt
@@ -0,0 +1,4 @@
+// Map 042-1: Tulimshar Suburbs
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/042-1/_mobs.txt",
+"npc/042-1/_warps.txt",
diff --git a/npc/042-1/_mobs.txt b/npc/042-1/_mobs.txt
new file mode 100644
index 00000000..4431a2eb
--- /dev/null
+++ b/npc/042-1/_mobs.txt
@@ -0,0 +1,12 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 042-1: Tulimshar Suburbs mobs
+042-1,101,69,15,7 monster Maggot 1002,5,100000,30000
+042-1,65,59,13,7 monster Maggot 1002,7,100000,30000
+042-1,68,102,3,4 monster Black Scorpion 1009,5,100000,30000
+042-1,98,88,2,4 monster Scorpion 1003,4,100000,30000
+042-1,63,63,18,15 monster Tame Scorpion 1046,6,100000,30000
+042-1,85,102,2,4 monster Scorpion 1003,5,100000,30000
+042-1,98,99,2,2 monster Scorpion 1003,3,100000,30000
+042-1,82,87,3,1 monster Scorpion 1003,2,100000,30000
+042-1,70,88,2,4 monster Black Scorpion 1009,5,100000,30000
+042-1,80,35,5,2 monster Black Scorpion 1009,5,100000,30000
diff --git a/npc/042-1/_warps.txt b/npc/042-1/_warps.txt
new file mode 100644
index 00000000..62a0d621
--- /dev/null
+++ b/npc/042-1/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 042-1: Tulimshar Suburbs warps
+042-1,65,20,0 warp #042-1_65_20 1,0,023-1,64,143
+042-1,44,115,0 warp #042-1_44_115 2,0,041-1,58,23
diff --git a/npc/043-1/_import.txt b/npc/043-1/_import.txt
new file mode 100644
index 00000000..b4d68aad
--- /dev/null
+++ b/npc/043-1/_import.txt
@@ -0,0 +1,4 @@
+// Map 043-1: Beach
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/043-1/_mobs.txt",
+"npc/043-1/_warps.txt",
diff --git a/npc/043-1/_mobs.txt b/npc/043-1/_mobs.txt
new file mode 100644
index 00000000..8ed13566
--- /dev/null
+++ b/npc/043-1/_mobs.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 043-1: Beach mobs
+043-1,0,0,0,0 monster Sea Slime 1033,17,40000,30000
+043-1,0,0,0,0 monster Yellow Slime 1007,15,60000,60000
+043-1,0,0,0,0 monster Green Slime 1005,20,60000,60000
diff --git a/npc/043-1/_warps.txt b/npc/043-1/_warps.txt
new file mode 100644
index 00000000..2c8584b9
--- /dev/null
+++ b/npc/043-1/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 043-1: Beach warps
+043-1,43,19,0 warp #043-1_43_19 5,0,003-4,114,116
diff --git a/npc/043-3/_import.txt b/npc/043-3/_import.txt
new file mode 100644
index 00000000..111c08dc
--- /dev/null
+++ b/npc/043-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 043-3: Sandy Dungeon Level 1
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/043-3/_mobs.txt",
+"npc/043-3/_warps.txt",
+"npc/043-3/mapflags.txt",
diff --git a/npc/043-3/_mobs.txt b/npc/043-3/_mobs.txt
new file mode 100644
index 00000000..351a87d4
--- /dev/null
+++ b/npc/043-3/_mobs.txt
@@ -0,0 +1,11 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 043-3: Sandy Dungeon Level 1 mobs
+043-3,39,45,12,8 monster Cave Maggot 1056,6,20000,20000
+043-3,44,60,12,8 monster Cave Maggot 1056,6,20000,20000
+043-3,41,96,17,13 monster Cave Maggot 1056,10,20000,20000
+043-3,52,91,3,3 monster Angry Scorpion 1057,5,30000,30000
+043-3,102,116,13,9 monster Angry Fire Goblin 1108,10,30000,30000
+043-3,33,99,3,3 monster Angry Scorpion 1057,5,30000,30000
+043-3,116,78,12,9 monster Angry Fire Goblin 1108,8,30000,30000
+043-3,113,47,15,11 monster Red Slime 1008,15,45000,35000
+043-3,94,44,20,9 monster Green Slime 1005,5,30000,15000
diff --git a/npc/043-3/_warps.txt b/npc/043-3/_warps.txt
new file mode 100644
index 00000000..59010fc3
--- /dev/null
+++ b/npc/043-3/_warps.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 043-3: Sandy Dungeon Level 1 warps
+043-3,31,26,0 warp #043-3_31_26 0,0,002-3,22,86
+043-3,77,30,0 warp #043-3_77_30 0,0,043-4,47,67
+043-3,116,36,0 warp #043-3_116_36 0,0,005-3,78,87
+043-3,32,37,0 warp #043-3_32_37 1,0,005-3,33,85
diff --git a/npc/043-3/mapflags.txt b/npc/043-3/mapflags.txt
new file mode 100644
index 00000000..5a36328d
--- /dev/null
+++ b/npc/043-3/mapflags.txt
@@ -0,0 +1 @@
+//043-3 mapflag resave 002-3,72,66
diff --git a/npc/043-4/_import.txt b/npc/043-4/_import.txt
new file mode 100644
index 00000000..dd06c08b
--- /dev/null
+++ b/npc/043-4/_import.txt
@@ -0,0 +1,5 @@
+// Map 043-4: Troll Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/043-4/_mobs.txt",
+"npc/043-4/_warps.txt",
+"npc/043-4/mapflags.txt",
diff --git a/npc/043-4/_mobs.txt b/npc/043-4/_mobs.txt
new file mode 100644
index 00000000..3785644a
--- /dev/null
+++ b/npc/043-4/_mobs.txt
@@ -0,0 +1,24 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 043-4: Troll Cave mobs
+043-4,139,163,3,3 monster Terranite 1062,2,240000,120000
+043-4,133,45,7,8 monster Undead Troll 1117,4,100000,50000
+043-4,91,139,5,5 monster Undead Troll 1117,2,100000,50000
+043-4,35,120,5,5 monster Undead Troll 1117,2,100000,50000
+043-4,43,143,6,5 monster Undead Witch 1116,2,120000,60000
+043-4,102,153,4,4 monster Undead Witch 1116,2,120000,60000
+043-4,142,159,7,6 monster Undead Witch 1116,2,120000,60000
+043-4,150,33,8,7 monster Undead Witch 1116,1,120000,60000
+043-4,103,54,4,11 monster Undead Troll 1117,3,100000,50000
+043-4,47,38,10,5 monster Troll 1054,7,100000,50000
+043-4,98,85,4,7 monster Snake 1010,5,100000,50000
+043-4,104,57,7,13 monster Troll 1054,7,100000,50000
+043-4,89,64,4,5 monster Black Scorpion 1009,5,100000,50000
+043-4,143,46,16,14 monster Troll 1054,7,100000,50000
+043-4,154,106,13,14 monster Black Scorpion 1009,8,100000,50000
+043-4,162,77,7,11 monster Snake 1010,6,100000,50000
+043-4,152,143,5,5 monster Black Scorpion 1009,6,100000,50000
+043-4,159,161,5,4 monster Snake 1010,6,100000,50000
+043-4,98,138,10,10 monster Troll 1054,5,100000,50000
+043-4,45,106,9,12 monster Troll 1054,5,100000,50000
+043-4,39,138,9,8 monster Black Scorpion 1009,5,100000,50000
+043-4,133,123,15,11 monster Troll 1054,3,100000,50000
diff --git a/npc/043-4/_warps.txt b/npc/043-4/_warps.txt
new file mode 100644
index 00000000..8fbc71b0
--- /dev/null
+++ b/npc/043-4/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 043-4: Troll Cave warps
+043-4,47,68,0 warp #043-4_47_68 0,0,043-3,77,31
+043-4,153,27,0 warp #043-4_153_27 0,0,043-4,193,32
+043-4,193,33,0 warp #043-4_193_33 0,0,043-4,153,28
diff --git a/npc/043-4/mapflags.txt b/npc/043-4/mapflags.txt
new file mode 100644
index 00000000..9f40e28e
--- /dev/null
+++ b/npc/043-4/mapflags.txt
@@ -0,0 +1 @@
+//043-4 mapflag resave 002-3,72,66
diff --git a/npc/045-1/_import.txt b/npc/045-1/_import.txt
new file mode 100644
index 00000000..759b3a8a
--- /dev/null
+++ b/npc/045-1/_import.txt
@@ -0,0 +1,5 @@
+// Map 045-1: Deep Snow Forest
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/045-1/_mobs.txt",
+"npc/045-1/_warps.txt",
+"npc/045-1/mapflags.txt",
diff --git a/npc/045-1/_mobs.txt b/npc/045-1/_mobs.txt
new file mode 100644
index 00000000..67f74f4f
--- /dev/null
+++ b/npc/045-1/_mobs.txt
@@ -0,0 +1,17 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 045-1: Deep Snow Forest mobs
+045-1,102,122,11,11 monster Wolvern 1090,10,100000,30000
+045-1,98,77,11,11 monster Wolvern 1090,5,100000,30000
+045-1,147,63,11,11 monster Wolvern 1090,5,100000,30000
+045-1,60,97,11,11 monster Wolvern 1090,5,100000,30000
+045-1,106,44,11,11 monster Wolvern 1090,5,100000,30000
+045-1,133,93,11,11 monster Wolvern 1090,5,100000,30000
+045-1,38,76,9,7 monster Wolvern 1090,5,100000,30000
+045-1,60,59,9,7 monster Wolvern 1090,5,100000,30000
+045-1,0,0,0,0 monster Squirrel 1038,40,100000,30000
+045-1,0,0,0,0 monster Reinboo 1094,30,100000,30000
+045-1,0,0,0,0 monster Fluffy 1020,40,100000,30000
+045-1,0,0,0,0 monster White Bell 1095,5,100000,30000
+045-1,47,145,12,12 monster Ice Goblin 1058,4,100000,30000
+045-1,150,126,12,12 monster Ice Goblin 1058,4,100000,30000
+045-1,104,149,39,5 monster Ice Goblin 1058,4,100000,30000
diff --git a/npc/045-1/_warps.txt b/npc/045-1/_warps.txt
new file mode 100644
index 00000000..1112d925
--- /dev/null
+++ b/npc/045-1/_warps.txt
@@ -0,0 +1,5 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 045-1: Deep Snow Forest warps
+045-1,175,60,0 warp #045-1_175_60 0,1,034-1,16,30
+045-1,177,132,0 warp #045-1_177_132 0,2,034-1,17,102
+045-1,26,179,0 warp #045-1_26_179 3,0,017-1,182,17
diff --git a/npc/045-1/mapflags.txt b/npc/045-1/mapflags.txt
new file mode 100644
index 00000000..c6b778d6
--- /dev/null
+++ b/npc/045-1/mapflags.txt
@@ -0,0 +1 @@
+//045-1 mapflag resave 017-1,170,25
diff --git a/npc/046-1/_import.txt b/npc/046-1/_import.txt
new file mode 100644
index 00000000..c1f211a3
--- /dev/null
+++ b/npc/046-1/_import.txt
@@ -0,0 +1,5 @@
+// Map 046-1: Rock Plateau
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/046-1/_mobs.txt",
+"npc/046-1/_warps.txt",
+"npc/046-1/mapflags.txt",
diff --git a/npc/046-1/_mobs.txt b/npc/046-1/_mobs.txt
new file mode 100644
index 00000000..f2d11830
--- /dev/null
+++ b/npc/046-1/_mobs.txt
@@ -0,0 +1,13 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 046-1: Rock Plateau mobs
+046-1,0,7,0,0 monster Reinboo 1094,40,100000,30000
+046-1,0,7,0,0 monster Fluffy 1020,50,100000,30000
+046-1,0,7,0,0 monster Squirrel 1038,50,100000,30000
+046-1,44,35,26,10 monster Moggun 1061,12,100000,30000
+046-1,0,7,0,0 monster Yeti 1072,2,100000,30000
+046-1,87,101,11,6 monster Wolvern 1090,5,100000,30000
+046-1,0,7,0,0 monster White Bell 1095,9,100000,30000
+046-1,72,59,7,6 monster Wolvern 1090,2,100000,30000
+046-1,36,112,5,4 monster Wolvern 1090,2,100000,30000
+046-1,115,40,22,16 monster Wolvern 1090,7,100000,30000
+046-1,145,67,5,4 monster Wolvern 1090,2,100000,30000
diff --git a/npc/046-1/_warps.txt b/npc/046-1/_warps.txt
new file mode 100644
index 00000000..4bcdaf92
--- /dev/null
+++ b/npc/046-1/_warps.txt
@@ -0,0 +1,12 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 046-1: Rock Plateau warps
+046-1,95,124,0 warp #046-1_95_124 1,0,034-1,94,19
+046-1,29,20,0 warp #046-1_29_20 0,0,047-1,70,178
+046-1,31,20,0 warp #046-1_31_20 0,0,047-1,70,178
+046-1,78,37,0 warp #046-1_78_37 0,0,046-3,78,29
+046-1,131,55,0 warp #046-1_131_55 0,0,046-3,131,47
+046-1,131,62,0 warp #046-1_131_62 0,0,046-3,131,54
+046-1,139,26,0 warp #046-1_139_26 0,0,046-3,139,18
+046-1,83,50,0 warp #046-1_83_50 0,0,046-3,83,42
+046-1,124,116,0 warp #046-1_124_116 0,0,046-3,124,108
+046-1,62,26,0 warp #046-1_62_26 0,0,019-4,24,123
diff --git a/npc/046-1/mapflags.txt b/npc/046-1/mapflags.txt
new file mode 100644
index 00000000..7141b13f
--- /dev/null
+++ b/npc/046-1/mapflags.txt
@@ -0,0 +1 @@
+//046-1 mapflag resave 046-1,92,48
diff --git a/npc/046-3/_import.txt b/npc/046-3/_import.txt
new file mode 100644
index 00000000..5422c983
--- /dev/null
+++ b/npc/046-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 046-3: Frosty Underground
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/046-3/_mobs.txt",
+"npc/046-3/_warps.txt",
+"npc/046-3/mapflags.txt",
diff --git a/npc/046-3/_mobs.txt b/npc/046-3/_mobs.txt
new file mode 100644
index 00000000..8ac0a85d
--- /dev/null
+++ b/npc/046-3/_mobs.txt
@@ -0,0 +1,17 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 046-3: Frosty Underground mobs
+046-3,68,101,6,4 monster Yeti 1072,2,100000,30000
+046-3,0,0,0,0 monster Ice Goblin 1058,20,100000,30000
+046-3,55,61,12,13 monster Moggun 1061,14,100000,30000
+046-3,119,104,2,2 monster Ice Element 1071,1,100000,30000
+046-3,132,71,4,3 monster White Slime 1093,4,100000,30000
+046-3,107,85,7,4 monster Blue Slime 1091,2,100000,30000
+046-3,98,77,3,2 monster White Slime 1093,4,100000,30000
+046-3,70,82,3,2 monster White Slime 1093,6,100000,30000
+046-3,106,34,3,2 monster White Slime 1093,4,100000,30000
+046-3,33,37,3,2 monster White Slime 1093,4,100000,30000
+046-3,144,105,7,4 monster Blue Slime 1091,2,100000,30000
+046-3,152,55,7,4 monster Blue Slime 1091,2,100000,30000
+046-3,84,53,7,4 monster Blue Slime 1091,2,100000,30000
+046-3,47,23,7,5 monster Ice Element 1071,2,100000,30000
+046-3,113,48,6,4 monster Yeti 1072,2,100000,30000
diff --git a/npc/046-3/_warps.txt b/npc/046-3/_warps.txt
new file mode 100644
index 00000000..3870e53d
--- /dev/null
+++ b/npc/046-3/_warps.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 046-3: Frosty Underground warps
+046-3,139,19,0 warp #046-3_139_19 0,0,046-1,139,27
+046-3,78,30,0 warp #046-3_78_30 0,0,046-1,78,38
+046-3,83,43,0 warp #046-3_83_43 0,0,046-1,83,51
+046-3,131,48,0 warp #046-3_131_48 0,0,046-1,131,56
+046-3,131,55,0 warp #046-3_131_55 0,0,046-1,131,63
+046-3,124,109,0 warp #046-3_124_109 0,0,046-1,124,117
diff --git a/npc/046-3/mapflags.txt b/npc/046-3/mapflags.txt
new file mode 100644
index 00000000..a879f8ce
--- /dev/null
+++ b/npc/046-3/mapflags.txt
@@ -0,0 +1 @@
+//046-3 mapflag resave 046-1,92,48
diff --git a/npc/047-1/_import.txt b/npc/047-1/_import.txt
new file mode 100644
index 00000000..ca2958ad
--- /dev/null
+++ b/npc/047-1/_import.txt
@@ -0,0 +1,5 @@
+// Map 047-1: snow Hills
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/047-1/_mobs.txt",
+"npc/047-1/_warps.txt",
+"npc/047-1/mapflags.txt",
diff --git a/npc/047-1/_mobs.txt b/npc/047-1/_mobs.txt
new file mode 100644
index 00000000..6cced5b8
--- /dev/null
+++ b/npc/047-1/_mobs.txt
@@ -0,0 +1,24 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 047-1: snow Hills mobs
+047-1,37,175,1,1 monster White Slime 1093,7,100000,30000
+047-1,45,75,1,1 monster Blue Slime 1091,1,100000,30000
+047-1,0,0,0,0 monster Reinboo 1094,50,100000,30000
+047-1,0,0,0,0 monster Fluffy 1020,60,100000,30000
+047-1,0,0,0,0 monster Squirrel 1038,60,100000,30000
+047-1,81,125,51,28 monster Moggun 1061,25,100000,30000
+047-1,189,123,12,18 monster Wolvern 1090,6,100000,30000
+047-1,160,115,12,10 monster Wolvern 1090,6,100000,30000
+047-1,169,163,24,15 monster Wolvern 1090,6,100000,30000
+047-1,58,71,24,15 monster Wolvern 1090,6,100000,30000
+047-1,122,116,10,12 monster Wolvern 1090,6,100000,30000
+047-1,110,173,12,10 monster Wolvern 1090,6,100000,30000
+047-1,108,168,1,1 monster White Slime 1093,7,100000,30000
+047-1,108,158,1,1 monster Blue Slime 1091,1,100000,30000
+047-1,0,0,0,0 monster White Bell 1095,10,100000,30000
+047-1,87,119,18,17 monster Yeti 1072,2,100000,30000
+047-1,138,22,1,1 monster White Slime 1093,4,100000,30000
+047-1,157,66,1,1 monster White Slime 1093,4,100000,30000
+047-1,174,46,2,2 monster Blue Slime 1091,2,100000,30000
+047-1,143,43,2,2 monster Blue Slime 1091,2,100000,30000
+047-1,122,61,1,1 monster White Slime 1093,4,100000,30000
+047-1,132,70,2,2 monster Blue Slime 1091,2,100000,30000
diff --git a/npc/047-1/_warps.txt b/npc/047-1/_warps.txt
new file mode 100644
index 00000000..532bd8f1
--- /dev/null
+++ b/npc/047-1/_warps.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 047-1: snow Hills warps
+047-1,108,165,0 warp #047-1_108_165 0,0,047-3,110,102
+047-1,108,156,0 warp #047-1_108_156 0,0,047-3,119,94
+047-1,102,111,0 warp #047-1_102_111 0,0,047-3,119,58
+047-1,102,107,0 warp #047-1_102_107 0,0,047-3,128,45
+047-1,154,92,0 warp #047-1_154_92 0,0,019-4,74,27
+047-1,101,143,0 warp #047-1_101_143 0,0,047-3,126,180
+047-1,37,173,0 warp #047-1_37_173 0,0,047-3,33,175
+047-1,45,73,0 warp #047-1_45_73 0,0,047-3,46,76
+047-1,78,109,0 warp #047-1_78_109 0,0,047-3,35,41
+047-1,83,123,0 warp #047-1_83_123 0,0,047-3,108,165
+047-1,71,179,0 warp #047-1_71_179 2,0,046-1,29,21
+047-1,130,50,0 warp #047-1_130_50 0,0,047-1,130,47
+047-1,130,48,0 warp #047-1_130_48 0,0,047-1,130,51
+047-1,128,39,0 warp #047-1_128_39 0,0,048-2,40,48
diff --git a/npc/047-1/mapflags.txt b/npc/047-1/mapflags.txt
new file mode 100644
index 00000000..c669b7f9
--- /dev/null
+++ b/npc/047-1/mapflags.txt
@@ -0,0 +1 @@
+//047-1 mapflag resave 048-2,26,46
diff --git a/npc/047-3/_import.txt b/npc/047-3/_import.txt
new file mode 100644
index 00000000..b1670019
--- /dev/null
+++ b/npc/047-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 047-3: Snow Hills Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/047-3/_mobs.txt",
+"npc/047-3/_warps.txt",
+"npc/047-3/mapflags.txt",
diff --git a/npc/047-3/_mobs.txt b/npc/047-3/_mobs.txt
new file mode 100644
index 00000000..c511d42a
--- /dev/null
+++ b/npc/047-3/_mobs.txt
@@ -0,0 +1,23 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 047-3: Snow Hills Cave mobs
+047-3,56,135,4,4 monster White Slime 1093,7,100000,30000
+047-3,35,153,3,3 monster White Slime 1093,7,100000,30000
+047-3,39,104,4,4 monster White Slime 1093,7,100000,30000
+047-3,73,153,4,4 monster White Slime 1093,7,100000,30000
+047-3,64,104,1,1 monster White Slime 1093,7,100000,30000
+047-3,24,168,3,2 monster Blue Slime 1091,2,100000,30000
+047-3,87,134,2,1 monster Blue Slime 1091,2,100000,30000
+047-3,55,122,2,1 monster Blue Slime 1091,2,100000,30000
+047-3,35,128,2,1 monster Blue Slime 1091,2,100000,30000
+047-3,53,84,2,1 monster Blue Slime 1091,2,100000,30000
+047-3,75,136,10,13 monster Moggun 1061,5,100000,30000
+047-3,39,31,21,10 monster Moggun 1061,12,100000,30000
+047-3,40,31,2,1 monster Ice Skull 1085,2,100000,30000
+047-3,122,157,10,8 monster Yeti 1072,2,100000,30000
+047-3,102,166,7,6 monster Ice Skull 1085,5,100000,30000
+047-3,109,81,7,6 monster Ice Element 1071,1,100000,30000
+047-3,123,90,2,1 monster Blue Slime 1091,2,100000,30000
+047-3,109,97,4,4 monster White Slime 1093,7,100000,30000
+047-3,119,41,21,10 monster Moggun 1061,8,100000,30000
+047-3,51,94,19,7 monster Ice Skull 1085,5,100000,30000
+047-3,121,172,4,4 monster White Slime 1093,7,100000,30000
diff --git a/npc/047-3/_warps.txt b/npc/047-3/_warps.txt
new file mode 100644
index 00000000..7b38d37f
--- /dev/null
+++ b/npc/047-3/_warps.txt
@@ -0,0 +1,11 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 047-3: Snow Hills Cave warps
+047-3,46,74,0 warp #047-3_46_74 0,0,047-1,45,75
+047-3,33,176,0 warp #047-3_33_176 0,0,047-1,37,174
+047-3,126,181,0 warp #047-3_126_181 0,0,047-1,101,144
+047-3,35,42,0 warp #047-3_35_42 0,0,047-1,78,110
+047-3,108,163,0 warp #047-3_108_163 0,0,047-1,83,125
+047-3,110,103,0 warp #047-3_110_103 0,0,047-1,108,166
+047-3,119,95,0 warp #047-3_119_95 0,0,047-1,108,157
+047-3,119,59,0 warp #047-3_119_59 0,0,047-1,102,112
+047-3,128,46,0 warp #047-3_128_46 0,0,047-1,102,108
diff --git a/npc/047-3/mapflags.txt b/npc/047-3/mapflags.txt
new file mode 100644
index 00000000..fd9f0602
--- /dev/null
+++ b/npc/047-3/mapflags.txt
@@ -0,0 +1 @@
+//047-3 mapflag resave 047-1,145,20
diff --git a/npc/048-2/_import.txt b/npc/048-2/_import.txt
new file mode 100644
index 00000000..d32a99d0
--- /dev/null
+++ b/npc/048-2/_import.txt
@@ -0,0 +1,26 @@
+// Map 048-2: Blue Sages' Mansion
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/048-2/_warps.txt",
+"npc/048-2/bluesageConfig.txt",
+"npc/048-2/helperAccused.txt",
+"npc/048-2/helperBookpages1.txt",
+"npc/048-2/helperBookpages2.txt",
+"npc/048-2/helperBookpages3.txt",
+"npc/048-2/helperChief.txt",
+"npc/048-2/helperCleaning1.txt",
+"npc/048-2/helperCleaning2.txt",
+"npc/048-2/helperCleaning3.txt",
+"npc/048-2/helperCleaning4.txt",
+"npc/048-2/helperCleaning5.txt",
+"npc/048-2/helperJanitor.txt",
+"npc/048-2/helperMInk.txt",
+"npc/048-2/helperMReed.txt",
+"npc/048-2/helperMSilk.txt",
+"npc/048-2/helperMYetiClaw.txt",
+"npc/048-2/helperResting1.txt",
+"npc/048-2/helperResting2.txt",
+"npc/048-2/mapflags.txt",
+"npc/048-2/sageNikolai.txt",
+"npc/048-2/slimes.txt",
+"npc/048-2/traveler.txt",
+"npc/048-2/visitors.txt",
diff --git a/npc/048-2/_warps.txt b/npc/048-2/_warps.txt
new file mode 100644
index 00000000..a806d9d4
--- /dev/null
+++ b/npc/048-2/_warps.txt
@@ -0,0 +1,19 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 048-2: Blue Sages' Mansion warps
+048-2,22,78,0 warp #048-2_22_78 1,0,048-2,84,23
+048-2,60,21,0 warp #048-2_60_21 1,0,048-2,121,26
+048-2,40,50,0 warp #048-2_40_50 0,0,047-1,128,40
+048-2,84,21,0 warp #048-2_84_21 1,0,048-2,22,76
+048-2,113,23,0 warp #048-2_113_23 0,0,048-2,147,35
+048-2,122,28,0 warp #048-2_122_28 1,0,048-2,59,22
+048-2,95,23,0 warp #048-2_95_23 0,0,048-2,178,35
+048-2,147,36,0 warp #048-2_147_36 0,0,048-2,113,24
+048-2,178,36,0 warp #048-2_178_36 0,0,048-2,95,24
+048-2,27,141,0 warp #048-2_27_141 0,0,048-2,52,102
+048-2,60,71,0 warp #048-2_60_71 1,0,048-2,60,104
+048-2,23,73,0 warp #048-2_23_73 0,0,048-2,85,132
+048-2,55,73,0 warp #048-2_55_73 0,0,048-2,121,132
+048-2,61,106,0 warp #048-2_61_106 1,0,048-2,59,73
+048-2,52,101,0 warp #048-2_52_101 0,0,048-2,27,140
+048-2,121,133,0 warp #048-2_121_133 0,0,048-2,55,74
+048-2,85,133,0 warp #048-2_85_133 0,0,048-2,23,74
diff --git a/npc/048-2/bluesageConfig.txt b/npc/048-2/bluesageConfig.txt
new file mode 100644
index 00000000..5a17a304
--- /dev/null
+++ b/npc/048-2/bluesageConfig.txt
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+- script #bluesageconfig NPC32767,{
+ end;
+
+OnInit:
+ $@Q_BlueSageMinimumLevel = 60;
+
+ $@Q_BlueSageBookPages_MASK = 0x1F;
+ $@Q_BlueSageBookPages_SHIFT = 0;
+
+ $@Q_BlueSageGrimoire = 0x20;
+ $@Q_BlueSageIceSword = 0x40;
+
+ $@Q_BlueSageMaterial_MASK = NIBBLE_2_MASK;
+ $@Q_BlueSageMaterial_SHIFT = NIBBLE_2_SHIFT;
+
+ $@Q_BlueSageMaterialReed = 0x100;
+ $@Q_BlueSageMaterialSilk = 0x200;
+ $@Q_BlueSageMaterialClaw = 0x400;
+ $@Q_BlueSageMaterialInk = 0x800;
+
+ $@Q_BlueSageSlimes_MASK = BYTE_2_MASK;
+ $@Q_BlueSageSlimes_SHIFT = BYTE_2_SHIFT;
+ $@Q_BlueSageSlimesStart = 0x010000;
+ $@Q_BlueSageSlime0 = 0x020000;
+ $@Q_BlueSageSlime1 = 0x040000;
+ $@Q_BlueSageSlime2 = 0x080000;
+ $@Q_BlueSageSlime3 = 0x100000;
+ $@Q_BlueSageSlime4 = 0x200000;
+ $@Q_BlueSageSlime5 = 0x400000;
+ $@Q_BlueSageSlime6 = 0x800000;
+ //white
+ $@BlueSageSlime0_Amount = 6;
+ $@BlueSageSlime1_Amount = 5;
+ $@BlueSageSlime2_Amount = 4;
+ $@BlueSageSlime3_Amount = 3;
+ // blue
+ $@BlueSageSlime4_Amount = 3;
+ $@BlueSageSlime5_Amount = 2;
+ $@BlueSageSlime6_Amount = 1;
+ end;
+}
+
+function script updateBlueSageBookPages {
+ QUEST_BlueSage = (QUEST_BlueSage & ~($@Q_BlueSageBookPages_MASK) | (@bookpages << $@Q_BlueSageBookPages_SHIFT));
+ return;
+}
+
+function script blueSageNumberOfClearedNests {
+ @slimenests = 0;
+ if (QUEST_BlueSage & $@Q_BlueSageSlime0)
+ @slimenests = @slimenests+1;
+ if (QUEST_BlueSage & $@Q_BlueSageSlime1)
+ @slimenests = @slimenests+1;
+ if (QUEST_BlueSage & $@Q_BlueSageSlime2)
+ @slimenests = @slimenests+1;
+ if (QUEST_BlueSage & $@Q_BlueSageSlime3)
+ @slimenests = @slimenests+1;
+ if (QUEST_BlueSage & $@Q_BlueSageSlime4)
+ @slimenests = @slimenests+1;
+ if (QUEST_BlueSage & $@Q_BlueSageSlime5)
+ @slimenests = @slimenests+1;
+ if (QUEST_BlueSage & $@Q_BlueSageSlime6)
+ @slimenests = @slimenests+1;
+ return;
+}
diff --git a/npc/048-2/helperAccused.txt b/npc/048-2/helperAccused.txt
new file mode 100644
index 00000000..110c5d70
--- /dev/null
+++ b/npc/048-2/helperAccused.txt
@@ -0,0 +1,139 @@
+
+048-2,25,135,0 script Peetu NPC130,{
+ if (QL_BSAGE_INVESTIGATE == 12) goto L_Thank;
+ if (QL_BSAGE_INVESTIGATE > 4 && QL_BSAGE_INVESTIGATE < 13) goto L_Investigate;
+ if (QL_BSAGE_INVESTIGATE > 1 && QL_BSAGE_INVESTIGATE < 13) goto L_Query;
+ if (QL_BSAGE_INVESTIGATE == 1) goto L_Help;
+
+ mes "You see a rather stressed helper, mumbling to himself.";
+ if (BaseLevel < $@Q_BlueSageMinimumLevel || !QL_BSAGE_INVESTIGATE)
+ goto L_close;
+ mes "[Peetu]";
+ mes "\"How could this have happened? I don't understand it... I'm sure I did the sealing correctly. Maybe the ingredients... but that doesn't make sense. They're checked regularly and...\"";
+ next;
+ mes "He startles as he notices you.";
+ mes "[Peetu]";
+ mes "\"Oh, hello. What are you doing here? Uh ... visitors usually don't come up here. I mean, I don't mean to be rude, of course. I'm just surprised to see you here.\"";
+ menu
+ "I'm just having a look around.",L_close,
+ "Sorry, I didn't mean to bother you.",L_close,
+ "Why aren't you downstairs, helping everyone to clean up?",L_Next;
+
+L_Next:
+ mes "[Peetu]";
+ mes "\"I would, but I'm ... under preliminary suspension.\"";
+ mes "He looks close to tears.";
+ next;
+ mes "[Peetu]";
+ mes "\"It's all my fault! It was my job to seal the slimes away for the night, but I somehow messed it up! How could this have happened? And now I'm going to lose my job and I'll have to leave here and no other sage would give me a new appointment and I don't know what else to do! I mean, I spent my whole life on this so far, I don't even know anything else I could do.\"";
+ next;
+ mes "He seems to be having a nervous breakdown, as he latches onto you and starts sobbing on your shoulder.";
+ menu
+ "(Try to console him)",L_More,
+ "(Shake him and tell him to pull himself together)",L_More,
+ "(Push him away from you and leave.)",L_close;
+
+L_More:
+ mes "He calms down a bit.";
+ mes "[Peetu]";
+ mes "\"Uh. You're probably right. I'm very sorry. I'm just... You know, I wanted to become a scholar of the sages, studying and... Oh, how could I mess that up? Did you see the library? It caused so much damage! What else should they do other than kick me out?\"";
+ menu
+ "Maybe you should talk to your chief about that?",L_Less,
+ "It doesn't make much sense to draw overhasty conclusions.",L_Less,
+ "Do you have a clue about what went wrong?",L_Less;
+
+L_Less:
+ mes "[Peetu]";
+ mes "\"Well ... but ... I mean ... I don't know ... ";
+ mes "I have an idea! Would you ... uhm ... would you talk to Chief Oskari for me? And ask him what he plans to do about me? I... I just don't feel capable of doing that myself right now. I'll try to pull myself together in the meanwhile.\"";
+ QL_BSAGE_INVESTIGATE = 1;
+ goto L_close;
+
+L_Help:
+ mes "[Peetu]";
+ mes "\"Please talk to Chief Oskari for me and find out if I'll get fired.";
+ mes "You can probably find him in his office on the second floor.\"";
+ goto L_close;
+
+L_Query:
+ mes "[Peetu]";
+ mes "\"Did you talk to Chief Oskari?\"";
+ menu
+ "Yes, and he doesn't plan to fire you.",L_Continue,
+ "Not yet.",L_close;
+
+L_Continue:
+ mes "You tell Peetu that Chief Oskari has a good opinion of him and explain your task to find out what exactly happened.";
+ next;
+ mes "[Peetu]";
+ mes "\"Alright, I understand. You see, I'm very confused too, because I usually pay a lot of attention to my work. Especially when doing something as delicate as sealing away the slimes for the night.\"";
+ menu
+ "Can you describe to me what exactly you did?",L_TextWall;
+
+L_TextWall:
+ mes "[Peetu]";
+ mes "\"Well, ok, sure. So, as you know we're doing some research on the nature of slimes, their connection to minerals and gemstones, their breeding behavior, and well ... uh ... doing some magical experiments to analyze their reactions to different kinds of magic.";
+ mes "These experiments caused some ... mutations, and the Blue and White Slimes developed some behavior different from the slimes of other colors, making them more dangerous.\"";
+ next;
+ mes "\"This is the reason they have to be magically sealed away for the night, since we didn't want them to get out in the wilderness... Oh, I can only imagine what damage they do to the environment!\"";
+ mes "He sighs.";
+ next;
+ mes "\"However, the sealing involves several steps. I usually start to prepare it while the helpers are still working on their research and experiments. That way, when they're done, they can just come and place the slimes under the seal.";
+ mes "I take the ingredients for the spell from the shelves, mix them together and cast the spell shortly before the other helpers finish their daily work.\"";
+ next;
+ mes "\"You can think of the seal as something like a magical cage. This is a simplified explanation, of course. It's rather advanced magic, a modified version of a shield spell, rather focused on the components that reduce the targets ability to move and... Oh, I seem to be losing you. Never mind then.";
+ mes "Anyway, I create and open the 'cage', then I wait for all the helpers to drop in the slimes and close it when all are in. When it is closed, I additionally cast a guarding spell to prevent unauthorized access.\"";
+ next;
+ mes "\"That night when the slimes escaped, I did all of this as usual. Everything seemed alright after I cast the guarding spell, so I went to bed. But I woke up in the middle of the night because I felt the spells... oh, it's hard to describe... it seems the spell which defines the magical cage started to... inflate itself. That caused the guarding spells to vanish, since they're intended to protect against threats from the outside, not the inside.";
+ mes "While expanding, the cage went thinner and thinner until it just... faded out of existence!\"";
+ next;
+ mes "\"This left all the slimes free in the workshop, right next to the library. Of course I hurried there as fast as I could, yelling to wake up everyone, but that caused so much confusion that we fell over each other in the corridor and when we finally reached the library, the slimes were already spread all over the room, eating the books and dripping out of the windows.\"";
+ next;
+ mes "\"We tried to block the windows to prevent them escaping, but as most of the helpers aren't experienced in fighting and only some of us have a higher magical education, the slimes are rather dangerous for most of them.";
+ mes "We weren't able to get the situation under control until most of the slimes had escaped.\"";
+ next;
+ mes "\"Since it was my responsibility to seal them away, I was preliminarily suspended and sent to my room. Since then I've been thinking over and over again about the happenings and how I cast the spell, trying to find the mistake I made.";
+ mes "But now that I've described the spells to you, I'm sure I cast them correctly. Thinking again about the effect of the seal inflating, I suppose it might have to do with the ingredients I used for the spell.\"";
+ next;
+ mes "\"I never tried it, because it makes no sense to do that, but theoretically adding some Silk Cocoons could have such an effect. That's pretty basic nature magic.";
+ mes "But... how would that have gotten into the ingredients?\"";
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 3;
+ goto L_close;
+
+L_Investigate:
+ mes "[Peetu]";
+ mes "\"Hello. Did you find out anything else yet?\"";
+ if (QL_BSAGE_INVESTIGATE != 11)
+ menu
+ "I'm still collecting information.",L_close;
+ if (@inventorylist_count == 100)
+ goto L_TooMany;
+ menu
+ "Yes, I have already talked with Chief Oskari.",L_ReallyMore,
+ "Not yet.",L_close;
+
+L_ReallyMore:
+ mes "You explain your gained insights to Peetu and what conclusions Chief Oskari drew.";
+ mes "[Peetu]";
+ mes "\"Oh, I'm so relieved!";
+ mes "I mean, this is alarming news, but I'm so glad that this isn't my fault and that he feels I deserve to keep my job.\"";
+ next;
+ mes "\"It isn't much, but please take these Silk Gloves. We use those when we have to protect our hands, but still need to perform magic.\"";
+ QL_BSAGE_INVESTIGATE = 12;
+ getitem "SilkGloves", 1;
+ goto L_close;
+
+L_Thank:
+ mes "[Peetu]";
+ mes "\"Thanks for all your help.\"";
+ goto L_close;
+
+L_TooMany:
+ mes "[Peetu]";
+ mes "\"Wow, you have a lot of stuff with you! Isn't that uncomfortable?\"";
+ goto L_close;
+
+L_close:
+ @inventorylist_count = 0;
+ close;
+}
diff --git a/npc/048-2/helperBookpages1.txt b/npc/048-2/helperBookpages1.txt
new file mode 100644
index 00000000..529142a2
--- /dev/null
+++ b/npc/048-2/helperBookpages1.txt
@@ -0,0 +1,136 @@
+
+048-2,104,86,0 script Ensio NPC365,{
+ @bookpages = ((QUEST_BlueSage & $@Q_BlueSageBookPages_MASK) >> $@Q_BlueSageBookPages_SHIFT);
+
+ @old_bookpage_exp = 1000;
+ @new_bookpage_exp = 10000;
+
+ if (@bookpages == 31) goto L_Thank;
+ if (@bookpages > 26) goto L_Almost;
+ if (@bookpages > 18) goto L_Many;
+ if (@bookpages > 8) goto L_Some;
+ if (@bookpages > 0) goto L_Few;
+
+ mes "[Ensio]";
+ mes "\"Hello. Did you come here to see the library? There isn't much left... But we're working on recovering the books by collecting the ripped out book pages, sorting them and recreating the books.\"";
+ if (BaseLevel < $@Q_BlueSageMinimumLevel)
+ goto L_close;
+ menu
+ "Good luck with that. See you in ten years or something.",L_Investigate,
+ "Can I help somehow?",L_Next;
+
+L_Next:
+ mes "[Ensio]";
+ mes "\"Oh, would you? That'd be great! You see, the slimes ate most of the books and it is difficult to retrieve the bookpages.";
+ mes "If you feel capable of this task, you could go out to hunt the Blue and White Slimes, to get the bookpages back from them.\"";
+ goto L_Progress;
+
+L_Few:
+ mes "[Ensio]";
+ mes "\"So many bookpages are still missing...\"";
+ next;
+ goto L_Progress;
+
+L_Some:
+ mes "[Ensio]";
+ mes "\"Thanks for the pages you brought. There are still some missing.\"";
+ next;
+ goto L_Progress;
+
+L_Many:
+ mes "[Ensio]";
+ mes "\"Wow, you already found quite a lot of bookpages. Please keep it up!\"";
+ next;
+ goto L_Progress;
+
+L_Almost:
+ mes "[Ensio]";
+ mes "\"There are only a few pages missing.\"";
+ next;
+ goto L_Progress;
+
+L_Progress:
+ mes "\"Did you get some bookpages from the slimes?\"";
+ menu
+ "Yes, have a look.",L_Continue,
+ "No.",L_Investigate;
+
+L_Continue:
+ if (countitem("BookPage") < 1)
+ goto L_NoItem;
+ delitem "BookPage", 1;
+
+ if (rand(90 - @bookpages) < 36)
+ goto L_OldPage;
+
+ @bookpages = @bookpages + 1;
+ callfunc "updateBlueSageBookPages";
+ getexp @new_bookpage_exp, 0;
+ mes "[Ensio]";
+ mes "\"Ah, wonderful! This is a page we haven't found yet!\"";
+ if (@bookpages < 31)
+ goto L_Progress;
+ next;
+ mes "\"Amazing. I think you found all the missing pages of which we didn't have a copy. This is a great help! I'll mention this to Nikolai.\"";
+ goto L_Investigate;
+
+L_OldPage:
+ getexp @old_bookpage_exp, 0;
+ mes "[Ensio]";
+ mes "\"Mh, let me see. We already have a copy of this page, but it's helpful nevertheless. Thank you.\"";
+ goto L_Progress;
+
+L_Thank:
+ mes "[Ensio]";
+ mes "\"We'd never be able to recover our books so quickly without your help. Thanks!\"";
+ goto L_Investigate;
+
+L_NoItem:
+ mes "[Ensio]";
+ mes "\"This isn't funny! Come back when you're serious.\"";
+ goto L_Investigate;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Ensio]";
+ mes "\"Visitor with a mask? Ah, I think I know who are you talking about. Black clothes and a golden mask. Rather strange guy.\"";
+ next;
+ mes "\"He was looking around in the library a while, and then came to ask about our research. He seemed to be particularly interested in our experiments with the slimes.";
+ mes "Heh, I wonder what he would've said if he'd have visited us a little bit later. Mh, now that I think about it, the accident with the slimes happened just the night after he was here.\"";
+ if ((QL_BSAGE_INVESTIGATE != 3) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 9))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 1;
+ goto L_close;
+
+L_Helper:
+ mes "[Ensio]";
+ mes "\"Oh, I can't really tell. I'm mostly working in the library, while he's very involved in the research.\"";
+ goto L_close;
+
+L_close:
+ @bookpages = 0;
+ @old_bookpage_exp = 0;
+ @new_bookpage_exp = 0;
+ close;
+}
diff --git a/npc/048-2/helperBookpages2.txt b/npc/048-2/helperBookpages2.txt
new file mode 100644
index 00000000..b7d94be5
--- /dev/null
+++ b/npc/048-2/helperBookpages2.txt
@@ -0,0 +1,83 @@
+
+048-2,94,86,0 script Henriikka NPC363,{
+ @bookpages = ((QUEST_BlueSage & $@Q_BlueSageBookPages_MASK) >> $@Q_BlueSageBookPages_SHIFT);
+
+ if (@bookpages == 31) goto L_Thank;
+ if (@bookpages > 0) goto L_Progress;
+
+ mes "You see a helper looking through some papers that have a strange smell.";
+ mes "[Henriikka]";
+ mes "\"Oh, hey. Welcome to the library, or what's left of it.\"";
+ mes "She sighs.";
+ menu
+ "What are you doing?",L_Next,
+ "You seem to be busy. See you.",L_close;
+
+L_Next:
+ mes "[Henriikka]";
+ mes "\"We're trying to repair the books by collecting the ripped out bookpages and sorting them and copying them for new books. It's a lot to do, and after being eaten by a slime they stink!";
+ mes "And a lot of pages are missing, since most of the slimes escaped. I suppose we'll have to go out and hunt them once we're done here.\"";
+ menu
+ "Maybe I can help with that?",L_Collect,
+ "Good luck.",L_close;
+
+L_Collect:
+ if (BaseLevel < $@Q_BlueSageMinimumLevel)
+ goto L_Careful;
+ mes "[Henriikka]";
+ mes "\"Oh, that'd be awesome! If you find some pages, you can bring them to Ensio.\"";
+ goto L_Investigate;
+
+L_Careful:
+ mes "[Henriikka]";
+ mes "\"Oh, that's very kind, but those slimes are dangerous! Better become a bit stronger first.\"";
+ goto L_close;
+
+L_Progress:
+ mes "[Henriikka]";
+ mes "\"If you get any bookpages from the slimes, bring them to Ensio. Thanks for your help!\"";
+ goto L_Investigate;
+
+L_Thank:
+ mes "[Henriikka]";
+ mes "\"I'm so glad we didn't have to go out to hunt the slimes! Thank you!\"";
+ goto L_Investigate;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Henriikka]";
+ mes "\"With a mask? I don't really remember... We have so many visitors. Though I suppose someone wearing a mask would be noticeable... But I'm so worn out from the past few days that I'm just glad I can even recall my own name! Sorry.\"";
+ goto L_close;
+
+L_Helper:
+ mes "[Henriikka]";
+ mes "\"Oh, I never really thought about that. He was the one who failed the sealing spell, right? But I heard it's a quite difficult spell, so I suppose this could've happened to anyone. I don't know. Why are you asking such difficult questions?\"";
+ next;
+ mes "\"I need to go on with sorting the bookpages now.\"";
+ goto L_close;
+
+L_close:
+ @bookpages = 0;
+ close;
+}
diff --git a/npc/048-2/helperBookpages3.txt b/npc/048-2/helperBookpages3.txt
new file mode 100644
index 00000000..4ac8d497
--- /dev/null
+++ b/npc/048-2/helperBookpages3.txt
@@ -0,0 +1,62 @@
+
+048-2,99,87,0 script Teuvo NPC366,{
+ @bookpages = ((QUEST_BlueSage & $@Q_BlueSageBookPages_MASK) >> $@Q_BlueSageBookPages_SHIFT);
+
+ if (@bookpages == 31) goto L_Thank;
+ if (@bookpages > 0) goto L_Progress;
+
+ mes "[Teuvo]";
+ mes "\"I always thought it was a bad idea to play around with the slimes. And as if holding them in here isn't bad enough, no, they also had to mess around with magic.\"";
+ mes "He seems to be rather upset.";
+ goto L_Investigate;
+
+L_Progress:
+ mes "[Teuvo]";
+ mes "\"Did you find some bookpages? Ensio will take them.\"";
+ goto L_Investigate;
+
+L_Thank:
+ mes "[Teuvo]";
+ mes "\"Thanks for helping out here.\"";
+ goto L_Investigate;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Teuvo]";
+ mes "\"With a mask? Hm. I don't remember.\"";
+ goto L_close;
+
+L_Helper:
+ mes "[Teuvo]";
+ mes "\"Peetu? He's one of those magic wielders who think they can do anything. Heh, you see the result here.";
+ mes "But to be fair, from what I've seen Peetu was always very attentive and dutiful.\"";
+ if ((QL_BSAGE_INVESTIGATE != 5) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 7))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 3;
+ goto L_close;
+
+L_close:
+ @bookpages = 0;
+ close;
+}
diff --git a/npc/048-2/helperChief.txt b/npc/048-2/helperChief.txt
new file mode 100644
index 00000000..0a4e3c90
--- /dev/null
+++ b/npc/048-2/helperChief.txt
@@ -0,0 +1,117 @@
+
+048-2,146,26,0 script Oskari NPC134,{
+ if (QL_BSAGE_INVESTIGATE >= 11 && QL_BSAGE_INVESTIGATE < 13) goto L_Goodjob;
+ if (QL_BSAGE_INVESTIGATE > 1 && QL_BSAGE_INVESTIGATE < 13) goto L_Investigate;
+
+ mes "[Oskari]";
+ mes "\"Hello. Welcome to the residence of the Great Nikolai.";
+ mes "You have to excuse me, as you might have heard we're having some trouble at the moment and I, as Chief of Nikolai's helpers, have a lot to do.\"";
+ if (QL_BSAGE_INVESTIGATE == 0)
+ goto L_close;
+ menu
+ "Peetu asked me to talk to you about his mishap.",L_Next,
+ "Ok, see you.",L_close;
+
+L_Next:
+ mes "You tell him about your conversation with Peetu, how he's blaming himself and his worries about losing his job.";
+ next;
+ mes "Oskari keeps silent for a moment after you finish, pondering. Then he talks to you.";
+ mes "[Oskari]";
+ mes "\"You know, Peetu is one of my most experienced and reliable employees. This whole situation is very disquieting, not to say suspicious.\"";
+ next;
+ mes "\"Due to all the trouble, I haven't had time to have a talk with him nor to make further investigations. You already showed some good knowledge of human nature by the way you calmed him down and talked to me.\"";
+ next;
+ mes "\"Would you be willing to talk with Peetu and the other helpers, investigating what actually happened?\"";
+ next;
+ mes "\"As someone who's not a member of our team you might be able to get a more unbiased view of the situation, besides the fact that all of us are very busy with getting the situation under control again.\"";
+ next;
+ mes "\"I suggest to start by talking to Peetu again to get a precise idea of his workflow and what he thinks happened.";
+ mes "Oh, and please tell him that I'm not considering firing him in the current situation. You might need that to calm him down and get meaningful information.\"";
+ next;
+ mes "\"You should find out if someone observed anything unusual during the time before the accident happened.\"";
+ QL_BSAGE_INVESTIGATE = 2;
+ goto L_close;
+
+L_Investigate:
+ mes "[Oskari]";
+ mes "\"Ah, hello. Did you get an overview over the happenings yet?\"";
+ if (QL_BSAGE_INVESTIGATE != 10)
+ menu
+ "I'm still collecting information.",L_close;
+ next;
+ mes "You explain who you talked to, the helpers positive opinions of Peetu and what you found out about the suspicious visitor.";
+ mes "[Oskari]";
+ mes "\"With a mask you say? This reminds me... wait a moment.\"";
+ mes "He turns to his desk and searches through some papers.";
+ next;
+ mes "[Oskari]";
+ mes "\"Mh... yes. It fits together.";
+ mes "Listen, this is a letter from Chief Warrick on Santa's team. It seems they encountered some sabotaging during their preparations for the Christmas time... the letter mentions a masked person as well.\"";
+ next;
+ mes "\"And there are some reports about cases of unusal behaviour from native animals in various places of Kaizei that came to the Sages notice.\"";
+ next;
+ mes "\"And now this accident in our house, also a person with a mask... and given the context of the recent frictions within the Sages...\"";
+ mes "Oskari seems rather excited.";
+ next;
+ mes "[Oskari]";
+ mes "\"I think you revealed some important connections. I need to notify Nikolai and the other Sages.\"";
+ menu
+ "I'm confused now.",L_Continue,
+ "What are you talking about?",L_Continue;
+
+L_Continue:
+ mes "[Oskari]";
+ mes "\"I'm sorry. I think you deserve an explanation. You see, the Sages of Kaizei are a circle of wise wizards who work together for the prosperity of this continent.";
+ mes "Recently there was some conflict among the Sages which caused one of the members to leave the circle. It's all very unfortunate.";
+ next;
+ mes "\"However, taking all these different events into account, I came to the suspicion that there might be a connection. Of course we don't have evidence yet, so I don't want to be too sure. Well, I'll bring this to the Sages' notice.\"";
+ next;
+ mes "\"You were a great help! I'll inform Nikolai about your involvement in clarifying this matter.\"";
+ next;
+ mes "\"And you should also talk with Peetu, I'm sure he'll be relieved to hear about the clarification of this matter too.\"";
+ QL_BSAGE_INVESTIGATE = 11;
+ goto L_close;
+
+L_Goodjob:
+ mes "[Oskari]";
+ mes "\"Thanks again for your investigations.\"";
+ menu
+ "You're welcome.",L_close,
+ "Can you tell me something about the Sages?",L_MoreText;
+
+L_MoreText:
+ mes "[Oskari]";
+ mes "\"Oh, sure. I'm a bit busy right now, but you were a great help, so I think I can take a few minutes for you. What do you want to know?\"";
+ menu
+ "What exactly are the Sages and what do they do?",L_Sages,
+ "What was that conflict you were talking about?",L_Conflict,
+ "Mh, I changed my mind.",L_close;
+
+L_Sages:
+ mes "[Oskari]";
+ mes "\"Well, as I said the Sages are a circle of powerful wizards. There are twelve of them - eh, actually, now there are only eleven of them.\"";
+ mes "He sighs.";
+ next;
+ mes "[Oskari]";
+ mes "\"However, they live in different places all over Kaizei, but they meet sometimes to discuss different matters. They work hard for the prosperity of this continent, trying to improve the living conditions by both political work and magical research, with the aid of their helpers.\"";
+ next;
+ mes "\"The politics on Kaizei are rather complicated. The Sages have great influence, but there are also other organizations and groups. Due to the harsh climate on this continent, villages or towns can be cut off from the rest of the world for several weeks sometimes, so most of them tend to be rather independent.\"";
+ next;
+ mes "\"Also there's the Order of Ice, an organization which represents the national interests of Kaizei in a rather narrow-minded way compared to the Sages.\"";
+ goto L_close;
+
+L_Conflict:
+ mes "[Oskari]";
+ mes "\"Oh, I'm not sure if I should talk about that... It's a rather delicate situation.\"";
+ next;
+ mes "\"Basically there was a disagreement between the Sages. Usually those things can be solved by discussion, but this time... things got rather personal and one of the members accused Santa of valuing his own interests over the general good.\"";
+ next;
+ mes "\"This, of course, is nonsense. Santa would never do that, and it's more that the person accusing him has been suspected to act this way. The other Sages were on Santa's side and I fear this harsh rejection caused a lot of painful feelings.\"";
+ next;
+ mes "\"Personally I think that he has been jealous of Santa's influence and high position for quite a while. However, he took this as a reason to leave the Sages and based on our insights, it seems he decided to work against the Sages.";
+ mes "It really is a shame.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/048-2/helperCleaning1.txt b/npc/048-2/helperCleaning1.txt
new file mode 100644
index 00000000..208a06d3
--- /dev/null
+++ b/npc/048-2/helperCleaning1.txt
@@ -0,0 +1,98 @@
+
+048-2,117,106,0 script Pyry NPC365,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (@slimes == 255) goto L_Thank;
+ if (@slimes > 0) goto L_Progress;
+
+ mes "[Pyry]";
+ mes "\"Welcome to the library of Sage Nikolai. I'm very sorry, but as you see it's not in a good shape at the moment. Most of the books were eaten by the slimes or damaged and we're working hard on cleaning up the mess.";
+ mes "I have to ask you not to go in the deeper parts of the library, since there are still some of the slimes left and they're dangerous.\"";
+ if (BaseLevel < $@Q_BlueSageMinimumLevel)
+ goto L_close;
+ menu
+ "I can fight them.",L_Next,
+ "Ok, thanks for the warning.",L_Investigate;
+
+L_Next:
+ mes "Pyry seems surprised.";
+ mes "[Pyry]";
+ mes "\"That... I didn't think about this possibility. But it'd be a great help!";
+ mes "Ok, there are some slimes around in the deeper parts of the library. They... erm, developed some very fast breeding behaviour, both the Blue Slimes and the White Slimes, but in a slightly different fashion.\"";
+ next;
+ mes "\"The Blue ones are able to generate smaller slimes which show a self-destructive behaviour to protect their... parent slime if you want to call it that. You have to kill the big one, but be careful of the smaller ones while trying that.\"";
+ next;
+ mes "\"The White Slimes appear in groups and when you attack one of them, they also show some self-destructive behaviour to protect their group as a whole. You have to defeat the entire group, otherwise the remaining slimes will breed new slimes to replace their lost.\"";
+ QUEST_BlueSage = QUEST_BlueSage | $@Q_BlueSageSlimesStart;
+ goto L_Investigate;
+
+L_Progress:
+ mes "[Pyry]";
+ mes "\"It's very brave of you to fight against those slimes deeper in the library. Remember that you have to kill the entire group to prevent them from breeding.\"";
+ callfunc "blueSageNumberOfClearedNests";
+ if (@slimenests > 5) goto L_Almost;
+ if (@slimenests > 3) goto L_Some;
+ if (@slimenests > 1) goto L_Few;
+ goto L_Investigate;
+
+L_Almost:
+ next;
+ mes "\"I think there are only very few left.\"";
+ goto L_Investigate;
+
+L_Some:
+ next;
+ mes "\"The amount of slimes decreased noticably, but there are still some left.\"";
+ goto L_Investigate;
+
+L_Few:
+ next;
+ mes "\"I saw you already started, keep it on!\"";
+ goto L_Investigate;
+
+L_Thank:
+ mes "[Pyry]";
+ mes "\"It seems all of the slimes are gone now. I'm so glad! Thanks for your help. I mentioned your assistance to Nikolai.\"";
+ goto L_Investigate;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Pyry]";
+ mes "\"Mh, yes. I remember him. He was very interested in the library and the research we do here. He had an unusual behaviour and appearance. But, well, that isn't a reason to refuse someone, right?\"";
+ goto L_close;
+
+L_Helper:
+ mes "[Pyry]";
+ mes "\"Peetu? I have always been glad to have him on the team. He's really brought forward our work here.\"";
+ next;
+ mes "\"I was very surprised when I heard that he's responsible for the failed sealing spell. I'd never have expected that from him.\"";
+ if ((QL_BSAGE_INVESTIGATE != 5) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 7))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 3;
+ goto L_close;
+
+L_close:
+ @slimes = 0;
+ close;
+}
diff --git a/npc/048-2/helperCleaning2.txt b/npc/048-2/helperCleaning2.txt
new file mode 100644
index 00000000..4be03d9d
--- /dev/null
+++ b/npc/048-2/helperCleaning2.txt
@@ -0,0 +1,67 @@
+
+048-2,123,87,0 script Nea NPC363,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (@slimes == 255) goto L_Thank;
+ if (@slimes > 0) goto L_Progress;
+
+ mes "[Nea]";
+ mes "\"Oh, hello. If I were you I wouldn't go deeper into the library. There are still some of those monsters left. Slipping between the bookshelves.\"";
+ mes "She shudders.";
+ next;
+ mes "[Nea]";
+ mes "\"And they can explode! Nothing in the world could make me go in there. I'll just do my work right here, clean the floor and tidy up the books, and I'm keeping my eyes open in case they get over here.\"";
+ goto L_Investigate;
+
+L_Progress:
+ mes "[Nea]";
+ mes "\"Oh, I'm so glad you're taking care of those scary slimes. You're so brave!";
+ mes "How many of them are still left, do you think? Will it be safe to go there soon?\"";
+ goto L_Investigate;
+
+L_Thank:
+ mes "[Nea]";
+ mes "\"I feel much safer now that you defeated the slimes. Thanks so much!\"";
+ goto L_Investigate;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Nea]";
+ mes "\"With a mask? Mh, I think I know who are you talking about. I vaguely remember that there was someone with a mask... but I can't recall any details, I wasn't really paying attention.\"";
+ goto L_close;
+
+L_Helper:
+ mes "[Nea]";
+ mes "\"Peetu? Yeah, he's the kind of person who always wants to do things perfectly. That makes it a bit difficult to work with him, since his expectations for others are as high as for himself.\"";
+ next;
+ mes "\"I really wonder how that accident with the sealing spell could've happened. I'd have never expected him to mess something up like that.\"";
+ if ((QL_BSAGE_INVESTIGATE != 5) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 7))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 3;
+ goto L_close;
+
+L_close:
+ @slimes = 0;
+ close;
+}
diff --git a/npc/048-2/helperCleaning3.txt b/npc/048-2/helperCleaning3.txt
new file mode 100644
index 00000000..df072fe1
--- /dev/null
+++ b/npc/048-2/helperCleaning3.txt
@@ -0,0 +1,71 @@
+
+048-2,139,99,0 script Arvo NPC366,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (@slimes == 255) goto L_Thank;
+ if (@slimes > 0) goto L_Progress;
+
+ mes "[Arvo]";
+ mes "\"Oh, this is so much work... I can't believe they let this happen! You would think they'd be careful when playing around with such powerful forces. Hah! Big mistake!\"";
+ goto L_Investigate;
+
+L_Progress:
+ mes "[Arvo]";
+ mes "\"We really appreciate your help with the slimes.\"";
+ mes "He sighs.";
+ goto L_Investigate;
+
+L_Thank:
+ mes "[Arvo]";
+ mes "\"Good work with the slimes. This will make our task much easier.\"";
+ mes "He sighs and takes a careful look around.";
+ next;
+ mes "[Arvo]";
+ mes "\"But it shows that Nikolai's position isn't what it used to be. There's disturbance in the great circle of our Sages and things have changed. About one year ago, Nikolai's helpers wouldn't have needed the help of a mere adventurer - no offense.\"";
+ next;
+ mes "\"But it appears we were focusing too much on research and this lead to neglect of other duties of a Sage's household. This is dangerous in times of changes. I'm worried about the future.\"";
+ goto L_Investigate;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Arvo]";
+ mes "\"Yes, I remember that one! I welcomed him in the libary and showed him around. But I didn't have the impression he was really listening to what I was saying, though that's hard to tell with the mask.\"";
+ next;
+ mes "\"But when I left him to look at the books on his own, he sneaked over to the workshop area. Visitors are allowed to have a look there, but only if they don't interfere with any research and experiments. But it seems he was being rather disturbing, since they sent them back to the library part.\"";
+ next;
+ mes "\"I tried to keep an eye on him after that, but when I got distracted by some newly arriving visitor he went over to the workshop again! Usually I enjoy my job, because I like talking to people, but this guy... was a pain, really.\"";
+ if ((QL_BSAGE_INVESTIGATE != 3) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 9))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 1;
+ goto L_close;
+
+L_Helper:
+ mes "[Arvo]";
+ mes "\"Peetu? That's one of the high rank helpers. As far as I know, he's very talented with magic and takes part in some important research. But I don't really know about those things.\"";
+ goto L_close;
+
+L_close:
+ @slimes = 0;
+ close;
+}
diff --git a/npc/048-2/helperCleaning4.txt b/npc/048-2/helperCleaning4.txt
new file mode 100644
index 00000000..ef1397be
--- /dev/null
+++ b/npc/048-2/helperCleaning4.txt
@@ -0,0 +1,62 @@
+
+048-2,131,119,0 script Kristian NPC366,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (@slimes == 255) goto L_Thank;
+ if (@slimes > 0) goto L_Progress;
+
+ mes "[Kristian]";
+ mes "\"Welcome. Please don't go deeper into the library, there are still some slimes left. But in spite of that we have made quite a bit of progress. You should have seen the mess just after most of the slimes escaped!\"";
+ goto L_Investigate;
+
+L_Progress:
+ mes "[Kristian]";
+ mes "\"Wow, it's really generous of you to fight those slimes for us.\"";
+ goto L_Investigate;
+
+L_Thank:
+ mes "[Kristian]";
+ mes "\"I'm so glad that you took care of the remaining slimes. Thanks!\"";
+ goto L_Investigate;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Kristian]";
+ mes "\"Oh, there was such a visitor, yes. Strange guy, and didn't really know how to behave. He sneaked into the workshop area all the time, I think he was rather curious about the things going on there.\"";
+ next;
+ mes "\"But still, he can't just walk in there, fiddle with the experiments and disturb the helpers doing their work.\"";
+ if ((QL_BSAGE_INVESTIGATE != 3) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 9))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 1;
+ goto L_close;
+
+L_Helper:
+ mes "[Kristian]";
+ mes "\"Peetu? I think he's a good guy. Very focused on his work, I think. I don't have that much to do with him, so I can't really tell.\"";
+ goto L_close;
+
+L_close:
+ @slimes = 0;
+ close;
+}
diff --git a/npc/048-2/helperCleaning5.txt b/npc/048-2/helperCleaning5.txt
new file mode 100644
index 00000000..3e9885a6
--- /dev/null
+++ b/npc/048-2/helperCleaning5.txt
@@ -0,0 +1,64 @@
+
+048-2,100,125,0 script Mirjami NPC363,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (@slimes == 255) goto L_Thank;
+
+ mes "[Mirjami]";
+ mes "\"Where is it? Everything's upside down. These terrible slimes.\"";
+ menu
+ "What are you doing?",L_Next;
+
+L_Next:
+ mes "[Mirjami]";
+ mes "\"Oh? I'm just searching for some cleaning supplies. They must be somewhere around here, but everything went upside down when the slimes escaped.\"";
+ goto L_Investigate;
+
+L_Thank:
+ mes "[Mirjami]";
+ mes "\"I heard you fought the slimes that were still roaming between the bookshelves. Thank you!\"";
+ next;
+ mes "\"I was a bit worried that they might ruin our efforts by messing everything up again after we just cleaned.\"";
+ goto L_Investigate;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Mirjami]";
+ mes "\"Ohh, I think I know who you mean. That was a strange guy. He always came over here in the workshop, said he's very interested in the research. I suppose that's ok, but he didn't keep his hands to himself, and touched some experiments and I caught him near some storage racks.\"";
+ next;
+ mes "\"Visitors should keep away from those!\"";
+ if ((QL_BSAGE_INVESTIGATE != 3) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 9))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 1;
+ goto L_close;
+
+L_Helper:
+ mes "[Mirjami]";
+ mes "\"Oh, eh, why are you asking me? I've only been here a short while and don't really know all of the people well enough yet.\"";
+ goto L_close;
+
+L_close:
+ @slimes = 0;
+ close;
+}
diff --git a/npc/048-2/helperJanitor.txt b/npc/048-2/helperJanitor.txt
new file mode 100644
index 00000000..b60b0062
--- /dev/null
+++ b/npc/048-2/helperJanitor.txt
@@ -0,0 +1,96 @@
+
+048-2,36,44,0 script Debug#BlueSage NPC110,{
+ mes "QUEST_BlueSage: "+ QUEST_BlueSage;
+ mes "QL_BSAGE_INVESTIGATE: "+ QL_BSAGE_INVESTIGATE;
+ next;
+ menu
+ "set QL_BSAGE_INVESTIGATE", L_Investigate;
+
+L_Investigate:
+ input @state;
+ if(@state < 0 || @state > 14) set @state, 0;
+ QL_BSAGE_INVESTIGATE = @state;
+ close;
+
+OnInit:
+ if (!debug) disablenpc strnpcinfo(0);
+ end;
+}
+
+048-2,40,41,0 script Elias NPC110,7,6,{
+ if (QL_BSAGE_INVESTIGATE == 11) goto L_Thank;
+ if ((QL_BSAGE_INVESTIGATE == 4) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Confirmed;
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 9)) goto L_Worry;
+ if (QUEST_BlueSage > 0 && QL_BSAGE_INVESTIGATE < 13) goto L_ShortHello;
+
+ mes "[Elias]";
+ mes "\"Welcome to the residence of Nikolai, member of the Sages of Kaizei.\"";
+ next;
+ mes "\"Our house is famous for its extraordinary and well equipped library.";
+ mes "Ahm, usually well equipped.\"";
+ next;
+ mes "\"We had an accident with some magic experiments, that caused some slimes to get out of control. They ate most of the books in the library.\"";
+ mes "He sighs with a regretful look on his face.";
+ next;
+ mes "[Elias]";
+ mes "\"So, if you came because of the library, I'll have to disappoint you, because there isn't much left.";
+ mes "Though you look like a skilled adventurer. If you'd like to offer your help that'd be greatly appreciated.\"";
+ if(QL_BSAGE_INVESTIGATE == 13)
+ QL_BSAGE_INVESTIGATE = 14;
+ next;
+ mes "\"The library is on the third floor.\"";
+ goto L_close;
+
+OnTouch:
+ if (BaseLevel >= $@Q_BlueSageMinimumLevel && !QL_BSAGE_INVESTIGATE)
+ QL_BSAGE_INVESTIGATE = 13;
+ end;
+
+L_ShortHello:
+ mes "[Elias]";
+ mes "\"Welcome back. I heard you're helping with the cleanup efforts in the library.";
+ mes "Thank you very much.\"";
+ if ((QL_BSAGE_INVESTIGATE != 2) && (QL_BSAGE_INVESTIGATE != 5) && (QL_BSAGE_INVESTIGATE != 8))
+ goto L_close;
+ menu
+ "Can you tell me if there were any unusual visitors before the accident?",L_Next;
+
+L_Next:
+ mes "[Elias]";
+ mes "\"Mh, let me think. There were quite a few visitors with different concerns, but that's usual at this time of the year.";
+ mes "One of them was a bit odd, he was wearing a mask and had a strange way of talking. He said he comes from Thermin, which is a mining town in the west. I figured his face might have gotten deformed in some mining accident, but I didn't ask, that would've been rude.";
+ mes "If I remember correctly he wanted to see the library.\"";
+ next;
+ mes "Elias gets a bit excited now.";
+ mes "[Elias]";
+ mes "\"Do you think he may have had something to do with the accident? We're a very hospitable house, so I didn't see a reason to deny him the entrance. I mean, his mask might have been a bit unusual, but hey, there could've been many reasons why someone would wear a mask, don't you think?\"";
+
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 1;
+
+ menu
+ "Sure, but it's interesting that he was here shortly before the accident.",L_close,
+ "I'll ask some more people about that guy.",L_close;
+
+L_Worry:
+ mes "[Elias]";
+ mes "\"After your questions I'm really getting worried about this guy with the mask. In retrospect it really seems suspicous.";
+ mes "It might be a good idea to ask around if anyone else observed something odd connected to this person.\"";
+ goto L_close;
+
+L_Confirmed:
+ mes "[Elias]";
+ mes "\"I heard your investigations reminded other people that they observed suspicious behaviour too.\"";
+ next;
+ mes "\"It's all my fault, I should've paid more attention! You should talk to Chief Oskari about this.\"";
+ goto L_close;
+
+L_Thank:
+ mes "[Elias]";
+ mes "\"Now that Chief Oskari knows about the sequence of events, the Sages will take care of it. It's really a shame how malicious people can be.\"";
+ next;
+ mes "\"Thanks a lot for your help revealing the truth.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/048-2/helperMInk.txt b/npc/048-2/helperMInk.txt
new file mode 100644
index 00000000..b695ec85
--- /dev/null
+++ b/npc/048-2/helperMInk.txt
@@ -0,0 +1,100 @@
+
+048-2,95,103,0 script Eevert NPC365,{
+ @water_amount = 5;
+ @spectre_amount = 3;
+ @poltergeist_amount = 3;
+ @wisp_amount = 3;
+ @ironpowder_amount = 4;
+ @ink_exp = 7000;
+
+ if (QUEST_BlueSage & $@Q_BlueSageMaterialInk) goto L_Done;
+
+ mes "[Eevert]";
+ mes "\"Mh. I wonder how I'm expected to perform my task with this meager equipment. The new books will look pathetic.\"";
+ mes "He sighs.";
+ if (BaseLevel < $@Q_BlueSageMinimumLevel)
+ goto L_close;
+ menu
+ "What do you need?",L_Need,
+ "Not my problem.",L_Investigate;
+
+L_Need:
+ mes "[Eevert]";
+ mes "\"I'm doing the covers and illustrations for the new books we create from the pieces of the old ones. But due to all of the chaos from when the slimes escaped, most of the phials of colored ink were broken. How am I supposed to do the illustrations without color?\"";
+ next;
+ mes "\"I think I'll need at least " + @water_amount + " Bottles of Water, " + @spectre_amount + " Spectre Powders, " + @poltergeist_amount + " Poltergeist Powders, " + @wisp_amount + " Wisp Powders and " + @ironpowder_amount + " Iron Powders to create new ink.\"";
+ menu
+ "I have those with me!",L_TurnIn,
+ "I'll try to get those.",L_close,
+ "Too bad.",L_Investigate;
+
+L_TurnIn:
+ if ((countitem("BottleOfWater") < @water_amount) || (countitem("SpectrePowder") < @spectre_amount) || (countitem("PoltergeistPowder") < @poltergeist_amount) || (countitem("WispPowder") < @wisp_amount) || (countitem("IronPowder") < @ironpowder_amount))
+ goto L_NoItem;
+ delitem "BottleOfWater", @water_amount;
+ delitem "SpectrePowder", @spectre_amount;
+ delitem "PoltergeistPowder", @poltergeist_amount;
+ delitem "WispPowder", @wisp_amount;
+ delitem "IronPowder", @ironpowder_amount;
+ getexp @ink_exp, 0;
+ QUEST_BlueSage = (QUEST_BlueSage | $@Q_BlueSageMaterialInk);
+ mes "[Eevert]";
+ mes "\"Wonderful! Now I can prepare the ink for magnificent illustrations! You're very generous.\"";
+ goto L_Investigate;
+
+L_Done:
+ mes "[Eevert]";
+ mes "\"Thanks for your help with the inks! Now I'll be able to fulfill my tasks adequately. Some of these books were really valuable, and it's important to recreate them as good as possible.\"";
+ goto L_Investigate;
+
+L_NoItem:
+ mes "[Eevert]";
+ mes "\"What does this mean? You don't have it!\"";
+ goto L_close;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Eevert]";
+ mes "\"A visitor? I don't really pay attention to visitors, unless it's someone notable.\"";
+ goto L_close;
+
+L_Helper:
+ mes "[Eevert]";
+ mes "\"Ah, Peetu. I really appreciate his sense for high quality work. The requirements to become a helper of a sage are already high, but Peetu is outstanding. He has a talent for magic and combined with his diligence, it's quite remarkable.\"";
+ next;
+ mes "\"That's why I'm really confused about this situation, since he was the one performing the sealing of the slimes. I wonder what went wrong.\"";
+ if ((QL_BSAGE_INVESTIGATE != 5) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 7))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 3;
+ goto L_close;
+
+L_close:
+ @water_amount = 0;
+ @spectre_amount = 0;
+ @poltergeist_amount = 0;
+ @wisp_amount = 0;
+ @ironpowder_amount = 0;
+ @ink_exp = 0;
+ close;
+}
diff --git a/npc/048-2/helperMReed.txt b/npc/048-2/helperMReed.txt
new file mode 100644
index 00000000..4a5bf109
--- /dev/null
+++ b/npc/048-2/helperMReed.txt
@@ -0,0 +1,89 @@
+
+048-2,104,78,0 script Kullervo NPC366,{
+ @reed_amount = 20;
+ @reed_exp = 10000;
+
+ if (QUEST_BlueSage & $@Q_BlueSageMaterialReed) goto L_Done;
+
+ mes "[Kullervo]";
+ mes "\"Oh no! What should we do now?\"";
+ menu
+ "What's wrong?",L_Foo;
+L_Foo:
+ mes "[Kullervo]";
+ mes "\"We're nearly out of paper. The new books require so much material... And it's not easy to get Reed Bundles to create new paper.\"";
+ if (BaseLevel < $@Q_BlueSageMinimumLevel)
+ goto L_close;
+ menu
+ "I have some.",L_TurnIn,
+ "I'll try to get some.",L_close,
+ "Too bad.",L_Investigate;
+
+L_TurnIn:
+ if(countitem("ReedBundle") < @reed_amount)
+ goto L_NoItem;
+ delitem "ReedBundle", @reed_amount;
+ getexp @reed_exp, 0;
+ QUEST_BlueSage = (QUEST_BlueSage | $@Q_BlueSageMaterialReed);
+ mes "[Kullervo]";
+ mes "\"Thank you! That's very generous of you.\"";
+ goto L_Investigate;
+
+L_Done:
+ mes "[Kullervo]";
+ mes "\"Very well, now I can create more paper.\"";
+ goto L_Investigate;
+
+L_NoItem:
+ mes "[Kullervo]";
+ mes "\"Oh, really? Ah, it's not enough. I need " + @reed_amount + " Reed Bundles.\"";
+ goto L_close;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Kullervo]";
+ mes "\"Oh, yes. There was such a guy, shortly before the accident I think. He sneaked into the workshop several times, sticking his nose into stuff that shouldn't be his business. We had to send him back to the library area at least three times.\"";
+ next;
+ mes "\"Maybe he was confused, not sure. He talked very strangely.\"";
+ if ((QL_BSAGE_INVESTIGATE != 3) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 9))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 1;
+ goto L_close;
+
+L_Helper:
+ mes "[Kullervo]";
+ mes "\"Are you asking because people say it's his fault? Listen, I've known him for many years now. We started our service here about the same time. We share our room and are really close friends.";
+ mes "And in all these years, I've never seen him messing up anything important. He's a perfectionist. He isn't satisfied with anything less than the best possible result when doing his work.\"";
+ next;
+ mes "\"I don't understand what went wrong with that spell, but it just has to have another cause than Peetu. I'm worried about him. He must feel very miserable. But I can't leave my duty here.\"";
+ if ((QL_BSAGE_INVESTIGATE != 5) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 7))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 3;
+ goto L_close;
+
+L_close:
+ @reed_amount = 0;
+ @reed_exp = 0;
+ close;
+}
diff --git a/npc/048-2/helperMSilk.txt b/npc/048-2/helperMSilk.txt
new file mode 100644
index 00000000..58d3f899
--- /dev/null
+++ b/npc/048-2/helperMSilk.txt
@@ -0,0 +1,84 @@
+
+048-2,104,103,0 script Janika NPC363,{
+ @silk_amount = 80;
+ @silk_exp = 10000;
+
+ if (QUEST_BlueSage & $@Q_BlueSageMaterialSilk) goto L_Done;
+ if (BaseLevel >= $@Q_BlueSageMinimumLevel) goto L_Quest;
+
+ mes "[Janika]";
+ mes "\"This is going to be difficult... oh, hello. I'm working on recreating some of the books that were destroyed.\"";
+ goto L_close;
+
+L_Quest:
+ mes "[Janika]";
+ mes "\"This is going to be difficult...";
+ mes "Oh, hello. You don't have " + @silk_amount + " Silk Cocoons with you, do you? I need them for the book covers and binding of some of the more valuable books we're trying to recreate.\"";
+ menu
+ "I have!",L_TurnIn,
+ "I haven't, but I can try to get some.",L_Investigate,
+ "No.",L_Investigate;
+
+L_TurnIn:
+ if(countitem("SilkCocoon") < @silk_amount)
+ goto L_NoItem;
+ delitem "SilkCocoon", @silk_amount;
+ getexp @silk_exp, 0;
+ QUEST_BlueSage = (QUEST_BlueSage | $@Q_BlueSageMaterialSilk);
+ mes "[Janika]";
+ mes "\"Excellent! This is exactly what I need. Thanks a lot. I'll tell Nikolai about your generosity.\"";
+ goto L_Investigate;
+
+L_Done:
+ mes "[Janika]";
+ mes "\"Thanks for the Silk Cocoons. With these the new books are going to be exquisite.\"";
+ goto L_Investigate;
+
+L_NoItem:
+ mes "[Janika]";
+ mes "\"Are you kidding? You don't have it!\"";
+ goto L_close;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Janika]";
+ mes "\"Oh, I know who you mean! That impertinent person came over in the workshop area and fiddled about with all kinds of things here! Such a rude person! Didn't he understand that we had delicate things going on here? We had to send him back to the library area several times.\"";
+ next;
+ mes "She shakes her head.";
+ mes "\"Sometimes I think it'd be better not to allow visitors here. But the sages set a high value on keeping contact with the population. Politics.\"";
+ if ((QL_BSAGE_INVESTIGATE != 3) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 9))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 1;
+ goto L_close;
+
+L_Helper:
+ mes "[Janika]";
+ mes "\"Mh, I don't know him closely.\"";
+ goto L_close;
+
+L_close:
+ @silk_amount = 0;
+ @silk_exp = 0;
+ close;
+}
diff --git a/npc/048-2/helperMYetiClaw.txt b/npc/048-2/helperMYetiClaw.txt
new file mode 100644
index 00000000..062b36d4
--- /dev/null
+++ b/npc/048-2/helperMYetiClaw.txt
@@ -0,0 +1,91 @@
+
+048-2,97,78,0 script Santeri NPC366,{
+ @claw_amount = 8;
+ @claw_exp = 10000;
+
+ if (QUEST_BlueSage & $@Q_BlueSageMaterialClaw) goto L_Done;
+ if (BaseLevel >= $@Q_BlueSageMinimumLevel) goto L_Quest;
+
+ mes "[Santeri]";
+ mes "\"Hm. Please don't disturb me, I'm trying to concentrate.\"";
+ goto L_close;
+
+L_Quest:
+ mes "[Santeri]";
+ mes "\"Welcome. Are you an adventurer? I could use some help.\"";
+ menu
+ "I am. What heroic action is needed?",L_HeroicAction,
+ "How can I help?",L_HeroicAction,
+ "I'm not interested.",L_close;
+
+L_HeroicAction:
+ mes "[Santeri]";
+ mes "\"You see, we're working on repairing all of the damaged books and creating new ones for those that were lost.";
+ mes "Therefore we need a lot of glue, but our supplies are nearly used up. I need " + @claw_amount + " Yeti Claws as ingredient to make new glue. Do you have that?\"";
+ menu
+ "Yes, here you go.",L_TurnIn,
+ "I need to look in my storage.",L_close,
+ "No, sorry.",L_Investigate;
+
+L_TurnIn:
+ if(countitem("YetiClaw") < @claw_amount)
+ goto L_NoItem;
+ delitem "YetiClaw", @claw_amount;
+ getexp @claw_exp, 0;
+ QUEST_BlueSage = (QUEST_BlueSage | $@Q_BlueSageMaterialClaw);
+ mes "[Santeri]";
+ mes "\"Great! Thank you!\"";
+ goto L_Investigate;
+
+L_Done:
+ mes "[Santeri]";
+ mes "\"Thanks to you, our glue supply is replenished and we can repair those books.\"";
+ goto L_Investigate;
+
+L_NoItem:
+ mes "[Santeri]";
+ mes "\"What are you telling me? You don't have it!\"";
+ goto L_close;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Santeri]";
+ mes "\"There was a visitor with a mask? I didn't notice. You see, I spend most of my time in the workshop, and concentrate on my work. There are other helpers who attend to the visitors. And hopefully keep them from disturbing my concentration.\"";
+ goto L_close;
+
+L_Helper:
+ mes "[Santeri]";
+ mes "\"Oh, that's an interesting question. I was really surprised when I heard that he was responsible for the sealing spell. I've worked together with him before, and I have to say, it really was a pleasure. He's very accurate and diligent, but also polite and helpful.\"";
+ next;
+ mes "\"I really wonder what went wrong with that sealing spell. I can't imagine Peetu messing up something so important.\"";
+ if ((QL_BSAGE_INVESTIGATE != 5) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 7))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 3;
+ goto L_close;
+
+L_close:
+ @claw_amount = 0;
+ @claw_exp = 0;
+ close;
+}
diff --git a/npc/048-2/helperResting1.txt b/npc/048-2/helperResting1.txt
new file mode 100644
index 00000000..ae6fb407
--- /dev/null
+++ b/npc/048-2/helperResting1.txt
@@ -0,0 +1,63 @@
+
+048-2,36,26,0 script Lenita NPC363,{
+ @bookpages = ((QUEST_BlueSage & $@Q_BlueSageBookPages_MASK) >> $@Q_BlueSageBookPages_SHIFT);
+
+ if (@bookpages == 254) goto L_Thank;
+ if (@bookpages > 0) goto L_Progress;
+
+ mes "[Lenita]";
+ mes "\"Oh, hello. You didn't choose a good time to visit. The library is a total mess. The slimes got out of control and ate most of the books.\"";
+ next;
+ mes "\"We're trying to repair some of the valuable and important books. It's so much work!";
+ mes "I was up until late last night, and woke up so early today... I'm having a break right now.\"";
+ goto L_Investigate;
+
+L_Progress:
+ mes "[Lenita]";
+ mes "\"Teuvo said you're helping to collect some of the missing bookpages to repair the books. That's very kind of you! It's so much work to do, so every bit of help is welcome.\"";
+ goto L_Investigate;
+
+L_Thank:
+ mes "[Lenita]";
+ mes "\"Wow, Ensio told me you collected so many of the lost book pages.\"";
+ goto L_Investigate;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "I need to leave.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "See you later.",L_close;
+
+L_Ask_Both:
+ menu
+ "Can you tell me anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Visitor:
+ mes "[Lenita]";
+ mes "\"With a mask? Yeah, I remember. That was a strange guy. He came to visit the library, but he lurked around at the workshop area and they had to send him back to the books.\"";
+ if ((QL_BSAGE_INVESTIGATE != 3) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 9))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 1;
+ goto L_close;
+
+L_Helper:
+ mes "[Lenita]";
+ mes "\"Mh, I can't really tell since I usually work in the library while he works at the workshop. Maybe you should ask around among the people who work there.\"";
+ goto L_close;
+
+L_close:
+ @bookpages = 0;
+ close;
+}
diff --git a/npc/048-2/helperResting2.txt b/npc/048-2/helperResting2.txt
new file mode 100644
index 00000000..30f16cd3
--- /dev/null
+++ b/npc/048-2/helperResting2.txt
@@ -0,0 +1,64 @@
+
+048-2,35,27,0 script Miro NPC366,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (@slimes == 255) goto L_Thank;
+ if (@slimes > 0) goto L_Progress;
+
+ mes "[Miro]";
+ mes "\"Hm? Oh, excuse me. I'm feeling so tired. We currently have some problems with some slimes out of control in the library. They ate most of the books and caused total chaos.\"";
+ next;
+ mes "\"We need to clean up the mess and it's so much to do. I was cleaning the floor for hours and I'm having a break now.\"";
+ goto L_Investigate;
+
+L_Progress:
+ mes "[Miro]";
+ mes "\"Pyry mentioned you're helping with the leftover slimes. You're really brave! I'd be afraid they'd eat me like they ate the books!\"";
+ goto L_Investigate;
+
+L_Thank:
+ mes "[Miro]";
+ mes "\"Wow, the way you took care of the slimes in the library! Amazing! This makes our job there much easier... and safer. Thank you so much!\"";
+ goto L_Investigate;
+
+L_Investigate:
+ if ((QL_BSAGE_INVESTIGATE == 3) || (QL_BSAGE_INVESTIGATE == 4)) goto L_Ask_Visitor;
+ if ((QL_BSAGE_INVESTIGATE == 5) || (QL_BSAGE_INVESTIGATE == 8)) goto L_Ask_Helper;
+ if ((QL_BSAGE_INVESTIGATE == 6) || (QL_BSAGE_INVESTIGATE == 7) || (QL_BSAGE_INVESTIGATE == 9) || (QL_BSAGE_INVESTIGATE == 10)) goto L_Ask_Both;
+ goto L_close;
+
+L_Ask_Visitor:
+ menu
+ "Do you know anything about the visitor with the mask?",L_Visitor,
+ "See you.",L_close;
+
+L_Ask_Helper:
+ menu
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "Bye.",L_close;
+
+L_Ask_Both:
+ menu
+ "Do you know anything about the visitor with the mask?",L_Visitor,
+ "What's your opinion of Peetu and how he does his work?",L_Helper,
+ "I need to leave.",L_close;
+
+L_Visitor:
+ mes "[Miro]";
+ mes "\"With a mask? I really don't know. I'm usually in the workshop and most of the visitors spend their time in the library. Sometimes they come to have a quick look in the workshop too, but I don't really pay attention to that, so... I can't recall a visitor with a mask, sorry.\"";
+ goto L_close;
+
+L_Helper:
+ mes "[Miro]";
+ mes "\"Peetu? It was his job to seal away the slimes before the night, right? I have to say I'm really surprised about what happened, because he's a very cautious person. I'd have never guessed that he'd mess up something as important as this.\"";
+ next;
+ mes "\"If Nikolai's helpers weren't so carefully chosen, I'd think this was some kind of a bad joke from someone.\"";
+ if ((QL_BSAGE_INVESTIGATE != 5) && (QL_BSAGE_INVESTIGATE != 6) && (QL_BSAGE_INVESTIGATE != 7))
+ goto L_close;
+ QL_BSAGE_INVESTIGATE = QL_BSAGE_INVESTIGATE + 3;
+ goto L_close;
+
+L_close:
+ @slimes = 0;
+ close;
+}
diff --git a/npc/048-2/mapflags.txt b/npc/048-2/mapflags.txt
new file mode 100644
index 00000000..8ec972d9
--- /dev/null
+++ b/npc/048-2/mapflags.txt
@@ -0,0 +1 @@
+//048-2 mapflag resave 048-2,26,46
diff --git a/npc/048-2/sageNikolai.txt b/npc/048-2/sageNikolai.txt
new file mode 100644
index 00000000..1013db10
--- /dev/null
+++ b/npc/048-2/sageNikolai.txt
@@ -0,0 +1,359 @@
+
+048-2,98,106,0 script Nikolai NPC362,{
+ @halloween_npc_id = $@halloween_npc_nikolai;
+ callfunc "TrickOrTreat";
+
+ @bookpages = ((QUEST_BlueSage & $@Q_BlueSageBookPages_MASK) >> $@Q_BlueSageBookPages_SHIFT);
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+ @material = ((QUEST_BlueSage & $@Q_BlueSageMaterial_MASK) >> $@Q_BlueSageMaterial_SHIFT);
+
+ if ((@bookpages == 31)
+ && (QUEST_BlueSage & $@Q_BlueSageMaterialInk)
+ && (QUEST_BlueSage & $@Q_BlueSageMaterialClaw)
+ && (QUEST_BlueSage & $@Q_BlueSageMaterialReed)
+ && (QUEST_BlueSage & $@Q_BlueSageMaterialSilk)
+ && !(QUEST_BlueSage & $@Q_BlueSageGrimoire))
+ goto L_GrimoireReward;
+
+ if ((@slimes == 255) && !(QUEST_BlueSage & $@Q_BlueSageIceSword))
+ goto L_SlimesReward;
+
+ if ((QUEST_BlueSage & $@Q_BlueSageGrimoire) && (QUEST_BlueSage & $@Q_BlueSageIceSword))
+ goto L_Done;
+
+ if (QUEST_BlueSage > 0)
+ goto L_Hints;
+
+ mes "You see a very reputable looking man who is going through some papers. He looks up as you approach.";
+ mesn;
+ mes "\"Welcome to my mansion. I am Nikolai, member of the Sages of Kaizei.";
+ mes "I assume you came to see our famous library? As you can see, it isn't in very good shape due to some... misfortunes. I'm very sorry.\"";
+ if (BaseLevel < $@Q_BlueSageMinimumLevel)
+ goto L_close;
+ next;
+ mes "\"You seem to be quite an experienced adventurer. I usually wouldn't ask for this, but since my dear friend Santa mentioned his good experiences with hiring additional helpers in times of pressure, I reconsidered.";
+ mes "If you don't mind, every bit of help with our current situation would be appreciated.\"";
+ next;
+ mes "\"There are many things to take care of at the moment, so if you'd like to aid us, the helpers will be able to tell you what they need.\"";
+ goto L_close;
+
+L_Hints:
+ mesn;
+ mes "\"I heard you started to help out a bit. That's very kind.\"";
+
+ cleararray @choice_idx, 0, 10;
+ cleararray @choice$, "", 10;
+
+ @C_startBookpages = 1;
+ @C_bookpages = 2;
+ @C_startMaterials = 3;
+ @C_materials = 4;
+ @C_startSlimes = 5;
+ @C_slimes = 6;
+ @C_startInvestigate = 7;
+ @C_investigate = 8;
+ @C_investigate2 = 9;
+ @C_nevermind = 10;
+
+ // counter of available answers
+ @choices_nr = 0;
+
+ if (@bookpages > 0)
+ goto L_NoStartBookpages;
+ @choice_idx[@choices_nr] = @C_startBookpages;
+ @choice$[@choices_nr] = "I heard the slimes ate most of the books...";
+ @choices_nr = @choices_nr + 1;
+ goto L_NoStartBookpages;
+
+L_NoStartBookpages:
+ if ((@bookpages == 0) || (@bookpages == 31))
+ goto L_NoBookpages;
+ @choice_idx[@choices_nr] = @C_bookpages;
+ @choice$[@choices_nr] = "I'm collecting lost bookpages.";
+ @choices_nr = @choices_nr + 1;
+ goto L_NoBookpages;
+
+L_NoBookpages:
+ if (@material > 0)
+ goto L_NoStartMaterials;
+ @choice_idx[@choices_nr] = @C_startMaterials;
+ @choice$[@choices_nr] = "There were many valuable books in your library, right?";
+ @choices_nr = @choices_nr + 1;
+ goto L_NoStartMaterials;
+
+L_NoStartMaterials:
+ if ((@material == 0) || (@material == 15))
+ goto L_NoMaterials;
+ @choice_idx[@choices_nr] = @C_materials;
+ @choice$[@choices_nr] = "I brought some material to repair the books.";
+ @choices_nr = @choices_nr + 1;
+ goto L_NoMaterials;
+
+L_NoMaterials:
+ if (@slimes > 0)
+ goto L_NoStartSlimes;
+ @choice_idx[@choices_nr] = @C_startSlimes;
+ @choice$[@choices_nr] = "Those slimes really caused a mess!";
+ @choices_nr = @choices_nr + 1;
+ goto L_NoStartSlimes;
+
+L_NoStartSlimes:
+ if ((@slimes == 0) || (@slimes == 255))
+ goto L_NoSlimes;
+ @choice_idx[@choices_nr] = @C_slimes;
+ @choice$[@choices_nr] = "I'm hunting the remaining slimes in the library.";
+ @choices_nr = @choices_nr + 1;
+ goto L_NoSlimes;
+
+L_NoSlimes:
+ if (QL_BSAGE_INVESTIGATE > 0 && QL_BSAGE_INVESTIGATE < 13)
+ goto L_NoStartInvestigate;
+ @choice_idx[@choices_nr] = @C_startInvestigate;
+ @choice$[@choices_nr] = "How did this all happen?";
+ @choices_nr = @choices_nr + 1;
+ goto L_NoStartInvestigate;
+
+L_NoStartInvestigate:
+ if ((QL_BSAGE_INVESTIGATE < 2) || (QL_BSAGE_INVESTIGATE > 11 && QL_BSAGE_INVESTIGATE < 13))
+ goto L_NoInvestigate;
+ @choice_idx[@choices_nr] = @C_investigate;
+ @choice$[@choices_nr] = "I'm trying to find out how that accident could've happened.";
+ @choices_nr = @choices_nr + 1;
+ goto L_NoInvestigate;
+
+L_NoInvestigate:
+ if (QL_BSAGE_INVESTIGATE != 11)
+ goto L_NoInvestigate2;
+ @choice_idx[@choices_nr] = @C_investigate2;
+ @choice$[@choices_nr] = "I told Chief Oskari what I found out about the accident.";
+ @choices_nr = @choices_nr + 1;
+ goto L_NoInvestigate2;
+
+L_NoInvestigate2:
+ @choice_idx[@choices_nr] = @C_nevermind;
+ @choice$[@choices_nr] = "Nevermind.";
+
+ menu
+ @choice$[0],L_MenuChoice,
+ @choice$[1],L_MenuChoice,
+ @choice$[2],L_MenuChoice,
+ @choice$[3],L_MenuChoice,
+ @choice$[4],L_MenuChoice,
+ @choice$[5],L_MenuChoice,
+ @choice$[6],L_MenuChoice,
+ @choice$[7],L_MenuChoice,
+ @choice$[8],L_MenuChoice,
+ @choice$[9],L_MenuChoice;
+
+L_MenuChoice:
+ @menu = @menu - 1;
+ if (@choice_idx[@menu] == 0)
+ goto L_close;
+ if (@choice_idx[@menu] == @C_startBookpages)
+ goto L_StartPagesAdvice;
+ if (@choice_idx[@menu] == @C_bookpages)
+ goto L_PagesAdvice;
+ if (@choice_idx[@menu] == @C_startMaterials)
+ goto L_StartMaterialAdvice;
+ if (@choice_idx[@menu] == @C_materials)
+ goto L_MaterialAdvice;
+ if (@choice_idx[@menu] == @C_startSlimes)
+ goto L_StartSlimesAdvice;
+ if (@choice_idx[@menu] == @C_slimes)
+ goto L_SlimesAdvice;
+ if (@choice_idx[@menu] == @C_startInvestigate)
+ goto L_StartInvAdvice;
+ if (@choice_idx[@menu] == @C_investigate)
+ goto L_InvestigateAdvice;
+ if (@choice_idx[@menu] == @C_investigate2)
+ goto L_InvestigateAdvice2;
+ if ((@choice_idx[@menu] == @C_nevermind))
+ goto L_close;
+ goto L_close;
+
+L_StartPagesAdvice:
+ // I heard the slimes ate most of the books...
+ mesn;
+ mes "\"This is true. But while hunting the slimes we discovered that they occasionaly drop bookpages that are still legible.";
+ mes "Since we had several copies of nearly all the books, we might be able to recreate most of them if we can get at least one copy of each page.\"";
+ goto L_close;
+
+L_PagesAdvice:
+ // I'm collecting lost bookpages.
+ mesn;
+ mes "\"Excellent! This will save us a lot of time. Ensio coordinates the sorting of the pages.\"";
+ goto L_close;
+
+L_StartMaterialAdvice:
+ // There were many valuable books in your library, right?
+ mes "He sighs.";
+ mesn;
+ mes "\"Yes. There were some really old and rare pieces.\"";
+ next;
+ mes "\"We're going to recreate some of them, but I'm not sure if we have all the needed materials. If you'd like to help you could ask around if someone is missing something.\"";
+ goto L_close;
+
+L_MaterialAdvice:
+ // I brought some material to repair the books.
+ mesn;
+ mes "\"That's very generous! Though I think not everyone has all they need yet.\"";
+ goto L_close;
+
+L_StartSlimesAdvice:
+ // Those slimes really caused a mess!
+ mesn;
+ mes "\"Indeed. My helpers did great work to clean the worst of it, but there are still some remaining slimes in the deeper parts of the library.\"";
+ goto L_close;
+
+L_SlimesAdvice:
+ // I'm hunting the remaining slimes in the library.
+ mesn;
+ mes "\"You're a great help! All helpers who would be capable of dealing with the slimes are occupied with other tasks.\"";
+ goto L_close;
+
+L_StartInvAdvice:
+ // How did this all happen?
+ mesn;
+ mes "\"We're not sure yet. The helper who was responsible for sealing away the slimes has been sent to his room until the situation calms down and we can start an investigation.\"";
+ goto L_close;
+
+L_InvestigateAdvice:
+ // I'm trying to find out how that accident could've happened.
+ mesn;
+ mes "\"I see. Well, we were too busy to start with that ourselves, but having someone unbiased looking at this case might be a good thing.\"";
+ next;
+ mes "\"It might be good if you talk to Elias at the reception. He usually has a very good overview of all the things going on and especially about visitors.\"";
+ goto L_close;
+
+L_InvestigateAdvice2:
+ // I told Chief Oskari what I found out about the accident.
+ mesn;
+ mes "\"Yes, he already let me know. Your investigations were very helpful! This is surely something we need to look into further.\"";
+ next;
+ mes "\"Did you already talk to Peetu? I'm sure he'll be glad to know about your results as well.\"";
+ goto L_close;
+
+L_GrimoireReward:
+ mesn;
+ mes "\"Ah, " + strcharinfo(0) + "! We're making excellent progress with our attempts to recover the important and valuable of the destroyed books, all thanks to you.\"";
+ next;
+ mes "\"I'd like you to have this as a reward for your help.\"";
+ getinventorylist;
+ if ((checkweight("Grimoire", 1) == 0) || (@inventorylist_count == 100))
+ goto L_Full_Inv;
+ getitem "Grimoire", 1;
+ QUEST_BlueSage = QUEST_BlueSage | $@Q_BlueSageGrimoire;
+ mes "He hands you a very precious book.";
+ next;
+ mes "\"This is an artifact of great power, and holding it while attempting to use magic will allow you to access your inner magic power much better. Use it wisely.\"";
+ goto L_close;
+
+L_SlimesReward:
+ mesn;
+ mes "\"Ah, I heard you took care of the remaining slimes in the library!\"";
+ next;
+ mes "\"While looking through some old artifacts that we found during the cleaning, we found this sword. We don't really have a use for it.\"";
+ getinventorylist;
+ if ((checkweight("IceGladius", 1) == 0) || (@inventorylist_count == 100))
+ goto L_Full_Inv;
+ getitem "IceGladius", 1;
+ QUEST_BlueSage = QUEST_BlueSage | $@Q_BlueSageIceSword;
+ mes "He gives you a sword with a shimmering blue blade.";
+ next;
+ mes "\"I'm sure you can use this well.\"";
+ goto L_close;
+
+L_Full_Inv:
+ mesn;
+ mes "\"You have a very full backback. Please come back when you have more room available.\"";
+ goto L_close;
+
+L_Done:
+ mesn;
+ mesq l("Thanks for all of your help.");
+ if ((get_nibble(##03_TMWQUEST, 0) == 2) &&
+ (##01_MLWORLD & MLP_TMW_YETIKING) &&
+ getvaultid()) goto L_VaultQuest;
+ goto L_close;
+
+L_VaultQuest:
+ mes "";
+ mesn strcharinfo(0);
+ select
+ l("Ask the Blue Sage about Cindy."),
+ l("Don't ask");
+ if (@menu == 2) close;
+ mes "";
+ mesn;
+ mesq l("Cindy? Never heard of.");
+ next;
+ mesn strcharinfo(0);
+ select
+ l("Press."),
+ l("Don't press.");
+ if (@menu == 2) close;
+ mes "";
+ mesn;
+ mesq l("Look, this is not Nivalis. This is Thermin. If I say I know nothing, I know nothing. Stop wasting my time.");
+ next;
+ mesn strcharinfo(0);
+ select
+ l("Press."),
+ l("Don't press.");
+ if (@menu == 2) close;
+ mes "";
+ mesn;
+ mesq l("Are you deaf?");
+ next;
+ mesn strcharinfo(0);
+ select
+ l("Press."),
+ l("Don't press.");
+ if (@menu == 2) close;
+ mes "";
+ mesn;
+ mesc l("*sigh*");
+ next;
+ mesn;
+ mesq l("Alright, alright, you win. But to make clear, this is NOT my fault. It's Santa's.");
+ next;
+ mesn;
+ mesq l("So, you know about the Sages of Kaizei, right? We used to be twelve, but then Balthasar left after fighting with Santa, and now we're only eleven.");
+ next;
+ mesn;
+ mesq l("Seems like Balthasar is bent on revenge. If you cannot harm a sage, aim at the things they hold dear, they say.");
+ next;
+ mesn;
+ mesq l("Christmas for Santa, the library for myself, and... Well, you guessed it: Cindy.");
+ next;
+ mesn;
+ mesq l("But please don't tell Angela this. She is already a worrywart, knowing Balthasar is after her husband will only makes things worse.");
+ next;
+ mesn;
+ mesq l("Listen, I'll give you either a Wizard Hat or a Wooden Staff for your silence. Do we have a deal?");
+ next;
+ select
+ l("I'll think on it later."),
+ l("Deal - Give me a Wizard Hat."),
+ l("Deal - Give me a Wooden Staff.");
+ mes "";
+ if (@menu == 1) close;
+ if (@menu == 2) .@it = any(2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209);
+ if (@menu == 3) .@it = WoodenStaff;
+ inventoryplace .@it, 1;
+ getitem .@it, 1;
+ set_nibble(##03_TMWQUEST, 0, 3);
+ getvaultexp(50);
+ mesn;
+ mesq l("Here, take this %s. Tell Angela just that I've heard about it and I'll investigate, and she has nothing to worry about.", getitemlink(.@it));
+ next;
+ mesn;
+ mesq l("And thanks. I'll inform her father with telepathy as well.");
+ goto L_close;
+
+L_close:
+ @inventorylist_count = 0;
+ @bookpages = 0;
+ @slimes = 0;
+ close;
+}
diff --git a/npc/048-2/slimes.txt b/npc/048-2/slimes.txt
new file mode 100644
index 00000000..f9733871
--- /dev/null
+++ b/npc/048-2/slimes.txt
@@ -0,0 +1,603 @@
+
+
+
+048-2,181,95,0 script #Slime0Trigger NPC32767,2,2,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (mobcount("048-2", "#Slime0::OnSlimeDeath") <= 0)
+ $@BlueSageSlime0_Spawn = 0;
+
+ // if finished or haven't started yet or spawn already active or spawn already done, do nothing
+ if ((@slimes == 0) || ($@BlueSageSlime0_Spawn > 0) || (QUEST_BlueSage & $@Q_BlueSageSlime0))
+ end;
+
+ @spawnSlime0 = 0;
+ @chance = rand(20);
+ if (@chance < 6)
+ goto L_End;
+ if (@chance < 7)
+ goto L_BlowUp;
+
+ $@Slime0VictimID = getcharid(3);
+ donpcevent "#Slime0::OnSpawn";
+ goto L_End;
+
+L_BlowUp:
+ heal -Hp, 0;
+ message strcharinfo(0), "A slime dripped out of a bookshelf right in front of you and stepped onto it. It exploded. That hurt.";
+ goto L_End;
+
+L_End:
+ @chance = 0;
+ @slimes = 0;
+ end;
+}
+
+048-2,181,95,0 script #Slime0 NPC32767,{
+ end;
+
+OnSpawn:
+ if (attachrid($@Slime0VictimID) == 0)
+ goto L_Clean;
+ $@BlueSageSlime0_Spawn = $@BlueSageSlime0_Amount;
+ areamonster "048-2", 178, 92, 184, 98, "", 1093, $@BlueSageSlime0_Spawn, "#Slime0::OnSlimeDeath";
+ message strcharinfo(0), "You notice a group of slimes emerging from the debris among the shelves.";
+ end;
+
+OnSlimeDeath:
+ $@BlueSageSlime0_Spawn = $@BlueSageSlime0_Spawn - 1;
+ if (mobcount("048-2", "#Slime0::OnSlimeDeath") <= 0)
+ $@BlueSageSlime0_Spawn = 0;
+
+ if ($@Slime0VictimID == getcharid(3))
+ goto L_Count;
+ if ($@BlueSageSlime0_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_Clean:
+ $@Slime0VictimID = 0;
+ end;
+
+L_Count:
+ @spawnSlime0 = @spawnSlime0 + 1;
+ if ($@BlueSageSlime0_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_SlimesEscaped:
+ @spawnSlime0 = 0;
+ message strcharinfo(0), "You don't see any slimes from that nest anymore. But did you really get all of them?";
+ goto L_Clean;
+
+L_ClearedPoint:
+ if (attachrid($@Slime0VictimID) == 0)
+ goto L_Clean;
+ if (rand($@BlueSageSlime0_Amount - @spawnSlime0) != 0)
+ goto L_SlimesEscaped;
+ QUEST_BlueSage = QUEST_BlueSage | $@Q_BlueSageSlime0;
+ message strcharinfo(0), "It wasn't easy, but you think that you extinguished this nest.";
+
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+ if (@slimes == 255)
+ message strcharinfo(0), "That was a lot of slimes. You wonder if you're done now.";
+ @slimes = 0;
+ @spawnSlime0 = 0;
+ goto L_Clean;
+}
+
+
+048-2,164,123,0 script #Slime1Trigger NPC32767,2,2,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (mobcount("048-2", "#Slime1::OnSlimeDeath") <= 0)
+ $@BlueSageSlime1_Spawn = 0;
+
+ // if finished or haven't started yet or spawn already active or spawn already done, do nothing
+ if ((@slimes == 0) || ($@BlueSageSlime1_Spawn > 0) || (QUEST_BlueSage & $@Q_BlueSageSlime1))
+ end;
+
+ @spawnSlime1 = 0;
+ @chance = rand(20);
+ if (@chance < 6)
+ goto L_End;
+ if (@chance < 7)
+ goto L_BlowUp;
+
+ $@Slime1VictimID = getcharid(3);
+ donpcevent "#Slime1::OnSpawn";
+ goto L_End;
+
+L_BlowUp:
+ heal -Hp, 0;
+ message strcharinfo(0), "A slime dripped out of a bookshelf right in front of you and stepped onto it. It exploded. That hurt.";
+ goto L_End;
+
+L_End:
+ @chance = 0;
+ @slimes = 0;
+ end;
+}
+
+048-2,164,123,0 script #Slime1 NPC32767,{
+ end;
+
+OnSpawn:
+ if (attachrid($@Slime1VictimID) == 0)
+ goto L_Clean;
+ $@BlueSageSlime1_Spawn = $@BlueSageSlime1_Amount;
+ areamonster "048-2", 161, 120, 167, 126, "", 1093, $@BlueSageSlime1_Spawn, "#Slime1::OnSlimeDeath";
+ message strcharinfo(0), "You notice a group of slimes emerging from the debris among the shelves.";
+ end;
+
+OnSlimeDeath:
+ $@BlueSageSlime1_Spawn = $@BlueSageSlime1_Spawn - 1;
+ if (mobcount("048-2", "#Slime1::OnSlimeDeath") <= 0)
+ $@BlueSageSlime1_Spawn = 0;
+
+ if ($@Slime1VictimID == getcharid(3))
+ goto L_Count;
+ if ($@BlueSageSlime1_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_Clean:
+ $@Slime1VictimID = 0;
+ end;
+
+L_Count:
+ @spawnSlime1 = @spawnSlime1 + 1;
+ if ($@BlueSageSlime1_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_SlimesEscaped:
+ @spawnSlime1 = 0;
+ message strcharinfo(0), "You don't see any slimes from that nest anymore. But did you really get all of them?";
+ goto L_Clean;
+
+L_ClearedPoint:
+ if (attachrid($@Slime1VictimID) == 0)
+ goto L_Clean;
+ if (rand($@BlueSageSlime1_Amount - @spawnSlime1) != 0)
+ goto L_SlimesEscaped;
+ QUEST_BlueSage = QUEST_BlueSage | $@Q_BlueSageSlime1;
+ message strcharinfo(0), "It wasn't easy, but you think that you extinguished this nest.";
+
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+ if (@slimes == 255)
+ message strcharinfo(0), "That was a lot of slimes. You wonder if you're done now.";
+ @slimes = 0;
+ @spawnSlime1 = 0;
+ goto L_Clean;
+}
+
+
+048-2,198,115,0 script #Slime2Trigger NPC32767,2,2,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (mobcount("048-2", "#Slime2::OnSlimeDeath") <= 0)
+ $@BlueSageSlime2_Spawn = 0;
+
+ // if finished or haven't started yet or spawn already active or spawn already done, do nothing
+ if ((@slimes == 0) || ($@BlueSageSlime2_Spawn > 0) || (QUEST_BlueSage & $@Q_BlueSageSlime2))
+ end;
+
+ @spawnSlime2 = 0;
+ @chance = rand(20);
+ if (@chance < 6)
+ goto L_End;
+ if (@chance < 7)
+ goto L_BlowUp;
+
+ $@Slime2VictimID = getcharid(3);
+ donpcevent "#Slime2::OnSpawn";
+ goto L_End;
+
+L_BlowUp:
+ heal -Hp, 0;
+ message strcharinfo(0), "A slime dripped out of a bookshelf right in front of you and stepped onto it. It exploded. That hurt.";
+ goto L_End;
+
+L_End:
+ @chance = 0;
+ @slimes = 0;
+ end;
+}
+
+048-2,198,115,0 script #Slime2 NPC32767,{
+ end;
+
+OnSpawn:
+ if (attachrid($@Slime2VictimID) == 0)
+ goto L_Clean;
+ $@BlueSageSlime2_Spawn = $@BlueSageSlime2_Amount;
+ areamonster "048-2", 195, 112, 201, 118, "", 1093, $@BlueSageSlime2_Spawn, "#Slime2::OnSlimeDeath";
+ message strcharinfo(0), "You notice a group of slimes emerging from the debris among the shelves.";
+ end;
+
+OnSlimeDeath:
+ $@BlueSageSlime2_Spawn = $@BlueSageSlime2_Spawn - 1;
+ if (mobcount("048-2", "#Slime2::OnSlimeDeath") <= 0)
+ $@BlueSageSlime2_Spawn = 0;
+
+ if ($@Slime2VictimID == getcharid(3))
+ goto L_Count;
+ if ($@BlueSageSlime2_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_Clean:
+ $@Slime2VictimID = 0;
+ end;
+
+L_Count:
+ @spawnSlime2 = @spawnSlime2 + 1;
+ if ($@BlueSageSlime2_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_SlimesEscaped:
+ @spawnSlime2 = 0;
+ message strcharinfo(0), "You don't see any slimes from that nest anymore. But did you really get all of them?";
+ goto L_Clean;
+
+L_ClearedPoint:
+ if (attachrid($@Slime2VictimID) == 0)
+ goto L_Clean;
+ if (rand($@BlueSageSlime2_Amount - @spawnSlime2) != 0)
+ goto L_SlimesEscaped;
+ QUEST_BlueSage = QUEST_BlueSage | $@Q_BlueSageSlime2;
+ message strcharinfo(0), "It wasn't easy, but you think that you extinguished this nest.";
+
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+ if (@slimes == 255)
+ message strcharinfo(0), "That was a lot of slimes. You wonder if you're done now.";
+ @slimes = 0;
+ @spawnSlime2 = 0;
+ goto L_Clean;
+}
+
+
+048-2,167,79,0 script #Slime3Trigger NPC32767,2,2,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (mobcount("048-2", "#Slime3::OnSlimeDeath") <= 0)
+ $@BlueSageSlime3_Spawn = 0;
+
+ // if finished or haven't started yet or spawn already active or spawn already done, do nothing
+ if ((@slimes == 0) || ($@BlueSageSlime3_Spawn > 0) || (QUEST_BlueSage & $@Q_BlueSageSlime3))
+ end;
+
+ @spawnSlime3 = 0;
+ @chance = rand(20);
+ if (@chance < 6)
+ goto L_End;
+ if (@chance < 7)
+ goto L_BlowUp;
+
+ $@Slime3VictimID = getcharid(3);
+ donpcevent "#Slime3::OnSpawn";
+ goto L_End;
+
+L_BlowUp:
+ heal -Hp, 0;
+ message strcharinfo(0), "A slime dripped out of a bookshelf right in front of you and stepped onto it. It exploded. That hurt.";
+ goto L_End;
+
+L_End:
+ @chance = 0;
+ @slimes = 0;
+ end;
+}
+
+048-2,167,79,0 script #Slime3 NPC32767,{
+ end;
+
+OnSpawn:
+ if (attachrid($@Slime3VictimID) == 0)
+ goto L_Clean;
+ $@BlueSageSlime3_Spawn = $@BlueSageSlime3_Amount;
+ areamonster "048-2", 164, 76, 170, 82, "", 1093, $@BlueSageSlime3_Spawn, "#Slime3::OnSlimeDeath";
+ message strcharinfo(0), "You notice a group of slimes emerging from the debris among the shelves.";
+ end;
+
+OnSlimeDeath:
+ $@BlueSageSlime3_Spawn = $@BlueSageSlime3_Spawn - 1;
+ if (mobcount("048-2", "#Slime3::OnSlimeDeath") <= 0)
+ $@BlueSageSlime3_Spawn = 0;
+
+ if ($@Slime3VictimID == getcharid(3))
+ goto L_Count;
+ if ($@BlueSageSlime3_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_Clean:
+ $@Slime3VictimID = 0;
+ end;
+
+L_Count:
+ @spawnSlime3 = @spawnSlime3 + 1;
+ if ($@BlueSageSlime3_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_SlimesEscaped:
+ @spawnSlime3 = 0;
+ message strcharinfo(0), "You don't see any slimes from that nest anymore. But did you really get all of them?";
+ goto L_Clean;
+
+L_ClearedPoint:
+ if (attachrid($@Slime3VictimID) == 0)
+ goto L_Clean;
+ if (rand($@BlueSageSlime3_Amount - @spawnSlime3) != 0)
+ goto L_SlimesEscaped;
+ QUEST_BlueSage = QUEST_BlueSage | $@Q_BlueSageSlime3;
+ message strcharinfo(0), "It wasn't easy, but you think that you extinguished this nest.";
+
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+ if (@slimes == 255)
+ message strcharinfo(0), "That was a lot of slimes. You wonder if you're done now.";
+ @slimes = 0;
+ @spawnSlime3 = 0;
+ goto L_Clean;
+}
+
+
+048-2,192,86,0 script #Slime4Trigger NPC32767,2,2,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (mobcount("048-2", "#Slime4::OnSlimeDeath") <= 0)
+ $@BlueSageSlime4_Spawn = 0;
+
+ // if finished or haven't started yet or spawn already active or spawn already done, do nothing
+ if ((@slimes == 0) || ($@BlueSageSlime4_Spawn > 0) || (QUEST_BlueSage & $@Q_BlueSageSlime4))
+ end;
+
+ @spawnSlime4 = 0;
+ @chance = rand(20);
+ if (@chance < 6)
+ goto L_End;
+ if (@chance < 7)
+ goto L_BlowUp;
+
+ $@Slime4VictimID = getcharid(3);
+ donpcevent "#Slime4::OnSpawn";
+ goto L_End;
+
+L_BlowUp:
+ heal -Hp, 0;
+ message strcharinfo(0), "A slime dripped out of a bookshelf right in front of you and stepped onto it. It exploded. That hurt.";
+ goto L_End;
+
+L_End:
+ @chance = 0;
+ @slimes = 0;
+ end;
+}
+
+048-2,192,86,0 script #Slime4 NPC32767,{
+ end;
+
+OnSpawn:
+ if (attachrid($@Slime4VictimID) == 0)
+ goto L_Clean;
+ $@BlueSageSlime4_Spawn = $@BlueSageSlime4_Amount;
+ areamonster "048-2", 189, 83, 195, 89, "", 1091, $@BlueSageSlime4_Spawn, "#Slime4::OnSlimeDeath";
+ message strcharinfo(0), "You notice a group of slimes emerging from the debris among the shelves.";
+ end;
+
+OnSlimeDeath:
+ $@BlueSageSlime4_Spawn = $@BlueSageSlime4_Spawn - 1;
+ if (mobcount("048-2", "#Slime4::OnSlimeDeath") <= 0)
+ $@BlueSageSlime4_Spawn = 0;
+
+ if ($@Slime4VictimID == getcharid(3))
+ goto L_Count;
+ if ($@BlueSageSlime4_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_Clean:
+ $@Slime4VictimID = 0;
+ end;
+
+L_Count:
+ @spawnSlime4 = @spawnSlime4 + 1;
+ if ($@BlueSageSlime4_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_SlimesEscaped:
+ @spawnSlime4 = 0;
+ message strcharinfo(0), "You don't see any slimes from that nest anymore. But did you really get all of them?";
+ goto L_Clean;
+
+L_ClearedPoint:
+ if (attachrid($@Slime4VictimID) == 0)
+ goto L_Clean;
+ if (rand($@BlueSageSlime4_Amount - @spawnSlime4) != 0)
+ goto L_SlimesEscaped;
+ QUEST_BlueSage = QUEST_BlueSage | $@Q_BlueSageSlime4;
+ message strcharinfo(0), "It wasn't easy, but you think that you extinguished this nest.";
+
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+ if (@slimes == 255)
+ message strcharinfo(0), "That was a lot of slimes. You wonder if you're done now.";
+ @slimes = 0;
+ @spawnSlime4 = 0;
+ goto L_Clean;
+}
+
+
+048-2,183,110,0 script #Slime5Trigger NPC32767,2,2,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (mobcount("048-2", "#Slime5::OnSlimeDeath") <= 0)
+ $@BlueSageSlime5_Spawn = 0;
+
+ // if finished or haven't started yet or spawn already active or spawn already done, do nothing
+ if ((@slimes == 0) || ($@BlueSageSlime5_Spawn > 0) || (QUEST_BlueSage & $@Q_BlueSageSlime5))
+ end;
+
+ @spawnSlime5 = 0;
+ @chance = rand(20);
+ if (@chance < 6)
+ goto L_End;
+ if (@chance < 7)
+ goto L_BlowUp;
+
+ $@Slime5VictimID = getcharid(3);
+ donpcevent "#Slime5::OnSpawn";
+ goto L_End;
+
+L_BlowUp:
+ heal -Hp, 0;
+ message strcharinfo(0), "A slime dripped out of a bookshelf right in front of you and stepped onto it. It exploded. That hurt.";
+ goto L_End;
+
+L_End:
+ @chance = 0;
+ @slimes = 0;
+ end;
+}
+
+048-2,183,110,0 script #Slime5 NPC32767,{
+ end;
+
+OnSpawn:
+ if (attachrid($@Slime5VictimID) == 0)
+ goto L_Clean;
+ $@BlueSageSlime5_Spawn = $@BlueSageSlime5_Amount;
+ areamonster "048-2", 180, 107, 186, 113, "", 1091, $@BlueSageSlime5_Spawn, "#Slime5::OnSlimeDeath";
+ message strcharinfo(0), "You notice a group of slimes emerging from the debris among the shelves.";
+ end;
+
+OnSlimeDeath:
+ $@BlueSageSlime5_Spawn = $@BlueSageSlime5_Spawn - 1;
+ if (mobcount("048-2", "#Slime5::OnSlimeDeath") <= 0)
+ $@BlueSageSlime5_Spawn = 0;
+
+ if ($@Slime5VictimID == getcharid(3))
+ goto L_Count;
+ if ($@BlueSageSlime5_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_Clean:
+ $@Slime5VictimID = 0;
+ end;
+
+L_Count:
+ @spawnSlime5 = @spawnSlime5 + 1;
+ if ($@BlueSageSlime5_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_SlimesEscaped:
+ @spawnSlime5 = 0;
+ message strcharinfo(0), "You don't see any slimes from that nest anymore. But did you really get all of them?";
+ goto L_Clean;
+
+L_ClearedPoint:
+ if (attachrid($@Slime5VictimID) == 0)
+ goto L_Clean;
+ if (rand($@BlueSageSlime5_Amount - @spawnSlime5) != 0)
+ goto L_SlimesEscaped;
+ QUEST_BlueSage = QUEST_BlueSage | $@Q_BlueSageSlime5;
+ message strcharinfo(0), "It wasn't easy, but you think that you extinguished this nest.";
+
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+ if (@slimes == 255)
+ message strcharinfo(0), "That was a lot of slimes. You wonder if you're done now.";
+ @slimes = 0;
+ @spawnSlime5 = 0;
+ goto L_Clean;
+}
+
+
+048-2,164,102,0 script #Slime6Trigger NPC32767,2,2,{
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+
+ if (mobcount("048-2", "#Slime6::OnSlimeDeath") <= 0)
+ $@BlueSageSlime6_Spawn = 0;
+
+ // if finished or haven't started yet or spawn already active or spawn already done, do nothing
+ if ((@slimes == 0) || ($@BlueSageSlime6_Spawn > 0) || (QUEST_BlueSage & $@Q_BlueSageSlime6))
+ end;
+
+ @spawnSlime6 = 0;
+ @chance = rand(20);
+ if (@chance < 6)
+ goto L_End;
+ if (@chance < 7)
+ goto L_BlowUp;
+
+ $@Slime6VictimID = getcharid(3);
+ donpcevent "#Slime6::OnSpawn";
+ goto L_End;
+
+L_BlowUp:
+ heal -Hp, 0;
+ message strcharinfo(0), "A slime dripped out of a bookshelf right in front of you and stepped onto it. It exploded. That hurt.";
+ goto L_End;
+
+L_End:
+ @chance = 0;
+ @slimes = 0;
+ end;
+}
+
+048-2,164,102,0 script #Slime6 NPC32767,{
+ end;
+
+OnSpawn:
+ if (attachrid($@Slime6VictimID) == 0)
+ goto L_Clean;
+ $@BlueSageSlime6_Spawn = $@BlueSageSlime6_Amount;
+ areamonster "048-2", 161, 99, 167, 105, "", 1091, $@BlueSageSlime6_Spawn, "#Slime6::OnSlimeDeath";
+ message strcharinfo(0), "You notice a group of slimes emerging from the debris among the shelves.";
+ end;
+
+OnSlimeDeath:
+ $@BlueSageSlime6_Spawn = $@BlueSageSlime6_Spawn - 1;
+ if (mobcount("048-2", "#Slime6::OnSlimeDeath") <= 0)
+ $@BlueSageSlime6_Spawn = 0;
+
+ if ($@Slime6VictimID == getcharid(3))
+ goto L_Count;
+ if ($@BlueSageSlime6_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_Clean:
+ $@Slime6VictimID = 0;
+ end;
+
+L_Count:
+ @spawnSlime6 = @spawnSlime6 + 1;
+ if ($@BlueSageSlime6_Spawn == 0)
+ goto L_ClearedPoint;
+ end;
+
+L_SlimesEscaped:
+ @spawnSlime6 = 0;
+ message strcharinfo(0), "You don't see any slimes from that nest anymore. But did you really get all of them?";
+ goto L_Clean;
+
+L_ClearedPoint:
+ if (attachrid($@Slime6VictimID) == 0)
+ goto L_Clean;
+ if (rand($@BlueSageSlime6_Amount - @spawnSlime6) != 0)
+ goto L_SlimesEscaped;
+ QUEST_BlueSage = QUEST_BlueSage | $@Q_BlueSageSlime6;
+ message strcharinfo(0), "It wasn't easy, but you think that you extinguished this nest.";
+
+ @slimes = ((QUEST_BlueSage & $@Q_BlueSageSlimes_MASK) >> $@Q_BlueSageSlimes_SHIFT);
+ if (@slimes == 255)
+ message strcharinfo(0), "That was a lot of slimes. You wonder if you're done now.";
+ @slimes = 0;
+ @spawnSlime6 = 0;
+ goto L_Clean;
+}
diff --git a/npc/048-2/traveler.txt b/npc/048-2/traveler.txt
new file mode 100644
index 00000000..41a66bda
--- /dev/null
+++ b/npc/048-2/traveler.txt
@@ -0,0 +1,7 @@
+
+048-2,23,46,0 script Drake the Traveler NPC103,{
+ @npcname$ = "Drake";
+ @NpcTravelBit = $@blue_sage_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/048-2/visitors.txt b/npc/048-2/visitors.txt
new file mode 100644
index 00000000..9227627b
--- /dev/null
+++ b/npc/048-2/visitors.txt
@@ -0,0 +1,36 @@
+
+048-2,46,44,0 script Connor NPC150,{
+ mes "[Connor]";
+ mes "\"Oh, hello. There was a big accident in the library! Most of the books were damaged or destroyed!\"";
+ next;
+ mes "\"As far as I understand it had to do with those weird slimes. They're white and blue! I've never seen slimes of that color.\"";
+ next;
+ mes "\"I was so excited to get an opportunity to study some of the rare and valuable books and now this.";
+ mes "I'd never have expected something like this happening in a Sages household. I thought they're so powerful and wise...\"";
+ close;
+}
+
+048-2,28,30,0 script Parcival NPC153,{
+ mes "[Parcival]";
+ mes "\"Hello young one. Did you also come here to see the library?\"";
+ menu
+ "Nah, I'm just having a look around.",L_close,
+ "Yes!", L_More;
+
+L_More:
+ mes "[Parcival]";
+ mes "\"That's very commendable. But you'll be disappointed, there is a huge problem and the library is all upside down.";
+ mes "This is very annoying! I was planning this trip for months and now this!\"";
+ mes "He sighs.";
+ next;
+ mes "[Parcival]";
+ mes "\"I'll probably have to leave and come back another time. But I want to warm up first.\"";
+ next;
+ mes "\"I wonder what they did... I can still feel some distortion in the magic pattern within this mansion. I mean, it's twisted anyway, because the Sages have their houses in a shifted dimension - that's why it is so much larger in the inside than from the outside.\"";
+ next;
+ mes "\"But there's something else... Well, I've heard about the research being done here. Seems there's some very advanced magic involved.\"";
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/051-1/_import.txt b/npc/051-1/_import.txt
new file mode 100644
index 00000000..9b055a82
--- /dev/null
+++ b/npc/051-1/_import.txt
@@ -0,0 +1,9 @@
+// Map 051-1: Illia outskirts
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/051-1/_mobs.txt",
+"npc/051-1/desert.txt",
+"npc/051-1/desertmonsters.txt",
+"npc/051-1/forest.txt",
+"npc/051-1/forestmonsters.txt",
+"npc/051-1/janitor.txt",
+"npc/051-1/mapflags.txt",
diff --git a/npc/051-1/_mobs.txt b/npc/051-1/_mobs.txt
new file mode 100644
index 00000000..a3f58c03
--- /dev/null
+++ b/npc/051-1/_mobs.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 051-1: Illia outskirts mobs
+051-1,42,35,21,12 monster Log Head 1025,30,100000,30000
+051-1,42,35,20,11 monster Spiky Mushroom 1019,10,100000,30000
diff --git a/npc/051-1/desert.txt b/npc/051-1/desert.txt
new file mode 100644
index 00000000..172cb48e
--- /dev/null
+++ b/npc/051-1/desert.txt
@@ -0,0 +1,132 @@
+
+051-1,142,39,0 script Bones NPC367,{
+ mes "You find a ruined paper next to these bones.";
+ mes "It says...";
+ next;
+ mes "\"This waterfall is cursed... it feeds on living souls... I could not get past throught it.\"";
+ mes "\"God, they appeared from nowhere...\"";
+ mes "\"...\"";
+ next;
+ mes "The rest isn't legible.";
+ close;
+
+}
+
+051-1,170,24,0 script Cursed Waterfall NPC400,{
+ $@illia_num_sealed_souls = 7;
+ @step = 3;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if ($@illia_level_3_progress == 0 && strcharinfo(0) == $@iLLIA_HERO$) goto L_GiveTask;
+ if ($@illia_level_3_progress == 0 && strcharinfo(0) != $@iLLIA_HERO$) goto L_HintToHelpers;
+ if ($@illia_level_3_progress == 1) goto L_GiveSouls;
+ mes "Jump in the waterfall?";
+ menu
+ "Yes", L_Warp,
+ "No", L_close;
+
+OnTimer1000:
+ npctalk strnpcinfo(0), "Youuuuuuu... Bring me souls... " + $@illia_num_sealed_souls + " fresh souls... Nooooow. And you shall paaass.";
+ end;
+
+OnTimer4750:
+ mapannounce "051-1", "You hear a loud scream coming from the wind... Something terrifying raised out there.", 0;
+ end;
+
+OnTimer6500:
+ npctalk strnpcinfo(0), "Nooooo... Do not let these things take them from youuuuuu!";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+L_HintToHelpers:
+ mes "[Cursed Waterfall]";
+ mes "\"Who are you?... Bring " + $@iLLIA_HERO$ + " to me!\"";
+ close;
+
+L_GiveTask:
+ $@illia_level_3_progress = 1;
+ mes "[Cursed Waterfall]";
+ mes "\"Yooouuuuuu...\"";
+ next;
+
+ mes "You look around and see this ghostly voice comes from the waterfall.";
+ next;
+
+ // This message will be in the timed messages,
+ // but display it here anyway to be sure the hero sees it.
+ mes "\"Youuuuuuu... Bring me souls... " + $@illia_num_sealed_souls + " fresh souls... Nooooow.\"";
+ mes "\"And you shall paaass.\"";
+
+ // Reset the soul eaters counters.
+ $@SoulEaters0_count = 0;
+ $@SoulEaters1_count = 0;
+ $@SoulEaters2_count = 0;
+ $@SoulEaters3_count = 0;
+ $@SoulEaters4_count = 0;
+ // Spawn 7 additional soul snakes in the north building, as a bait.
+ areamonster "051-1", 125, 14, 143, 18, "", 1096, 7, "IlliaDMobs051-1::On1096";
+ // Same with 5, in the island
+ areamonster "051-1", 138, 34, 145, 41, "", 1096, 5, "IlliaDMobs051-1::On1096";
+ // Start timed messages
+ initnpctimer;
+ goto L_close;
+
+L_GiveSouls:
+ if (strcharinfo(0) != $@iLLIA_HERO$)
+ goto L_GiveSoulsToHero;
+ mes "[Cursed Waterfall]";
+ mes "\"Give me the souuuuuuls... Noooooooow!!\"";
+ menu
+ "Please, have a look at these.", L_CheckSouls,
+ "Sorry, I don't have any.", L_close;
+
+L_GiveSoulsToHero:
+ mes "[Cursed Waterfall]";
+ mes "\"Who are you?.... I want the souuuuuuls from " + $@iLLIA_HERO$ + "!\"";
+ goto L_close;
+
+L_CheckSouls:
+ if (countitem ("SealedSoul") < $@illia_num_sealed_souls)
+ goto L_NotEnough;
+ delitem "SealedSoul", $@illia_num_sealed_souls;
+ $@illia_level_3_progress = 2;
+ $@illia_progress = 4;
+ callfunc "UpdateIlliaProgress";
+ $@illia_max_time = $@illia_max_time + 540;
+
+ // Clean all spawned monsters
+ killmonster "051-1", "IlliaDMobs051-1::On1096";
+ killmonster "051-1", "#SoulEaters0::OnSoulEaterDeath";
+ killmonster "051-1", "#SoulEaters1::OnSoulEaterDeath";
+ killmonster "051-1", "#SoulEaters2::OnSoulEaterDeath";
+ killmonster "051-1", "#SoulEaters3::OnSoulEaterDeath";
+ killmonster "051-1", "#SoulEaters4::OnSoulEaterDeath";
+
+
+ mes "\"Goooood... Tasty souuuuuls...\"";
+ mes "You shall pass now... before I change my mind...\"";
+ next;
+ mes "A blinding light appears from inside the waterfall.";
+
+ // Display an effect to show the waterfall opens itself / kills remaining monsters
+ misceffect FX_MEDIUM_BLINDINGLIGHT;
+ goto L_close;
+
+L_NotEnough:
+ mes "[Cursed Waterfall]";
+ mes "\"Moooooooooore... Give me more...\"";
+ goto L_close;
+
+L_Warp:
+ warp "052-1", 23, 52;
+ // Count the player who reached the island.
+ $@illia_players_in_luvia_territory = $@illia_players_in_luvia_territory + 1;
+ goto L_close;
+
+L_close:
+ close;
+}
diff --git a/npc/051-1/desertmonsters.txt b/npc/051-1/desertmonsters.txt
new file mode 100644
index 00000000..9424d63e
--- /dev/null
+++ b/npc/051-1/desertmonsters.txt
@@ -0,0 +1,153 @@
+051-1,134,36,67,49 monster SoulSnake 1096,12,100000,30000,IlliaDMobs051-1::On1096
+
+051-1,0,0,0 script IlliaDMobs051-1 NPC32767,{
+ end;
+
+On1096:
+ if (rand(4) == 0 && $@illia_progress == 3 && $@illia_level_3_progress == 1)
+ getitem SealedSoul, 1;
+ fix_mobkill(Snake);
+ end;
+
+}
+
+
+051-1,142,38,0 script #SoulEaters0Trigger NPC32767,3,3,{
+ if ($@illia_progress != 3 || $@illia_level_3_progress != 1)
+ end;
+ if ($@SoulEaters0_count > 0)
+ end;
+ donpcevent "#SoulEaters0::OnSpawn";
+ end;
+}
+
+051-1,142,38,0 script #SoulEaters0 NPC32767,{
+ end;
+
+OnSpawn:
+ $@SoulEaters0_count = 5;
+ areamonster "051-1", 139, 34, 145, 41, "", 1097, $@SoulEaters0_count, "#SoulEaters0::OnSoulEaterDeath";
+ end;
+
+OnSoulEaterDeath:
+ $@SoulEaters0_count = $@SoulEaters0_count - 1;
+ if ($@illia_progress != 3 || $@illia_level_3_progress != 1)
+ end;
+ if (countitem(SealedSoul) == 0)
+ end;
+ delitem SealedSoul, countitem(SealedSoul);
+ message strcharinfo(0), "The Soul Eater feeds on the Sealed Souls you are carrying.";
+ end;
+}
+
+051-1,134,16,0 script #SoulEaters1Trigger NPC32767,9,2,{
+ if ($@illia_progress != 3 || $@illia_level_3_progress != 1)
+ end;
+ if ($@SoulEaters1_count > 0)
+ end;
+ donpcevent "#SoulEaters1::OnSpawn";
+ end;
+}
+
+051-1,134,16,0 script #SoulEaters1 NPC32767,{
+ end;
+
+OnSpawn:
+ $@SoulEaters1_count = 7;
+ areamonster "051-1", 125, 14, 143, 18, "", 1097, $@SoulEaters1_count, "#SoulEaters1::OnSoulEaterDeath";
+ end;
+
+OnSoulEaterDeath:
+ $@SoulEaters1_count = $@SoulEaters1_count - 1;
+ if ($@illia_progress != 3 || $@illia_level_3_progress != 1)
+ end;
+ if (countitem(SealedSoul) == 0)
+ end;
+ delitem SealedSoul, countitem(SealedSoul);
+ message strcharinfo(0), "The Soul Eater feeds on the Sealed Souls you are carrying.";
+ end;
+}
+
+051-1,137,55,0 script #SoulEaters2Trigger NPC32767,5,4,{
+ if ($@illia_progress != 3 || $@illia_level_3_progress != 1)
+ end;
+ if ($@SoulEaters2_count > 0)
+ end;
+ donpcevent "#SoulEaters2::OnSpawn";
+ end;
+}
+
+051-1,137,55,0 script #SoulEaters2 NPC32767,{
+ end;
+
+OnSpawn:
+ $@SoulEaters2_count = 4;
+ areamonster "051-1", 134, 54, 139, 58, "", 1097, $@SoulEaters2_count, "#SoulEaters2::OnSoulEaterDeath";
+ end;
+
+OnSoulEaterDeath:
+ $@SoulEaters2_count = $@SoulEaters2_count - 1;
+ if ($@illia_progress != 3 || $@illia_level_3_progress != 1)
+ end;
+ if (countitem(SealedSoul) == 0)
+ end;
+ delitem SealedSoul, countitem(SealedSoul);
+ message strcharinfo(0), "The Soul Eater feeds on the Sealed Souls you are carrying.";
+ end;
+}
+
+051-1,155,35,0 script #SoulEaters3Trigger NPC32767,4,7,{
+ if ($@illia_progress != 3 || $@illia_level_3_progress != 1)
+ end;
+ if ($@SoulEaters3_count > 0)
+ end;
+ donpcevent "#SoulEaters3::OnSpawn";
+ end;
+}
+
+051-1,155,35,0 script #SoulEaters3 NPC32767,{
+ end;
+
+OnSpawn:
+ $@SoulEaters3_count = 4;
+ areamonster "051-1", 151, 29, 160, 45, "", 1097, $@SoulEaters3_count, "#SoulEaters3::OnSoulEaterDeath";
+ end;
+
+OnSoulEaterDeath:
+ $@SoulEaters3_count = $@SoulEaters3_count - 1;
+ if ($@illia_progress != 3 || $@illia_level_3_progress != 1)
+ end;
+ if (countitem(SealedSoul) == 0)
+ end;
+ delitem SealedSoul, countitem(SealedSoul);
+ message strcharinfo(0), "The Soul Eater feeds on the Sealed Souls you are carrying.";
+ end;
+}
+
+051-1,120,38,0 script #SoulEaters4Trigger NPC32767,6,9,{
+ if ($@illia_progress != 3 || $@illia_level_3_progress != 1)
+ end;
+ if ($@SoulEaters4_count > 0)
+ end;
+ donpcevent "#SoulEaters4::OnSpawn";
+ end;
+}
+
+051-1,120,38,0 script #SoulEaters4 NPC32767,{
+ end;
+
+OnSpawn:
+ $@SoulEaters4_count = 4;
+ areamonster "051-1", 116, 29, 127, 50, "", 1097, $@SoulEaters4_count, "#SoulEaters4::OnSoulEaterDeath";
+ end;
+
+OnSoulEaterDeath:
+ $@SoulEaters4_count = $@SoulEaters4_count - 1;
+ if ($@illia_progress != 3 || $@illia_level_3_progress != 1)
+ end;
+ if (countitem(SealedSoul) == 0)
+ end;
+ delitem SealedSoul, countitem(SealedSoul);
+ message strcharinfo(0), "The Soul Eater feeds on the Sealed Souls you are carrying.";
+ end;
+}
diff --git a/npc/051-1/forest.txt b/npc/051-1/forest.txt
new file mode 100644
index 00000000..d9c21625
--- /dev/null
+++ b/npc/051-1/forest.txt
@@ -0,0 +1,76 @@
+
+051-1,64,46,0 script Strange Stone NPC400,{
+ @step = 1;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if (isin("051-1", 65,45, 67,48) == 0) end;
+ if (strcharinfo(0) != $@iLLIA_HERO$) goto L_HandleHelper;
+ if ($@illia_level_1_progress == 0) goto L_GiveTask;
+ if ($@illia_level_1_progress == 1) goto L_TaskNotComplete;
+ if ($@illia_level_1_progress == 2) goto L_TaskComplete;
+ if ($@illia_level_1_progress == 3) goto L_NothingElseToDo;
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+L_HandleHelper:
+ mes "This stuff sounds complicated.";
+ mes "I should ask " + $@iLLIA_HERO$ + " what to do.";
+ close;
+
+L_NothingElseToDo:
+ mes "The door is opened... What am I waiting for?";
+ close;
+
+L_GiveTask:
+ mes "You look at the rocks with attention.";
+ mes "You are smart enough to notice that there seems to be a missing rock that could activate a mechanism.";
+ next;
+ menu
+ "This rock must not be far... Let's look around.", L_Foo;
+L_Foo:
+ $@illia_level_1_progress = 1;
+ $@illia_level_1_num_deaths = 0;
+ close;
+
+L_TaskNotComplete:
+ mes "It's not working. I have to find the rock.";
+ mes "With all the slimes around here, maybe one absorbed it.";
+ close;
+
+L_TaskComplete:
+ $@illia_level_1_progress = 3;
+ $@illia_progress = 2;
+ callfunc "UpdateIlliaProgress";
+ $@illia_max_time = $@illia_max_time + 360;
+ mes "You insert the rock in the mechanism, then hear an unlock noise. The rocks move by themselves in a rumbling noise, making an opening in the wall.";
+ close;
+
+}
+
+051-1,66,44,0 script #ToCave NPC32767,1,1,{
+ @step = 1;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if ($@illia_level_1_progress < 2) goto L_Blocked;
+ if ($@illia_level_1_progress == 2 && strcharinfo(0) == $@iLLIA_HERO$) goto L_SeeStone;
+ if ($@illia_level_1_progress == 3) goto L_Warp;
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+L_Blocked:
+ message strcharinfo(0), "There should be a way to open this... but not with my bare hands.";
+ end;
+
+L_SeeStone:
+ message strcharinfo(0), "I should take a look at the stone.";
+ end;
+
+L_Warp:
+ warp "051-3", 24, 60;
+ end;
+}
+
diff --git a/npc/051-1/forestmonsters.txt b/npc/051-1/forestmonsters.txt
new file mode 100644
index 00000000..b6a6c102
--- /dev/null
+++ b/npc/051-1/forestmonsters.txt
@@ -0,0 +1,22 @@
+051-1,52,32,10,8 monster GreenSlime 1005,20,100000,30000,IlliaFMobs051-1::On1005
+
+051-1,0,0,0 script IlliaFMobs051-1 NPC32767,{
+ end;
+
+On1005:
+ if ($@illia_level_1_progress == 1)
+ goto L_RockFinding;
+ end;
+
+L_RockFinding:
+ $@illia_level_1_num_deaths = $@illia_level_1_num_deaths + 1;
+ @p = 50 - $@illia_level_1_num_deaths;
+ if (@p < 0)
+ @p = 0;
+ if ($@illia_progress != 1 || $@iLLIA_STATUS != 4 || rand(@p) != 0)
+ end;
+ message strcharinfo(0), "This slime released a rock with a weird shape, that seems to fit in the mechanism!";
+ $@illia_level_1_progress = 2;
+ end;
+
+}
diff --git a/npc/051-1/janitor.txt b/npc/051-1/janitor.txt
new file mode 100644
index 00000000..15a849c1
--- /dev/null
+++ b/npc/051-1/janitor.txt
@@ -0,0 +1,23 @@
+051-1,1,1,0 script #IlliaJanitor1 NPC32767,{
+end;
+
+OnCommandClean:
+ // Nothing to do here.
+ end;
+
+}
+
+051-1,1,1,0 script #IlliaJanitor3 NPC32767,{
+end;
+
+OnCommandClean:
+ killmonster "051-1", "IlliaDMobs051-1::On1096";
+ // Kill the soul eaters that were spawned
+ killmonster "051-1", "#SoulEaters0::OnSoulEaterDeath";
+ killmonster "051-1", "#SoulEaters1::OnSoulEaterDeath";
+ killmonster "051-1", "#SoulEaters2::OnSoulEaterDeath";
+ killmonster "051-1", "#SoulEaters3::OnSoulEaterDeath";
+ killmonster "051-1", "#SoulEaters4::OnSoulEaterDeath";
+ end;
+
+}
diff --git a/npc/051-1/mapflags.txt b/npc/051-1/mapflags.txt
new file mode 100644
index 00000000..620a8d3c
--- /dev/null
+++ b/npc/051-1/mapflags.txt
@@ -0,0 +1,2 @@
+051-1 mapflag nosave 007-2,36,23
+051-1 mapflag zone MMO
diff --git a/npc/051-3/_import.txt b/npc/051-3/_import.txt
new file mode 100644
index 00000000..cf35c359
--- /dev/null
+++ b/npc/051-3/_import.txt
@@ -0,0 +1,9 @@
+// Map 051-3: Illia Bandit Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/051-3/_mobs.txt",
+"npc/051-3/ambush.txt",
+"npc/051-3/jailslimes.txt",
+"npc/051-3/janitor.txt",
+"npc/051-3/locks.txt",
+"npc/051-3/mapflags.txt",
+"npc/051-3/reinforcements.txt",
diff --git a/npc/051-3/_mobs.txt b/npc/051-3/_mobs.txt
new file mode 100644
index 00000000..e348ab86
--- /dev/null
+++ b/npc/051-3/_mobs.txt
@@ -0,0 +1,18 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 051-3: Illia Bandit Cave mobs
+051-3,31,52,10,6 monster Red Slime 1008,8,100000,30000
+051-3,31,52,9,7 monster Cave Maggot 1056,3,100000,30000
+051-3,56,102,1,1 monster Spider 1012,1,100000,250000
+051-3,61,102,1,1 monster Spider 1012,1,100000,250000
+051-3,65,102,1,1 monster Spider 1012,1,100000,250000
+051-3,71,109,2,1 monster Black Scorpion 1009,1,100000,250000
+051-3,59,56,6,18 monster Bandit 1064,47,100000,10000
+051-3,59,44,6,6 monster Bandit Lord 1065,4,100000,20000
+051-3,60,69,9,4 monster Bandit Lord 1065,4,100000,20000
+051-3,63,94,0,0 monster Sleeping Bandit 1099,1,100000,60000
+051-3,53,93,0,0 monster Sleeping Bandit 1099,1,100000,60000
+051-3,48,71,0,0 monster Sleeping Bandit 1099,1,100000,60000
+051-3,38,30,8,6 monster Bandit 1064,12,100000,10000
+051-3,39,33,5,4 monster Bandit Lord 1065,2,100000,20000
+051-3,80,101,5,6 monster Copper Slime 1098,7,100000,60000
+051-3,60,94,9,2 monster Copper Slime 1098,7,100000,60000
diff --git a/npc/051-3/ambush.txt b/npc/051-3/ambush.txt
new file mode 100644
index 00000000..48a051a9
--- /dev/null
+++ b/npc/051-3/ambush.txt
@@ -0,0 +1,165 @@
+
+051-3,40,52,0 script #WayBlockedTrigger NPC32767,2,2,{
+ message strcharinfo(0), "There is no way I can pass here. Let's find another way.";
+ end;
+}
+
+051-3,31,70,0 script #AmbushReadyTrigger NPC32767,2,2,{
+ @step = 2;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if (strcharinfo(0) == $@iLLIA_HERO$ && $@illia_level_2_progress == 0) goto L_PrepareAmbush;
+ end;
+
+L_PrepareAmbush:
+ disablenpc "Sneaky Bandit";
+ disablenpc "Another Sneaky Bandit";
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+}
+
+051-3,31,93,0 script #BanditAmbushTrigger NPC32767,3,3,{
+ @step = 2;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if ($@illia_level_2_progress == 0 && strcharinfo(0) == $@iLLIA_HERO$) goto L_MakeAmbush;
+ end;
+
+L_MakeAmbush:
+ $@illia_level_2_progress = 1;
+ donpcevent "#BndtTl::OnCommandAmbush";
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ message strcharinfo(0), "Your throat got cut by a sneaky bandit!";
+ end;
+}
+
+051-3,1,1,0 script #BndtTl NPC32767,{
+ end;
+
+OnCommandAmbush:
+ initnpctimer;
+ end;
+
+OnTimer1000:
+ enablenpc "Sneaky Bandit";
+ donpcevent "Sneaky Bandit::OnCommandTalk";
+ enablenpc "Another Sneaky Bandit";
+ donpcevent "Another Sneaky Bandit::OnCommandTalk";
+ end;
+
+OnTimer9000:
+ areawarp "051-3", 22, 45, 42, 97, "051-3", 101, 13;
+ end;
+
+OnTimer11000:
+ 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;
+
+OnOuch:
+ message strcharinfo(0), "Ouch my head...";
+ end;
+
+OnA:
+ if (strcharinfo(0) == $@iLLIA_HERO$)
+ goto L_CaptureHero;
+ if (strcharinfo(0) == $@iLLIA_HELPER1$)
+ goto L_CaptureHelper1;
+ if (strcharinfo(0) == $@iLLIA_HELPER2$)
+ goto L_CaptureHelper2;
+ if (strcharinfo(0) == $@iLLIA_HELPER3$)
+ goto L_CaptureHelper3;
+ // kill that player otherwise, since not part of the quest.
+ heal -Hp, 0;
+ end;
+
+L_CaptureHero:
+ // Simulate the capture of the player.
+ // Unequip all equipments
+ nude;
+ // put the health at 40%.
+ heal MaxHp, 0;
+ heal ((MaxHp/100) * -60), 0;
+ warp "051-3", 69, 109;
+ message strcharinfo(0), "Meh... Where am I?";
+ end;
+
+L_CaptureHelper1:
+ // Simulate the capture of the player.
+ // Unequip all equipments
+ nude;
+ // put the health at 40%.
+ heal MaxHp, 0;
+ heal ((MaxHp/100) * -60), 0;
+ warp "051-3", 64, 102;
+ message strcharinfo(0), "Meh... Where am I?";
+ end;
+
+L_CaptureHelper2:
+ // Simulate the capture of the player.
+ // Unequip all equipments
+ nude;
+ // put the health at 40%.
+ heal MaxHp, 0;
+ heal ((MaxHp/100) * -60), 0;
+ warp "051-3", 62, 102;
+ message strcharinfo(0), "Meh... Where am I?";
+ end;
+
+L_CaptureHelper3:
+ // Simulate the capture of the player.
+ // Unequip all equipments
+ nude;
+ // put the health at 40%.
+ heal MaxHp, 0;
+ heal ((MaxHp/100) * -60), 0;
+ warp "051-3", 58, 102;
+ message strcharinfo(0), "Meh... Where am I?";
+ end;
+
+}
+
+051-3,29,94,0 script Sneaky Bandit NPC32767,{
+ end;
+
+OnCommandTalk:
+ initnpctimer;
+ end;
+
+OnTimer100:
+ npctalk strnpcinfo(0), "Did you think you could sneak in our den without a problem?";
+ end;
+
+OnTimer3600:
+ npctalk strnpcinfo(0), "Drop your weapons, and come with us!";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+}
+
+051-3,33,95,0 script Another Sneaky Bandit NPC32767,{
+ end;
+
+OnCommandTalk:
+ initnpctimer;
+ end;
+
+OnTimer1500:
+ npctalk strnpcinfo(0), "W00t! More slaves!";
+ end;
+
+OnTimer5500:
+ npctalk strnpcinfo(0), "Ahaha, that was easy! Ok, knock them out!";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+}
diff --git a/npc/051-3/jailslimes.txt b/npc/051-3/jailslimes.txt
new file mode 100644
index 00000000..169fe7a3
--- /dev/null
+++ b/npc/051-3/jailslimes.txt
@@ -0,0 +1,28 @@
+051-3,57,104,1,1 monster CopperSlime 1098,1,60000,30000,IlliaCMobs051-3::On1098
+051-3,62,104,1,1 monster CopperSlime 1098,1,60000,30000,IlliaCMobs051-3::On1098
+051-3,63,104,1,1 monster CopperSlime 1098,1,60000,30000,IlliaCMobs051-3::On1098
+051-3,70,111,1,1 monster CopperSlime 1098,1,60000,30000,IlliaCMobs051-3::On1098
+
+051-3,0,0,0 script IlliaCMobs051-3 NPC32767,{
+ end;
+
+On1098:
+ if (rand(100) < 80 && $@illia_progress == 2 && ($@illia_level_2_progress == 1 || $@illia_level_2_progress == 2))
+ goto L_LockPicks;
+ goto L_End;
+
+L_LockPicks:
+ if (countitem ("LockPicks") == 0)
+ goto L_GiveLockPicks;
+ goto L_End;
+
+L_GiveLockPicks:
+ message strcharinfo(0), "Hey nice, someone left behind these rusty lock picks.";
+ getitem "LockPicks", 1;
+ goto L_End;
+
+L_End:
+ fix_mobkill(1098);
+ end;
+
+}
diff --git a/npc/051-3/janitor.txt b/npc/051-3/janitor.txt
new file mode 100644
index 00000000..9531f33a
--- /dev/null
+++ b/npc/051-3/janitor.txt
@@ -0,0 +1,9 @@
+051-3,1,1,0 script #IlliaJanitor2 NPC32767,{
+end;
+
+OnCommandClean:
+ // Kill all remaining bandits spawned during the "reinforcements" event
+ killmonster "051-1", "Door::OnB";
+ end;
+
+}
diff --git a/npc/051-3/locks.txt b/npc/051-3/locks.txt
new file mode 100644
index 00000000..6b7cf6d8
--- /dev/null
+++ b/npc/051-3/locks.txt
@@ -0,0 +1,65 @@
+051-3,69,107,0 script Jail Lock 1 NPC400,{
+ if (isin("051-3", 69, 108, 73, 111)) goto L_Do_Lock_Picking;
+ end;
+
+L_Do_Lock_Picking:
+ callfunc "LockPicking";
+ if (@lock_picking_success > 0)
+ goto L_OpenDoor;
+ close;
+
+L_OpenDoor:
+ @lock_picking_success = 0;
+ warp "051-3", 69, 104;
+ message strcharinfo(0), "Ok, let's get out of here now.";
+ $@illia_level_2_progress = 2;
+ close;
+}
+
+051-3,64,100,0 script Jail Lock 2 NPC400,{
+ if (isin("051-3", 64, 101, 66, 104)) goto L_Do_Lock_Picking;
+ end;
+
+L_Do_Lock_Picking:
+ callfunc "LockPicking";
+ if (@lock_picking_success > 0)
+ goto L_OpenDoor;
+ close;
+
+L_OpenDoor:
+ @lock_picking_success = 0;
+ warp "051-3", 64, 97;
+ close;
+}
+
+051-3,62,100,0 script Jail Lock 3 NPC400,{
+ if (isin("051-3", 61, 101, 62, 104)) goto L_Do_Lock_Picking;
+ end;
+
+L_Do_Lock_Picking:
+ callfunc "LockPicking";
+ if (@lock_picking_success > 0)
+ goto L_OpenDoor;
+ close;
+
+L_OpenDoor:
+ @lock_picking_success = 0;
+ warp "051-3", 62, 97;
+ close;
+}
+
+051-3,58,100,0 script Jail Lock 4 NPC400,{
+ if (isin("051-3", 57, 101, 58, 104)) goto L_Do_Lock_Picking;
+ end;
+
+L_Do_Lock_Picking:
+ callfunc "LockPicking";
+ if (@lock_picking_success > 0)
+ goto L_OpenDoor;
+ close;
+
+L_OpenDoor:
+ @lock_picking_success = 0;
+ warp "051-3", 58, 97;
+ close;
+}
diff --git a/npc/051-3/mapflags.txt b/npc/051-3/mapflags.txt
new file mode 100644
index 00000000..3a343f5a
--- /dev/null
+++ b/npc/051-3/mapflags.txt
@@ -0,0 +1,2 @@
+051-3 mapflag nosave 007-2,36,23
+051-3 mapflag zone MMO
diff --git a/npc/051-3/reinforcements.txt b/npc/051-3/reinforcements.txt
new file mode 100644
index 00000000..b56b6271
--- /dev/null
+++ b/npc/051-3/reinforcements.txt
@@ -0,0 +1,83 @@
+051-3,47,30,0 script #BndtRnfrcmtsTrigger NPC32767,2,3,{
+ @step = 2;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if ($@illia_level_2_progress == 2) goto L_CallReinforcements;
+ end;
+
+L_CallReinforcements:
+ donpcevent "Door::OnRnfrcmts";
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+}
+
+051-3,37,24,0 script Door NPC400,{
+ @step = 2;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ mes "Try open the door?";
+ menu
+ "Yes", L_TryOpen,
+ "Do nothing", L_close;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+L_TryOpen:
+ if ($@illia_level_2_progress < 4)
+ goto L_KeyNotFound;
+ goto L_Warp;
+
+L_KeyNotFound:
+ mes "You do not see a way to open this door.";
+ close;
+
+L_Warp:
+ mes "You place the key in the door and open the lock.";
+ warp "051-1", 118, 55;
+ close;
+
+OnRnfrcmts:
+ $@illia_level_2_progress = 3;
+ // Spawn 20 bandits
+ areamonster "051-3", 29, 25, 48, 39, "", 1064, 18, "Door::OnB";
+ // Spawn 4 bandit lords
+ areamonster "051-3", 29, 25, 48, 39, "", 1065, 3, "Door::OnB";
+ initnpctimer;
+ mapannounce "051-3", "Bandit Lords : Do not let them escape!!" , 0;
+ areatimer 0, "051-3", 25, 20, 80, 85, 10, "Door::OnDRnfrcmts";
+ end;
+
+OnB:
+ end;
+
+OnDRnfrcmts:
+ message strcharinfo(0), "Oh no, reinforcements! We must kill them all!";
+ end;
+
+OnTimer2000:
+ setnpctimer 0;
+ if ($@illia_level_2_progress != 3 || $@illia_progress != 2)
+ end;
+ if (mobcount("051-3", "Door::OnB") <= 0)
+ goto L_OpenDoor;
+ end;
+
+L_OpenDoor:
+ $@illia_level_2_progress = 4;
+ $@illia_progress = 3;
+ callfunc "UpdateIlliaProgress";
+ $@illia_max_time = $@illia_max_time + 300;
+ areatimer 0, "051-3", 25, 20, 80, 85, 10, "Door::OnKeyFound";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnKeyFound:
+ message strcharinfo(0), "One of the defeated bandit lords had a door key attached to his belt.";
+ end;
+L_close:
+ close;
+}
diff --git a/npc/052-1/_import.txt b/npc/052-1/_import.txt
new file mode 100644
index 00000000..f9c306da
--- /dev/null
+++ b/npc/052-1/_import.txt
@@ -0,0 +1,6 @@
+// Map 052-1: Illia archipelago
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/052-1/_mobs.txt",
+"npc/052-1/channelling.txt",
+"npc/052-1/janitor.txt",
+"npc/052-1/mapflags.txt",
diff --git a/npc/052-1/_mobs.txt b/npc/052-1/_mobs.txt
new file mode 100644
index 00000000..f53b2bb6
--- /dev/null
+++ b/npc/052-1/_mobs.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 052-1: Illia archipelago mobs
+052-1,55,29,21,19 monster Azul Slime 1100,18,100000,20000
diff --git a/npc/052-1/channelling.txt b/npc/052-1/channelling.txt
new file mode 100644
index 00000000..143a1225
--- /dev/null
+++ b/npc/052-1/channelling.txt
@@ -0,0 +1,339 @@
+
+052-1,25,44,0 script #EnchantDoorTrigger NPC32767,3,4,{
+ @step = 4;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if (strcharinfo(0) == $@iLLIA_HERO$ &&
+ $@illia_level_4_progress == 0) goto L_EnchantDoor;
+ end;
+
+L_EnchantDoor:
+ enablenpc "#Enchanted Door";
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+}
+
+052-1,57,29,0 script #Enchanted Door NPC369,1,1,{
+ if ($@illia_level_4_progress != 2) goto L_PushBack;
+ end;
+
+L_PushBack:
+ warp "052-1", 57, 34;
+ heal ((MaxHp/100) * -20), 0;
+ message strcharinfo(0), "You are pushed back violently. There is probably some way to break this barrier.";
+ mes "You are pushed back violently.";
+ mes "There is probably some way to break this barrier.";
+ close;
+
+OnCommandDS:
+ areamonster "052-1", 56, 30, 60, 31, "", 1101, 2 + rand(3), "#Enchanted Door::OnSpawn";
+ misceffect FX_EVIL_SUMMON;
+ end;
+
+OnSpawn:
+ end;
+
+}
+
+052-1,57,29,0 script #Enchanted Door2 NPC400,1,1,{
+ if ($@illia_level_4_progress == 2) goto L_Warp;
+ end;
+
+L_Warp:
+ warp "052-2", 33, 40;
+ end;
+
+OnCommandDestroy:
+ misceffect FX_ENCHANTED_DOOR_BROKEN;
+ end;
+
+}
+
+052-1,51,38,0 script Engravings NPC400,{
+ mes "You can read some words engraved inside this rock, but some are erased by wind and time:";
+ next;
+ mes "\".. can use this .. power..´. . .´. . . amplify a spell ..´.";
+ mes " . ´´. Don't let .. spell power .´..´ . .. fade away ...";
+ mes "´ .Use lazurite stones ´..´. they will appear. ..´ .. drop them inside .. this circle.";
+ mes ". ´ power.. drains .. life..´. .´ focus . .not move at all´. .\"";
+ next;
+ mes "Below this strange writing, you notice a word still deeply engraved in the stone:";
+ next;
+ mesq b("catalazuli");
+ next;
+ mes "... that looks like an incantation or something.";
+ if ($@illia_level_4_progress == 0)
+ goto L_SuggestChannelling;
+ close;
+
+L_SuggestChannelling:
+ next;
+ mes "I think this blue circle right here can be helpful to break the enchantment that blocks the door of the Inn.";
+ next;
+ mes "Let's see how I can activate it...";
+ mes "But I should probably get inside it, first.";
+ close;
+}
+
+function script StartChannelling {
+ if (isat("052-1", 53, 38) == 0)
+ goto L_Return;
+ if ($@illia_level_4_progress > 0)
+ goto L_Return;
+ $@illia_level_4_progress = 1;
+ $@illia_char_channelling$ = strcharinfo(0);
+
+ @bonus = (Int+1) / 25;
+ // Lazurite Stones power, will also depend on the Int of the channelling character
+ setarray $@illia_lazurites_power,
+ 12 + @bonus, // small
+ 32 + @bonus, // regular
+ 65 + @bonus; // large
+
+ // coordinates where stones will appear
+ setarray $@illia_small_lazurites, 50,41, 44,33, 61,42;
+ setarray $@illia_regular_lazurites, 68,29, 47,25, 38,45, 70,40;
+ setarray $@illia_large_lazurites, 21,40, 34,25;
+
+ // amount of initial magic power
+ $@illia_magic_power = 1811 + Int*2;
+ // Channelling required power depends on the base Int of the character
+ $@illia_magic_power_required = 5707 - 2*Int;
+ // magic power loss depends also on Int
+ $@illia_magic_power_loss = 53 - ((Int+1)*2)/10;
+
+ // register the power status to display hints to the players
+ // Statuses: 0=critical(below 300), 1=neutral, 2=almost there (max-300)
+ $@illia_magic_power_status = 1;
+
+ message strcharinfo(0), "Ok, let's stay focused now!";
+ donpcevent "#Power Circle::OnCommandSt";
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+052-1,53,38,0 script #Power Circle NPC368,{
+ @step = 4;
+ if ($@illia_progress < @step)
+ goto L_ShouldNotBeHere;
+ if (isat("052-1",53,38) == 0)
+ goto L_Hint;
+ end;
+
+OnCommandSt:
+ initnpctimer;
+ end;
+
+L_Hint:
+ mes "Magic seems to be flowing from this place. I should find out what it is.";
+ close;
+
+OnTimer2000:
+ callsub S_CheckChannelling;
+ end;
+
+OnTimer4000:
+ callsub S_CheckChannelling;
+ end;
+
+OnTimer6000:
+ // Spawn items at specific place
+ callsub S_ItemSpawn;
+ callsub S_CheckChannelling;
+ end;
+
+OnTimer8000:
+ callsub S_CheckChannelling;
+ end;
+
+OnTimer10000:
+ // Spawn items at specific place
+ callsub S_ItemSpawn;
+ callsub S_CheckChannelling;
+ end;
+
+OnTimer11000:
+ setnpctimer 0;
+ // Spawn monsters (demonic spirits) near the enchanted door
+ donpcevent "#Enchanted Door::OnCommandDS";
+ end;
+
+S_ItemSpawn:
+ if (!(attachrid(getcharid(3, $@illia_char_channelling$))))
+ goto L_Return;
+ // spawn items at random
+ $@illia_item_spawn_i = rand(getarraysize($@illia_small_lazurites)/2);
+ $@illia_item_spawn_x = $@illia_small_lazurites[$@illia_item_spawn_i*2];
+ $@illia_item_spawn_y = $@illia_small_lazurites[($@illia_item_spawn_i*2)+1];
+ if (rand(10) > 0)
+ makeitem 873, rand(4,7), "052-1", $@illia_item_spawn_x, $@illia_item_spawn_y;
+
+ $@illia_item_spawn_i = rand(getarraysize($@illia_regular_lazurites)/2);
+ $@illia_item_spawn_x = $@illia_regular_lazurites[$@illia_item_spawn_i*2];
+ $@illia_item_spawn_y = $@illia_regular_lazurites[($@illia_item_spawn_i*2)+1];
+ if (rand(8) > 0)
+ makeitem 874, rand(3,4), "052-1", $@illia_item_spawn_x, $@illia_item_spawn_y;
+
+ $@illia_item_spawn_i = rand(getarraysize($@illia_large_lazurites)/2);
+ $@illia_item_spawn_x = $@illia_large_lazurites[$@illia_item_spawn_i*2];
+ $@illia_item_spawn_y = $@illia_large_lazurites[($@illia_item_spawn_i*2)+1];
+ if (rand(4) > 0)
+ makeitem 875, rand(1,2), "052-1", $@illia_item_spawn_x, $@illia_item_spawn_y;
+
+ $@illia_item_spawn_i = 0;
+ $@illia_item_spawn_x = 0;
+ $@illia_item_spawn_y = 0;
+
+ detachrid;
+ goto L_Return;
+
+L_Return:
+ return;
+
+S_CheckChannelling:
+ // Remove stones inside the circle
+ set $@illia_magic_power, $@illia_magic_power +
+ getareadropitem("052-1", 52, 37, 54, 39, 873, 1)*$@illia_lazurites_power[0] +
+ getareadropitem("052-1", 52, 37, 54, 39, 874, 1)*$@illia_lazurites_power[1] +
+ getareadropitem("052-1", 52, 37, 54, 39, 875, 1)*$@illia_lazurites_power[2];
+
+ // magic power fades over time
+ $@illia_magic_power = $@illia_magic_power - $@illia_magic_power_loss;
+
+ $@illia_magic_power_last_status = $@illia_magic_power_status;
+ $@illia_magic_power_status = 1;
+ if ($@illia_magic_power < 300)
+ $@illia_magic_power_status = 0;
+ if ($@illia_magic_power > $@illia_magic_power_required - 300)
+ $@illia_magic_power_status = 2;
+
+ // Player loses a part of his health while channelling
+ if (!(attachrid(getcharid(3, $@illia_char_channelling$))))
+ goto L_ChannellingFail;
+ // Display an effect showing the drain
+ misceffect FX_CHANNELLING_RAISE;
+ heal ((MaxHp/100) * -4), 0;
+
+ if (ispcdead())
+ goto L_ChannellingDead;
+ if (isat("052-1",53,38) == 0)
+ goto L_ChannellingMoved;
+ // check the magic power
+ if ($@illia_magic_power <= 0)
+ goto L_ChPwrVanish;
+ if ($@illia_magic_power >= $@illia_magic_power_required)
+ goto L_ChannellingComplete;
+
+ detachrid;
+
+ $@illia_channelling_status_msg$ = "";
+
+ if ($@illia_magic_power_last_status == 0 && $@illia_magic_power_status == 1)
+ $@illia_channelling_status_msg$ = $@illia_char_channelling$ + ": I think I'm controlling the spell again now. Keep up!";
+ if ($@illia_magic_power_last_status == 1 && $@illia_magic_power_status == 0)
+ $@illia_channelling_status_msg$ = $@illia_char_channelling$ + ": Guys I'm loosing it! Hurry up!";
+ if ($@illia_magic_power_last_status == 1 && $@illia_magic_power_status == 2)
+ $@illia_channelling_status_msg$ = $@illia_char_channelling$ + ": I almost have the power to cast it! One last effort!";
+ if ($@illia_magic_power_last_status == 2 && $@illia_magic_power_status == 1)
+ $@illia_channelling_status_msg$ = $@illia_char_channelling$ + ": Damn! It faded a little.";
+
+ if ($@illia_channelling_status_msg$ != "")
+ areatimer 0, "052-1", 1, 1, 100, 80, 0, "#Power Circle::OnMPSC";
+
+ return;
+
+OnMPSC:
+ message strcharinfo(0), $@illia_channelling_status_msg$;
+ $@illia_channelling_status_msg$ = "";
+ end;
+
+L_ChannellingComplete:
+ message strcharinfo(0), "You successfully cast the spell and broke the door's enchantment!";
+ detachrid;
+ stopnpctimer;
+ setnpctimer 0;
+ $@illia_magic_power = 0;
+ $@illia_magic_power_required = 0;
+ $@illia_magic_power_last_status = 0;
+ $@illia_magic_power_status = 0;
+ $@illia_magic_power_loss = 0;
+ $@illia_char_channelling$ = "";
+ $@illia_level_4_progress = 2;
+ $@illia_progress = 5;
+ callfunc "UpdateIlliaProgress";
+ $@illia_max_time = $@illia_max_time + 600;
+ // Effect to display the disenchant is cast
+ misceffect FX_CHANNELLING_CAST;
+ // move away the enchanted door
+ donpcevent "#Enchanted Door2::OnCommandDestroy";
+ disablenpc "#Enchanted Door";
+ end;
+
+L_ChannellingDead:
+ misceffect FX_MAGIC_DARK_EXPLOSION, strcharinfo(0);
+ goto L_ChannellingFail;
+
+L_ChannellingMoved:
+ // kill the player as part of the process: the magic process drained his life.
+ // But only if he is still in the island (otherwise, he probably got warped
+ // and does not need being killed)
+ if (isin("052-1",1,1,100,80) == 0)
+ goto L_ChannellingFail;
+ heal -Hp, 0;
+ misceffect FX_MAGIC_DARK_EXPLOSION, strcharinfo(0);
+ message strcharinfo(0), "You moved out of the power circle. The magic power you accumulated backfires at you!";
+ goto L_ChannellingFail;
+
+L_ChPwrVanish:
+ // kill the player as part of the process: the magic process drained his life.
+ heal -Hp, 0;
+ misceffect FX_MAGIC_DARK_EXPLOSION, strcharinfo(0);
+ message strcharinfo(0), "The magic power vanished, and your spell backfires at you!";
+ goto L_ChannellingFail;
+
+L_ChannellingFail:
+ detachrid;
+ stopnpctimer;
+ setnpctimer 0;
+ $@illia_magic_power = 0;
+ $@illia_magic_power_required = 0;
+ $@illia_magic_power_last_status = 0;
+ $@illia_magic_power_status = 0;
+ $@illia_magic_power_loss = 0;
+ $@illia_char_channelling$ = "";
+ $@illia_level_4_progress = 0;
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+OnInit:
+ // In theory, pattern ID must be between 1~9
+ // To set $@p1$~$@p9$ with the PERL expression
+ // But as we're only using $@p0$ (full string)
+ // the value itself is meaningless
+ .pid=getnpcid();
+ debugmes "Catalazuli: Pattern %d", .pid;
+ //I'm not going to learn PERL just for that
+ defpattern(.pid, "^(.*)$", "OnTalkNearby");
+ activatepset(.pid);
+ end;
+
+OnTalkNearby:
+ // not very obvious stuff by gumi, $@p0$ contains the whole string
+ // so we must cut it. Could use $@p1$ if perl was proper but... meh.
+ .@no_nick$ = strip(substr($@p0$, getstrlen(strcharinfo(PC_NAME)) + 3, getstrlen($@p0$) - 1));
+ .@message$ = strtoupper(.@no_nick$);
+
+ // Only react if the message is what we want to hear
+ if (.@message$ == "CATALAZULI") {
+ StartChannelling();
+ }
+ end;
+}
diff --git a/npc/052-1/janitor.txt b/npc/052-1/janitor.txt
new file mode 100644
index 00000000..cae999e5
--- /dev/null
+++ b/npc/052-1/janitor.txt
@@ -0,0 +1,17 @@
+
+052-1,1,1,0 script #IlliaJanitor4 NPC32767,{
+end;
+
+OnCommandClean:
+ // Kill all monsters (that includes the spawned Demonic Spirits and Azul Slimes)
+ // Note that the loot the slimes may have picked will be deleted at the same time.
+ killmonster "052-1", "All";
+ // Delete the magic stones that are still laying around.
+ // FIXME Syntax error happens if not setting a variable...
+ set $@dummy_var, getareadropitem("052-1", 1, 1, 98, 78, 873, 1) +
+ getareadropitem("052-1", 1, 1, 98, 78, 874, 1) +
+ getareadropitem("052-1", 1, 1, 98, 78, 875, 1);
+ $@dummy_var = 0;
+ end;
+
+}
diff --git a/npc/052-1/mapflags.txt b/npc/052-1/mapflags.txt
new file mode 100644
index 00000000..045801f7
--- /dev/null
+++ b/npc/052-1/mapflags.txt
@@ -0,0 +1,2 @@
+052-1 mapflag nosave 007-2,36,23
+052-1 mapflag zone MMO
diff --git a/npc/052-2/_import.txt b/npc/052-2/_import.txt
new file mode 100644
index 00000000..07ba8d12
--- /dev/null
+++ b/npc/052-2/_import.txt
@@ -0,0 +1,8 @@
+// Map 052-2: Illia forsaken inn
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/052-2/chest.txt",
+"npc/052-2/janitor.txt",
+"npc/052-2/lobby.txt",
+"npc/052-2/mapflags.txt",
+"npc/052-2/partyroom.txt",
+"npc/052-2/storage.txt",
diff --git a/npc/052-2/chest.txt b/npc/052-2/chest.txt
new file mode 100644
index 00000000..a54fa144
--- /dev/null
+++ b/npc/052-2/chest.txt
@@ -0,0 +1,167 @@
+
+052-2,146,83,0 script Chest#illia NPC111,{
+ @step = 8;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if (@illia_got_rewards > 2) end;
+ if (@illia_got_rewards == 2) goto L_AlreadyGotReward;
+ if (@illia_current_num_rewards > 0) goto L_ResumePick;
+ @illia_current_num_rewards = 0;
+ mes "You find an opened chest which seems full of equipments.";
+ next;
+ mes "You realize again you were not the first one to visit this place. But where the others failed, you succeeded.";
+ goto L_Pick;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+OnInit:
+ setarray $@illia_common_rewards$, "SteelShield", "WarlordHelmet", "KnightsHelmet", "InfantryHelmet", "CrusadeHelmet", "ChainmailShirt", "LightPlatemail", "WarlordPlate", "Setzer", "RockKnife", "WarlordBoots", "ForestArmor", "ForestBow", "WoodenStaff", "WizardHat", "ShortSword", "BoneKnife", "JeansChaps", "PointyWitchHat", "AssassinPants", "AssassinGloves", "AssassinBoots";
+ setarray $@illia_common_rewards_n$, "Steel Shield", "Warlord Helmet", "Knights Helmet", "Infantry Helmet", "Crusade Helmet", "Chainmail Shirt", "Light Platemail", "Warlord Plate", "Setzer", "Rock Knife", "Warlord Boots", "Forest Armor", "Forest Bow", "Wooden Staff", "Wizard Hat", "Short Sword", "Bone Knife", "Jeans Chaps", "Pointy Witch Hat", "Assassin Pants", "Assassin Gloves", "Assassin Boots";
+ setarray $@illia_unique_rewards$, "BullHelmet", "BansheeBow", "HeartOfIsis", "LazuriteRobe", "AssassinShirt";
+ setarray $@illia_unique_rewards_n$, "Bull Helmet", "Banshee Bow", "Heart of Isis", "Lazurite Robe", "Assassin Shirt";
+ end;
+
+L_ResumePick:
+ mes "Ok. I should continue to dig in this chest...";
+ menu
+ "... and quickly.", L_GetReward,
+ "... or maybe not. I am out of time.", L_AskLeaving,
+ "... but I can't carry more stuff.", L_AskLeaving,
+ "... no, wait a minute.", L_close;
+
+L_Pick:
+ menu
+ "Let's take what I deserve for all this.", L_GetReward,
+ "Wait.", L_close;
+
+L_GetReward:
+ if (@illia_got_rewards == 0)
+ goto L_GetCommonReward;
+ if (@illia_got_rewards == 1)
+ goto L_GetUniqueReward;
+ goto L_close;
+
+L_GetCommonReward:
+ if (@illia_current_num_rewards == $@illia_num_common_reward_items)
+ goto L_RewardDone;
+ getinventorylist;
+ @index = rand(getarraysize($@illia_common_rewards$));
+ @reward$ = $@illia_common_rewards$[@index];
+ if ((checkweight(@reward$, 1) == 0) || (@inventorylist_count == 100))
+ goto L_InventoryNoSpace;
+ @illia_current_num_rewards = @illia_current_num_rewards + 1;
+ getitem @reward$, 1;
+ mes "You found a " + $@illia_common_rewards_n$[@index] + "!";
+ @reward$ = "";
+ goto L_GetCommonReward;
+
+L_GetUniqueReward:
+ if (@illia_current_num_rewards == $@illia_num_unique_reward_items)
+ goto L_RewardDone;
+ if (Illia_Uniques_Count >= 2)
+ goto L_GetUniqueReward2;
+ getinventorylist;
+ @index = rand(getarraysize($@illia_unique_rewards$));
+ @reward$ = $@illia_unique_rewards$[@index];
+ if ((checkweight(@reward$, 1) == 0) || (@inventorylist_count == 100))
+ goto L_InventoryNoSpace;
+ next;
+ mes "You notice an interesting shape hidden under a cover...";
+ next;
+ @illia_current_num_rewards = @illia_current_num_rewards + 1;
+ getitem @reward$, 1;
+ mes "You found a " + $@illia_unique_rewards_n$[@index] + "!";
+ Illia_Uniques_Count = Illia_Uniques_Count + 1;
+ @reward$ = "";
+ goto L_GetUniqueReward;
+
+L_GetUniqueReward2:
+ next;
+ mes "You find a bunch of gold pieces!";
+ next;
+ Zeny = Zeny + 100000*($@illia_num_unique_reward_items - @illia_current_num_rewards);
+ getexp 200000*($@illia_num_unique_reward_items - @illia_current_num_rewards), 0;
+ @illia_current_num_rewards = $@illia_num_unique_reward_items;
+ goto L_GetUniqueReward;
+
+L_AlreadyGotReward:
+ mes "I already took my part.";
+ next;
+ goto L_AskLeaving;
+
+L_RewardDone:
+ @illia_got_rewards = @illia_got_rewards + 1;
+ @illia_current_num_rewards = 0;
+ next;
+ if (@illia_got_rewards == 1)
+ goto L_GetUniqueReward;
+ goto L_AskLeaving; // @illia_got_rewards == 2
+
+L_InventoryNoSpace:
+ mes "You cannot carry more stuff. Make some room first.";
+ close;
+
+L_AskLeaving:
+ mes "It's time to leave this place now.";
+ next;
+ // Force the hero to leave last, as this event triggers the end of the quest
+ // as well as some dialogs from Valia, when the hero returns.
+ if (strcharinfo(0) == $@iLLIA_HERO$ && getareausers("052-2", 19, 8, 137, 88) > 1)
+ goto L_WaitHelpersLeave;
+ goto L_PrepareLeaving;
+
+L_WaitHelpersLeave:
+ mes "However, I'd better wait my friends leave before I do.";
+ next;
+ mes "I prefer to know they left safely this place.";
+ close;
+
+L_PrepareLeaving:
+ mes "Use Valia's ring to teleport now?";
+ menu
+ "Yes. Time to make her pay for her trick!", L_Leave,
+ "No, I still need to see things here.", L_close;
+
+L_Leave:
+ @illia_got_rewards = 3;
+ @illia_current_num_rewards = 0;
+ addtimer 1000, "Chest#illia::OnMsg1";
+ addtimer 4000, "Chest#illia::OnMsg2";
+ addtimer 7000, "Chest#illia::OnMsg3";
+ addtimer 9000, "Chest#illia::OnFx";
+ addtimer 10000, "Chest#illia::OnRing";
+ close;
+
+OnMsg1:
+ message strcharinfo(0), "At the moment you are wearing the ring, you start to feel dizzy...";
+ end;
+
+OnMsg2:
+ message strcharinfo(0), "Who is Luvia? Something isn't right... It looks like your memory is rewritten.";
+ end;
+
+OnMsg3:
+ message strcharinfo(0), "Damn, this ring! That Valia! Someone...";
+ end;
+
+OnFx:
+ misceffect FX_MAGIC_BLUE_TELEPORT, strcharinfo(0);
+ end;
+
+OnRing:
+ warp "007-2",31 + rand(0,2),23 + rand(0,2);
+ if (strcharinfo(0) == $@iLLIA_HERO$)
+ goto L_ScheduleEnd;
+ end;
+
+L_ScheduleEnd:
+ $@iLLIA_STATUS = 253;
+ startnpctimer "Valia";
+ donpcevent "#IlliaDaemon::OnCommandToggle";
+ end;
+
+L_close:
+ close;
+
+}
diff --git a/npc/052-2/janitor.txt b/npc/052-2/janitor.txt
new file mode 100644
index 00000000..7583f4e4
--- /dev/null
+++ b/npc/052-2/janitor.txt
@@ -0,0 +1,32 @@
+052-2,1,1,0 script #IlliaJanitor5 NPC32767,{
+end;
+
+OnCommandClean:
+ // For security, kill all.
+ killmonster "052-2", "All";
+ npcwarp 1, 1, "Luvia?";
+ end;
+
+}
+
+052-2,1,1,0 script #IlliaJanitor6 NPC32767,{
+end;
+
+OnCommandClean:
+ killmonster "052-2", "#ItemsInvoker::OnDeath";
+ npcwarp 1, 1, "#ItemsInvoker";
+ end;
+
+}
+
+052-2,1,1,0 script #IlliaJanitor7 NPC32767,{
+end;
+
+OnCommandClean:
+ killmonster "052-2", "#LuviaDaemon::OnDeath";
+ killmonster "052-2", "#LuviaDaemon::OnWGD";
+ npcwarp 93, 38, "#LuviaDaemon";
+ npcwarp 98, 25, "Luvia";
+ end;
+
+}
diff --git a/npc/052-2/lobby.txt b/npc/052-2/lobby.txt
new file mode 100644
index 00000000..0245cc6b
--- /dev/null
+++ b/npc/052-2/lobby.txt
@@ -0,0 +1,352 @@
+
+052-2,50,29,0 script #InnDoorTrigger NPC32767,2,2,{
+ @step = 5;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if ($@illia_level_5_progress == 8) goto L_Warp;
+ message strcharinfo(0), "A magical field prevents you from going further...";
+ end;
+
+L_Warp:
+ warp "052-2", 33, 81;
+ message strcharinfo(0), "This place is full of dust... *coughs*";
+ end;
+
+L_ShouldNotBeHere:
+ heal -100, 0;
+ end;
+
+}
+
+052-2,43,50,0 script #EntranceTrigger NPC32767,4,2,{
+ @step = 5;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if ($@illia_level_5_progress == 0 && strcharinfo(0) == $@iLLIA_HERO$) goto L_StartVoices;
+ end;
+
+L_StartVoices:
+ $@illia_level_5_progress = 1;
+ donpcevent "#MysteriousVoice::OnCommandStart";
+ end;
+
+L_ShouldNotBeHere:
+ heal -100, 0;
+ end;
+}
+
+052-2,1,1,0 script #LuviaShadow NPC127,{
+end;
+
+OnCommandEscape:
+ initnpctimer;
+ end;
+
+OnTimer100:
+ if ($@illia_level_5_progress != 7)
+ end;
+ npcwarp 49, 45, "#LuviaShadow";
+ misceffect FX_DARK_TELEPORT;
+ npcwarp 1, 1, "Luvia?";
+ end;
+
+OnTimer750:
+ if ($@illia_level_5_progress != 7)
+ end;
+ npcwarp 1, 1, "#LuviaShadow";
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnCommandInvoke:
+ initnpctimer;
+ end;
+
+OnTimer650:
+ if ($@illia_level_5_progress != 2)
+ end;
+ npcwarp 49, 45, "#LuviaShadow";
+ misceffect FX_EVIL_SUMMON;
+ end;
+
+OnTimer1500:
+ if ($@illia_level_5_progress != 2)
+ end;
+ npcwarp 1, 1, "#LuviaShadow";
+ npcwarp 49, 45, "Luvia?";
+ $@illia_level_5_progress = 3;
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnNN:
+ message strcharinfo(0), "The last guard is down. Let's go after Luvia now!";
+ end;
+
+}
+
+052-2,1,1,0 script #MysteriousVoice NPC127,{
+end;
+
+OnInit:
+ setarray $@illia_lobby_voices$, "Finally.", "I was...", "Waiting...", "For you!";
+ end;
+
+OnCommandStart:
+ $@illia_lobby_voices_index = 0;
+ initnpctimer;
+ end;
+
+OnTimer2000:
+ if ($@illia_level_5_progress != 1)
+ end;
+ npcwarp rand(40,52), rand(42,48), "?";
+ donpcevent "?::OnCommandTalk";
+ end;
+
+OnTimer3000:
+ if ($@illia_level_5_progress != 1)
+ end;
+ npcwarp 1, 1, "?";
+ $@illia_lobby_voices_index = $@illia_lobby_voices_index + 1;
+ // FIXME Uncomment next line, comment the next next, when getarraysize is repaired.
+ //if ($@illia_lobby_voices_index < getarraysize($@illia_lobby_voices$)) goto L_Continue;
+ if ($@illia_lobby_voices_index < 4)
+ goto L_Continue;
+ // End the process
+ stopnpctimer;
+ setnpctimer 0;
+ $@illia_lobby_voices_index = 0;
+ $@illia_level_5_progress = 2;
+ donpcevent "#LuviaShadow::OnCommandInvoke";
+ end;
+
+L_Continue:
+ setnpctimer 0;
+ end;
+
+}
+
+052-2,1,1,0 script ? NPC127,{
+end;
+
+OnCommandTalk:
+ npctalk strnpcinfo(0), $@illia_lobby_voices$[$@illia_lobby_voices_index];
+ end;
+
+}
+
+052-2,1,1,0 script Luvia? NPC371,2,2,{
+ if ($@illia_level_5_progress != 3) end;
+ if (isin("052-2", 47,46, 51,49)) goto L_HandleTalk;
+ // Notify too far
+ mes "You see a strange and frightening, yet beautiful woman.";
+ if (strcharinfo(0) == $@iLLIA_HERO$)
+ mes "Maybe she knows something about this place.";
+ close;
+
+L_HandleTalk:
+ if (strcharinfo(0) == $@iLLIA_HERO$)
+ goto L_TalkToHero;
+ goto L_TalkToHelper;
+
+L_TalkToHelper:
+ mes "She gives you a quick look then gives her attention to " + $@iLLIA_HERO$ + ".";
+ close;
+
+L_TalkToHero:
+ mes "Are you Luvia? Your sister Valia sent me to save you! Where is Ismuth?";
+ next;
+ $@illia_level_5_progress = 4;
+ initnpctimer;
+ close;
+
+OnTimer1500:
+ if ($@illia_level_5_progress != 4)
+ end;
+ npctalk strnpcinfo(0), "Yes " + $@iLLIA_HERO$ + ", I am Luvia.";
+ end;
+
+OnTimer4500:
+ if ($@illia_level_5_progress != 4)
+ end;
+ npctalk strnpcinfo(0), "How nice of all of you to have come to save me!";
+ end;
+
+OnTimer7500:
+ if ($@illia_level_5_progress != 4)
+ end;
+ npctalk strnpcinfo(0), "But I fear...";
+ end;
+
+OnTimer10500:
+ if ($@illia_level_5_progress != 4)
+ end;
+ npctalk strnpcinfo(0), "... that you are mistaken about who has to be saved!";
+ end;
+
+OnTimer13500:
+ if ($@illia_level_5_progress != 4)
+ end;
+ npctalk strnpcinfo(0), "Don't make these faces...";
+ end;
+
+OnTimer16500:
+ if ($@illia_level_5_progress != 4)
+ end;
+ npctalk strnpcinfo(0), "Valia is just helping me by sending new soldiers for my personal army!";
+ end;
+
+OnTimer21500:
+ if ($@illia_level_5_progress != 4)
+ end;
+ npctalk strnpcinfo(0), "So, if I may... Let's see what you are made of!";
+ end;
+
+OnTimer24500:
+ if ($@illia_level_5_progress != 4)
+ end;
+ npctalk strnpcinfo(0), "Demonotis!";
+ misceffect FX_EVIL_SUMMON;
+ callsub S_GetHeroRect;
+ areamonster "052-2", $@illia_lobby_x1, $@illia_lobby_y1, $@illia_lobby_x2, $@illia_lobby_y2, "", 1101, 20 + 16 - 480/(30+$Illia_Luvia_Harvest), "Luvia?::OnDSDeath";
+ callsub S_ClearHeroRect;
+ end;
+
+OnTimer44000:
+ if ($@illia_level_5_progress != 4)
+ end;
+ npctalk strnpcinfo(0), "Demonotis!";
+ misceffect FX_EVIL_SUMMON;
+ callsub S_GetHeroRect;
+ areamonster "052-2", $@illia_lobby_x1, $@illia_lobby_y1, $@illia_lobby_x2, $@illia_lobby_y2, "", 1101, 28 + 16 - 480/(30+$Illia_Luvia_Harvest), "Luvia?::OnDSDeath";
+ callsub S_ClearHeroRect;
+ end;
+
+OnTimer77000:
+ if ($@illia_level_5_progress != 4)
+ end;
+ npctalk strnpcinfo(0), "Demonotis!";
+ misceffect FX_EVIL_SUMMON;
+ callsub S_GetHeroRect;
+ areamonster "052-2", $@illia_lobby_x1, $@illia_lobby_y1, $@illia_lobby_x2, $@illia_lobby_y2, "", 1101, 42 + 16 - 480/(30+$Illia_Luvia_Harvest), "Luvia?::OnDSDeath";
+ callsub S_ClearHeroRect;
+ // That was the last spawn: reset the timer to start the CheckInvoke loop.
+ $@illia_level_5_progress = 5;
+ setnpctimer 0;
+ end;
+
+OnTimer6500:
+ if ($@illia_level_5_progress != 6)
+ end;
+ npctalk strnpcinfo(0), "Okay. You have some skill.";
+ end;
+
+OnTimer10000:
+ if ($@illia_level_5_progress != 6)
+ end;
+ npctalk strnpcinfo(0), "But that was only the beginning!";
+ end;
+
+OnTimer13000:
+ if ($@illia_level_5_progress != 6)
+ end;
+ npctalk strnpcinfo(0), "I'll leave you in the good hands of your predecessors. Farewell!";
+ end;
+
+OnTimer18500:
+ if ($@illia_level_5_progress != 6)
+ end;
+ npctalk strnpcinfo(0), "Demonotis Major!";
+ misceffect FX_EVIL_SUMMON;
+ misceffect FX_MAGIC_DARK_EXPLOSION;
+ callsub S_GetHeroRect;
+ areamonster "052-2", $@illia_lobby_x1, $@illia_lobby_y1, $@illia_lobby_x2, $@illia_lobby_y2, "", 1103, 8 + (16 - 480/(30+$Illia_Luvia_Harvest))/3, "Luvia?::OnWGDeath";
+ callsub S_ClearHeroRect;
+ end;
+
+OnTimer20000:
+ if ($@illia_level_5_progress != 6)
+ end;
+ $@illia_level_5_progress = 7;
+ donpcevent "#LuviaShadow::OnCommandEscape";
+ setnpctimer 0;
+ end;
+
+OnTimer2000:
+ if ($@illia_progress != 5)
+ goto L_Clear;
+ if ($@illia_level_5_progress != 5 && $@illia_level_5_progress != 7)
+ end;
+ setnpctimer 0;
+ // Mock players randomly (more or less once every 40 secs) and if still enough mobs running after them
+ if ($@illia_level_5_progress == 5 && rand(20) == 0 && (mobcount("052-2", "Luvia?::OnDSDeath") > 21))
+ npctalk strnpcinfo(0), "Ahaha! Run... Run!";
+ if ($@illia_level_5_progress == 5 && (mobcount("052-2", "Luvia?::OnDSDeath") <= 0))
+ goto L_AllWavesClear;
+ if ($@illia_level_5_progress == 7 && (mobcount("052-2", "Luvia?::OnWGDeath") <= 0))
+ goto L_AllWavesClear;
+ end;
+
+L_Clear:
+ stopnpctimer;
+ setnpctimer 0;
+ killmonster "052-2", "Luvia?::OnDSDeath";
+ killmonster "052-2", "Luvia?::OnWGDeath";
+ end;
+
+L_AllWavesClear:
+ $@illia_level_5_progress = $@illia_level_5_progress + 1;
+ stopnpctimer;
+ setnpctimer 0;
+ if ($@illia_level_5_progress == 6)
+ startnpctimer;
+ if ($@illia_level_5_progress == 8)
+ goto L_ChaseLuvia;
+ end;
+
+L_ChaseLuvia:
+ $@illia_progress = 6;
+ callfunc "UpdateIlliaProgress";
+ $@illia_max_time = $@illia_max_time + 360;
+ areatimer 0, "052-2", 29, 28, 58, 53, 2000, "#LuviaShadow::OnNN";
+ end;
+
+S_GetHeroRect:
+ if (!(attachrid($@iLLIA_HERO_ID)))
+ goto L_Clear;
+ if(!(isin("052-2", 30, 31, 57, 53)))
+ goto L_Clear;
+
+ $@illia_lobby_x = getx();
+ $@illia_lobby_y = gety();
+
+ $@illia_lobby_x1 = $@illia_lobby_x - 12;
+ $@illia_lobby_y1 = $@illia_lobby_y - 8;
+ $@illia_lobby_x2 = $@illia_lobby_x + 12;
+ $@illia_lobby_y2 = $@illia_lobby_y + 8;
+
+ if ($@illia_lobby_x1 < 30)
+ $@illia_lobby_x1 = 30;
+ if ($@illia_lobby_y1 < 19)
+ $@illia_lobby_y1 = 19;
+ if ($@illia_lobby_x2 > 57)
+ $@illia_lobby_x2 = 57;
+ if ($@illia_lobby_y2 > 42)
+ $@illia_lobby_y2 = 42;
+
+ detachrid;
+ return;
+
+S_ClearHeroRect:
+ $@illia_lobby_x1 = 30;
+ $@illia_lobby_y1 = 19;
+ $@illia_lobby_x2 = 57;
+ $@illia_lobby_y2 = 42;
+ return;
+
+OnDSDeath:
+ end;
+
+OnWGDeath:
+ end;
+
+}
diff --git a/npc/052-2/mapflags.txt b/npc/052-2/mapflags.txt
new file mode 100644
index 00000000..082d21b1
--- /dev/null
+++ b/npc/052-2/mapflags.txt
@@ -0,0 +1,2 @@
+052-2 mapflag nosave 007-2,36,23
+052-2 mapflag zone MMO
diff --git a/npc/052-2/partyroom.txt b/npc/052-2/partyroom.txt
new file mode 100644
index 00000000..399c690d
--- /dev/null
+++ b/npc/052-2/partyroom.txt
@@ -0,0 +1,267 @@
+
+052-2,98,29,0 script #TriggerDialog NPC32767,3,2,{
+ @step = 7;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if ($@illia_level_7_progress == 0 && strcharinfo(0) == $@iLLIA_HERO$) goto L_SpawnLuvia;
+ end;
+
+L_SpawnLuvia:
+ $@illia_level_7_progress = 1;
+ donpcevent "Luvia::OnCommandStart";
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+}
+
+052-2,87,58,0 script #TriggerPlaceLuvia NPC32767,1,1,{
+ if (strcharinfo(0) != $@iLLIA_HERO$) end;
+ if ($@illia_progress == 7 && $@illia_level_7_progress == 0) goto L_PlaceLuvia;
+ end;
+
+L_PlaceLuvia:
+ npcwarp 98, 25, "#LuviaDaemon";
+ npcwarp 98, 25, "Luvia";
+ end;
+
+}
+
+052-2,98,25,0 script Luvia NPC371,{
+ @step = 7;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if ($@illia_level_7_progress == 0 && strcharinfo(0) == $@iLLIA_HERO$) goto L_Start;
+ end;
+
+OnCommandStart:
+ goto L_Start;
+
+L_Start:
+ setnpctimer 0;
+ if ($@illia_level_7_progress == 1)
+ startnpctimer;
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+OnTimer1000:
+ npctalk strnpcinfo(0), "Oh well, who thought you would survive so far?";
+ end;
+
+OnTimer5000:
+ npctalk strnpcinfo(0), "All this way, for nothing, only to die from my hands...";
+ end;
+
+OnTimer10000:
+ npctalk strnpcinfo(0), "Don't worry, you will continue to live, for my sake.";
+ end;
+
+OnTimer15000:
+ npctalk strnpcinfo(0), "One piece of advice: get prepared!";
+ stopnpctimer;
+ setnpctimer 0;
+ donpcevent "#LuviaDaemon::OnCommandInvoke";
+ end;
+
+}
+
+052-2,98,25,0 script #LuviaDaemon NPC32767,{
+end;
+
+OnCommandInvoke:
+ setnpctimer 0;
+ if ($@illia_level_7_progress == 1)
+ startnpctimer;
+ end;
+
+OnTimer2000:
+ if ($@illia_level_7_progress != 1) end;
+ misceffect FX_DARK_TELEPORT;
+ // Kill any mob existing on the map
+ // That's to terminate any attempt at players mass-summoning mobs
+ // and hide in a corner of the map.
+ killmonster "052-2", "All";
+ npcwarp 1, 1, "Luvia";
+ end;
+
+OnTimer100:
+ if ($@illia_progress != 7)
+ goto L_Clear;
+ if ($@illia_level_7_progress != 3)
+ end;
+ // Trance mode
+ callsub S_SpawnWitchGuard;
+ end;
+
+OnTimer2600:
+ if ($@illia_level_7_progress != 3)
+ end;
+ npcwarp 1, 1, "#LuviaDaemon";
+ setnpctimer 0;
+ end;
+
+OnTimer5000:
+ if ($@illia_level_7_progress != 1)
+ end;
+ // Warp to the place to spawn luvia once the teleport sequence is finished
+ if (!(attachrid($@iLLIA_HERO_ID)))
+ end;
+ $@illia_luvia_x = getx();
+ $@illia_luvia_y = gety();
+ npcwarp $@illia_luvia_x, $@illia_luvia_y, "#LuviaDaemon";
+
+ detachrid;
+ // This is a fix to force the official mana client to display a npc after a warp.
+ // Note: the manaplus client do not need this.
+ disablenpc "#LuviaDaemon";
+ end;
+
+OnTimer5500:
+ if ($@illia_level_7_progress != 1) end;
+ // See the note above.
+ enablenpc "#LuviaDaemon";
+ misceffect FX_EVIL_SUMMON;
+ misceffect FX_CHANNELLING_CAST;
+ monster "052-2", $@illia_luvia_x, $@illia_luvia_y, "", 1102, 1, "#LuviaDaemon::OnDeath";
+ $@illia_luvia_x = 0;
+ $@illia_luvia_y = 0;
+ end;
+
+OnTimer9000:
+ if ($@illia_level_7_progress != 1) end;
+ set $@illia_luvia_trance_delay, 480; // 8 minutes before turning in trance mode
+ $@illia_witch_guard_threshold = 30 + ($Illia_Luvia_Harvest*3)/5;
+ if ($@illia_witch_guard_threshold > 100)
+ $@illia_witch_guard_threshold = 100;
+ $@illia_level_7_progress = 2;
+ npcwarp 1, 1, "#LuviaDaemon";
+ setnpctimer 0;
+ end;
+
+OnTimer26000:
+ if ($@illia_progress != 7)
+ goto L_Clear;
+ if ($@illia_level_7_progress != 2)
+ end;
+ // The more players Luvia "harvested", the stronger she is.
+ if (rand(100) >= $@illia_witch_guard_threshold)
+ end;
+ // Decrease her power over time.
+ $@illia_witch_guard_threshold = $@illia_witch_guard_threshold - 7;
+ // Keep always a small probability when it reached the minimum
+ if ($@illia_witch_guard_threshold <= 0)
+ $@illia_witch_guard_threshold = 6 + $Illia_Luvia_Harvest/5;
+ callsub S_SpawnWitchGuard;
+ end;
+
+S_SpawnWitchGuard:
+ if (!(attachrid($@iLLIA_HERO_ID)))
+ end;
+ npcwarp getx(), gety(), "#LuviaDaemon";
+ misceffect FX_EVIL_SUMMON;
+ misceffect FX_GROUND_SPAWN;
+ monster "052-2", getx(), gety(), "", 1103, 1, "#LuviaDaemon::OnWGD";
+ detachrid;
+ areatimer 0, "052-2", 83, 21, 125, 59, 0, "#LuviaDaemon::OnWGS";
+ return;
+
+OnTimer30000:
+ if ($@illia_level_7_progress != 2)
+ end;
+ npcwarp 1, 1, "#LuviaDaemon";
+ $@illia_luvia_trance_delay = $@illia_luvia_trance_delay - 30;
+ if ($@illia_luvia_trance_delay <= 0)
+ goto L_TriggerTrance;
+ setnpctimer 0;
+ end;
+
+L_TriggerTrance:
+ $@illia_level_7_progress = 3;
+ $@illia_luvia_trance_delay = 0;
+ areatimer 0, "052-2", 83, 21, 125, 59, 0, "#LuviaDaemon::OnTT";
+ setnpctimer 0;
+ end;
+
+L_Clear:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnDeath:
+ stopnpctimer;
+ setnpctimer 0;
+ if ($@illia_progress != 7)
+ end;
+ $@illia_level_7_progress = 4;
+ killmonster "052-2", "#LuviaDaemon::OnWGD";
+ mapannounce "052-2", "Luvia : How? By mere humans! But we will see again! Enjoy your victory while it lasts, " + $@iLLIA_HERO$ + "!!", 0;
+
+ $@illia_bp = $Illia_Luvia_Harvest * 16 / 10 + 120;
+ areatimer 0, "052-2", 83, 21, 125, 59, 0, "#LuviaDaemon::OnBP";
+
+ areatimer 0, "052-2", 83, 21, 125, 59, 2000, "#LuviaDaemon::OnW00t";
+
+ $@illia_progress = 8;
+ callfunc "UpdateIlliaProgress";
+ // Set the number of common rewards rewards
+ if ($Illia_Luvia_Harvest < 15)
+ $@illia_num_common_reward_items = 0;
+ if ($Illia_Luvia_Harvest >= 15 && $Illia_Luvia_Harvest < 35)
+ $@illia_num_common_reward_items = 1;
+ if ($Illia_Luvia_Harvest >= 35)
+ $@illia_num_common_reward_items = 2;
+
+ // Set the number of unique rewards
+ if ($Illia_Luvia_Harvest < 40)
+ $@illia_num_unique_reward_items = 1;
+ if ($Illia_Luvia_Harvest >= 40)
+ $@illia_num_unique_reward_items = 2;
+ $Illia_Luvia_Harvest = 0;
+
+ // Extend the time limit of +7 mins to leave enough time to pick
+ // the rewards even if close to the time limit
+ $@illia_max_time = $@illia_max_time + 300;
+
+ // Record how many times the quest was finished
+ $Illia_Win_Counter = $Illia_Win_Counter + 1;
+
+ end;
+
+OnBP:
+ BOSS_POINTS = BOSS_POINTS + $@illia_bp;
+ message strcharinfo(0), "You gain " + $@illia_bp + " Boss Points giving you a total of " + BOSS_POINTS + ".";
+ end;
+
+OnWGD:
+ end;
+
+OnWGS:
+ if ($@illia_level_7_progress == 2)
+ message strcharinfo(0), "One of Luvia's guard spawned from the depths to assist her!";
+ end;
+
+OnTT:
+ if ($@illia_level_7_progress == 3)
+ message strcharinfo(0), "Luvia seems to become in trance!";
+ end;
+
+OnW00t:
+ message strcharinfo(0), "You defeated this evil sorceress... But what about her sister now?";
+ end;
+
+}
+
+052-2,98,22,0 script #ToLuviaRoomDoor NPC32767,1,2,{
+ @step = 7;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if ($@illia_level_7_progress < 4) end;
+ warp "052-2", 143, 94;
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+}
diff --git a/npc/052-2/storage.txt b/npc/052-2/storage.txt
new file mode 100644
index 00000000..8dfcdfaf
--- /dev/null
+++ b/npc/052-2/storage.txt
@@ -0,0 +1,179 @@
+
+052-2,33,79,0 script #TriggerItemsInvoker NPC32767,1,0,{
+ @step = 6;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if (strcharinfo(0) != $@iLLIA_HERO$) end;
+ if ($@illia_level_6_progress == 0) goto L_StartItemInvoker;
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+L_StartItemInvoker:
+ $@illia_level_6_progress = 1;
+ donpcevent "#ItemsInvoker::OnCommandStart";
+ end;
+
+}
+
+052-2,1,1,0 script #ItemsInvoker NPC32767,{
+end;
+
+OnInit:
+ setarray $@illia_storage_items, 541, 567, 568, 562;
+ setarray $@illia_storage_special_items, 687, 827, 1229;
+ // Map coords:* x1,y1, x2,y2, ...
+ setarray $@illia_storage_item_points, 30,77, 32,85, 37,81, 40,83, 44,86, 40,74, 44,75, 44,72, 31,71, 32,74;
+ end;
+
+OnCommandStart:
+ $@illia_storage_max_items = 20;
+ $@illia_storage_deviation = (8 + ($Illia_Luvia_Harvest*70)/100)*3;
+ initnpctimer;
+ areatimer 0, "052-2", 29, 70, 45, 88, 10, "#ItemsInvoker::OnStart";
+ end;
+
+OnStart:
+ message strcharinfo(0), "You feel a strange atmosphere in this room... You sense a strong magic rising from the depth!";
+ end;
+
+OnTimer1000:
+ if ($@illia_storage_max_items == 0)
+ goto L_CheckMobs;
+ $@item_invoke_index = rand(getarraysize($@illia_storage_item_points)/2);
+ $@item_invoke_x = $@illia_storage_item_points[$@item_invoke_index*2];
+ $@item_invoke_y = $@illia_storage_item_points[($@item_invoke_index*2)+1];
+ npcwarp $@item_invoke_x, $@item_invoke_y, "#ItemsInvoker";
+ // This is a fix to force the official mana client to display a npc after a warp.
+ // Note: the manaplus client do not need this.
+ disablenpc "#ItemsInvoker";
+ end;
+
+OnTimer1500:
+ // See the note above.
+ enablenpc "#ItemsInvoker";
+ areatimer 0, "052-2", 29, 70, 45, 88, 10, "#ItemsInvoker::OnItem";
+ misceffect FX_GROUND_SPAWN;
+ end;
+
+OnTimer3750:
+ setnpctimer 0;
+ $@item_invoke_x = 0;
+ $@item_invoke_y = 0;
+ $@item_invoke_index = 0;
+ end;
+
+OnItem:
+ if (strcharinfo(0) == $@iLLIA_HERO$)
+ goto L_ItemSpawn;
+ end;
+
+L_ItemSpawn:
+ // This section will decide what to spawn: special monster, monster, item, special item
+ // Calculation uses a decreasing variable which introduces a deviation.
+ // Its initial value is based on $@illia_Luvia_Harvest
+ // * first decide (50% / 50%) if the deviation will be positive or negative
+ // * Apply the deviation to a random number between 0, 100. (note the final value can be < 0 or > 100)
+ // The purpose is that, when the initial deviation is high, there are high chances to get either
+ // a special monster, or a special item.
+ @m = rand(100);
+ if (@m < 50)
+ @r = rand(100) - $@illia_storage_deviation;
+ if (@m >= 50)
+ @r = rand(100) + $@illia_storage_deviation;
+ // Reduce the deviation
+ $@illia_storage_deviation = $@illia_storage_deviation*83/100;
+ if (@r < 5)
+ goto L_MakeSpecialMonster;
+ if (@r < 50)
+ goto L_MakeMonster;
+ if (@r > 98)
+ goto L_MakeSpecialItem;
+ // Normal item
+ makeitem $@illia_storage_items[rand(getarraysize($@illia_storage_items))], rand(2, 8), "052-2", $@item_invoke_x, $@item_invoke_y;
+ $@illia_storage_max_items = $@illia_storage_max_items - 1;
+ @r = 0;
+ end;
+
+L_MakeSpecialMonster:
+ monster "052-2", $@item_invoke_x, $@item_invoke_y, "", 1103, 1, "#ItemsInvoker::OnDeath";
+ areatimer 0, "052-2", 29, 70, 45, 88, 10, "#ItemsInvoker::OnWtf";
+ $@illia_storage_max_items = $@illia_storage_max_items - 1;
+ end;
+
+L_MakeMonster:
+ monster "052-2", $@item_invoke_x, $@item_invoke_y, "", 1101, rand(1, 3), "#ItemsInvoker::OnDeath";
+ $@illia_storage_max_items = $@illia_storage_max_items - 1;
+ @r = 0;
+ end;
+
+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 0, "052-2", 29, 70, 45, 88, 10, "#ItemsInvoker::OnWow";
+ $@illia_storage_max_items = $@illia_storage_max_items - 1;
+ @r = 0;
+ end;
+
+L_CheckMobs:
+ if ($@illia_progress != 6)
+ goto L_Clear;
+ if (mobcount("052-2", "#ItemsInvoker::OnDeath") <= 0)
+ goto L_Stop;
+ setnpctimer 0;
+ end;
+
+L_Clear:
+ stopnpctimer;
+ setnpctimer 0;
+ $@illia_storage_deviation = 0;
+ $@illia_storage_max_items = 0;
+ killmonster "052-2", "#ItemsInvoker::OnDeath";
+ end;
+
+L_Stop:
+ stopnpctimer;
+ setnpctimer 0;
+ npcwarp 1, 1, "#ItemsInvoker";
+ $@illia_storage_deviation = 0;
+ $@illia_storage_max_items = 0;
+ $@illia_level_6_progress = 2;
+ $@illia_progress = 7;
+ callfunc "UpdateIlliaProgress";
+ $@illia_max_time = $@illia_max_time + 900;
+ areatimer 0, "052-2", 29, 70, 45, 88, 10, "#ItemsInvoker::OnStop";
+ end;
+
+OnDeath:
+ end;
+
+OnStop:
+ message strcharinfo(0), "The magic seems to quickly dissipate.";
+ end;
+
+OnWtf:
+ message strcharinfo(0), "Look out!";
+ end;
+
+OnWow:
+ message strcharinfo(0), "Wow, see what appeared!";
+ end;
+
+}
+
+052-2,45,78,0 script #ToPartyRoom NPC32767,1,1,{
+ @step = 6;
+ if ($@illia_progress < @step) goto L_ShouldNotBeHere;
+ if ($@illia_level_6_progress == 2) goto L_Warp;
+ message strcharinfo(0), "The strong magic inside this room prevents you from going further.";
+ end;
+
+L_Warp:
+ warp "052-2", 83, 58;
+ end;
+
+L_ShouldNotBeHere:
+ heal -Hp, 0;
+ end;
+
+}
diff --git a/npc/055-1/_import.txt b/npc/055-1/_import.txt
new file mode 100644
index 00000000..dcbfce99
--- /dev/null
+++ b/npc/055-1/_import.txt
@@ -0,0 +1,8 @@
+// Map 055-1: Woodland Hills
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/055-1/_mobs.txt",
+"npc/055-1/_warps.txt",
+"npc/055-1/flowerpentagram4.txt",
+"npc/055-1/mapflags.txt",
+"npc/055-1/pumpkins.txt",
+"npc/055-1/traveler.txt",
diff --git a/npc/055-1/_mobs.txt b/npc/055-1/_mobs.txt
new file mode 100644
index 00000000..62392f6f
--- /dev/null
+++ b/npc/055-1/_mobs.txt
@@ -0,0 +1,19 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 055-1: Woodland Hills mobs
+055-1,68,72,11,9 monster Butterfly 1055,16,10000,85000
+055-1,87,29,27,7 monster Silkworm 1035,15,10000,85000
+055-1,79,30,42,8 monster Squirrel 1038,10,10000,45000
+055-1,0,0,0,0 monster Mouboo 1028,15,10000,85000
+055-1,91,49,3,2 monster Clover Patch 1037,1,10000,180000
+055-1,103,54,2,1 monster Clover Patch 1037,1,10000,180000
+055-1,64,75,13,8 monster Clover Patch 1037,1,10000,120000
+055-1,80,34,41,12 monster Snail 1041,3,10000,85000
+055-1,70,72,8,12 monster Alizarin Plant 1032,2,10000,60000
+055-1,81,32,40,11 monster Alizarin Plant 1032,2,10000,60000
+055-1,0,0,0,0 monster Mauve Plant 1029,7,10000,55000
+055-1,0,0,0,0 monster Cobalt Plant 1030,3,10000,60000
+055-1,0,0,0,0 monster Gamboge Plant 1031,2,10000,60000
+055-1,116,60,2,1 monster Pink Flower 1014,1,10000,45000
+055-1,97,60,2,1 monster Pink Flower 1014,1,10000,45000
+055-1,64,73,11,8 monster Pink Flower 1014,1,10000,45000
+055-1,0,0,0,0 monster Spiky Mushroom 1019,7,10000,60000
diff --git a/npc/055-1/_warps.txt b/npc/055-1/_warps.txt
new file mode 100644
index 00000000..31dc2b47
--- /dev/null
+++ b/npc/055-1/_warps.txt
@@ -0,0 +1,9 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 055-1: Woodland Hills warps
+055-1,100,83,0 warp #055-1_100_83 0,0,055-3,30,27
+055-1,100,89,0 warp #055-1_100_89 0,0,055-3,50,42
+055-1,22,52,0 warp #055-1_22_52 0,3,013-1,135,51
+055-1,137,96,0 warp #055-1_137_96 0,0,055-3,76,39
+055-1,60,93,0 warp #055-1_60_93 0,0,055-3,96,70
+055-1,75,20,0 warp #055-1_75_20 1,0,017-1,188,103
+055-1,149,63,0 warp #055-1_149_63 0,2,057-1,20,63
diff --git a/npc/055-1/flowerpentagram4.txt b/npc/055-1/flowerpentagram4.txt
new file mode 100644
index 00000000..86966c15
--- /dev/null
+++ b/npc/055-1/flowerpentagram4.txt
@@ -0,0 +1,114 @@
+
+055-1,141,89,0 script #FlowerPentagram4 NPC400,{
+ if (OrumQuest >= 31) goto L_PlacedFifthFlower;
+
+ if (OrumQuest > 26) goto L_PlacedFourthFlower;
+ if (OrumQuest == 26) goto L_FourthFlower;
+
+ message strcharinfo(0), "Something is odd about this place.";
+ end;
+
+L_FourthFlower:
+ mes "This is the spot where you have to place the fourth of Orum's magical flowers.";
+ menu
+ "Place the flower.", L_PlaceTheFlower,
+ "Leave.", L_close;
+
+L_PlaceTheFlower:
+ if (isin("055-1", 140, 88, 142, 90))
+ goto L_Place;
+
+ mes "This isn't working, you're too far away.";
+ goto L_close;
+
+L_Place:
+ set @localMonsterCount,
+ mobcount("055-1", "#FlowerPentagram4::OnSquirrelDeath") +
+ mobcount("055-1", "#FlowerPentagram4::OnMushroomDeath") +
+ mobcount("055-1", "#FlowerPentagram4::OnBlueparDeath") +
+ mobcount("055-1", "#FlowerPentagram4::OnMoubooDeath") +
+ mobcount("055-1", "#FlowerPentagram4::OnScorpionDeath") +
+ mobcount("055-1", "#FlowerPentagram4::OnRScorpionDeath") +
+ mobcount("055-1", "#FlowerPentagram4::OnAScorpionDeath") +
+ mobcount("055-1", "#FlowerPentagram4::OnBScorpionDeath");
+ if (@localMonsterCount > 4)
+ goto L_MonstersAlive;
+
+ if (countitem("YellowSummonFlower") < 1)
+ goto L_NoFlower;
+ delitem "YellowSummonFlower", 1;
+ mes "Worried about what will shift from the astral plane this time, you prepare yourself and put the flower in place.";
+ mes "As expected, you feel the magical tension building up. They're coming.";
+ OrumQuest = 27;
+ close2;
+ areamonster "055-1", 133, 87, 144, 99, "", 1105, 1, "#FlowerPentagram4::OnSquirrelDeath";
+ areamonster "055-1", 133, 87, 144, 99, "", 1106, 1, "#FlowerPentagram4::OnMushroomDeath";
+ areamonster "055-1", 133, 87, 144, 99, "", 1107, 2, "#FlowerPentagram4::OnBlueparDeath";
+ areamonster "055-1", 133, 87, 144, 99, "", 1104, 2, "#FlowerPentagram4::OnMoubooDeath";
+ areamonster "055-1", 133, 87, 144, 99, "", 1003, 2, "#FlowerPentagram4::OnScorpionDeath";
+ areamonster "055-1", 133, 87, 144, 99, "", 1004, 2, "#FlowerPentagram4::OnRScorpionDeath";
+ areamonster "055-1", 133, 87, 144, 99, "", 1057, 2, "#FlowerPentagram4::OnAScorpionDeath";
+ areamonster "055-1", 133, 87, 144, 99, "", 1009, 1, "#FlowerPentagram4::OnBScorpionDeath";
+ @value = 15;
+ callfunc "QuestSagathaAnnoy";
+ @value = 0;
+ end;
+
+OnSquirrelDeath:
+ fix_mobkill(1105);
+ end;
+
+OnMushroomDeath:
+ fix_mobkill(1106);
+ end;
+
+OnBlueparDeath:
+ fix_mobkill(1107);
+ end;
+
+OnMoubooDeath:
+ fix_mobkill(1104);
+ end;
+
+OnScorpionDeath:
+ fix_mobkill(1003);
+ end;
+
+OnRScorpionDeath:
+ fix_mobkill(1004);
+ end;
+
+OnAScorpionDeath:
+ fix_mobkill(1057);
+ end;
+
+OnBScorpionDeath:
+ fix_mobkill(1009);
+ end;
+
+L_MonstersAlive:
+ mes "As you get closer to the place, you feel an unnerving presence.";
+ mes "This place has recently been used to summon something! And the beings are still nearby!";
+ next;
+ mes "You should get rid of them before attempting the summoning yourself.";
+ goto L_close;
+
+L_NoFlower:
+ mes "You search your belongings for the magical flower. Where is it?";
+ mes "If you lost it, you should talk to Orum again.";
+ goto L_close;
+
+L_PlacedFourthFlower:
+ mes "You placed the fourth of Orum's magical flowers here.";
+ mes "You can still feel the magical power shimmering around this place, waiting to be unleashed.";
+ goto L_close;
+
+L_PlacedFifthFlower:
+ mes "This is where you placed the fourth of Orum's magical flowers.";
+ mes "However, now that the summoning spell has been cast, everything is back to normal here.";
+ goto L_close;
+
+L_close:
+ @localMonsterCount = 0;
+ close;
+}
diff --git a/npc/055-1/mapflags.txt b/npc/055-1/mapflags.txt
new file mode 100644
index 00000000..e47dd41a
--- /dev/null
+++ b/npc/055-1/mapflags.txt
@@ -0,0 +1 @@
+//055-1 mapflag resave 055-1,133,61
diff --git a/npc/055-1/pumpkins.txt b/npc/055-1/pumpkins.txt
new file mode 100644
index 00000000..d008d389
--- /dev/null
+++ b/npc/055-1/pumpkins.txt
@@ -0,0 +1,147 @@
+055-1,0,0,0 script _N-Pumpkin NPC32767,{
+ close;
+ /*
+ set @distance_handler, 1; // silent
+ set @npc_distance, (1-2); // -1 means attack range
+ callfunc "PCtoNPCRange";
+ if (@npc_check) end;
+
+ if (Quest_Halloween != 1 || !(gettime(6) == 11 && (gettime(5) >= 4 && gettime(5) <= 30)))
+ goto L_HeavyPoison;
+ if (@discover_poisonous_pumpkin == 0)
+ message strcharinfo(0), "Pumpkin : Yuke, this pumpkin released some ugly poison gas!";
+ @discover_poisonous_pumpkin = 1;
+ misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
+ heal -15, 0;
+ sc_start SC_POISON, 1, 4;
+ if (rand(0,100) < 10)
+ getitem "PumpkinSeeds", 1;
+
+ if (countitem("PumpkinSeeds") >= $@halloween_num_seeds)
+ goto L_EnoughSeeds;
+
+ fix_mobkill(1063);
+ goto L_Destroy;
+
+L_EnoughSeeds:
+ 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...";
+ Quest_Halloween = 2;
+ // Reset this to get the message for the "heavy" poison
+ @discover_poisonous_pumpkin = 0;
+ goto L_Destroy;
+
+L_HeavyPoison:
+ if (@discover_poisonous_pumpkin == 0)
+ goto L_HeavyPoison0;
+ if (@discover_poisonous_pumpkin == 1)
+ goto L_HeavyPoison1;
+ goto L_HeavyPoison2;
+
+L_HeavyPoison0:
+ @discover_poisonous_pumpkin = @discover_poisonous_pumpkin + 1;
+ 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;
+ goto L_Destroy;
+
+L_HeavyPoison1:
+ @discover_poisonous_pumpkin = @discover_poisonous_pumpkin + 1;
+ 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;
+ goto L_Destroy;
+
+L_HeavyPoison2:
+ @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
+ sleep(.death_t);
+ set(getvariableofnpc(.nodes[.i], "_N-Pumpkin"), get(.nodes[.i], "_N-Pumpkin") - 1); // tell the puppeteer we lost an egg
+ destroy;
+
+
+
+S_MakeNode:
+ set .nID, .nID + 1; // give the node an id
+ .@name$ = "#_Pkin" + chr(3) + .nID;
+ if (.nID == 2147483647)
+ set .nID, 0; // start over if id = 0x7FFFFFFF
+ goto S_FindXY;
+
+S_FindXY:
+ .@x = rand(.x1[.i], .x2[.i]);
+ .@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)
+ if (.@p < 1) goto S_MakeNode; // silently retry
+ 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
+ .nodes[.i] = .nodes[.i] + 1;
+ return;
+
+S_IterateObjects:
+ if (.min_nodes[.i] == 0)
+ .min_nodes[.i] = (.min * min(1, ((.x2[.i] - .x1[.i]) * (.y2[.i] - .y1[.i])) / .divisor));
+ if (.max_nodes[.i] == 0)
+ .max_nodes[.i] = (.max * max(1, ((.x2[.i] - .x1[.i]) * (.y2[.i] - .y1[.i])) / .divisor));
+
+ if (.nodes[.i] >= .max_nodes[.i])
+ goto S_NextObject;
+
+ 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:
+ .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;
+ .started = 1;
+ addnpctimer 10000, strnpcinfo(0)+"::OnHeartbeat"; // first heartbeat
+ end;
+ */
+}
diff --git a/npc/055-1/traveler.txt b/npc/055-1/traveler.txt
new file mode 100644
index 00000000..14c798ec
--- /dev/null
+++ b/npc/055-1/traveler.txt
@@ -0,0 +1,7 @@
+
+055-1,135,60,0 script Sherman the Traveler NPC103,{
+ @npcname$ = "Sherman";
+ @NpcTravelBit = $@hurns_farms_bit;
+ callfunc "Traveler";
+ end;
+}
diff --git a/npc/055-3/_import.txt b/npc/055-3/_import.txt
new file mode 100644
index 00000000..a39a581e
--- /dev/null
+++ b/npc/055-3/_import.txt
@@ -0,0 +1,5 @@
+// Map 055-3: Cave
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/055-3/_mobs.txt",
+"npc/055-3/_warps.txt",
+"npc/055-3/mapflags.txt",
diff --git a/npc/055-3/_mobs.txt b/npc/055-3/_mobs.txt
new file mode 100644
index 00000000..51713aa1
--- /dev/null
+++ b/npc/055-3/_mobs.txt
@@ -0,0 +1,10 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 055-3: Cave mobs
+055-3,45,44,10,7 monster Red Slime 1008,10,10000,60000
+055-3,0,0,0,0 monster Bat 1017,20,10000,45000
+055-3,53,75,14,20 monster Yellow Slime 1007,10,10000,60000
+055-3,0,0,0,0 monster Black Scorpion 1009,8,10000,35000
+055-3,0,0,0,0 monster Spider 1012,8,10000,35000
+055-3,0,0,0,0 monster Snake 1010,3,10000,20000
+055-3,46,44,7,9 monster Spider 1012,3,50000,100000
+055-3,52,78,18,11 monster Black Scorpion 1009,3,50000,100000
diff --git a/npc/055-3/_warps.txt b/npc/055-3/_warps.txt
new file mode 100644
index 00000000..826c4977
--- /dev/null
+++ b/npc/055-3/_warps.txt
@@ -0,0 +1,8 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 055-3: Cave warps
+055-3,77,40,0 warp #055-3_77_40 1,0,055-1,137,97
+055-3,30,26,0 warp #055-3_30_26 0,0,055-1,100,82
+055-3,50,43,0 warp #055-3_50_43 0,0,055-1,100,90
+055-3,96,71,0 warp #055-3_96_71 1,0,055-1,60,94
+055-3,58,96,0 warp #055-3_58_96 1,0,055-3,98,115
+055-3,98,114,0 warp #055-3_98_114 0,0,055-3,57,95
diff --git a/npc/055-3/mapflags.txt b/npc/055-3/mapflags.txt
new file mode 100644
index 00000000..11160b5f
--- /dev/null
+++ b/npc/055-3/mapflags.txt
@@ -0,0 +1 @@
+//055-3 mapflag resave 055-1,133,61
diff --git a/npc/056-2/_import.txt b/npc/056-2/_import.txt
new file mode 100644
index 00000000..0fed9acb
--- /dev/null
+++ b/npc/056-2/_import.txt
@@ -0,0 +1,7 @@
+// Map 056-2: Mirak's House
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/056-2/_warps.txt",
+"npc/056-2/barrier.txt",
+"npc/056-2/mapflags.txt",
+"npc/056-2/mirak.txt",
+"npc/056-2/notes.txt",
diff --git a/npc/056-2/_warps.txt b/npc/056-2/_warps.txt
new file mode 100644
index 00000000..c83522db
--- /dev/null
+++ b/npc/056-2/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 056-2: Mirak's House warps
+056-2,63,34,0 warp #056-2_63_34 0,0,056-2,23,32
+056-2,35,30,0 warp #056-2_35_30 0,0,017-1,169,90
diff --git a/npc/056-2/barrier.txt b/npc/056-2/barrier.txt
new file mode 100644
index 00000000..f6759e3a
--- /dev/null
+++ b/npc/056-2/barrier.txt
@@ -0,0 +1,17 @@
+056-2,23,33,0 script #Barrier NPC45,0,0,{
+ if (Mirak_Bantime > gettimetick(2))
+ goto L_Block;
+ if (BaseLevel < 25)
+ goto L_Weak;
+ warp "056-2", 63, 35;
+ end;
+
+L_Block:
+ message strcharinfo(0), "I can't enter.... That old man really made sure that I wouldn't be able to bother him again anytime soon.";
+ end;
+
+L_Weak:
+ message strcharinfo(0), "I can't enter because this magic field is too strong. Maybe I should train some more....";
+ end;
+
+}
diff --git a/npc/056-2/mapflags.txt b/npc/056-2/mapflags.txt
new file mode 100644
index 00000000..5bfaa624
--- /dev/null
+++ b/npc/056-2/mapflags.txt
@@ -0,0 +1,2 @@
+056-2 mapflag nosave 017-1,107,70
+//056-2 mapflag resave 017-1,107,70
diff --git a/npc/056-2/mirak.txt b/npc/056-2/mirak.txt
new file mode 100644
index 00000000..d24b3ec1
--- /dev/null
+++ b/npc/056-2/mirak.txt
@@ -0,0 +1,139 @@
+056-2,67,24,0 script Mirak NPC372,{
+
+ callfunc "DailyQuestPointsFunc";
+
+ @Mirak_MASK = NIBBLE_0_MASK;
+ @Mirak_SHIFT = NIBBLE_0_SHIFT;
+
+ @talk = ((QUEST_Mirak & @Mirak_MASK) >> @Mirak_SHIFT);
+
+ @Mirak_Annoy_MASK = NIBBLE_1_MASK;
+ @Mirak_Annoy_SHIFT = NIBBLE_1_SHIFT;
+
+ @annoy = ((QUEST_Mirak & @Mirak_Annoy_MASK) >> @Mirak_Annoy_SHIFT);
+
+
+ if (Mirak_Questtime > gettimetick(2))
+ goto L_TooSoon;
+ if (@annoy > 3)
+ goto L_Kill;
+ if (Mirak_Bantime > gettimetick(2))
+ goto L_Ban;
+ if (@talk < 3)
+ goto L_Talk;
+ goto L_Ban;
+
+L_Ban:
+ mes "[Mirak]";
+ mes "\"How did you get back here?\"";
+ goto L_Kill;
+
+L_Talk:
+ Mirak_Bantime = 0;
+ Mirak_Questtime = 0;
+ if (@talk == 1)
+ goto L_Talk1;
+ if (@talk == 2)
+ goto L_Talk2;
+ mes "The old man reads a book and looks up when he sees you coming.";
+ mes "He looks at you angrily.";
+ next;
+ mes "[Mirak]";
+ mes "\"Hi, my name is Mirak. You might have the impression that I am nice, but I am NOT! I want to be left alone to read in peace! I tried that at my mansion in Port City but it did not work. My damn brother, he always kept going on about Bat Wings...\"";
+ next;
+ mes "Suddenly his face gets red. He breathes slowly three times...";
+ next;
+ mes "He seems to be calm again.";
+ next;
+ mes "[Mirak]";
+ mes "\"Eh... Ah! That's why I bought this house in this goddamn woods. I hoped nobody would come by here. It seems I was wrong. I believe that you did not read the notes I left behind. Read them on your way out.\"";
+ mes "He looks down on his book and ignores you.";
+ @talk = 1;
+ callsub S_Update_Mask;
+ close;
+
+L_Talk1:
+ mes "[Mirak]";
+ mes "\"What?! You again? Get going!\"";
+ @talk = 2;
+ callsub S_Update_Mask;
+ close;
+
+L_Talk2:
+ mes "[Mirak]";
+ mes "\"What do you want?!\"";
+ menu
+ "Nothing.", L_Nothing,
+ "Money!", L_Quest;
+
+L_Nothing:
+ mes "[Mirak]";
+ mes "\"Ahhhh! Get lost, or you'll regret it!\"";
+ @annoy = @annoy+1;
+ callsub S_Update_Mask_Annoy;
+ close;
+
+L_Quest:
+ @dq_cost = DailyQuestPoints;
+ @dq_money = 20;
+ @dq_exp = 20;
+ mes "[Mirak]";
+ mes "\"If you have some energy left, which I need, I can give you money for it. But only if you will leave me alone!\"";
+ menu
+ "Okay.", L_Trade,
+ "Nah, I won't leave you alone.", L_Kill;
+
+L_TooSoon:
+ mes "Mirak looks up, sees you, and gets angry.";
+ mes "[Mirak]";
+ mes "\"I told you not to bother me again! That's why I paid you!\"";
+ goto L_Kill;
+
+L_Kill:
+ misceffect sfx_magic_war, strcharinfo(0);
+ heal -Hp, 0;
+ @annoy = 0;
+ callsub S_Update_Mask_Annoy;
+ Mirak_Bantime = gettimetick(2) + 86400;
+ Mirak_Questtime = 0;
+ mes "The old man stands up and looks at you angrier than ever. He mumbles something and your head explodes.";
+ next;
+ mes "[Mirak]";
+ mes "\"That's what you get for annoying me! I studied under the Mages of Tulimshar!";
+ mes "I feel better now.\"";
+ next;
+ mes "The old man sits back down and continues to read.";
+ close;
+
+L_Trade:
+ if (DailyQuestPoints == 0)
+ goto L_NoPoints;
+ Zeny = Zeny + (@dq_money * @dq_cost);
+ getexp @dq_exp * @dq_cost, 0;
+ DailyQuestPoints = DailyQuestPoints - @dq_cost;
+
+ mes "[" + @dq_money * @dq_cost + " money]";
+ mes "[" + @dq_exp * @dq_cost + " experience points]";
+ mes "\"Now leave or you'll regret it. Don't come back!\"";
+ Mirak_Questtime = gettimetick(2) + 86400;
+ Mirak_Bantime = 0;
+ close;
+
+L_NoPoints:
+ mes "[Mirak]";
+ mes "\"Why do you bother me!? You have no energy left!\"";
+ goto L_Kill;
+
+
+S_Update_Mask_Annoy:
+ set QUEST_Mirak,
+ (QUEST_Mirak & ~(@Mirak_Annoy_MASK))
+ | (@annoy << @Mirak_Annoy_SHIFT);
+ return;
+
+S_Update_Mask:
+ set QUEST_Mirak,
+ (QUEST_Mirak & ~(@Mirak_MASK))
+ | (@talk << @Mirak_SHIFT);
+ return;
+}
diff --git a/npc/056-2/notes.txt b/npc/056-2/notes.txt
new file mode 100644
index 00000000..091ffd73
--- /dev/null
+++ b/npc/056-2/notes.txt
@@ -0,0 +1,13 @@
+056-2,77,34,0 script Warning#mirak NPC400,{
+ mes "Turn around. Do not come any closer!";
+ mes "Go back upstairs and leave! I don't want to see anybody!";
+ mes "This is the last warning!";
+ mes "- Mirak";
+ close;
+}
+056-2,29,30,0 script Note#mirak NPC400,{
+ mes "DO NOT GO ANY FURTHER!";
+ mes "Put the supplies on the table and do not come downstairs. I don't want to be bothered.";
+ mes "- Mirak";
+ close;
+}
diff --git a/npc/057-1/_import.txt b/npc/057-1/_import.txt
new file mode 100644
index 00000000..38f606e6
--- /dev/null
+++ b/npc/057-1/_import.txt
@@ -0,0 +1,5 @@
+// Map 057-1: Woodland
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/057-1/_mobs.txt",
+"npc/057-1/_warps.txt",
+"npc/057-1/mapflags.txt",
diff --git a/npc/057-1/_mobs.txt b/npc/057-1/_mobs.txt
new file mode 100644
index 00000000..cd006618
--- /dev/null
+++ b/npc/057-1/_mobs.txt
@@ -0,0 +1,20 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 057-1: Woodland mobs
+057-1,0,0,0,0 monster Mauve Plant 1029,5,45000,45000
+057-1,0,0,0,0 monster Cobalt Plant 1030,3,10000,65000
+057-1,0,0,0,0 monster Gamboge Plant 1031,5,10000,45000
+057-1,0,0,0,0 monster Alizarin Plant 1032,7,10000,70000
+057-1,0,0,0,0 monster Mouboo 1028,14,10000,45000
+057-1,95,42,14,4 monster Butterfly 1055,3,10000,40000
+057-1,25,48,5,23 monster Silkworm 1035,7,10000,15000
+057-1,99,40,11,8 monster Pink Flower 1014,2,10000,45000
+057-1,100,30,9,5 monster Butterfly 1055,2,10000,40000
+057-1,83,64,6,6 monster Butterfly 1055,2,10000,40000
+057-1,59,34,4,5 monster Butterfly 1055,2,10000,40000
+057-1,32,45,4,5 monster Butterfly 1055,2,10000,40000
+057-1,144,35,6,6 monster Butterfly 1055,2,10000,40000
+057-1,104,67,6,5 monster Pink Flower 1014,2,10000,45000
+057-1,135,53,6,5 monster Pink Flower 1014,2,10000,45000
+057-1,0,0,0,0 monster Spiky Mushroom 1019,10,10000,45000
+057-1,0,0,0,0 monster Clover Patch 1037,3,10000,180000
+057-1,27,46,7,26 monster Squirrel 1038,6,10000,50000
diff --git a/npc/057-1/_warps.txt b/npc/057-1/_warps.txt
new file mode 100644
index 00000000..4571efd2
--- /dev/null
+++ b/npc/057-1/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 057-1: Woodland warps
+057-1,19,63,0 warp #057-1_19_63 0,2,055-1,148,63
diff --git a/npc/057-1/mapflags.txt b/npc/057-1/mapflags.txt
new file mode 100644
index 00000000..33c0165b
--- /dev/null
+++ b/npc/057-1/mapflags.txt
@@ -0,0 +1 @@
+//057-1 mapflag resave 055-1,133,61
diff --git a/npc/069-2/_import.txt b/npc/069-2/_import.txt
new file mode 100644
index 00000000..b225a413
--- /dev/null
+++ b/npc/069-2/_import.txt
@@ -0,0 +1,3 @@
+// Map 069-2: Celestia's Hideout
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/069-2/_warps.txt",
diff --git a/npc/069-2/_warps.txt b/npc/069-2/_warps.txt
new file mode 100644
index 00000000..1b10167c
--- /dev/null
+++ b/npc/069-2/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 069-2: Celestia's Hideout warps
+069-2,45,83,0 warp #069-2_45_83 3,0,069-2,106,116
+069-2,107,117,0 warp #069-2_107_117 3,0,069-2,44,84
diff --git a/npc/070-1/_import.txt b/npc/070-1/_import.txt
new file mode 100644
index 00000000..2a44f7d7
--- /dev/null
+++ b/npc/070-1/_import.txt
@@ -0,0 +1,3 @@
+// Map 070-1: Underworld
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/070-1/mapflags.txt",
diff --git a/npc/070-1/mapflags.txt b/npc/070-1/mapflags.txt
new file mode 100644
index 00000000..fb393c84
--- /dev/null
+++ b/npc/070-1/mapflags.txt
@@ -0,0 +1 @@
+070-1 mapflag mask 17
diff --git a/npc/070-3/_import.txt b/npc/070-3/_import.txt
new file mode 100644
index 00000000..ebe4b06e
--- /dev/null
+++ b/npc/070-3/_import.txt
@@ -0,0 +1,2 @@
+// Map 070-3: The Abyss
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
diff --git a/npc/099-1/_import.txt b/npc/099-1/_import.txt
new file mode 100644
index 00000000..9448a625
--- /dev/null
+++ b/npc/099-1/_import.txt
@@ -0,0 +1,3 @@
+// Map 099-1: Keshlam's Adventurer's Guild
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/099-1/_warps.txt",
diff --git a/npc/099-1/_warps.txt b/npc/099-1/_warps.txt
new file mode 100644
index 00000000..1416158a
--- /dev/null
+++ b/npc/099-1/_warps.txt
@@ -0,0 +1,67 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 099-1: Keshlam's Adventurer's Guild warps
+099-1,49,30,0 warp #099-1_49_30 0,0,099-2,45,27
+099-1,97,30,0 warp #099-1_97_30 0,0,099-2,79,36
+099-1,125,22,0 warp #099-1_125_22 0,0,099-2,110,36
+099-1,111,150,0 warp #099-1_111_150 0,0,099-2,141,36
+099-1,40,129,0 warp #099-1_40_129 0,0,099-2,45,64
+099-1,117,99,0 warp #099-1_117_99 0,0,099-2,79,64
+099-1,139,131,0 warp #099-1_139_131 0,0,099-3,92,41
+099-1,132,140,0 warp #099-1_132_140 0,0,099-2,111,64
+099-1,84,128,0 warp #099-1_84_128 0,0,099-2,141,64
+099-1,84,86,0 warp #099-1_84_86 0,0,099-2,45,90
+099-1,62,65,0 warp #099-1_62_65 0,0,099-2,79,90
+099-1,112,58,0 warp #099-1_112_58 0,0,099-2,111,90
+099-1,35,91,0 warp #099-1_35_91 0,0,099-2,141,90
+099-1,62,139,0 warp #099-1_62_139 0,0,099-2,45,116
+099-1,133,75,0 warp #099-1_133_75 0,0,099-2,80,116
+099-1,151,95,0 warp #099-1_151_95 0,0,099-2,111,116
+099-1,92,72,0 warp #099-1_92_72 0,0,099-2,141,116
+099-1,67,106,0 warp #099-1_67_106 0,0,099-2,46,147
+099-1,122,38,0 warp #099-1_122_38 0,0,099-2,80,147
+099-1,140,58,0 warp #099-1_140_58 0,0,099-2,112,147
+099-1,117,119,0 warp #099-1_117_119 0,0,099-2,141,147
+099-1,68,30,0 warp #099-1_68_30 0,0,099-3,49,78
+099-1,96,39,0 warp #099-1_96_39 0,0,099-3,55,78
+099-1,148,31,0 warp #099-1_148_31 0,0,099-3,61,78
+099-1,130,61,0 warp #099-1_130_61 0,0,099-3,67,78
+099-1,140,92,0 warp #099-1_140_92 0,0,099-3,73,78
+099-1,133,111,0 warp #099-1_133_111 0,0,099-3,79,78
+099-1,145,111,0 warp #099-1_145_111 0,0,099-3,99,78
+099-1,80,106,0 warp #099-1_80_106 0,0,099-3,105,78
+099-1,40,68,0 warp #099-1_40_68 0,0,099-3,111,78
+099-1,34,71,0 warp #099-1_34_71 0,0,099-3,117,78
+099-1,42,84,0 warp #099-1_42_84 0,0,099-3,123,78
+099-1,39,107,0 warp #099-1_39_107 0,0,099-3,129,78
+099-1,77,65,0 warp #099-1_77_65 0,0,099-3,135,78
+099-1,148,58,0 warp #099-1_148_58 0,0,099-1,55,45
+099-1,41,30,0 warp #099-1_41_30 0,0,099-6,141,147
+099-1,59,30,0 warp #099-1_59_30 0,0,099-1,55,45
+099-1,78,30,0 warp #099-1_78_30 0,0,099-6,112,147
+099-1,87,30,0 warp #099-1_87_30 0,0,099-1,55,45
+099-1,105,30,0 warp #099-1_105_30 0,0,099-6,79,36
+099-1,117,22,0 warp #099-1_117_22 0,0,099-1,55,45
+099-1,117,45,0 warp #099-1_117_45 0,0,099-6,46,147
+099-1,124,45,0 warp #099-1_124_45 0,0,099-6,110,36
+099-1,128,38,0 warp #099-1_128_38 0,0,099-6,141,116
+099-1,119,58,0 warp #099-1_119_58 0,0,099-1,55,45
+099-1,102,58,0 warp #099-1_102_58 0,0,099-6,111,116
+099-1,102,39,0 warp #099-1_102_39 0,0,099-1,55,45
+099-1,89,39,0 warp #099-1_89_39 0,0,099-6,80,147
+099-1,115,75,0 warp #099-1_115_75 0,0,099-6,80,116
+099-1,98,72,0 warp #099-1_98_72 0,0,099-6,45,37
+099-1,86,72,0 warp #099-1_86_72 0,0,099-6,45,116
+099-1,125,75,0 warp #099-1_125_75 0,0,099-1,55,45
+099-1,70,65,0 warp #099-1_70_65 0,0,099-1,55,45
+099-1,54,65,0 warp #099-1_54_65 0,0,099-6,141,90
+099-1,47,65,0 warp #099-1_47_65 0,0,099-6,111,90
+099-1,45,94,0 warp #099-1_45_94 0,0,099-6,79,90
+099-1,60,118,0 warp #099-1_60_118 0,0,099-6,45,90
+099-1,49,129,0 warp #099-1_49_129 0,0,099-1,55,45
+099-1,49,150,0 warp #099-1_49_150 0,0,099-6,141,63
+099-1,78,143,0 warp #099-1_78_143 0,0,099-6,111,64
+099-1,104,131,0 warp #099-1_104_131 0,0,099-6,79,64
+099-1,145,140,0 warp #099-1_145_140 0,0,099-1,55,45
+099-1,103,119,0 warp #099-1_103_119 0,0,099-6,45,64
+099-1,108,102,0 warp #099-1_108_102 0,0,099-1,55,45
+099-1,99,86,0 warp #099-1_99_86 0,0,099-6,141,36
diff --git a/npc/099-2/_import.txt b/npc/099-2/_import.txt
new file mode 100644
index 00000000..99cc03a3
--- /dev/null
+++ b/npc/099-2/_import.txt
@@ -0,0 +1,3 @@
+// Map 099-2: Keshlam's Adventurer's Guild Quarters
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/099-2/_warps.txt",
diff --git a/npc/099-2/_warps.txt b/npc/099-2/_warps.txt
new file mode 100644
index 00000000..d6630c33
--- /dev/null
+++ b/npc/099-2/_warps.txt
@@ -0,0 +1,22 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 099-2: Keshlam's Adventurer's Guild Quarters warps
+099-2,45,38,0 warp #099-2_45_38 0,0,099-1,49,32
+099-2,79,37,0 warp #099-2_79_37 0,0,099-1,97,32
+099-2,110,37,0 warp #099-2_110_37 0,0,099-1,125,24
+099-2,141,37,0 warp #099-2_141_37 0,0,099-1,111,152
+099-2,45,65,0 warp #099-2_45_65 0,0,099-1,40,131
+099-2,79,65,0 warp #099-2_79_65 0,0,099-1,117,101
+099-2,111,65,0 warp #099-2_111_65 0,0,099-1,132,142
+099-2,141,64,0 warp #099-2_141_64 0,0,099-1,84,130
+099-2,45,91,0 warp #099-2_45_91 0,0,099-1,84,88
+099-2,79,91,0 warp #099-2_79_91 0,0,099-1,62,67
+099-2,111,91,0 warp #099-2_111_91 0,0,099-1,112,60
+099-2,141,91,0 warp #099-2_141_91 0,0,099-1,35,93
+099-2,45,117,0 warp #099-2_45_117 0,0,099-1,69,145
+099-2,80,117,0 warp #099-2_80_117 0,0,099-1,133,77
+099-2,111,117,0 warp #099-2_111_117 0,0,099-1,151,94
+099-2,141,117,0 warp #099-2_141_117 0,0,099-1,92,74
+099-2,46,148,0 warp #099-2_46_148 0,0,099-1,67,108
+099-2,80,148,0 warp #099-2_80_148 0,0,099-1,122,40
+099-2,112,148,0 warp #099-2_112_148 0,0,099-1,140,60
+099-2,141,148,0 warp #099-2_141_148 0,0,099-1,117,121
diff --git a/npc/099-3/_import.txt b/npc/099-3/_import.txt
new file mode 100644
index 00000000..24ad4ebf
--- /dev/null
+++ b/npc/099-3/_import.txt
@@ -0,0 +1,3 @@
+// Map 099-3: Keshlam's Adventurer's Guild Basement
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/099-3/_warps.txt",
diff --git a/npc/099-3/_warps.txt b/npc/099-3/_warps.txt
new file mode 100644
index 00000000..1396e822
--- /dev/null
+++ b/npc/099-3/_warps.txt
@@ -0,0 +1,16 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 099-3: Keshlam's Adventurer's Guild Basement warps
+099-3,72,25,0 warp #099-3_72_25 0,0,099-1,119,115
+099-3,29,61,0 warp #099-3_29_61 0,0,099-1,48,17
+099-3,35,61,0 warp #099-3_35_61 0,0,099-1,76,26
+099-3,41,61,0 warp #099-3_41_61 0,0,099-1,128,18
+099-3,47,61,0 warp #099-3_47_61 0,0,099-1,110,45
+099-3,53,61,0 warp #099-3_53_61 0,0,099-1,120,79
+099-3,59,61,0 warp #099-3_59_61 0,0,099-1,113,98
+099-3,79,61,0 warp #099-3_79_61 0,0,099-1,125,98
+099-3,85,61,0 warp #099-3_85_61 0,0,099-1,60,93
+099-3,91,61,0 warp #099-3_91_61 0,0,099-1,20,55
+099-3,97,61,0 warp #099-3_97_61 0,0,099-1,14,55
+099-3,103,61,0 warp #099-3_103_61 0,0,099-1,15,68
+099-3,109,61,0 warp #099-3_109_61 0,0,099-1,19,94
+099-3,115,61,0 warp #099-3_115_61 0,0,099-1,57,52
diff --git a/npc/099-4/_import.txt b/npc/099-4/_import.txt
new file mode 100644
index 00000000..d37bbba0
--- /dev/null
+++ b/npc/099-4/_import.txt
@@ -0,0 +1,2 @@
+// Map 099-4: ?????
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
diff --git a/npc/099-5/_import.txt b/npc/099-5/_import.txt
new file mode 100644
index 00000000..9276a379
--- /dev/null
+++ b/npc/099-5/_import.txt
@@ -0,0 +1,3 @@
+// Map 099-5: ?????
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/099-5/mapflag.txt",
diff --git a/npc/099-5/mapflag.txt b/npc/099-5/mapflag.txt
new file mode 100644
index 00000000..df97cc7c
--- /dev/null
+++ b/npc/099-5/mapflag.txt
@@ -0,0 +1,2 @@
+099-5 mapflag zone MMO
+099-6 mapflag zone MMO
diff --git a/npc/099-6/_import.txt b/npc/099-6/_import.txt
new file mode 100644
index 00000000..dc737d61
--- /dev/null
+++ b/npc/099-6/_import.txt
@@ -0,0 +1,3 @@
+// Map 099-6: Keshlam's Adventurer's Guild Quarters
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/099-6/_warps.txt",
diff --git a/npc/099-6/_warps.txt b/npc/099-6/_warps.txt
new file mode 100644
index 00000000..066fcd62
--- /dev/null
+++ b/npc/099-6/_warps.txt
@@ -0,0 +1,22 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 099-6: Keshlam's Adventurer's Guild Quarters warps
+099-6,45,38,0 warp #099-6_45_38 0,0,099-1,49,32
+099-6,79,37,0 warp #099-6_79_37 0,0,099-1,97,32
+099-6,110,37,0 warp #099-6_110_37 0,0,099-1,125,24
+099-6,141,37,0 warp #099-6_141_37 0,0,099-1,111,152
+099-6,45,65,0 warp #099-6_45_65 0,0,099-1,40,131
+099-6,79,65,0 warp #099-6_79_65 0,0,099-1,117,101
+099-6,111,65,0 warp #099-6_111_65 0,0,099-1,132,142
+099-6,141,64,0 warp #099-6_141_64 0,0,099-1,84,130
+099-6,45,91,0 warp #099-6_45_91 0,0,099-1,84,88
+099-6,79,91,0 warp #099-6_79_91 0,0,099-1,62,67
+099-6,111,91,0 warp #099-6_111_91 0,0,099-1,112,60
+099-6,141,91,0 warp #099-6_141_91 0,0,099-1,54,67
+099-6,45,117,0 warp #099-6_45_117 0,0,099-1,69,145
+099-6,80,117,0 warp #099-6_80_117 0,0,099-1,133,77
+099-6,111,117,0 warp #099-6_111_117 0,0,099-1,151,94
+099-6,141,117,0 warp #099-6_141_117 0,0,099-1,92,74
+099-6,46,148,0 warp #099-6_46_148 0,0,099-1,67,108
+099-6,80,148,0 warp #099-6_80_148 0,0,099-1,122,40
+099-6,112,148,0 warp #099-6_112_148 0,0,099-1,140,60
+099-6,141,148,0 warp #099-6_141_148 0,0,099-1,117,121
diff --git a/npc/099-7/_import.txt b/npc/099-7/_import.txt
new file mode 100644
index 00000000..998db4ea
--- /dev/null
+++ b/npc/099-7/_import.txt
@@ -0,0 +1,4 @@
+// Map 099-7: Ruined Swamps
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/099-7/boss.txt",
+"npc/099-7/cronos.txt",
diff --git a/npc/099-7/boss.txt b/npc/099-7/boss.txt
new file mode 100644
index 00000000..6afbf37c
--- /dev/null
+++ b/npc/099-7/boss.txt
@@ -0,0 +1,743 @@
+
+027-4,105,61,0 script #KeshlamClue701 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "In memory of the left handed singer";
+ if (#CRYPT_PASSWORD & 1) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At south a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+}
+
+027-4,91,61,0 script #KeshlamClue702 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "In memory of the left handed lone warrior";
+ if (#CRYPT_PASSWORD & 1) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At southwest a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At southeast a bright sparks.";
+ close;
+}
+
+027-4,99,61,0 script #KeshlamClue703 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "In memory of the left handed sailor";
+ if (#CRYPT_PASSWORD & 1) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At northwest a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At south a bright sparks.";
+ close;
+}
+
+027-4,121,61,0 script #KeshlamClue704 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "In memory of the left handed gargoyle";
+ if (#CRYPT_PASSWORD & 2) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At southwest a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At southeast a bright sparks.";
+ close;
+}
+
+
+
+027-3,105,88,0 script #KeshlamClue705 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 4) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At northwest a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At south a bright sparks.";
+ close;
+}
+
+027-3,111,88,0 script #KeshlamClue706 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 4) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At southwest a bright sparks.";
+ close;
+}
+
+
+
+
+027-3,105,83,0 script #KeshlamClue707 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 4) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At north a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At west a bright sparks.";
+ close;
+}
+
+027-3,111,83,0 script #KeshlamClue708 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 8) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At east a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At north a bright sparks.";
+ close;
+}
+
+
+
+027-3,105,78,0 script #KeshlamClue709 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 8) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At southeast a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At northwest a bright sparks.";
+ close;
+}
+
+027-3,111,78,0 script #KeshlamClue710 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 8) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At southwest a bright sparks.";
+ close;
+}
+
+
+
+027-3,105,73,0 script #KeshlamClue711 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 8) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At north a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At west a bright sparks.";
+ close;
+}
+
+027-3,111,73,0 script #KeshlamClue712 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 16) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At east a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At north a bright sparks.";
+ close;
+}
+
+
+
+027-3,106,59,0 script #KeshlamClue713 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 16) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At southeast a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At northwest a bright sparks.";
+ close;
+}
+
+027-3,111,59,0 script #KeshlamClue714 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 16) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At south a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+}
+
+
+
+027-3,106,54,0 script #KeshlamClue715 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 32) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At southwest a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At southeast a bright sparks.";
+ close;
+}
+
+027-3,111,54,0 script #KeshlamClue716 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 32) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At south a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+}
+
+027-4,111,61,0 script #KeshlamClue750 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "In memory of the right handed sailor";
+ if (#CRYPT_PASSWORD & 64) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At southwest a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At southeast a bright sparks.";
+ close;
+}
+
+027-4,108,61,0 script #KeshlamClue751 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "In memory of the right handed duo";
+ if (#CRYPT_PASSWORD & 64) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At south a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+}
+
+027-4,115,61,0 script #KeshlamClue752 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "In memory of the right handed Kage";
+ if (#CRYPT_PASSWORD & 128) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At northwest a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At south a bright sparks.";
+ close;
+}
+
+027-4,119,61,0 script #KeshlamClue753 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "In memory of the right handed lone warrior";
+ if (#CRYPT_PASSWORD & 128) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At southwest a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At southeast a bright sparks.";
+ close;
+}
+
+
+
+027-3,118,88,0 script #KeshlamClue754 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 256) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At northwest a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At south a bright sparks.";
+ close;
+}
+
+027-3,124,88,0 script #KeshlamClue755 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 256) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At southwest a bright sparks.";
+ close;
+}
+
+
+
+027-3,118,83,0 script #KeshlamClue756 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 256) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At north a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At west a bright sparks.";
+ close;
+}
+
+027-3,124,83,0 script #KeshlamClue757 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 256) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At east a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At north a bright sparks.";
+ close;
+}
+
+
+
+027-3,118,78,0 script #KeshlamClue758 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 512) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At north a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At west a bright sparks.";
+ close;
+}
+
+027-3,124,78,0 script #KeshlamClue759 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 512) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At east a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At north a bright sparks.";
+ close;
+}
+
+
+
+027-3,118,73,0 script #KeshlamClue760 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 512) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At southwest a bright sparks.";
+ close;
+}
+
+027-3,124,73,0 script #KeshlamClue761 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 512) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At south a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+}
+
+
+
+027-3,117,59,0 script #KeshlamClue762 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 1024) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At south a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+}
+
+027-3,122,59,0 script #KeshlamClue763 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 1024) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At southeast a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At northwest a bright sparks.";
+ close;
+}
+
+
+
+027-3,117,54,0 script #KeshlamClue764 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 2048) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At south a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At northeast a bright sparks.";
+ close;
+}
+
+027-3,122,54,0 script #KeshlamClue765 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ if (#CRYPT_PASSWORD & 2048) goto L_On;
+ goto L_Off;
+
+L_On:
+ mes "A reading says: At southwest a bright sparks.";
+ close;
+
+L_Off:
+ mes "A reading says: At southeast a bright sparks.";
+ close;
+}
+
+027-5,68,94,0 script #KeshlamClue791 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "There's an inscription on the gate.";
+ next;
+ mes "\"Krukan reads from bottom up. Four clues.\"";
+ close;
+}
+
+027-5,68,87,0 script #KeshlamClue792 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "There's an inscription on the gate.";
+ next;
+ mes "\"The candle shall lit you, but if you mess up, a different light will show.";
+ mes "Alas did you knew, that Razha came before Krukan?\"";
+ close;
+}
+
+027-5,68,73,0 script #KeshlamClue793 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "There's an inscription on the gate.";
+ next;
+ mes "\"Razha likes to read from left to right. Two clues, Two clues.\"";
+ close;
+}
+
+027-5,68,59,0 script #KeshlamClue794 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "There's an inscription on the gate.";
+ next;
+ mes "\"The master's candlesticks are like the fingers of his hand.";
+ mes "And if it is not to kill, they will never move.\"";
+ close;
+}
+
+027-5,68,46,0 script #KeshlamClue795 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "There's a bloody inscription on the gate.";
+ next;
+ mes "\"##B"+"reapercry"+"##b\"";
+ learnskill SKILL_REAPERCRY, 1;
+ next;
+ mes "##9You hear the sounds of battle. Candle lights shines in distance.";
+ next;
+ mes "##9However, when you turn towards the source - both the light as the sound have already stopped.";
+ next;
+ mes "##9Is this a clue of some sort?";
+ close;
+}
+
+099-7,75,49,0 script Engraving#Keshlam NPC400,{
+ mes "There's an engraving on this tree.";
+ next;
+ if (countitem("FlawedLens") < 1) goto L_Tools;
+ mes "Thanks to the lens on your inventory, you can read this:";
+ mes "";
+ mes "\"Nu'rem perished here, after the fight with Jande, Tal and Di'Tal.";
+ mes "For this very reason, this land is plagued forever. We shall give Nu'Rem a proper burrial.\"";
+ next;
+ mes "-- The Sparron";
+ close;
+
+L_Tools:
+ mes "It is too faint to read without some good lens, but you can make the following words out of the engraving:";
+ next;
+ mes "\"Nu'rem .... here .... fight .... Jande ....";
+ mes ".... land .... plagued forever. .... Nu'Rem .... proper burrial.\"";
+ next;
+ mes "-- The ....";
+ close;
+}
+
+
+- script Keshlam NPC32767,{
+ close;
+
+OnInit:
+ areamonster "099-7", 20, 20, 120, 120, "", 1148, 10, "Keshlam::OnDeath8";
+ areamonster "099-7", 20, 20, 120, 120, "", 1149, 10, "Keshlam::OnDeath9";
+ monster "099-7", 20, 105, "Grim Reaper", 1068, 1, "Keshlam::OnBoss";
+ end;
+
+OnDeath8:
+OnDeath9:
+OnDeath:
+ // TODO: Only fire this if timer not running. Set timer to 5min
+ initnpctimer;
+ end;
+
+OnBoss:
+ initnpctimer;
+ if (playerattached()) {
+ // If a player is attached, give them 20 Treasure Keys
+ getitem TreasureKey, 20;
+ BOSS_POINTS+=10;
+ if (getq(Quest_Reapercry) < 3) {
+ dispbottom l("Somehow, it does not feel *right* - Maybe you need to perform some sort of ritual before defeating the Grim Reaper?");
+ } else if (getq(Quest_Reapercry) == 3) {
+ getitembound UnderworldKey, 1, 4;
+ setq Quest_Reapercry, 4;
+ dispbottom l("The Reaper drops a key - It might be valuable, so you keep it.");
+ } else {
+ dispbottom l("Somehow, it does not feel *right* - We already defeated the Grim Reaper before anyway, didn't we?");
+ }
+ }
+ end;
+
+OnTimer150000:
+ // 1148
+ .@KeshlamMc = mobcount("099-7", "Keshlam::OnDeath8");
+ if (.@KeshlamMc < 10)
+ areamonster "099-7", 20, 20, 120, 120, "", 1148, 10-.@KeshlamMc, "Keshlam::OnDeath8";
+
+ // 1149
+ .@KeshlamMc = mobcount("099-7", "Keshlam::OnDeath9");
+ if (.@KeshlamMc < 10)
+ areamonster "099-7", 20, 20, 120, 120, "", 1149, 10-.@KeshlamMc, "Keshlam::OnDeath9";
+
+ // Boss (TODO maybe give boss their own timer with 5 minutes)
+ .@KeshlamMc = mobcount("099-7", "Keshlam::OnBoss");
+ if (.@KeshlamMc < 1)
+ monster "099-7", 20, 105, "Grim Reaper", 1068, 1, "Keshlam::OnBoss";
+
+ // Done
+ .@KeshlamMc = 0;
+ stopnpctimer;
+ end;
+}
+
+099-7,18,110,0 script Chest#keshlam NPC111,{
+ if (FLAGS & FLAG_KESHLAM_RAREDROP) goto L_Finished;
+ mes "[Chest]";
+ mes "Would you try to open it?";
+ mes "##1Cost: 1000 Treasure Keys##0";
+ next;
+ menu
+ "Yes.", L_Yes,
+ "No.", L_close;
+
+L_Yes:
+ if (ispcdead())
+ goto L_Not_Enough;
+ if(countitem(TreasureKey) < 1000)
+ goto L_Not_Enough;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem(TreasureKey) > 1000)
+ goto L_TooMany;
+ delitem TreasureKey, 1000;
+ if (FLAGS & FLAG_KESHLAM_FLAWEDLENS) goto L_Rare;
+ goto L_FlawedLens;
+
+L_FlawedLens:
+ getitem FlawedLens, 1;
+ getexp 20000000, 0;
+ FLAGS = FLAGS | FLAG_KESHLAM_FLAWEDLENS;
+ mes "[Chest]";
+ mes "You opened it and found...! Some flawed lens?! Meh.";
+ next;
+ mes "[Chest]";
+ mes "You notice this chest has a hidden section with another lock.";
+ mes "You might want try that again later.";
+ close;
+
+L_Rare:
+ getexp 10000000, 0;
+ FLAGS = FLAGS | FLAG_KESHLAM_RAREDROP;
+ if (rand2(4) == 1) goto L_Amulet; // 25% chance
+ goto L_Ring; // 75% chance
+
+L_Amulet:
+ getitem EnchantersAmulet, 1;
+ mes "[Chest]";
+ mes "You opened it and found...! An Enchanter's Amulet! Lucky!";
+ close;
+
+L_Ring:
+ getitem MageRing, 1;
+ mes "[Chest]";
+ mes "You opened it and found...! A Mage Ring! Lucky!";
+ close;
+
+L_Not_Enough:
+ mes "It seems that this is not the right key...";
+ close;
+
+L_Finished:
+ mes "[Chest]";
+ mes "You already opened this chest.";
+ close;
+
+L_TooMany:
+ mes "[Chest]";
+ mes "You don't have room for what ever is inside. Maybe you should try again later.";
+ close;
+
+L_close:
+ close;
+}
+
+099-7,95,117,0 script Knowledgeable Tree NPC400,{
+ mes "If you kill every monster, this tree can warp you back.";
+ mes "You will receive experience points for cleaning the map.";
+ mes "";
+ mes "But be warned, monsters respawn on their own every five minutes.";
+ mes "The boss must also be defeated.";
+ next;
+ @KeshlamMc = mobcount("099-7", "Keshlam::OnDeath8");
+ @KeshlamMc = @KeshlamMc+mobcount("099-7", "Keshlam::OnDeath9");
+ @KeshlamMc = @KeshlamMc+mobcount("099-7", "Keshlam::OnBoss");
+ if (@KeshlamMc <= 0) goto L_Done;
+ mes "There is ##B"+@KeshlamMc+" monsters##b alive.";
+ close;
+
+L_Done:
+ mes l("Go back?");
+ if (askyesno() == ASK_NO)
+ close;
+ mes "";
+ getexp 1000000, 0;
+ warp "027-2", 50, 29;
+ close;
+}
+
+027-4,107,61,0 script #NoobJesusalva01 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "(The memorial is at right, behind the column.)";
+ close;
+}
+027-4,109,61,0 script #NoobJesusalva02 NPC400,{
+ if (!#CRYPT_PASSWORD) end;
+ mes "(The memorial is at left, behind the column.)";
+ close;
+}
+099-7,73,20,0 script #NoobKytty01 NPC400,0,0,{
+ warp "099-7", 72, 17;
+ end;
+}
+099-7,73,17,0 script #NoobKytty02 NPC400,0,0,{
+ warp "099-7", 72, 20;
+ end;
+}
+
+099-7,95,33,0 script An Evil Obelisk NPC185,{
+ mes l("An evil obelisk. Totally not suspcious. At all.");
+ // 1 = Assigned; 2 = Warped; 3 = Obelisk
+ if (getq(Quest_Reapercry) == 2) {
+ next;
+ // FIXME: Infuse a Soul in the Broken Doll obtained from Fey Sprite
+ // Then sacrifice it, opening the portal. [HOCUSIDEA]
+ mesc l("(You touch the mysterious obelisk. Somehow you feels peace and pain at the same time.)");
+ mesc l("(Suddenly a strange sensation flows through you. It feels like your body leaves your soul and becomes one with the stone.)");
+ mesc l("(As suddenly as the feeling started it stops. The strange attraction is away from one moment to the next and the obelisk feels like just an ordinary evil stone.)");
+ setq Quest_Reapercry, 3;
+ }
+ close;
+
+OnInit:
+ .distance=3;
+ end;
+}
+
diff --git a/npc/099-7/cronos.txt b/npc/099-7/cronos.txt
new file mode 100644
index 00000000..f259efe5
--- /dev/null
+++ b/npc/099-7/cronos.txt
@@ -0,0 +1,156 @@
+// Cronos, the lord of time and apparently a shopkeeper
+// There's also Father Time in the GM stuff
+
+099-7,99,30,0 script Chronos NPC313,{
+ mesn;
+ mesq l("I'm Chronos, lord of time, the immortal, the head editor of the Almanach, the... Alright, let's forget that.");
+ if (BOSS_POINTS < .price)
+ close;
+ // Boss Points validation
+ .@cur=(BOSS_POINTS / .price);
+ .@dif=.@cur - BOSS_MEDALS;
+ if (.@dif) {
+ next;
+ getitembound BossMedal, .@dif, IBT_ACCOUNT;
+ BOSS_MEDALS+=.@dif;
+ mesn;
+ mesq l("For your deeds, I shall bestow upon you %d %s. Use them wisely, they are the results of your hard effort.", .@dif, getitemlink(BossMedal));
+ mesc l("Boss Medals are earned each %s boss points. They are account-bound and cannot be given to other players.", fnum(.price));
+ next;
+ }
+
+ // Shopkeeping
+ mesc l("All things shall pass, but with the limited time you have, please enjoy shopkeeping.");
+ if (countitem(UnderworldKey)) {
+ select
+ l("Thanks."),
+ l("Do you know what the Underworld Key is for?");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("Yes, I do. But now is not the time. One day, when the event horizon aligns itself and the lazy titans move, then I shall tell you what you need to know."); // lazy titans = The developers and shout out to Kronus from mythology
+ close;
+ }
+ } else {
+ next;
+ }
+ openshop;
+ closeclientdialog;
+ close;
+
+OnInit:
+ tradertype(NST_CUSTOM);
+ .distance=4;
+ .price=10000;
+
+ sellitem Goggles, 1;
+ sellitem LeatherGoggles, 1;
+ sellitem Eyepatch, 1;
+ sellitem TopHat, 1;
+ sellitem FunkyHat, 1;
+ sellitem MushHat, 1;
+ sellitem ShroomHat, 1;
+ sellitem ChristmasElfHat, 1;
+ sellitem FaceMask, 1;
+ sellitem Crown, 1;
+ sellitem Cap, 1;
+
+ sellitem DesertHelmet, 1;
+ sellitem CaptainsHat, 1;
+ sellitem GuyFawkesMask, 1;
+ sellitem WitchDoctorsMask, 1;
+ sellitem Earmuffs, 1;
+ sellitem ElfNightcap, 1;
+ sellitem Sunglasses, 1;
+ sellitem TamOShanter, 1;
+ sellitem ChristmasTreeHat, 1;
+ sellitem SantaBeardHat, 1;
+ sellitem BunnyEars, 1;
+ sellitem MoubooHead, 1;
+ sellitem PaperBag, 1;
+ sellitem BunchOfParsley, 1;
+ sellitem SkullMask, 1;
+
+ sellitem SnowGoggles, 1;
+ sellitem HeartGlasses, 1;
+ sellitem ReadingGlasses, 1;
+ sellitem OperaMask, 1;
+ sellitem JesterMask, 1;
+ sellitem WitchHat, 1;
+ sellitem GoblinMask, 1;
+
+ sellitem BlinkingEvil, 1;
+ sellitem BlinkingEvilRed, 1;
+ sellitem BlinkingEvilBlue, 1;
+ sellitem BlinkingEvilPink, 1;
+ sellitem BlinkingEvilYellow, 1;
+ sellitem BlinkingHocus, 1;
+
+ sellitem PanHat, 1;
+ sellitem ChefHat, 1;
+ sellitem PilotHat, 1;
+ sellitem MoonshroomHat, 1;
+ sellitem CarbonGasMask, 1;
+ sellitem EskimoHat, 1;
+ sellitem GroovyHat, 1;
+ sellitem JazzyHat, 1;
+ sellitem ChicSantaHat, 1;
+ sellitem AnniversaryHat, 1;
+ sellitem AFKCap, 1;
+ sellitem SmileyCap, 1;
+
+ sellitem RedShades, 1;
+ sellitem GreenShades, 1;
+ sellitem DarkBlueShades, 1;
+ sellitem YellowShades, 1;
+ sellitem LightBlueShades, 1;
+ sellitem PinkShades, 1;
+ sellitem BlackShades, 1;
+ sellitem OrangeShades, 1;
+ sellitem PurpleShades, 1;
+ sellitem DarkGreenShades, 1;
+
+ sellitem MovieCap, 1;
+ sellitem BlueWolfHelmet, 1;
+ sellitem CloverHat, 1;
+ sellitem RabbitEars, 1;
+ sellitem EggshellHat, 1;
+ sellitem Pipe, 1;
+
+ sellitem WhiteEvokersRobeBlue, 1;
+ sellitem BlackEvokersRobeBlue, 1;
+ sellitem ApprenticeRobe, 1;
+ sellitem GoldenWarlordPlate, 1;
+ sellitem GoldenPlatemail, 1;
+
+ sellitem ScarabArmlet, 1;
+ sellitem SnowLauncher, 1;
+
+ sellitem OverlordsHelmet, 2;
+ sellitem DarkTalisman, 2;
+ sellitem Aureole, 2;
+ sellitem MageRing, 2;
+ sellitem PaladinsHelmet, 2;
+ sellitem EnchantersAmulet, 2;
+ sellitem HeartOfIsis, 2;
+ sellitem BansheeBow, 2;
+ sellitem BullHelmet, 2;
+ sellitem AssassinShirt, 2;
+ sellitem LazuriteRobe, 2;
+ sellitem DarkHelm, 2;
+ sellitem UnderworldMask, 2;
+ sellitem Phylactery, 2;
+ end;
+
+OnCountFunds:
+ setcurrency(countitem(BossMedal));
+ end;
+
+OnPayFunds:
+ if( countitem(BossMedal) < @price )
+ end;
+ delitem BossMedal, @price;
+ purchaseok();
+ end;
+}
+
diff --git a/npc/099-8/_import.txt b/npc/099-8/_import.txt
new file mode 100644
index 00000000..9bf2a06f
--- /dev/null
+++ b/npc/099-8/_import.txt
@@ -0,0 +1,2 @@
+// Map 099-8: Keshlam's Maze
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
diff --git a/npc/_anchors.txt b/npc/_anchors.txt
new file mode 100644
index 00000000..c28e2ce2
--- /dev/null
+++ b/npc/_anchors.txt
@@ -0,0 +1,11 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+
+- script __anchors__ 32767,{
+OnInit:
+ .ht = htnew();
+ htput(.ht, "^FERMI|VOTE", "fermi 29 20");
+ htput(.ht, "^HURN", "009-1 53 38");
+ htput(.ht, "^KESH", "099-7 97 65");
+ htput(.ht, "^NIVAL", "020-1 84 74");
+ htput(.ht, "^TULI", "001-1 84 100");
+}
diff --git a/npc/_import.txt b/npc/_import.txt
new file mode 100644
index 00000000..b8dcd152
--- /dev/null
+++ b/npc/_import.txt
@@ -0,0 +1,135 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+
+@include "npc/000-1/_import.txt"
+@include "npc/001-1/_import.txt"
+@include "npc/001-2/_import.txt"
+@include "npc/001-3/_import.txt"
+@include "npc/002-1/_import.txt"
+@include "npc/002-2/_import.txt"
+@include "npc/002-3/_import.txt"
+@include "npc/002-4/_import.txt"
+@include "npc/002-5/_import.txt"
+@include "npc/003-1/_import.txt"
+@include "npc/003-4/_import.txt"
+@include "npc/004-1/_import.txt"
+@include "npc/004-3/_import.txt"
+@include "npc/004-4/_import.txt"
+@include "npc/004-5/_import.txt"
+@include "npc/005-3/_import.txt"
+@include "npc/006-1/_import.txt"
+@include "npc/006-2/_import.txt"
+@include "npc/006-3/_import.txt"
+@include "npc/007-1/_import.txt"
+@include "npc/007-2/_import.txt"
+@include "npc/008-1/_import.txt"
+@include "npc/009-1/_import.txt"
+@include "npc/009-2/_import.txt"
+@include "npc/009-3/_import.txt"
+@include "npc/009-4/_import.txt"
+@include "npc/009-5/_import.txt"
+@include "npc/009-6/_import.txt"
+@include "npc/009-7/_import.txt"
+@include "npc/009-8/_import.txt"
+@include "npc/010-1/_import.txt"
+@include "npc/010-2/_import.txt"
+@include "npc/011-1/_import.txt"
+@include "npc/011-3/_import.txt"
+@include "npc/011-4/_import.txt"
+@include "npc/011-6/_import.txt"
+@include "npc/012-1/_import.txt"
+@include "npc/012-3/_import.txt"
+@include "npc/012-4/_import.txt"
+@include "npc/013-1/_import.txt"
+@include "npc/013-2/_import.txt"
+@include "npc/013-3/_import.txt"
+@include "npc/014-1/_import.txt"
+@include "npc/014-3/_import.txt"
+@include "npc/015-1/_import.txt"
+@include "npc/015-3/_import.txt"
+@include "npc/016-1/_import.txt"
+@include "npc/016-2/_import.txt"
+@include "npc/017-1/_import.txt"
+@include "npc/017-2/_import.txt"
+@include "npc/017-3/_import.txt"
+@include "npc/017-4/_import.txt"
+@include "npc/017-9/_import.txt"
+@include "npc/018-1/_import.txt"
+@include "npc/018-2/_import.txt"
+@include "npc/018-3/_import.txt"
+@include "npc/019-1/_import.txt"
+@include "npc/019-3/_import.txt"
+@include "npc/019-4/_import.txt"
+@include "npc/020-1/_import.txt"
+@include "npc/020-2/_import.txt"
+@include "npc/020-3/_import.txt"
+@include "npc/021-3/_import.txt"
+@include "npc/023-1/_import.txt"
+@include "npc/023-2/_import.txt"
+@include "npc/023-3/_import.txt"
+@include "npc/025-1/_import.txt"
+@include "npc/025-3/_import.txt"
+@include "npc/025-4/_import.txt"
+@include "npc/026-1/_import.txt"
+@include "npc/026-2/_import.txt"
+@include "npc/027-1/_import.txt"
+@include "npc/027-2/_import.txt"
+@include "npc/027-3/_import.txt"
+@include "npc/027-4/_import.txt"
+@include "npc/027-5/_import.txt"
+@include "npc/027-6/_import.txt"
+@include "npc/027-7/_import.txt"
+@include "npc/027-8/_import.txt"
+@include "npc/028-1/_import.txt"
+@include "npc/028-3/_import.txt"
+@include "npc/029-1/_import.txt"
+@include "npc/029-2/_import.txt"
+@include "npc/029-3/_import.txt"
+@include "npc/029-4/_import.txt"
+@include "npc/030-1/_import.txt"
+@include "npc/030-2/_import.txt"
+@include "npc/030-3/_import.txt"
+@include "npc/030-4/_import.txt"
+@include "npc/031-1/_import.txt"
+@include "npc/031-2/_import.txt"
+@include "npc/031-3/_import.txt"
+@include "npc/031-4/_import.txt"
+@include "npc/032-3/_import.txt"
+@include "npc/033-1/_import.txt"
+@include "npc/034-1/_import.txt"
+@include "npc/034-2/_import.txt"
+@include "npc/035-2/_import.txt"
+@include "npc/036-2/_import.txt"
+@include "npc/041-1/_import.txt"
+@include "npc/042-1/_import.txt"
+@include "npc/043-1/_import.txt"
+@include "npc/043-3/_import.txt"
+@include "npc/043-4/_import.txt"
+@include "npc/045-1/_import.txt"
+@include "npc/046-1/_import.txt"
+@include "npc/046-3/_import.txt"
+@include "npc/047-1/_import.txt"
+@include "npc/047-3/_import.txt"
+@include "npc/048-2/_import.txt"
+@include "npc/051-1/_import.txt"
+@include "npc/051-3/_import.txt"
+@include "npc/052-1/_import.txt"
+@include "npc/052-2/_import.txt"
+@include "npc/055-1/_import.txt"
+@include "npc/055-3/_import.txt"
+@include "npc/056-2/_import.txt"
+@include "npc/057-1/_import.txt"
+@include "npc/069-2/_import.txt"
+@include "npc/070-1/_import.txt"
+@include "npc/070-3/_import.txt"
+@include "npc/099-1/_import.txt"
+@include "npc/099-2/_import.txt"
+@include "npc/099-3/_import.txt"
+@include "npc/099-4/_import.txt"
+@include "npc/099-5/_import.txt"
+@include "npc/099-6/_import.txt"
+@include "npc/099-7/_import.txt"
+@include "npc/099-8/_import.txt"
+@include "npc/botcheck/_import.txt"
+@include "npc/fermi/_import.txt"
+@include "npc/sec_pri/_import.txt"
+"npc/_anchors.txt",
diff --git a/npc/annuals/check_time.txt b/npc/annuals/check_time.txt
new file mode 100644
index 00000000..5d229e4c
--- /dev/null
+++ b/npc/annuals/check_time.txt
@@ -0,0 +1,46 @@
+
+function script GetEventTime {
+ $@month = gettime(6);
+ $@day = gettime(5);
+
+ if ($@start_month > $@end_month)
+ goto L_YearWrap;
+ goto L_Normal;
+
+L_Normal:
+ if(($@month < $@start_month)
+ || ($@month == $@start_month && $@day < $@start_day))
+ goto L_NoEventTime;
+ if(($@month > $@end_month)
+ || ($@month == $@end_month && $@day > $@end_day))
+ goto L_NoEventTime;
+ if(($@month > $@reward_start_month)
+ || ($@month == $@reward_start_month && $@day >= $@reward_start_day))
+ goto L_RewardTime;
+ goto L_EventTime;
+
+L_YearWrap:
+ if(($@month == $@reward_start_month && $@day >= $@reward_start_day
+ && ($@day <= $@end_day && $@reward_start_month == $@end_month
+ || !($@reward_start_month == $@end_month)))
+ || ($@month == $@end_month && $@day <= $@end_day
+ && ($@day >= $@reward_start_day && $@reward_start_month == $@end_month
+ || !($@reward_start_month == $@end_month)))
+ || ($@month < $@end_month && $@month > $@reward_start_month))
+ goto L_RewardTime;
+ if (($@month >= $@start_month && $@day >= $@start_day) || ($@month <= $@end_month && $@day <= $@end_day))
+ goto L_EventTime;
+ goto L_NoEventTime;
+
+L_NoEventTime:
+ $@event_time = 0;
+ return;
+
+L_EventTime:
+ $@event_time = 1;
+ return;
+
+L_RewardTime:
+ $@event_time = 2;
+ return;
+}
diff --git a/npc/annuals/fathertime.txt b/npc/annuals/fathertime.txt
new file mode 100644
index 00000000..6a92e7dc
--- /dev/null
+++ b/npc/annuals/fathertime.txt
@@ -0,0 +1,32 @@
+017-9,26,28,0 script #HolidayConfig NPC32767,{
+ end;
+
+OnInit:
+ if (debug >= 2) end;
+ donpcevent strnpcinfo(0) + "::OnTimer20000";
+ end;
+
+OnClock0000:
+OnTimer20000:
+ donpcevent "#XmasConfig::OnCommandRestartQuest";
+ donpcevent "#HalloweenConfig::OnCommandRestartQuest";
+ donpcevent "Easter Eggs::OnCheckEaster";
+ //initnpctimer;
+ end;
+}
+
+function script TMWBirthday {
+ if (gettime(GETTIME_MONTH) != APRIL) return;
+ if (gettime(GETTIME_DAYOFMONTH) != 11) return;
+ .@age=gettime(GETTIME_YEAR)-2004;
+ .@end=(.@age % 10);
+ .@mo$=(.@end == 1 ? "st" : (.@end == 2 ? "nd" : (.@end == 3 ? "rd" : "th")));
+ dispbottom l("It is TMW's %d%s birthday!", .@age, .@mo$);
+ // Handle gifts
+ if (#TMWBDAY < .@age) {
+ #TMWBDAY=.@age;
+ getitem TMWBirthdayGift, 1;
+ }
+ return;
+}
+
diff --git a/npc/annuals/halloween/config.txt b/npc/annuals/halloween/config.txt
new file mode 100644
index 00000000..d86e3de7
--- /dev/null
+++ b/npc/annuals/halloween/config.txt
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+- script #HalloweenConfig NPC32767,{
+ end;
+
+OnCommandRestartQuest:
+ goto L_Main;
+
+OnInit:
+ goto L_Main;
+
+L_Main:
+ // Halloween Key Identifier Set through Botcheck Debug
+ if(!($HALLOWEEN_TIME_KEY) || (getarraysize($HALLOWEEN_TIME_KEY) != 6))
+ setarray $HALLOWEEN_TIME_KEY, 10,10,11,24,2,gettime(7);
+ if(($HALLOWEEN_TIME_KEY[0] == 0) || ($HALLOWEEN_TIME_KEY[0] > 12))
+ goto L_HalloweenError;
+ if(($HALLOWEEN_TIME_KEY[1] == 0) || ($HALLOWEEN_TIME_KEY[1] > 12))
+ goto L_HalloweenError;
+ if(($HALLOWEEN_TIME_KEY[2] == 0) || ($HALLOWEEN_TIME_KEY[2] > 12))
+ goto L_HalloweenError;
+ if(($HALLOWEEN_TIME_KEY[3] == 0) || ($HALLOWEEN_TIME_KEY[3] > 31))
+ goto L_HalloweenError;
+ if(($HALLOWEEN_TIME_KEY[4] == 0) || ($HALLOWEEN_TIME_KEY[4] > 31))
+ goto L_HalloweenError;
+ if($HALLOWEEN_TIME_KEY[5] == 0)
+ goto L_HalloweenError;
+
+ // Event Runs until Reward Period.
+ // Month Start/End
+ $@halloween_start_month = $HALLOWEEN_TIME_KEY[0];
+ $@halloween_reward_start_month = $HALLOWEEN_TIME_KEY[1];
+ $@halloween_end_month = $HALLOWEEN_TIME_KEY[2];
+
+ // Reward Day Start/End
+ $@halloween_reward_start_day = $HALLOWEEN_TIME_KEY[3];
+ $@halloween_reward_end_day = $HALLOWEEN_TIME_KEY[4];
+
+ // Time Settings
+ $@halloween_no_event_time = 0;
+ $@halloween_event_time = 1;
+ $@halloween_reward_time = 2;
+
+ // How many, maximum is 8
+ $@halloween_memory_count = 8;
+ // Level to go trick-or-treating
+ $@halloween_min_level = 10;
+
+ // Number of trick and treats completed to get charm.
+ $@halloween_charm_count = 10;
+ $@halloween_got_charm_reward = (1 << 17);
+ setarray $@halloween_big_reward, 905, 1175;
+ $@halloween_got_big_reward = (1 << 16);
+ setarray $@halloween_sweets,
+ 534, // OrangeCupcake
+ 737, // ChocolateCake
+ 510, // Candy
+ 513, // Cake
+ 509, // ChocolateBar
+ 519, // CherryCake
+ 736, // WhiteCake
+ 738, // OrangeCake
+ 739, // AppleCake
+ 3006, // TonoriDelight
+ 3007, // Marshmallow
+ 3009, // JellySkull
+ 3010, // CandyPumpkin
+ 838, // CranberryLollipop
+ 839, // GrapeLollipop
+ 840; // OrangeLollipop
+ $@halloween_sweets_num = getarraysize($@halloween_sweets);
+
+ setarray $@halloween_mask_IDs, 678, 679, 1221, 634, 615, 639, 769, 801, 1218, 1276, 1277, 1279, 4027;
+ setarray $@halloween_scare_factors, 2, 4, 4, 4, 2, 3, 2, 2, 1, 3, 2, 4, 4;
+
+ if (getarraysize($@halloween_mask_IDs) != getarraysize($@halloween_scare_factors))
+ goto L_HalloweenError;
+ // temporary counter
+ $@n = 0;
+
+ $@halloween_npc_caretaker = $@n;
+ $@halloween_npc_names$[$@n] = "[Caretaker]";
+ $@halloween_greetings$[$@n] = "\"Alright, come on then. Show me your trick.\"";
+ $@halloween_trick_notscary$[$@n] = "Trick? You must have misheard me. I've come because the Government needs to build a road through your house.";
+ $@halloween_react_notscary$[$@n] = "\"And?\"";
+ $@halloween_trick_scary$[$@n] = "You look pretty deceased to me, old man. Undead must die! Yaah!";
+ $@halloween_react_scary$[$@n] = "\"Now listen here, I'm as alive as you - oh. Say, that was a good trick!\"";
+ $@halloween_trick_veryscary$[$@n] = "Your wife... she's - she's - she's DEAD!";
+ $@halloween_react_veryscary$[$@n] = "\"But... I live here! My wife l... is dead here. You can't - oh. I DIDN'T mishear you. You really had me fooled!\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_eurni = $@n;
+ $@halloween_npc_names$[$@n] = "[Eurni the Surgeon]";
+ $@halloween_greetings$[$@n] = "\"Oh, right.\"";
+ $@halloween_trick_notscary$[$@n] = "I paid good money for your services, and when I get home I find that now I'm not a man OR a woman...";
+ $@halloween_react_notscary$[$@n] = "\"Heheh, sucks, buddy. But there's always a risk.\"";
+ $@halloween_trick_scary$[$@n] = "Look out! A scorpion!";
+ $@halloween_react_scary$[$@n] = "\"Where? Darn things, I think they're what keep scaring away my customers.\"";
+ $@halloween_trick_veryscary$[$@n] = "I know about your hobby of performing numerous Sex changes on yourself.";
+ $@halloween_react_veryscary$[$@n] = "\"Shut up! Look, will you hold your tongue if I give you more treats...?\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_george = $@n;
+ $@halloween_npc_names$[$@n] = "[George the Pirate]";
+ $@halloween_greetings$[$@n] = "\"Shiver me timbers! What do ye mean?\"";
+ $@halloween_trick_notscary$[$@n] = "Well... I do a trick, and then... you give me a treat...";
+ $@halloween_react_notscary$[$@n] = "\"Arrrrh, I knew what ye meant, to be sure! I were just kidding with ye, pretending to be a crazy old pirate! Arrrrh!\"";
+ $@halloween_trick_scary$[$@n] = "Your eyepatch is on the wrong eye!";
+ $@halloween_react_scary$[$@n] = "\"Arrrrh, so it is! Ta for pointing it out, mate - wait, no it isn't! Harhar, what a good trick!\"";
+ $@halloween_trick_veryscary$[$@n] = "By the powers, ye're a daft landlubber to be sure, ye barnacle-ridden swab!";
+ $@halloween_react_veryscary$[$@n] = "\"Arrrrh, ye scurvy dog! I'm sure my first mate will return with the ship eventually.\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_inac = $@n;
+ $@halloween_npc_names$[$@n] = "[Inac]";
+ $@halloween_greetings$[$@n] = "\"Oh, yes?\"";
+ $@halloween_trick_notscary$[$@n] = "Yes, we monsters moved into the tunnels... and now we're coming out... for revenge!";
+ $@halloween_react_notscary$[$@n] = "\"Haha! That's the worse trick I've seen today.\"";
+ $@halloween_trick_scary$[$@n] = "One of those monsters you mentioned is crawling out of the well!";
+ $@halloween_react_scary$[$@n] = "\"He IS? Where!? Aah! Oh. You were just tricking, right? Hahaha, that was good, I really believed you.\"";
+ $@halloween_trick_veryscary$[$@n] = "Yeah, but it's all fossil water. One day it's gonna dry up!";
+ $@halloween_react_veryscary$[$@n] = "\"Fossil water? You mean it's turned to STONE? But you can't drink - oh... you were just tricking, right? You WEREN'T? Aaaah!\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_kfahr = $@n;
+ $@halloween_npc_names$[$@n] = "[Kfahr the Warrior]";
+ $@halloween_greetings$[$@n] = "\"Ah, yes!\" He rubs his hands. \"Trick away, then!\"";
+ $@halloween_trick_notscary$[$@n] = "Meh... I'm only trick-or-treating you to avoid listening to your BORING stories.";
+ $@halloween_react_notscary$[$@n] = "\"Boring?\" He grins. \"You must be mistaking me for someone else.\"";
+ $@halloween_trick_scary$[$@n] = "Did you hear the bad news already? They made up a law prohibiting to serve alcoholic drinks! That means no more beer!";
+ $@halloween_react_scary$[$@n] = "\"What? But- but- why do they- oh, you tricked me. I was about to really get worried for a moment.\"";
+ $@halloween_trick_veryscary$[$@n] = "Have you heard? Tulimshar was destroyed by a giant Desert Worm!";
+ $@halloween_react_veryscary$[$@n] = "\"What!?\" Kfahr stares. \"And no one called for me? This is appalling! But - what? That was your trick? Hm, nice one. You almost had me fooled!\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_nurse = $@n;
+ $@halloween_npc_names$[$@n] = "[Nurse]";
+ $@halloween_greetings$[$@n] = "\"I don't know why I let the Mayor trick me into this... well, go on then.\"";
+ $@halloween_trick_notscary$[$@n] = "I ate too much Hallowe'en candy, now I'm sick!";
+ $@halloween_react_notscary$[$@n] = "\"Well, no one's to blame but yourself, you know. Just make sure you don't eat any more.\"";
+ $@halloween_trick_scary$[$@n] = "Hurnscald has been struck by plague! You must come and tend to the dying!";
+ $@halloween_react_scary$[$@n] = "\"But I don't know how to deal with plague! Oh no! You must get the Doctor! Unless... you were just tricking me! Whew, that's a relief!\"";
+ $@halloween_trick_veryscary$[$@n] = "The Doctor asked me to tell you that he doesn't want to see you any more.";
+ $@halloween_react_veryscary$[$@n] = "\"What? But we were getting it on so well. I mean, getting on so well! Oh... that was your trick! Dear me, I believed you!\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_pachua = $@n;
+ $@halloween_npc_names$[$@n] = "[Chief Pachua]";
+ $@halloween_greetings$[$@n] = "\"Ah, the strange custom the Government man told me about.\"";
+ $@halloween_trick_notscary$[$@n] = "Look out! A scorpion!";
+ $@halloween_react_notscary$[$@n] = "\"Don't mind him, he won't hurt you. Er... so I give you sweets now, or what?\"";
+ $@halloween_trick_scary$[$@n] = "Yes, the ritual giving of treats... LOTS of treats... or else!";
+ $@halloween_react_scary$[$@n] = "\"Alright, here you go.\"";
+ $@halloween_trick_veryscary$[$@n] = "Yes, the ritual giving of treats followed by the sacrifice of the treat-giver...";
+ $@halloween_react_veryscary$[$@n] = "\"I do like a good sacrifice, but less so if it's me! I'll give you extra sweets if you forget the sacrifice.\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_yanis = $@n;
+ $@halloween_npc_names$[$@n] = "[Yanis]";
+ $@halloween_greetings$[$@n] = "\"I am employed by the Tonori Government, make sure you abide the regulations we wrote down for Trick-or-Treaters this year...\"";
+ $@halloween_trick_notscary$[$@n] = "Of course I will... not!";
+ $@halloween_react_notscary$[$@n] = "\"Hm!\"";
+ $@halloween_trick_scary$[$@n] = "Regulations, smegulations. The Tonori Government can go suck a lollipop for all I care!";
+ $@halloween_react_scary$[$@n] = "\"!? How dare you - oh, that was your trick! You did have me worried for a moment...\"";
+ $@halloween_trick_veryscary$[$@n] = "What regulations?";
+ $@halloween_react_veryscary$[$@n] = "\"You mean you haven't even READ - I don't believe - this is ghastly - I - oh... that was your trick... gosh, I believed you for a minute! I thought you really hadn't read them!\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_vincent = $@n;
+ $@halloween_npc_names$[$@n] = "[Vincent]";
+ $@halloween_greetings$[$@n] = "\"Ooh, okay! Trick away!\"";
+ $@halloween_trick_notscary$[$@n] = "Look out! A scorpion!";
+ $@halloween_react_notscary$[$@n] = "\"They're everywhere in this desert! Don't worry about them.\"";
+ $@halloween_trick_scary$[$@n] = "Hey, that action figure you're building just CAME TO LIFE!";
+ $@halloween_react_scary$[$@n] = "\"Really? Cool! Where? What? You were tricking me? WAAAH!\"";
+ $@halloween_trick_veryscary$[$@n] = "Wow, this is a neat action figure! Haha, check out its moves! Oops! Never mind, I'm sure it'll glue back on.";
+ $@halloween_react_veryscary$[$@n] = "\"My Bug Leg action figure! You broke it!\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_weellos = $@n;
+ $@halloween_npc_names$[$@n] = "[Weellos]";
+ $@halloween_greetings$[$@n] = "\"Trick me, then!\"";
+ $@halloween_trick_notscary$[$@n] = "Look out! A scorpion!";
+ $@halloween_react_notscary$[$@n] = "\"Pesky things, I know, but they're everywhere around here...\"";
+ $@halloween_trick_scary$[$@n] = "Actually, it's a fake. It was built just ten years ago.";
+ $@halloween_react_scary$[$@n] = "\"No! But I've read all the accounts... oh, haha! Very funny!\"";
+ $@halloween_trick_veryscary$[$@n] = "They say the earthquake ruined the foundations of this building, and that it's going to fall down.";
+ $@halloween_react_veryscary$[$@n] = "\"B-but it's one of the oldest buildings around! And... wait, I just remembered that it was designed to be earthquake-proof. You were tricking me!\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_zack = $@n;
+ $@halloween_npc_names$[$@n] = "[Zack]";
+ $@halloween_greetings$[$@n] = "\"I thought no one would find me down here, but I'm glad I was wrong! Let's see your trick, then.\"";
+ $@halloween_trick_notscary$[$@n] = "You think this is something to do with Hallowe'en? Hands up!";
+ $@halloween_react_notscary$[$@n] = "\"Heh... That was ok.\"";
+ $@halloween_trick_scary$[$@n] = "And now that I've found you, you die!";
+ $@halloween_react_scary$[$@n] = "\"Aah! What did I do? Oh - wait - I see! That was a good one!\"";
+ $@halloween_trick_veryscary$[$@n] = "Yes, I have found you. After all these years.";
+ $@halloween_react_veryscary$[$@n] = "\"Uncle Henry? But how, I covered my tracks so well! I never told anyone that - wait... that was your trick! You had me worried for a minute!\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_kimarr = $@n;
+ $@halloween_npc_names$[$@n] = "[Kimarr]";
+ $@halloween_greetings$[$@n] = "\"Many have tried to scare me, all have failed. Try your best, but the frozen wastes contain all manner of horrors.\"";
+ $@halloween_trick_notscary$[$@n] = "Look out Yetis!";
+ $@halloween_react_notscary$[$@n] = "\"You will have to do better then that.\"";
+ $@halloween_trick_scary$[$@n] = "Hrmm Is that your wife calling you?";
+ $@halloween_react_scary$[$@n] = "\"What? You haven't se... wait a second. Ok that was good.\"";
+ $@halloween_trick_veryscary$[$@n] = "The Kaizeian government declared fluffies an endangered species.";
+ $@halloween_react_veryscary$[$@n] = "\"NOooOOOooo!!! The Hunt!!! ... wait a second, you city folk are slick.\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_nikolai = $@n;
+ $@halloween_npc_names$[$@n] = "[Nikolai]";
+ $@halloween_greetings$[$@n] = "\"Let us see if you are scarier then Kfahr's Fairy Tales.\"";
+ $@halloween_trick_notscary$[$@n] = "Your going over their to the store.";
+ $@halloween_react_notscary$[$@n] = "\"*You're* *there* Ugh, thats more annoying then scary.\"";
+ $@halloween_trick_scary$[$@n] = "Whats White, Blue and slimey? I don't know either but it's right behind you.";
+ $@halloween_react_scary$[$@n] = "\"More Slimes, Oh no the books again. O you tricked me, good one.\"";
+ $@halloween_trick_veryscary$[$@n] = "I hope you don't mind I used some of this kindling you have on the shelves to start a fire.";
+ $@halloween_react_veryscary$[$@n] = "\"AHHHHH!!!! You burned our books!!! *GAH* ... *Eye Twitch*\"";
+
+ $@n = $@n + 1;
+
+ $@halloween_npc_vellamo = $@n;
+ $@halloween_npc_names$[$@n] = "[Vellamo]";
+ $@halloween_greetings$[$@n] = "\"Ahh yes, more candy related ritual.\"";
+ $@halloween_trick_notscary$[$@n] = "Candy? No, I want Parsley.";
+ $@halloween_react_notscary$[$@n] = "\"Parsley? is this some kind of monster? I'm not getting this scare at all\"";
+ $@halloween_trick_scary$[$@n] = "Chief Warrick says he needs the candy inventory by end of day.";
+ $@halloween_react_scary$[$@n] = "\"Ahh, no! I forgot to put a cover sheet on my Candy Production and Storage report.\"";
+ $@halloween_trick_veryscary$[$@n] = "I'm sorry, but your doctor says your diabetic.";
+ $@halloween_react_veryscary$[$@n] = "\"Darkest day of my life, blacker then the darkest chocolate.\"";
+
+ $@halloween_num_npcs = $@n + 1;
+
+ $@n = 0;
+
+ // Age to go trick-or-treating (1 week before the start)
+ if ((gettime(6) >= $@halloween_start_month) || (gettime(6) <= $@halloween_end_month))
+ $@halloween_min_age = ((gettime(5) + 7)*86400);
+ if (gettime(6) == $@halloween_reward_start_month)
+ $@halloween_min_age = ((gettime(5) + 38)*86400);
+
+ $@start_month = $@halloween_start_month;
+ $@end_month = $@halloween_end_month;
+ $@start_day = 1;
+ $@end_day = $@halloween_reward_end_day;
+ $@reward_start_month = $@halloween_reward_start_month;
+ $@reward_start_day = $@halloween_reward_start_day;
+
+ callfunc "GetEventTime";
+ $@halloween_time = $@event_time;
+
+ if($@halloween_time == 0 && $HALLOWEEN_TIME_KEY[5] < gettime(7))
+ setarray $HALLOWEEN_TIME_KEY, $HALLOWEEN_TIME_KEY[0],$HALLOWEEN_TIME_KEY[1],$HALLOWEEN_TIME_KEY[2],$HALLOWEEN_TIME_KEY[3],$HALLOWEEN_TIME_KEY[4],gettime(7);
+ goto L_Return;
+
+L_Return:
+ callfunc "SpawnMunro";
+ callfunc "ReplaceTrees";
+ end;
+
+L_HalloweenError:
+ debugmes "Halloween is Dead Jim.";
+ mapexit;
+}
diff --git a/npc/annuals/halloween/debug.txt b/npc/annuals/halloween/debug.txt
new file mode 100644
index 00000000..9d7e3650
--- /dev/null
+++ b/npc/annuals/halloween/debug.txt
@@ -0,0 +1,138 @@
+
+function script HalloweenDebug {
+ if(debug)
+ goto L_Debug;
+ goto L_Live;
+
+L_Live:
+ menu
+ "Debug Time", L_DebugTime,
+ "Set Old Event Flag.", L_LastReset,
+ "Halloween Time Key Change.", L_HalloweenTimeKey,
+ "Reset NPC's mask memory", L_ResetMask,
+ "Nothing.", L_close;
+
+L_Debug:
+ menu
+ "Debug Time", L_DebugTime,
+ "Set Old Event Flag.", L_LastReset,
+ "Halloween Time Key Change.", L_HalloweenTimeKey,
+ "Quest State", L_QuestState,
+ "Set NPC trick or treat flag", L_SetTrickOrTreats,
+ "Reset my quest state", L_ResetMe,
+ "Reset NPC's mask memory", L_ResetMask,
+ "Nothing.", L_close;
+
+L_DebugTime:
+ mes "--Sever--";
+ mes "Event State: " + $@halloween_time;
+ mes "Event Start" + $HALLOWEEN_TIME_KEY[0] + "/1";
+ mes "Reward Start: " + $HALLOWEEN_TIME_KEY[1] + "/" + $HALLOWEEN_TIME_KEY[3];
+ mes "Event End: " + $HALLOWEEN_TIME_KEY[2] + "/" + $HALLOWEEN_TIME_KEY[4];
+ mes "Event Time Key (year (CCYY)): " + $HALLOWEEN_TIME_KEY[5];
+ next;
+ goto L_Debug;
+
+L_LastReset:
+ HALLOWEENTIME = 255;
+ HALLOWEENYEAR = 2012;
+ goto L_Debug;
+
+L_HalloweenTimeKey:
+ mes "Halloween Time Key Change.";
+ mes "Start Month?";
+ input @halloween_time_key_smonth;
+ if((@halloween_time_key_smonth == 0) || (@halloween_time_key_smonth > 12))
+ goto L_HalloweenError;
+ mes "Reward Start Month?";
+ input @halloween_time_key_srmonth;
+ if((@halloween_time_key_srmonth == 0) || (@halloween_time_key_srmonth > 12))
+ goto L_HalloweenError;
+ mes "End Month?";
+ input @halloween_time_key_emonth;
+ if((@halloween_time_key_emonth == 0) || (@halloween_time_key_emonth > 12))
+ goto L_HalloweenError;
+ mes "Reward Start Day?";
+ input @halloween_time_key_rsday;
+ if((@halloween_time_key_rsday == 0) || (@halloween_time_key_rsday > 31))
+ goto L_HalloweenError;
+ mes "Reward End Day?";
+ input @halloween_time_key_reday;
+ if((@halloween_time_key_reday == 0) || (@halloween_time_key_reday > 31))
+ goto L_HalloweenError;
+ mes "Time Key (CCYY) ";
+ input @halloween_time_key_year;
+ goto L_SetNewKey;
+
+L_HalloweenError:
+ mes "Incorrect Entry. Try again.";
+ next;
+ goto L_Debug;
+
+L_SetNewKey:
+ setarray $HALLOWEEN_TIME_KEY, @halloween_time_key_smonth, @halloween_time_key_srmonth, @halloween_time_key_emonth, @halloween_time_key_rsday, @halloween_time_key_reday, @halloween_time_key_year;
+ donpcevent "#HalloweenConfig::OnCommandRestartQuest";
+ goto L_Debug;
+
+L_QuestState:
+ mes "Karma: " + (HALLOWEENTIME & 65535);
+ @big_reward_status$ = " No.";
+ if (HALLOWEENTIME & $@halloween_got_big_reward)
+ @big_reward_status$ = " Yes.";
+ mes "Big Reward: " + @big_reward_status$;
+ @charm_reward_status$ = " No.";
+ if (HALLOWEENTIME & $@halloween_got_charm_reward)
+ @charm_reward_status$ = " Yes.";
+ mes "Charm Reward:" + @charm_reward_status$;
+ @npc_check_loop = 0;
+ goto L_NpcCheckLoop;
+
+L_NpcCheckLoop:
+ @display_mes$ = "NPC ID " + @npc_check_loop + ":" + $@halloween_npc_names$[@npc_check_loop];
+ @npc_status$ = " Needed";
+ if (HALLOWEENTIME & (1 << (31 - @npc_check_loop)))
+ @npc_status$ = " Complete";
+ @display_mes$ = @display_mes$ + @npc_status$;
+ mes @display_mes$;
+ @display_mes$ = "";
+ goto L_NpcCheckInc;
+
+L_NpcCheckInc:
+ @npc_check_loop = (@npc_check_loop + 1);
+ if (@npc_check_loop >= getarraysize($@halloween_npc_names$))
+ goto L_TrickOrTreatCount;
+ goto L_NpcCheckLoop;
+
+L_TrickOrTreatCount:
+ callfunc "TrickOrTreatTally";
+ mes @npc_tally + " out of 14";
+ next;
+ goto L_Debug;
+
+L_SetTrickOrTreats:
+ mes "Enter NPC to set";
+ input @halloween_npc_id;
+ HALLOWEENTIME = HALLOWEENTIME | (1 << (31 - @halloween_npc_id));
+ goto L_Debug;
+
+L_ResetMe:
+ HALLOWEENTIME = 0;
+ HALLOWEENYEAR = $HALLOWEEN_TIME_KEY[5];
+ goto L_Debug;
+
+L_ResetMask:
+ mes "Enter NPC to reset:";
+ input @halloween_npc_id;
+ $@halloween_maskmemory[8 * @halloween_npc_id] = 0;
+ goto L_Debug;
+
+L_close:
+ @tmp = 0;
+ @Mask = 0;
+ @karma = 0;
+ @loop = 0;
+ @menu = 0;
+ @halloween_npc_id = 0;
+ close2;
+ return;
+}
diff --git a/npc/annuals/halloween/munro.txt b/npc/annuals/halloween/munro.txt
new file mode 100644
index 00000000..93d01764
--- /dev/null
+++ b/npc/annuals/halloween/munro.txt
@@ -0,0 +1,46 @@
+026-1,24,37,0 script Munro NPC183,{
+ callfunc "HalloweenCheckOld";
+ callfunc "TrickOrTreatTally";
+ if (($@halloween_time == $@halloween_reward_time) && (@npc_tally >= $@halloween_charm_count) && !(HALLOWEENTIME & $@halloween_got_charm_reward))
+ goto L_Halloween;
+ goto L_NoReward;
+
+L_NoReward:
+ mes "[Munro]";
+ mes "\"Greetings mortal.\"";
+ next;
+ mes "\"Once again we come to that time of year when the veil is thin\"";
+ next;
+ mes "\"All those who have passed on can part the veil to return.\"";
+ next;
+ mes "\"A time to celebrate our ancestors and chase evil away.\"";
+ next;
+ mes "\"Celebrate the holiday with me and I will reward you later.\"";
+ goto L_Exit;
+
+L_Halloween:
+ mes "[Munro]";
+ mes "\"You have shown to have the Halloween spirit. Take this charm.\"";
+ HALLOWEENTIME = HALLOWEENTIME | $@halloween_got_charm_reward;
+ getitem "SkeletonCharm",1;
+ goto L_Exit;
+
+L_Exit:
+ close;
+}
+function script SpawnMunro {
+ if ($@halloween_time)
+ goto L_EnableMunro;
+ goto L_DisableMunro;
+
+L_EnableMunro:
+ enablenpc "Munro";
+ goto L_Return;
+
+L_DisableMunro:
+ disablenpc "Munro";
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/npc/annuals/halloween/trick_or_treat.txt b/npc/annuals/halloween/trick_or_treat.txt
new file mode 100644
index 00000000..fa4eb6f4
--- /dev/null
+++ b/npc/annuals/halloween/trick_or_treat.txt
@@ -0,0 +1,322 @@
+function script TrickOrTreat {
+ callfunc "HalloweenCheckOld";
+ if ($@halloween_time)
+ goto L_Halloween;
+ goto L_QuickReturn;
+
+L_Halloween:
+ if ((gettimetick(2)-TUT_var < $@halloween_min_age) || (BaseLevel < $@halloween_min_level)) //player must be created at least 1 weeks ago
+ goto L_QuickReturn;
+ menu
+ "Trick or Treat", L_HWQuest,
+ "[Go to normal NPC dialog]", L_QuickReturn;
+
+L_HWQuest:
+ @Mask = getequipid(equip_head);
+ goto L_Begin;
+
+L_Begin:
+ @karma = (HALLOWEENTIME & 65535);
+ if (@Mask > 0)
+ goto L_WearingMask;
+ goto L_NoMask;
+
+L_WearingMask:
+ // set the scare factor of the equipped mask
+ @Mask_index = 0;
+ @scare_factor = 1;
+ goto L_MaskLoop;
+
+L_MaskLoop:
+ if ($@halloween_mask_IDs[@Mask_index] == @Mask)
+ goto L_FoundMask;
+ @Mask_index = @Mask_index + 1;
+ if ($@halloween_mask_IDs[@Mask_index])
+ goto L_MaskLoop;
+ // not a mask in the list
+ @Mask = 0;
+ goto L_MaskDone;
+
+L_FoundMask:
+ @scare_factor = $@halloween_scare_factors[@Mask_index];
+ if (@Mask != 616)
+ goto L_MaskDone;
+ mes "\"Aaargh... Gross! This is sick! I can't even look at your face...\"";
+ goto L_MaskDone;
+
+L_MaskDone:
+ @Mask_index = 0;
+ // check if the mask is in the memory
+ @loop = 0;
+ // Note: we don't handle remembered faces until they get their candy
+ if (!@Mask)
+ goto L_MaskMemoryNo;
+ // check if the mask is remembered
+ goto L_MaskMemoryCheck;
+
+L_MaskMemoryCheck:
+ @tmp = $@halloween_maskmemory[8 * @halloween_npc_id + @loop];
+ if (!@tmp)
+ goto L_MaskMemoryNo;
+ if (@tmp == @Mask)
+ goto L_MaskMemoryYes;
+ @loop = @loop + 1;
+ if (@loop != $@halloween_memory_count)
+ goto L_MaskMemoryCheck;
+ goto L_MaskMemoryNo;
+
+L_MaskMemoryYes:
+ // not necessarily true
+ mes "\"I remember you, " + getitemlink(getequipid(equip_head)) + " person. No more treats for you!\"";
+ goto L_close;
+
+L_MaskMemoryNo:
+ // player will probably get treats
+ @loop = 0;
+ @sweets_types = 0;
+ goto L_Count_Sweets;
+
+L_Count_Sweets:
+ if ($@halloween_sweets[@loop] == 0)
+ goto L_Check_Inventory;
+ if (countitem($@halloween_sweets[@loop]))
+ @sweets_types = @sweets_types + 1;
+ @loop = @loop + 1;
+ goto L_Count_Sweets;
+
+L_Check_Inventory:
+ getinventorylist;
+ if (@inventorylist_count + (@loop - @halloween_invy) > 100)
+ goto L_Full_Inventory;
+ if (@Mask)
+ goto L_Check_Karma;
+ // check if the player's face is remembered
+ if (HALLOWEENTIME & (1 << (31 - @halloween_npc_id)))
+ goto L_Remember_Face;
+ goto L_Tricking_Trick_or_Treat;
+
+L_Check_Karma:
+ // NPC Cheater detection starts after max NPCs hit
+ if (rand($@halloween_num_npcs, 65535) <= @karma)
+ goto L_Cheater;
+ // NPC Cheater detection engages at 48 Trick or Treats
+ if (@karma >= 48)
+ goto L_Cheater;
+ if (HALLOWEENTIME & $@halloween_got_big_reward)
+ goto L_Tricking_Trick_or_Treat;
+ // assert: @karma < $@halloween_num_npcs
+ if (rand($@halloween_num_npcs - @karma))
+ goto L_Tricking_Trick_or_Treat;
+ mes "\"All this candy isn't healthy, here take this to have a break from it.\"";
+ getitem $@halloween_big_reward[rand(getarraysize($@halloween_big_reward))], 1;
+ HALLOWEENTIME = HALLOWEENTIME | $@halloween_got_big_reward;
+ // you get the big reward first, then the main treats
+ // otherwise it would be too complicated, and/or possibly unfair
+ goto L_Tricking_Trick_or_Treat;
+
+L_Cheater:
+ mes "\"I recognize you despite your mask, you have been taking sweets you do not deserve.\"";
+ if (@karma != 65535)
+ HALLOWEENTIME = HALLOWEENTIME + 1;
+ goto L_close;
+
+L_Remember_Face:
+ // mes "You've been here before; I remember your face";
+ mes "\"I remember your face, " + strcharinfo(0) + ". No more treats for you!\"";
+ goto L_close;
+
+L_Tricking_Trick_or_Treat:
+ // moved above
+ mes $@halloween_npc_names$[@halloween_npc_id];
+ mes $@halloween_greetings$[@halloween_npc_id];
+ next;
+ // TODO: should we randomize these? (in a subsequent commit)
+ menu
+ $@halloween_trick_notscary$[@halloween_npc_id], L_Tricking_Notscary,
+ $@halloween_trick_scary$[@halloween_npc_id], L_Tricking_Scary,
+ $@halloween_trick_veryscary$[@halloween_npc_id], L_Tricking_Veryscary;
+
+L_Tricking_Notscary:
+ mes $@halloween_npc_names$[@halloween_npc_id];
+ mes $@halloween_react_notscary$[@halloween_npc_id];
+ goto L_Tricking_Reward;
+
+L_Tricking_Scary:
+ mes $@halloween_npc_names$[@halloween_npc_id];
+ mes $@halloween_react_scary$[@halloween_npc_id];
+ @scare_factor = @scare_factor * 2;
+ goto L_Tricking_Reward;
+
+L_Tricking_Veryscary:
+ mes $@halloween_npc_names$[@halloween_npc_id];
+ mes $@halloween_react_veryscary$[@halloween_npc_id];
+ @scare_factor = @scare_factor * 3;
+ goto L_Tricking_Reward;
+
+L_Tricking_Reward:
+ next;
+ if (@karma >= 16)
+ @scare_factor = rand(@scare_factor / 2, @scare_factor);
+ if (@karma >= 24)
+ @scare_factor = rand(@scare_factor / 3, @scare_factor);
+ if (@scare_factor < 1)
+ @scare_factor = 1;
+ goto L_Tricking_Reward_Loop;
+
+L_Tricking_Reward_Loop:
+ @random = rand($@halloween_sweets_num);
+ setarray @getitem_ids, $@halloween_sweets[@random];
+ setarray @getitem_counts, 1;
+ callfunc "CheckInventory";
+ if (@check_fail)
+ @scare_factor = 0;
+ if (!@scare_factor)
+ goto L_Tricking_End;
+ // NOTE: it gives out one piece at a time, but can loop several times
+ getitem $@halloween_sweets[@random], 1;
+ @scare_factor = @scare_factor - 1;
+ goto L_Tricking_Reward_Loop;
+
+L_SetRememberFace:
+ HALLOWEENTIME = HALLOWEENTIME | (1 << (31 - @halloween_npc_id));
+ goto L_close;
+
+L_Tricking_End:
+ mes $@halloween_npc_names$[@halloween_npc_id];
+ mes "\"That should be enough sweets for you. Thanks for participating!\"";
+ if (!@Mask)
+ goto L_SetRememberFace;
+ // add the player's mask to the list
+ @loop = 7;
+ goto L_SetRememberMask;
+
+L_SetRememberMask:
+ $@halloween_maskmemory[8 * @halloween_npc_id + @loop] = $@halloween_maskmemory[8 * @halloween_npc_id + @loop - 1];
+ @loop = @loop - 1;
+ if (@loop)
+ goto L_SetRememberMask;
+ $@halloween_maskmemory[8 * @halloween_npc_id] = @Mask;
+ HALLOWEENTIME = HALLOWEENTIME + 1;
+ goto L_close;
+
+L_Full_Inventory:
+ mes $@halloween_npc_names$[@halloween_npc_id];
+ mes "\"You are trying to collect candy but you have no space to carry all the kinds of stuff that I have to offer! Please, save room for more stuff and come back.\"";
+ goto L_close;
+
+L_NoMask:
+ mes $@halloween_npc_names$[@halloween_npc_id];
+ mes "\"Hey " + strcharinfo(0) + ", are you trying to scare me with your face? Interesting! hahaha...\"";
+ goto L_close;
+
+L_close:
+ @tmp = 0;
+ @Mask = 0;
+ @karma = 0;
+ @loop = 0;
+ @menu = 0;
+ @halloween_npc_id = 0;
+ return;
+
+L_QuickReturn:
+ @halloween_npc_id = 0;
+ return;
+}
+function script TrickOrTreatTally {
+ @npc_loop = 0;
+ @npc_tally = 0;
+ goto L_LoopCheck;
+
+L_LoopCheck:
+ if (HALLOWEENTIME & (1 << (31 - @npc_loop)))
+ @npc_tally = (@npc_tally + 1);
+ goto L_IncLoop;
+
+L_IncLoop:
+ @npc_loop = (@npc_loop + 1);
+ if (@npc_loop >= 15)
+ goto L_Return;
+ goto L_LoopCheck;
+
+L_Return:
+ return;
+}
+function script HalloweenCheckOld {
+ if(HALLOWEENYEAR == $HALLOWEEN_TIME_KEY[5])
+ goto L_Return;
+ goto L_OldMatch;
+
+L_OldMatch:
+ HALLOWEENTIME = 0;
+ HALLOWEENYEAR = $HALLOWEEN_TIME_KEY[5];
+ goto L_Return;
+
+L_Return:
+ return;
+}
+function script HalloweenTree {
+ mes "[Confused Tree]";
+ if ((HALLOWEENTIME & 65535) > ($@halloween_num_npcs * 3))
+ mes "\"Whoa slow down greedy, leave some candy for the reset of us!\"";
+ if ((HALLOWEENTIME & 65535) > $@halloween_num_npcs)
+ mes "\"I see you have ben enjoying trick or treating, I hope you don't get a stomach ache.\"";
+ if ((HALLOWEENTIME & 65535) <= $@halloween_num_npcs)
+ mes "\"I love halloween, wearing masks and going trick or treating is so much fun.\"";
+ goto L_StartMenu;
+
+L_StartMenu:
+ menu
+ "Whats Halloween?", L_Explain,
+ "Me too!", L_CheckDressed,
+ "Meh, I like Christmas Better.", L_XmasBetter;
+
+L_Explain:
+ mes "\"I've convinced some people throughout the world to help with trick or treating.\"";
+ next;
+ @npc_check_loop = 0;
+ goto L_NpcCheckLoop;
+
+L_NpcCheckLoop:
+ mes $@halloween_npc_names$[@npc_check_loop];
+ next;
+ goto L_NpcCheckInc;
+
+L_NpcCheckInc:
+ @npc_check_loop = (@npc_check_loop + 1);
+ if (@npc_check_loop >= getarraysize($@halloween_npc_names$))
+ goto L_ContinueExplain;
+ goto L_NpcCheckLoop;
+
+L_ContinueExplain:
+ mes "\"Find each person and put on a mask then try to scare them.\"";
+ next;
+ mes "\"The scarier you are, the more treats you will be awarded.\"";
+ next;
+ mes "\"If you are really scary you could get a rare reward.\"";
+ next;
+ goto L_StartMenu;
+
+L_CheckDressed:
+ @head = getequipid(equip_head);
+ @chest = getequipid(equip_torso);
+ @leg = getequipid(equip_legs);
+ @random_mes$ = "\" I like your costume.\"";
+ if ((@head <= 0) && (@chest <= 0) && (@leg <= 0))
+ @random_mes$ = "\"Birthday Suit, always a classic.\"";
+ if ((@head == 615) && (@chest == 870))
+ @random_mes$ = "\"How embrassing... we are wearing the same costume.\"";
+ if ((@head == 617) || (@head == 622) || (@head == 621))
+ @random_mes$ = "\"Yar, matey I see that.\"";
+ if ((@head == 633) || (@head == 1205) || (@chest == 1183) || (@chest == 1184) || (@chest == 1185) || (@chest == 1186) || (@chest == 1187))
+ @random_mes$ = "\"Your sense of humor offends me, it's way to early for that.\"";
+ mes @random_mes$;
+ goto L_Return;
+
+L_XmasBetter:
+ mes "\"Bah, Humbug, Show your Halloween spirit! OOooooOooo\"";
+ misceffect 302, strcharinfo(0);
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/npc/annuals/tree_beard.txt b/npc/annuals/tree_beard.txt
new file mode 100644
index 00000000..ba135853
--- /dev/null
+++ b/npc/annuals/tree_beard.txt
@@ -0,0 +1,1038 @@
+020-1,90,79,0 script Present#1 NPC386,{
+ callfunc "XmasStates";
+ callfunc "XmasMainItemReward";
+ close;
+}
+
+009-1,54,39,0 script Present#2 NPC386,{
+ callfunc "XmasStates";
+ callfunc "XmasMainItemReward";
+ close;
+}
+
+001-1,58,76,0 script Present#3 NPC386,{
+ callfunc "XmasStates";
+ callfunc "XmasMainItemReward";
+ close;
+}
+
+function script SpawnMobs {
+ donpcevent "XmasSpawnManager::OnCommandSpawnStart";
+ return;
+}
+
+function script PresentHandler {
+ if($@xmas_time == $@xmas_reward_time)
+ goto L_DeliverPresents;
+ goto L_DisablePresents;
+
+L_DeliverPresents:
+ enablenpc "Present#1";
+ enablenpc "Present#2";
+ enablenpc "Present#3";
+ goto L_Return;
+
+L_DisablePresents:
+ disablenpc "Present#1";
+ disablenpc "Present#2";
+ disablenpc "Present#3";
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+function script ReplaceTrees {
+ if ($@xmas_time)
+ goto L_XmasTree;
+ if ($@halloween_time)
+ goto L_HalloweenLive;
+
+ setnpcdisplay("#ConfusedTree", NPC394);
+ setnpcdisplay("#ConfusedIcedTree", NPC380);
+ setnpcdisplay("#ConfusedPalmTree", NPC384);
+ return;
+
+L_XmasTree:
+ setnpcdisplay("#ConfusedTree", NPC381);
+ setnpcdisplay("#ConfusedIcedTree", NPC379);
+ setnpcdisplay("#ConfusedPalmTree", NPC383);
+ return;
+
+L_HalloweenLive:
+ setnpcdisplay("#ConfusedTree", NPC133);
+ setnpcdisplay("#ConfusedIcedTree", NPC133);
+ setnpcdisplay("#ConfusedPalmTree", NPC133);
+ return;
+}
+
+// Evol scripts.
+// Author:
+// gumi
+// Based on CrazyTree, originally made by:
+// gumi
+// pclouds
+// veryape
+// wushin
+// Description:
+// emulated confused tree prototype
+
+// ~t lowercase hot word regex
+
+009-1,54,38,0 script #ConfusedTree NPC394,14,14,{
+
+ function tree_panel {
+ if (is_trusted() == false && #Tree_Trusted == false)
+ {
+ narrator(l("You see a tree."));
+ // FIXME Inspector Quest
+ if (getq(HurnscaldQuests_Inspector) == 2)
+ {
+ select(
+ l("Have you seen anything strange lately?"),
+ l("Do you know anything about the recent robberies?"));
+
+ narrator(S_FIRST_BLANK_LINE,
+ l("..."),
+ l("It doesn't reply."));
+ }
+ close;
+ }
+
+ function clear_db {
+ clear();
+ mes(l("##BWARNING:##b you are about to permanently empty the quote database."));
+ next();
+ mes(l("Do you want to continue?"));
+
+ select(
+ l("Abort!"),
+ l("Empty the quote DB"));
+
+ if (@menu == 2)
+ {
+ .@sentence$ = "I am an idiot";
+ mes(l("Please write the following sentence:"));
+ mes("");
+ mesf(" ##B%s.", .@sentence$);
+ input(.@confirm$);
+
+ if (!startswith(strtoupper(.@confirm$), strtoupper(.@sentence$))) {
+ mes(l("Invalid!"));
+ close;
+ }
+
+ query_sql("TRUNCATE TABLE tree_quotes;");
+ mes(l("Database erased."));
+ // GM Log
+ logmes(sprintf("%s has deleted all quotes from CrazyTree =(", strcharinfo(0)), LOGMES_ATCOMMAND);
+ next();
+ }
+
+ return;
+ }
+
+ function list_commands {
+ clear();
+ mes(l("To grab a quote:"));
+ mes(col(" ~grab ##Bplayer name##b", 7));
+ next();
+ mes(l("To get a quote:"));
+ mes(col(" ~quote anyone", 7));
+ mes(col(" ~quote ##Bplayer name##b", 7));
+ mes(col(" ~quote ##B#number##b", 7));
+ next();
+ mes(l("To remove a quote:"));
+ mes(col(" ~remove quote ##B#number##b", 7));
+ mes(col(" ~remove last quote", 7));
+ next();
+ mes(l("Last seen:"));
+ mes(col(" ~seen ##Bplayer name##b", 7));
+ next();
+ mes(l("To ignore a player:"));
+ mes(col(" ~ignore ##Bplayer name##b", 7));
+ next();
+ mes(l("To unignore a player:"));
+ mes(col(" ~unignore ##Bplayer name##b", 7));
+ next();
+
+ if (is_admin())
+ {
+ mes(l("To trust a player:"));
+ mes(col(" ~trust ##Bplayer name##b", 7));
+ next();
+ mes(l("To de-trust a player:"));
+ mes(col(" ~untrust ##Bplayer name##b", 7));
+ next();
+ }
+ return;
+ }
+
+ do
+ {
+ clear();
+ setnpcdialogtitle(l("Tree Control Panel"));
+ mes(l("Oh noes! You found my secret backdoor!"));
+ next();
+ mes(l("Please select an option:"));
+
+ select(
+ l("List the commands"),
+ rif(is_admin(), l("Empty the quote DB")),
+ l("Dance for me"));
+
+ switch (@menu)
+ {
+ case 1: list_commands(); break;
+ case 2: clear_db(); break;
+ default: speech(l("Too lazy.")); close;
+ }
+
+ } while (true);
+
+ end;
+ }
+
+ // utility functions below
+
+ function check_is_ignored {
+ .@val = htget(.ignore_ht, strcharinfo(PC_NAME), 0);
+
+ if (.@val > gettimetick(2))
+ {
+ ++.ignored_times;
+ end;
+ }
+
+ else if (.@val > 0)
+ {
+ htput(.ignore_ht, strcharinfo(PC_NAME), 0); // remove expired entries
+ }
+
+ return;
+ }
+
+ function special_name {
+ .@name$ = strcharinfo(PC_NAME);
+ .@low$ = strtolower(.@name$);
+
+ if (rand(.sname_rate) == 0)
+ {
+ for (.@i = 0; .@i < .alias; .@i += 2)
+ {
+ if (.@low$ ~= .alias$[.@i])
+ {
+ explode(.@aliases$, .alias$[.@i+1], "`");
+ .@name$ = .@aliases$[rand(getarraysize(.@aliases$))];
+ break;
+ }
+ }
+ }
+
+ return .@name$;
+ }
+
+ function face {
+ if (gettimetick(2) - .last_emote < .emote_rate)
+ {
+ ++.ignored_times;
+ return;
+ }
+
+ .last_emote = gettimetick(2);
+ return emotion(getarg(0, E_SURPRISE));
+ }
+
+ function rp {
+ // used for queries
+ return replacestr(getarg(0,""), "~t", strtolower("(?:" + .name$ + "|" + .hotwords$ + ")"));
+ }
+
+ function format_reply {
+ // used for replies
+ .@str$ = getarg(0, "");
+
+ // search for {{mustaches}}
+ while (.@str$ ~= "{{([^}]+)}}")
+ {
+ .@sub$ = replacestr($@regexmatch$[1], " ", ""); // remove whitespaces
+ .@sub$ = strtolower(.@sub$); // always lowercase the var name
+ .@capitalize = .@titlecase = .@allcaps = false;
+
+ if (charat(.@sub$, 0) == "^")
+ {
+ .@capitalize = true;
+ .@sub$ = substr(.@sub$, 1, getstrlen(.@sub$) - 1); // strip first char
+ }
+
+ else if (charat(.@sub$, 0) == "+")
+ {
+ .@titlecase = true;
+ .@sub$ = substr(.@sub$, 1, getstrlen(.@sub$) - 1); // strip first char
+ }
+
+ else if (charat(.@sub$, 0) == "!")
+ {
+ .@allcaps = true;
+ .@sub$ = substr(.@sub$, 1, getstrlen(.@sub$) - 1); // strip first char
+ }
+
+ if (compare(.@sub$, ",")) {
+ .@var$ = sprintf(".H%s$", substr(md5(.@sub$), 0, 25));
+
+ if (getelementofarray(getd(.@var$), 1) == "") {
+ explode(.@sub2$, .@sub$, ",");
+ .@size = 1;
+
+ for (.@i = 0; .@i < getarraysize(.@sub2$); ++.@i) {
+ .@subsize = getd(sprintf(".D_%s", .@sub2$));
+ copyarray(getelementofarray(getd(.@var$), .@size), getd(sprintf(".D_%s$[1]", .@sub2$)), .@subsize);
+ .@size += .@subsize;
+ }
+ }
+ } else {
+ .@var$ = sprintf(".D_%s$", .@sub$);
+ }
+
+ .@rep$ = relative_array_random(getd(.@var$));
+
+ if (.@capitalize) .@rep$ = capitalize(.@rep$);
+ else if (.@titlecase) .@rep$ = titlecase(.@rep$);
+ else if (.@allcaps) .@rep$ = strtoupper(.@rep$);
+
+ .@str$ = replacestr(.@str$, $@regexmatch$[0], .@rep$); // remove the mustache, replace by value
+ }
+
+ // search for emotes
+ if (.@str$ ~= "%%([^ ])")
+ {
+ // only handling a few of them
+ switch (ord($@regexmatch$[1]))
+ {
+ case 73: face(any(E_WINK, E_ANGEL)); break;
+ case 83: face(any(E_SAD, E_CRYING)); break;
+ case 85: face(E_SURPRISE); break;
+ case 93: face(any(E_HEARTEYE, E_HEART)); break;
+ case 94: face(E_DISGUST); break;
+ case 99: face(E_DEAD); break;
+ case 105: face(E_CRYING); break;
+ case 106:
+ case 91: face(any(E_SPEECH, E_BLAH)); break;
+ case 107: face(E_INSULTBUBBLE); break;
+ default: .@unhandled = true;
+ }
+
+ if (.@unhandled != true)
+ {
+ if (.@str$ == $@regexmatch$[0]) end; // don't send handled, emote-only messages
+ .@str$ = replacestr(.@str$, " "+ $@regexmatch$[0], ""); // otherwise strip the emote
+ }
+ }
+
+ // built-in variables
+ .@str$ = replacestr(.@str$, "~n", .name$); // npc name
+ .@str$ = replacestr(.@str$, "~p", special_name()); // player name or special name
+ .@str$ = replacestr(.@str$, "~P", strcharinfo(PC_NAME)); // unaltered player name
+
+ return rp(.@str$);
+ }
+
+ function strip_colors {
+ .@str$ = replacestr(getarg(0, ""), "##0", "");
+ .@str$ = replacestr(.@str$, "##1", "");
+ .@str$ = replacestr(.@str$, "##2", "");
+ .@str$ = replacestr(.@str$, "##3", "");
+ .@str$ = replacestr(.@str$, "##4", "");
+ .@str$ = replacestr(.@str$, "##5", "");
+ .@str$ = replacestr(.@str$, "##6", "");
+ .@str$ = replacestr(.@str$, "##7", "");
+ .@str$ = replacestr(.@str$, "##8", "");
+ .@str$ = replacestr(.@str$, "##9", "");
+ return replacestr(.@str$, "##a", "");
+ }
+
+ function strip_formatting {
+ .@str$ = strip_colors(getarg(0, ""));
+ .@str$ = replacestr(.@str$, "##B", "");
+ return replacestr(.@str$, "##b", "");
+ }
+
+ function delayed_reply {
+ ++.answered_times;
+ @tree_reply$ = getarg(0, "");
+ addtimer(.delay_reply, .name$ + "::OnDoReply");
+ return;
+ }
+
+ function reply {
+ .@reply$ = format_reply(getarg(0, ""));
+ getmapxy(.@pc_map$, .@pc_x, .@pc_y, UNITTYPE_PC); // get char location
+
+ if (((.@reply$ == .last_reply$ && gettimetick(2) - .last_reply < .repeat_rate)
+ || gettimetick(2) - .last_reply < .talk_rate
+ || (gettimetick(2) - .blocked < .block_time && is_trusted() == false)
+ || .@pc_map$ != .map$
+ || distance(.x, .y, .@pc_x, .@pc_y) > .distance
+ || .@reply$ == "")
+ && is_dev() == false)
+ {
+ ++.ignored_times;
+ return;
+ }
+
+ .last_reply = gettimetick(2);
+ .last_reply$= .@reply$;
+
+ delayed_reply(.@reply$);
+ return;
+ }
+
+ function seen_me {
+ if (playerattached() > 0 && htexists(.seen_ht))
+ {
+ htput(.seen_ht, strcharinfo(PC_NAME), gettimetick(2));
+ }
+ return;
+ }
+
+ function have_you_seen {
+ .@player$ = getarg(0, "");
+ .@player = getcharid(CHAR_ID_ACCOUNT, .@player$);
+
+ if (.@player > 0)
+ {
+ // nested if, because they don't short-circuit
+ if (checkoption(Option_Invisible, .@player) == false) {
+ delayed_reply(sprintf("Player `%s` is currently online.", .@player$));
+ end;
+ }
+ }
+
+ .@time = htget(.seen_ht, .@player$, 0);
+
+ if (.@time < 1)
+ delayed_reply(sprintf("I haven't seen player `%s` today.", .@player$));
+
+ else
+ delayed_reply(sprintf("Player `%s` was last seen %s.", .@player$, FuzzyTime(.@time, 0, 99)));
+
+ end;
+ }
+
+ function special_drops {
+ .@drop$ = relative_array_random(.drops$);
+ .@name$ = strcharinfo(PC_NAME);
+ .@low$ = strtolower(.@name$);
+
+ if (rand(.sdrop_rate) == 0)
+ {
+ for (.@i = 0; .@i < .sdrops; .@i += 2)
+ {
+ if (.@low$ ~= .sdrops$[.@i])
+ {
+ explode(.@d$, .sdrops$[.@i+1], "`");
+ .@drop$ = .@d$[rand(getarraysize(.@d$))];
+ break;
+ }
+ }
+ }
+
+ return .@drop$;
+ }
+
+ function roll_dice {
+ .@dices = max(min(getarg(0, 1), 8), 1); // 1..8
+ .@sides = max((getarg(1, 6) < 1 ? 6 : getarg(1, 6)), 1); // 1..MAX_INT
+
+ .@result$ = sprintf("*rolls the dice%s: %d",
+ rif(.@dices > 1, "s"), rand(1, .@sides)); // first dice
+
+ for (.@d = 1; .@d < .@dices; ++.@d)
+ {
+ .@result$ += ", " + rand(1, .@sides);
+ }
+
+ return .@result$ + ".*";
+ }
+
+ function flip_coin {
+ .@coins = getarg(0, 1);
+
+ .@result$ = sprintf("*flips the coin%s: %s",
+ rif(.@coins > 1, "s"), (rand(2) == 1 ? "heads" : "tails")); // first coin
+
+ for (.@c = 1; .@c < .@coins; ++.@c)
+ {
+ .@result$ += ", " + (rand(2) == 1 ? "heads" : "tails");
+ }
+
+ return .@result$ + ".*";
+ }
+
+ function roulette {
+ if (.roulette == 1)
+ {
+ npctalk("*pulls the trigger: *##BBANG##b*.*");
+ delayed_reply("*reloads and spins the chambers.*");
+ .roulette = rand(1, 7); // the Nagant_M1895 has 7 chambers
+
+ // now the fun part
+ nude();
+ percentheal(-100, 0);
+ }
+
+ else
+ {
+ delayed_reply("*pulls the trigger: *click*.*");
+ .roulette = (.roulette == 7 ? 1 : .roulette + 1);
+ }
+
+ end;
+ }
+
+ function monologue_player {
+ return sprintf("Your current monologue is at least %d line%s long.",
+ @monologue, rif(@monologue != 1, "s"));
+ }
+
+ function who_player {
+ return sprintf("You seem to be ##B~P##b [%i:%i].",
+ getcharid(CHAR_ID_ACCOUNT), getcharid(CHAR_ID_CHAR));
+ }
+
+ function make_quote_table {
+ // Do not modify this
+ query_sql("CREATE TABLE IF NOT EXISTS `tree_quotes` ("
+ " `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,"
+ " `char_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',"
+ " `grabber` INT(11) UNSIGNED NOT NULL DEFAULT '0',"
+ " `timestamp` INT(10) UNSIGNED NOT NULL DEFAULT '0',"
+ " `message` VARCHAR(150) NOT NULL DEFAULT '',"
+ " PRIMARY KEY (`id`),"
+ " KEY `char_id` (`char_id`),"
+ " KEY `grabber` (`grabber`)"
+ ") ENGINE=MyISAM;");
+
+ .last_query = gettimetick(2);
+ return;
+ }
+
+ function grab_quote {
+ .@name$ = getarg(0, "");
+
+ if (gettimetick(2) - .last_query < (is_trusted() ? .qpoll_rate : .qpoll_rate2))
+ {
+ ++.ignored_times;
+ end;
+ }
+
+ if (.@name$ == strcharinfo(PC_NAME))
+ {
+ delayed_reply("##BError: You may not grab yourself.");
+ end;
+ }
+
+ explode(.@tmp$[0], htget(.msg_ht, .@name$, ""), ":"); // get last message, if any
+ htput(.msg_ht, .@name$, ""); // ensure you can't grab twice the same message
+
+ .@char_id = atoi(.@tmp$[0]); // grab the char id part
+
+ if (.@char_id < 1)
+ {
+ delayed_reply(sprintf("##BError: I couldn't find anything to grab from player `%s`.", .@name$));
+ end;
+ }
+
+ .@msg$ = implode(.@tmp$, ":"); // put it back together
+ .@start = getstrlen(.@tmp$[0]) + getstrlen(.@tmp$[1]) + 2; // char:time:msg <= we just want the msg part
+ .@msg$ = escape_sql(strip_formatting(substr(.@msg$, .@start, getstrlen(.@msg$) - 1))); // sanitize
+
+ if (.@msg$ == "")
+ {
+ delayed_reply("##BError: Message is empty or malformed. It cannot be grabbed.");
+ end;
+ }
+
+ else if (.@msg$ ~= "^[!#~@]?(?:grab)?shield(?:ed)?(?:[:.!]? .*)?$")
+ {
+ delayed_reply("##BError: Message is shielded.");
+ end;
+ }
+
+ query_sql(sprintf("INSERT INTO tree_quotes (char_id,grabber,timestamp,message) VALUES (%i,%i,%i,'%s');",
+ .@char_id, getcharid(CHAR_ID_CHAR), gettimetick(2), .@msg$));
+
+ query_sql("SELECT MAX(id) FROM tree_quotes;", .q_last_id); // get the last quote id
+
+ .last_query = gettimetick(2);
+
+ delayed_reply(sprintf("Success: Quote grabbed. (#%i)", .q_last_id));
+ end;
+ }
+
+ function remove_quote {
+ .@tmp = getarg(0, 0);
+
+ if (gettimetick(2) - .last_query < (is_trusted() ? .qpoll_rate : .qpoll_rate2))
+ {
+ ++.ignored_times;
+ end;
+ }
+
+ query_sql(sprintf("SELECT id FROM tree_quotes WHERE id = %i ORDER BY id DESC LIMIT 1;", .@tmp), .@id); // check if it exists
+
+ if (.@id < 1)
+ {
+ delayed_reply(sprintf("##BError: I couldn't find quote #%i in the database.", .@tmp));
+ end;
+ }
+
+ query_sql(sprintf("DELETE FROM tree_quotes WHERE id = %i ORDER BY id DESC LIMIT 1;", .@id));
+
+ .last_query = gettimetick(2);
+
+ delayed_reply(sprintf("Success: Quote removed. (#%i)", .@id));
+ end;
+ }
+
+ function cite_quote {
+ .@id = getarg(0,0);
+
+ if (gettimetick(2) - .last_query < (is_trusted() ? .qpoll_rate : .qpoll_rate2))
+ {
+ ++.ignored_times;
+ end;
+ }
+
+ // FIXME: Maybe load all quotes to memory and only do a SQL lookup oninit
+ query_sql(sprintf("SELECT t.id, c.name AS grabee, d.name AS grabber, t.timestamp, t.message "
+ "FROM `tree_quotes` t "
+ "JOIN `char` c ON t.char_id = c.char_id "
+ "JOIN `char` d ON t.grabber = d.char_id "
+ "WHERE t.id=%i ORDER BY t.id DESC LIMIT 1;",
+ .@id),
+ .@nid[0], .@grabee$[0], .@grabber$[0], .@time[0], .@msg$[0]);
+
+ .last_query = gettimetick(2);
+
+ if (.@nid[0] < 1)
+ {
+ delayed_reply(sprintf("##BError: I couldn't find quote #%i in the database.", .@id));
+ end;
+ }
+
+ delayed_reply(sprintf("<%s> ##B%s##b ##a— grabbed by %s %s.",
+ .@grabee$[0], .@msg$[0], .@grabber$[0], FuzzyTime(.@time[0],0,1)));
+ end;
+ }
+
+ function random_quote {
+ .@name$ = escape_sql(getarg(0, ""));
+
+ if (gettimetick(2) - .last_query < (is_trusted() ? .qpoll_rate : .qpoll_rate2))
+ {
+ ++.ignored_times;
+ end;
+ }
+
+ query_sql("SELECT t.id, c.name AS grabee, d.name AS grabber, t.timestamp, t.message "
+ "FROM `char` c "
+ "JOIN `tree_quotes` t ON t.char_id = c.char_id "
+ "JOIN `char` d ON d.char_id = t.grabber " +
+ rif(.@name$ != "", sprintf("WHERE c.name='%s' ", .@name$)) +
+ "ORDER BY RAND() LIMIT 1;",
+ .@nid[0], .@grabee$[0], .@grabber$[0], .@time[0], .@msg$[0]);
+
+ .last_query = gettimetick(2);
+
+ if (.@nid[0] < 1)
+ {
+ if (.@name$ != "")
+ delayed_reply(sprintf("##BError: I couldn't find any quote from `%s` in the database.", getarg(0, "")));
+ else
+ delayed_reply("##BError: The quote database is empty.");
+ end;
+ }
+
+ delayed_reply(sprintf("<%s> ##B%s##b ##a— grabbed by %s %s. (#%i)",
+ .@grabee$[0], .@msg$[0], .@grabber$[0], FuzzyTime(.@time[0],0,1), .@nid[0]));
+ end;
+ }
+
+ function trigger_hotword {
+ .@o$ = getarg(0, ""); // original lowercase
+ .@m$ = replacestr(.@o$, "*", ""); // original lowercase clean
+
+
+ if (.@m$ ~= "(?:^| )tell(?: (?:me|him|her|us|them))? a(?:n ?other| lame| bad| boring)? joke")
+ reply(relative_array_random(.jokes$));
+
+ else if (.@m$ ~= "(?:^| )heal me(?:$|[^a-z])")
+ reply(relative_array_random(.healing$));
+ // XXX: maybe actually heal the player once in a while
+
+ else if (.@m$ ~= "(?:^| )(?:what|who) are you")
+ reply(relative_array_random(.whoami$));
+
+ else if (.@m$ ~= rp("(?:^| )(?:hi+|hello|heya?|hiya|good (?:morning|afternoon))[^a-z]* .*~t|~t.* (?:hi+|hello|heya?|hiya)"))
+ {
+ .blocked = 0;
+ .@rpl$ = relative_array_random(.greetings$);
+ reply(.@rpl$);
+ }
+
+ else if (.@o$ ~= rp("(?:^[*]| )(?:kicks?|shakes?) .*~t"))
+ reply(special_drops());
+
+ else if (.@o$ ~= rp("(?:^[*]| )(?:cuts?|nukes?|kills?|chops? down|saws?|hews?|murders?) .*~t"))
+ reply(relative_array_random(.kill$));
+
+ else if (.@o$ ~= rp("(?:^[*]| )pokes? .*~t"))
+ reply(relative_array_random(.poke$));
+
+ else if (.@o$ ~= rp("(?:^[*]| )(?:waters?|pees?|licks?) .*~t"))
+ reply(relative_array_random(.disgusting$));
+
+ else if (compare(.@m$, " answer ") && .@m$ ~= "(?:life|universe|everything)(?:$|[^a-z])")
+ reply(relative_array_random(.answer$));
+
+ else if (.@o$ ~= rp("(?:^[*]| )(?:burns?|incinerates?|ignites?) .*~t"))
+ reply(relative_array_random(.burning$));
+ // XXX: maybe here send a fire particle effect
+
+ else if (.@m$ ~= rp("(?:^| )die ~t"))
+ reply(relative_array_random(.die$));
+
+ else if (.@o$ ~= rp("(?:^[*]| )bites? .*~t|(?:^[*]| )drops? .* on ~t"))
+ reply(relative_array_random(.silly$));
+
+ else if (.@m$ ~= rp("(?:^| )(?:loves?|hugs?|kiss(es)?) .*~t|~t.* love(?:$|[^a-z])"))
+ reply(relative_array_random(.love$));
+
+ else if (.@m$ ~= rp("(?:^| )dance .*~t|~t.* dance(?:$|[^a-z])"))
+ reply(relative_array_random(.dance$));
+
+ else if (.@m$ ~= rp("(?:^| )hates? .*~t"))
+ reply(relative_array_random(.hate$));
+
+ else if (.@o$ ~= rp("(?:^[*]| )(?:eats?|shoots?|plucks?|tortures?|slaps?|slaps?|poisons?|breaks?|stabs?|throws?|punch(?:es)?) .*~t"))
+ reply(relative_array_random(.pain$));
+
+ else if (.@o$ ~= rp("(?:^[*]| )(?:climbs?|rides?|mounts?) .*~t"))
+ reply(relative_array_random(.climb$));
+
+ else if (.@m$ ~= "(?:^| )(?:see y(?:a|ou)|good night|(?:bye)?bye+)(?:$|[^a-z])")
+ reply(relative_array_random(.bye$));
+
+ else if (.@m$ ~= rp("(?:^| )bad ~t"))
+ reply(relative_array_random(.bad$));
+
+ else if (.@m$ ~= "(?:^| )(?:how old are you|uptime)(?:$|[^a-z])")
+ reply("%%B Server uptime: " + FuzzyTime(.uptime, 1, 99) + ".");
+
+ else if (.@m$ ~= "(?:^| )how chatty are you(?:$|[^a-z])")
+ reply("%%B Answered " + .answered_times + " times, ignored " + .ignored_times + " times.");
+
+ else if (.@m$ ~= "(?:^| )what.* version(?:$|[^a-z])")
+ reply("%%B ~n, version " + .version + "."); // XXX: maybe return Hercules version and serverdata commit instead
+
+ else if (.@m$ ~= "(?:^| )(?:(?:8|eight)[ -]?ball|(?:should|would|will|do|does) (?:i|you|he|she|it|we|they))(?:$|[^a-z])")
+ reply(relative_array_random(.eightball$));
+
+ else if (.@m$ ~= "(?:^| )roll(?: a| the)? dice(?:$|[^a-z])")
+ reply(roll_dice(1, 6));
+
+ else if (.@m$ ~= "(?:^| )roll(?: a)? ([1-8])d((?:[1-9][0-9]{0,10})?)(?:$|[^0-9a-z])")
+ reply(roll_dice(atoi($@regexmatch$[1]), atoi($@regexmatch$[2])));
+
+ else if (.@m$ ~= "(?:^| )roll ([1-8]) dices?(?:$|[^a-z])")
+ reply(roll_dice(atoi($@regexmatch$[1]), 6));
+
+ else if (.@m$ ~= "(?:^| )(?:flip|toss)(?: a| the)? coin(?:$|[^a-z])")
+ reply(flip_coin(1));
+
+ else if (.@m$ ~= "(?:^| )(?:flip|toss) ([1-8]) coins?(?:$|[^a-z])")
+ reply(flip_coin(atoi($@regexmatch$[1])));
+
+ else if (.@m$ ~= "(?:^| )(?:press|pull)(?: the)? trigger(?:$|[^a-z])")
+ roulette();
+
+ else if (.@m$ ~= "(?:^| )(?:how long|what) is(?: my)? monologue(?:$|[^a-z])")
+ reply(monologue_player());
+
+ else if (.@m$ ~= "(?:^| )who am i(?:$|[^a-z])")
+ reply(who_player());
+
+ else if (.@m$ ~= "(?:^| )shut up(?:$|[^a-z])")
+ {
+ reply(relative_array_random(.shut_up$));
+ .blocked = gettimetick(2);
+ }
+
+ else if (rand(.dunno_rate) == 0)
+ reply(relative_array_random(.no_idea$));
+
+ else
+ ++.ignored_times;
+
+ end;
+ }
+
+ function trigger_hiall {
+ if (rand(.hiall_rate) == 0)
+ reply(relative_array_random(.greetings$));
+
+ else
+ ++.ignored_times;
+
+ end;
+ }
+
+OnClick:
+ //if ($@xmas_time)
+ // goto L_XmasTree;
+ if ($@halloween_time)
+ callfunc "HalloweenTree";
+ tree_panel();
+ end;
+
+
+OnTalkNearby:
+ .@no_nick$ = strip(strip_formatting(substr($@p0$, getstrlen(strcharinfo(PC_NAME)) + 3, getstrlen($@p0$) - 1))); // not very obvious stuff
+ .@no_nick_lower$ = strtolower(.@no_nick$); // FIXME: hercules doesn't have a way to do case insensitive regex yet
+ .@no_nick_clean$ = replacestr(.@no_nick_lower$, "*", "");
+
+ htput(.msg_ht, strcharinfo(PC_NAME), getcharid(CHAR_ID_CHAR) + ":" + gettimetick(2) + ":" + .@no_nick$); // log last message, for quotegrabs
+ .lastsender = getcharid(CHAR_ID_CHAR); // for monologue
+
+ .last_activity = gettimetick(2); // for the auto-janitor
+
+ if ((is_trusted() || #Tree_Trusted) && charat(.@no_nick$, 0) == .symbol$)
+ {
+ if (.@no_nick$ ~= "^.grab \"?([^#:@\"]{4,23})\"?$")
+ reply(grab_quote($@regexmatch$[1]));
+
+ else if (.@no_nick$ ~= "^.(?:ungrab|remove|delete)(?: quote)? #([0-9]+)$")
+ reply(remove_quote(atoi($@regexmatch$[1])));
+
+ else if (.@no_nick$ ~= "^.(?:ungrab|remove|delete)(?: last(?: quote)?)?$")
+ reply(remove_quote(.q_last_id));
+
+ else if (.@no_nick$ ~= "^.(?:quote|cite) #([0-9]+)$")
+ reply(cite_quote(atoi($@regexmatch$[1])));
+
+ else if (.@no_nick$ ~= "^.(?:(?:random )?quote|cite)(?: anyone| someone| random)?$")
+ reply(random_quote());
+
+ else if (.@no_nick$ ~= "^.(?:quote|cite) \"?([^#:@\"]{4,23})\"?$")
+ reply(random_quote($@regexmatch$[1]));
+
+ else if (.@no_nick$ ~= "^.seen \"?([^#:@\"]{4,23})\"?$")
+ reply(have_you_seen($@regexmatch$[1]));
+
+ // to allow trusted testers to reboot without knowing the exit code
+ else if (debug && .@no_nick$ ~= "^.re(?:boot|load|start)(?:(?: the)? server)?$")
+ {
+ announce("The server is rebooting. This may take a couple minutes.", bc_all);
+ // GM Log
+ logmes(sprintf("%s has restarted the server with CrazyTree.", strcharinfo(0)), LOGMES_ATCOMMAND);
+ sleep2(1000);
+ atcommand("@serverexit 104");
+ }
+
+ // exit, pull all, clean, build, reboot
+ else if (debug && .@no_nick$ ~= "^.re-?build(?:(?: the)? server)?$")
+ {
+ announce("The server is rebuilding. This will take several minutes.", bc_all);
+ // GM Log
+ logmes(sprintf("%s has restarted & rebuilt the server with CrazyTree.", strcharinfo(0)), LOGMES_ATCOMMAND);
+ sleep2(1000);
+ atcommand("@serverexit 108");
+ }
+
+ else if (.@no_nick$ ~= "^.(?:add )?ignored? \"?([^#:@\"]{4,23})\"?$")
+ {
+ .@chr = getcharid(CHAR_ID_ACCOUNT, $@regexmatch$[1]);
+ if (.@chr < 1)
+ {
+ reply("##BError: Player not found or not online.");
+ end;
+ }
+ htput(.ignore_ht, strcharinfo(PC_NAME, .@chr), gettimetick(2) + 3600);
+ reply(sprintf("Success: Player `%s` is now ignored for 1 hour.",
+ strcharinfo(PC_NAME, .@chr)));
+ }
+
+ else if (.@no_nick$ ~= "^.(?:un|de-?|remove )ignored? \"?([^#:@\"]{4,23})\"?$")
+ {
+ .@chr = getcharid(CHAR_ID_ACCOUNT, $@regexmatch$[1]);
+ if (.@chr < 1)
+ {
+ reply("##BError: Player not found or not online.");
+ end;
+ }
+ htput(.ignore_ht, strcharinfo(PC_NAME, .@chr), 0);
+ reply(sprintf("Success: Player `%s` is no longer ignored.",
+ strcharinfo(PC_NAME, .@chr)));
+ }
+
+ else if (is_admin() && .@no_nick$ ~= "^.(?:add )?trust(?:ed)? \"?([^#:@\"]{4,23})\"?$")
+ {
+ .@chr = getcharid(CHAR_ID_ACCOUNT, $@regexmatch$[1]);
+ if (.@chr < 1)
+ {
+ reply("##BError: Player not found or not online.");
+ end;
+ }
+ set(getvariableofpc(#Tree_Trusted, .@chr), true);
+ // GM Log
+ logmes(sprintf("%s has granted access to \"%s\" on CrazyTree.", strcharinfo(0), strcharinfo(PC_NAME, .@chr)), LOGMES_ATCOMMAND);
+ reply(sprintf("Success: Player `%s` can now use restricted commands.",
+ strcharinfo(PC_NAME, .@chr)));
+ }
+
+ else if (is_admin() && .@no_nick$ ~= "^.(?:un|de-?|remove )trust(?:ed)? \"?([^#:@\"]{4,23})\"?$")
+ {
+ .@chr = getcharid(CHAR_ID_ACCOUNT, $@regexmatch$[1]);
+ if (.@chr < 1)
+ {
+ reply("##BError: Player not found or not online.");
+ end;
+ }
+ set(getvariableofpc(#Tree_Trusted, .@chr), false);
+ // GM Log
+ logmes(sprintf("%s has removed access from \"%s\" on CrazyTree.", strcharinfo(0), strcharinfo(PC_NAME, .@chr)), LOGMES_ATCOMMAND);
+ reply(sprintf("Success: Player `%s` can no longer use restricted commands.",
+ strcharinfo(PC_NAME, .@chr)));
+ }
+
+ else
+ reply("##BError: Command not found or invalid syntax.");
+ }
+
+ else if (.@no_nick_lower$ ~= rp("^(~t[^a-z ]* .*|(?:.* (?:~t[^a-z ]* .*|~t[^ a-z]*)))$"))
+ {
+ check_is_ignored();
+ trigger_hotword($@regexmatch$[1]);
+ }
+
+ else if (.@no_nick_clean$ ~= "^(hi(ya)?|hello|heya?) (all|friends|every(one|body))")
+ {
+ check_is_ignored();
+ trigger_hiall();
+ }
+
+ else
+ {
+ if (.lastsender == getcharid(CHAR_ID_CHAR))
+ @monologue++;
+
+ else
+ @monologue = 1;
+ }
+
+ // TODO: eliza mode, whisper eliza mode
+ end;
+
+OnTouch:
+ if (rand(.touch_rate) == 0) {
+ face();
+ }
+ end;
+
+OnDoReply:
+ if (@tree_reply$ != "") {
+ npctalk(@tree_reply$);
+ @tree_reply$ = "";
+ }
+ end;
+
+OnPCLogoutEvent:
+ seen_me();
+ end;
+
+OnTimer3600000:
+ // scheduled janitor
+ .@now = gettimetick(2);
+ initnpctimer(); // schedule next
+
+ if (.last_activity > (.@now - 3600)) {
+ end; // last activity is too recent
+ }
+
+ // cleanup routine below
+ .lastsender = 0;
+ .last_activity = 0;
+ .last_reply = 0;
+ .last_emote = 0;
+ .last_query = 0;
+ .blocked = 0;
+ .enable_janitor = 0;
+
+ htclear(.msg_ht); // empty the message table (quotegrabs)
+ htclear(.ignore_ht); // empty the ignore table
+
+ .@it = htiterator(.seen_ht); // allocate new iterator
+ for (.@key$ = htinextkey(.@it); hticheck(.@it); .@key$ = htinextkey(.@it)) {
+ if (.@key$ == "") {
+ continue;
+ }
+
+ if (htget(.seen_ht, .@key$, 0) < (.@now - 86400)) {
+ htput(.seen_ht, .@key$, 0); // remove from hash table if older than 24h
+ }
+ }
+ htidelete(.@it); // free the iterator
+
+ face(); // do an emote (because why not)
+ end;
+
+
+OnInit:
+ // config below
+ .hotwords$ = "tree"; // what hot words the npc should listen to, besides its own name (regex)
+ .distance = 14; // the npc will only listen to player within X tiles
+ //.dir = season_direction(); // sprite direction according to the season
+ .talk_rate = 1; // min number of seconds to wait between replies
+ .repeat_rate = 1; // min number of seconds to wait before sending the same message twice in a row
+ .block_time = 600; // how long to stay quiet after someone says shut up, in seconds
+ .emote_rate = 3; // min number of seconds to wait between emotes
+ .sdrop_rate = 8; // 1 in X chances to get a special drop
+ .sname_rate = 8; // 1 in X chances to get a special name
+ .dunno_rate = 2; // 1 in X chances to get a reply when the command is not found
+ .hiall_rate = 2; // 1 in X chances to reply to a "hi everyone"
+ .touch_rate = 4; // 1 in X chances to trigger the OnTouch action
+ .qpoll_rate = 1; // min number of seconds to wait before calling the sql db again for GMs
+ .qpoll_rate2 = 5; // min number of seconds to wait before calling the sql db again for non-GMs (currently unused)
+ .delay_reply = 250; // number of ms to wait to reply
+ .enable_janitor = true; // automatically free memory when idle
+ .symbol$ = "~"; // symbol for GM-only commands
+
+ // register some arrays
+ callfunc("TREE_dictionaries");
+
+ // do random stuff
+ make_quote_table();
+ face();
+
+ // boring stuff below
+ .version[0] = 21; // increase this when you make a change
+ .version[1] = 1;
+ .uptime = gettimetick(2);
+ .alwaysVisible = true; // the NPC doesn't de-spawn when moving away
+ .pid = 1; // regex pattern id
+ .msg_ht = htnew(); // hashtable id for message history
+ .seen_ht = htnew(); // hashtable id for seen log
+ .ignore_ht = htnew(); // hashtable id for ignored players
+ .roulette = rand(1, 7); // spin the chambers
+ defpattern(.pid, "^(.*)$", "OnTalkNearby");
+ activatepset(.pid);
+ if (.enable_janitor) {
+ initnpctimer();
+ }
+}
+
+// Duplicates below
+001-1,57,75,0 duplicate(#ConfusedTree) #ConfusedPalmTree NPC384,14,14
+020-1,90,78,0 duplicate(#ConfusedTree) #ConfusedIcedTree NPC380,14,14
+
diff --git a/npc/annuals/xmas/barriers.txt b/npc/annuals/xmas/barriers.txt
new file mode 100644
index 00000000..0b62281b
--- /dev/null
+++ b/npc/annuals/xmas/barriers.txt
@@ -0,0 +1,155 @@
+
+function script ThrowOutTheBum {
+ @getout = 0;
+ if((@xmas_thrown_out) && ($@xmas_time))
+ goto L_SideOut;
+ goto L_Return;
+
+L_SideOut:
+ if(@xmas_helper_start_state)
+ goto L_Warp;
+ goto L_Hint;
+
+L_Hint:
+ message strcharinfo(0), "I said get out! We've got no time for your kind here.";
+ mesn l("Balthasar");
+ mes "\"What are you doing? Come, see me in the caves below!\"";
+ mes "\"I said go south till you reach the snowman. Then head into the cave to the east.\"";
+ close2;
+ warp "020-1",33,94;
+ @getout = 1;
+ goto L_Return;
+
+L_Warp:
+ message strcharinfo(0), "I said get out, We've no time for your kind here.";
+ warp "020-1",33,94;
+ @getout = 1;
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+030-2,153,21,0 script #DarkDoor NPC45,0,0,{
+ callfunc "XmasStates";
+
+ if((@xmas_boss_door_state) && ($@xmas_time))
+ goto L_XmasMain;
+ goto L_NotActive;
+
+L_XmasMain:
+ mes "You get the strange sensation that this might go terribly wrong. You had better bring some of your strongest comrades to help you in that case.";
+ mes "Open the warehouse door?";
+ menu
+ "Yes, I feel brave.", L_Open,
+ "No, It's quite nice out here.", L_close;
+
+L_Open:
+ if ($@XmasBattleStatus) goto L_BattleInProgress;
+ warp "030-4",34,48;
+ goto L_close;
+
+L_BattleInProgress:
+ mes "You can hear shouts and screams of despair from behind the door. But trying to open it fails.";
+ next;
+ mes "You will have to wait till someone from the inside opens the door again.";
+ goto L_close;
+
+L_NotActive:
+ message strcharinfo(0), "This door appears locked by magical forces.";
+ end;
+
+L_close:
+ close;
+}
+
+
+030-3,27,24,0 script SmallCrack#XmasPassage NPC400,0,1,{
+ callfunc "XmasStates";
+
+ if((@xmas_basement_passage) && ($@xmas_time))
+ goto L_XmasMain;
+ goto L_NotActive;
+
+L_NotActive:
+ mes "You don't notice anything special.";
+ goto L_close;
+
+L_XmasMain:
+ mes "You notice a small creak in the wall, what do you want to do?";
+ next;
+ goto L_EnterDialogue;
+
+L_EnterDialogue:
+ menu
+ "Nothing.", L_close,
+ "Bang my head against it repeatedly.", L_Tux9th,
+ "Oh, not very much, I do not see anynthing there.", L_close,
+ "Hit it with my strong fist.", L_Enter;
+
+L_Tux9th:
+ heal -20, 0;
+ message strcharinfo(0), "Ouch, that hurt!";
+ setlook LOOK_HAIR_STYLE, rand(20);
+ goto L_Fail;
+
+L_Enter:
+ if (getequipid(equip_hand1) > 0 || getequipid(equip_hand2) > 0) goto L_Sword;
+ if (getequipid(equip_gloves) <= 0) goto L_Gloves;
+ goto L_QueryWarp;
+
+L_Sword:
+ mes "That is not your fist silly,";
+ mes "use your fist, alright?";
+ goto L_close;
+
+L_Gloves:
+ mes "Wow! Next time you plan to hit a wall,";
+ mes "you had better equip some decent gloves in advance.";
+ heal -20, 0;
+ message strcharinfo(0), "Ouch, that hurt!";
+ goto L_QueryWarp;
+
+L_QueryWarp:
+ mes "You gaze into a black hole, do you want to enter?";
+ mes " ";
+ menu
+ "Yes", L_Warp,
+ "No", L_close;
+
+L_Warp:
+ warp "030-2",47,44;
+ goto L_close;
+
+L_Fail:
+ mes "Seems like that won't work out as you planned.";
+ goto L_close;
+
+L_close:
+ close;
+}
+
+030-2,48,44,0 script #BasementDoor NPC45,0,0,{
+ callfunc "XmasStates";
+
+ if((@xmas_basement_passage) && ($@xmas_time))
+ goto L_XmasMain;
+ goto L_NotActive;
+
+L_XmasMain:
+ mes "Descend into the caves?";
+ menu
+ "Yes.", L_Open,
+ "No.", L_close;
+
+L_Open:
+ warp "030-3",27,26;
+ goto L_close;
+
+L_NotActive:
+ message strcharinfo(0), "This door appears locked by magical forces.";
+ end;
+
+L_close:
+ close;
+}
diff --git a/npc/annuals/xmas/config.txt b/npc/annuals/xmas/config.txt
new file mode 100644
index 00000000..b3816df2
--- /dev/null
+++ b/npc/annuals/xmas/config.txt
@@ -0,0 +1,252 @@
+
+
+- script #XmasConfig NPC32767,{
+ end;
+
+OnCommandRestartQuest:
+ goto L_Main;
+
+OnInit:
+ goto L_Main;
+
+L_Main:
+ // Xmas Key Identifier Set through Botcheck Debug
+ if(!($XMAS_TIME_KEY) || (getarraysize($XMAS_TIME_KEY) != 6))
+ setarray $XMAS_TIME_KEY, 12,12,1,25,6,gettime(7);
+ if(($XMAS_TIME_KEY[0] == 0) || ($XMAS_TIME_KEY[0] > 12))
+ goto L_XmasError;
+ if(($XMAS_TIME_KEY[1] == 0) || ($XMAS_TIME_KEY[1] > 12))
+ goto L_XmasError;
+ if(($XMAS_TIME_KEY[2] == 0) || ($XMAS_TIME_KEY[2] > 12))
+ goto L_XmasError;
+ if(($XMAS_TIME_KEY[3] == 0) || ($XMAS_TIME_KEY[3] > 31))
+ goto L_XmasError;
+ if(($XMAS_TIME_KEY[4] == 0) || ($XMAS_TIME_KEY[4] > 31))
+ goto L_XmasError;
+ if($XMAS_TIME_KEY[5] == 0)
+ goto L_XmasError;
+
+ // Event Runs until Reward Period.
+ // Month Start/End
+ $@xmas_start_month = $XMAS_TIME_KEY[0];
+ $@xmas_reward_start_month = $XMAS_TIME_KEY[1];
+ $@xmas_end_month = $XMAS_TIME_KEY[2];
+
+ // Reward Day Start/End
+ $@xmas_reward_start_day = $XMAS_TIME_KEY[3];
+ $@xmas_reward_end_day = $XMAS_TIME_KEY[4];
+
+ // Time Settings
+ $@xmas_no_event_time = 0;
+ $@xmas_event_time = 1;
+ $@xmas_reward_time = 2;
+
+ // Main Quest Settings
+ // Bit used to Set Which one of the 2 quests you are on
+ $@xmas_side_bit = false;//(1 << 31); FIXME
+ $@xmas_base_bonus_xp = 4;
+ $@xmas_karma_bonus = 1;
+ $@xmas_reward_max_karma = 15;
+ $@xmas_reward_hero_boss = 15;
+ $@xmas_reward_all_lists = 10;
+ $@xmas_reward_all_helpers = 10;
+ $@xmas_reward_tally_rare = 80;
+ $@xmas_reward_tally_common = 40;
+ // Guidance System
+ $@xmas_route_bit = (1 << 23);
+ // Basement Passage way
+ $@xmas_basement_passage = (1 << 24);
+ // Thrown Out
+ $@xmas_thrown_out_bit = (1 << 25);
+ // Quest Start (@xmas_state)
+ $@xmas_list_path2_state = 1;
+ $@xmas_list_path1_state = 2;
+ $@xmas_list_both_state = 3;
+ $@xmas_list_complete_state = 4;
+ $@xmas_list_deliver_state = 5;
+ // Helper SubQuest
+ $@xmas_helpers_start_state = 6;
+ $@xmas_helpers_done_state = 7;
+ // Reagents
+ $@xmas_reagents_start = 8;
+ $@xmas_reagents_done = 9;
+ // Boss Door State
+ $@xmas_boss_door_open_state = 10;
+ // Reward State
+ $@xmas_reward_start = 11;
+ $@xmas_reward1_done = 12;
+ $@xmas_reward2_done = 13;
+ $@xmas_reward_done = 14;
+
+ // Boss Fight Required Level for Hard Mode
+ $@BossHardLevel = 70;
+ $@xmas_boss_start_bit = (1 << 26);
+ $@xmas_boss_hero_bit = (1 << 27);
+ $@xmas_boss_start_shift = 26;
+ $@xmas_boss_hero_shift = 27;
+ setarray $@xmas_boss_req$, "IronPotion", "DarkCrystal";
+ setarray $@xmas_boss_amount, 15, 10;
+ if(getarraysize($@xmas_boss_amount) != getarraysize($@xmas_boss_req$))
+ goto L_XmasError;
+ // Santas Helper quest rewards
+ setarray $@SantasHelper_Annual_Reward$,
+ "RedTurtleneck",
+ "YellowTurtleneck",
+ "LightBlueTurtleneck",
+ "PinkTurtleneck",
+ "OrangeTurtleneck",
+ "PurpleTurtleneck",
+ "KnitCap",
+ "KnitCap";
+
+ // Main Quest rewards
+ setarray $@xmas_present_from$, "Santa", "Orum";
+ setarray $@xmas_rare_reward$, "FunkyChristmasSweater", "DarkChristmasSweater";
+ setarray $@xmas_uncommon_reward$, "NutcrackerHat", "AmberChristmasSweater", "RedStockings", "PinkChristmasSweater", "BlueChristmasSweater";
+ // Quest Side 0 Settings
+ setarray $@xmas_zero_reagents$, "ShockSweet", "EmptyBottle", "EmeraldPowder";
+ setarray $@xmas_zero_reagents_names$, "Shock Sweet", "Empty Bottles", "Emerald Powders";
+ setarray $@xmas_zero_reagents_amounts, 1, 4, 10;
+ if(getarraysize($@xmas_zero_reagents_amounts) != getarraysize($@xmas_zero_reagents$))
+ goto L_XmasError;
+
+ // Quest Side 1 Settings
+ setarray $@xmas_one_reagents$, "DarkCrystal", "IronPotion", "EmeraldPowder";
+ setarray $@xmas_one_reagents_names$, "Dark Crystal", "Iron Potions", "Emerald Powders";
+ setarray $@xmas_one_reagents_amounts, 1, 4, 10;
+ if(getarraysize($@xmas_one_reagents_amounts) != getarraysize($@xmas_one_reagents$))
+ goto L_XmasError;
+
+ // List Bits
+ $@xmas_all_lists_bit = (1 << 29);
+ setarray $@xmas_child_list, (1 << 8), (1 << 9), (1 << 10), (1 << 11), (1 << 12), (1 << 13), (1 << 14), (1 << 15);
+ setarray $@xmas_child_list_name$, "Ayasha", "Latif", "Charda", "Faris", "Rasin", "Ghada", "Rossy", "Kadiya";
+ if(getarraysize($@xmas_child_list) != getarraysize($@xmas_child_list_name$))
+ goto L_XmasError;
+
+ $@xmas_perfect_list_count = getarraysize($@xmas_child_list);
+ $@xmas_required_list_count = (getarraysize($@xmas_child_list) / 2);
+
+ // Santa's Helper
+ $@xmas_sh_bit = (1 << 22);
+ $@xmas_sh_purple_amount = 25;
+ $@xmas_sh_blue_amount = 20;
+ $@xmas_sh_green_amount = 5;
+
+ // Main Helper Bit
+ $@xmas_helper_bit = (1 << 30);
+ $@xmas_all_helpers_bit = (1 << 28);
+
+ // Acorns
+ $@xmas_helper_bit_acorns = (1 << 21);
+ $@xmas_acorn_amount = 10;
+ $@xmas_iron_potion_amount = 1;
+
+ // Bedding
+ $@xmas_helper_bit_bed_starts = (1 << 16);
+ $@xmas_helper_bit_bed_ends = (1 << 17);
+ $@xmas_bedding_amount = 10;
+
+ // Boxes
+ $@xmas_log_amount = 2;
+
+ // Wrap
+ $@xmas_reed_amount = 2;
+ $@xmas_water_amount = 1;
+ $@xmas_wrap_reward = 1;
+
+ // Wrap Dye Amounts
+ $@xmas_poa_amount = 2;
+ $@xmas_wrap_yellow_amount = 2;
+ $@xmas_wrap_ltblue_amount = 2;
+ $@xmas_wrap_purple_amount = 2;
+ $@xmas_wrap_green_amount = 2;
+
+ // Present Return
+ $@xmas_present_amount = 5;
+
+ // Shipping
+ $@xmas_wrap_amount = 1;
+ $@xmas_empty_box_amount = 1;
+ $@xmas_ship_present_amount = 1;
+
+ // Glitter
+ $@xmas_helper_bit_glitter_starts = (1 << 18);
+ $@xmas_helper_bit_glitter_ends = (1 << 19);
+ $@xmas_red_amount = 5;
+ $@xmas_yellow_amount = 5;
+
+ // Storage (Daily Xmas)
+ $@xmas_helper_bit_storage = (1 << 20);
+ // Good Daily Ammounts
+ $@xmas_good_level = 30;
+ $@xmas_good_cost = 12;
+ $@xmas_good_count = 3;
+ $@xmas_good_name$ = "Candy";
+ $@xmas_good_friendly_name$ = "Candies";
+ $@xmas_good_money = 500;
+ $@xmas_good_exp = 200;
+
+ // Bad Daily Ammounts
+ $@xmas_bad_level = 30;
+ $@xmas_bad_cost = 12;
+ $@xmas_bad_count = 3;
+
+ $@xmas_bad_name$ = "RedApple";
+ $@xmas_bad_friendly_name$ = "Red Apples";
+ $@xmas_bad_money = 500;
+ $@xmas_bad_exp = 200;
+
+ //Boss Fight Reward
+ $@xmas_boss_bp = 50;
+
+ // Helpers Flags needed to set $@xmas_all_helpers_bit
+ setarray $@xmas_helper_list, $@xmas_helper_bit_bed_ends, $@xmas_helper_bit_glitter_ends, $@xmas_helper_bit_storage, $@xmas_helper_bit_acorns, $@xmas_sh_bit;
+ $@xmas_perfect_helpers_count = getarraysize($@xmas_helper_list);
+ $@xmas_required_helpers_count = (getarraysize($@xmas_helper_list) / 2);
+
+ // MobManager
+ setarray $@xmas_mob_names$, "Santa Slime", "Candied Slime", "Candied Slime";
+ setarray $@xmas_mob_spawns, "1015", "1111", "1111";
+ setarray $@xmas_mob_counts, 10, 5, 5;
+ setarray $@xmas_map_spawns$, "019-1", "019-3", "030-3";
+ if(getarraysize($@xmas_mob_spawns) != getarraysize($@xmas_map_spawns$))
+ goto L_XmasError;
+ if(getarraysize($@xmas_mob_names$) != getarraysize($@xmas_map_spawns$))
+ goto L_XmasError;
+ if(getarraysize($@xmas_mob_counts) != getarraysize($@xmas_map_spawns$))
+ goto L_XmasError;
+
+ $@xmas_spawn_x1 = 54;
+ $@xmas_spawn_y1 = 48;
+ $@xmas_spawn_x2 = 79;
+ $@xmas_spawn_y2 = 89;
+ $@xmas_respawn_count = 9;
+
+ $@start_month = $@xmas_start_month;
+ $@end_month = $@xmas_end_month;
+ $@start_day = 1;
+ $@end_day = $@xmas_reward_end_day;
+ $@reward_start_month = $@xmas_reward_start_month;
+ $@reward_start_day = $@xmas_reward_start_day;
+
+ callfunc "GetEventTime";
+ $@xmas_time = $@event_time;
+
+ if($@xmas_time == 0 && $XMAS_TIME_KEY[5] < gettime(7))
+ setarray $XMAS_TIME_KEY, $XMAS_TIME_KEY[0],$XMAS_TIME_KEY[1],$XMAS_TIME_KEY[2],$XMAS_TIME_KEY[3],$XMAS_TIME_KEY[4],gettime(7);
+ goto L_Return;
+
+L_Return:
+ // technically this only needs to skip the npctimer in SpawnMobs,
+ // but this is a low-level debug setting so whatever.
+ if (debug >= 2) end;
+ callfunc "SpawnMobs";
+ callfunc "PresentHandler";
+ callfunc "ReplaceTrees";
+ end;
+
+L_XmasError:
+ debugmes "Xmas is Dead Jim.";
+ mapexit;
+}
diff --git a/npc/annuals/xmas/core.txt b/npc/annuals/xmas/core.txt
new file mode 100644
index 00000000..2abeefce
--- /dev/null
+++ b/npc/annuals/xmas/core.txt
@@ -0,0 +1,229 @@
+
+function script XmasNaughty {
+ @xmas_karma = ((XMASTIME & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT);
+ if((@xmas_karma - @karma_bonus) >= 0)
+ goto L_SetNaughty;
+ goto L_ResetNaughty;
+
+L_SetNaughty:
+ @xmas_karma = (@xmas_karma - @karma_bonus);
+ goto L_Return;
+
+L_ResetNaughty:
+ @xmas_karma = 0;
+ goto L_Return;
+
+L_Return:
+ XMASTIME = (XMASTIME & ~(NIBBLE_1_MASK) | (@xmas_karma << NIBBLE_1_SHIFT));
+ @karma_bonus = 0;
+ return;
+}
+
+function script XmasNice {
+ @xmas_karma = ((XMASTIME & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT);
+ if((@xmas_karma + @karma_bonus) < 16)
+ goto L_SetNice;
+ goto L_ResetNice;
+
+L_SetNice:
+ @xmas_karma = (@karma_bonus + @xmas_karma);
+ goto L_Return;
+
+L_ResetNice:
+ @xmas_karma = 15;
+ goto L_Return;
+
+L_Return:
+ XMASTIME = (XMASTIME & ~(NIBBLE_1_MASK) | (@xmas_karma << NIBBLE_1_SHIFT));
+ @karma_bonus = 0;
+ return;
+}
+
+function script XmasXpReward {
+ if (BaseLevel >= 10)
+ goto L_HigherLevel;
+ goto L_LowLevel;
+
+L_HigherLevel:
+ getexp ((BaseLevel / 10) * ($@xmas_base_bonus_xp * BaseLevel)), 0;
+ goto L_Return;
+
+L_LowLevel:
+ getexp ($@xmas_base_bonus_xp * BaseLevel), 0;
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+function script XmasSetState {
+ XMASTIME = (XMASTIME & ~(NIBBLE_0_MASK) | (@xmas_state << NIBBLE_0_SHIFT));
+ return;
+}
+
+function script XmasSetSide {
+ XMASTIME = XMASTIME | $@xmas_side_bit;
+ return;
+}
+
+function script XmasSetRoute {
+ XMASTIME = XMASTIME | $@xmas_route_bit;
+ return;
+}
+
+function script XmasThrowOut {
+ XMASTIME = XMASTIME | $@xmas_thrown_out_bit;
+ return;
+}
+
+function script XmasSetBossStart {
+ XMASTIME = XMASTIME | $@xmas_boss_start_bit;
+ return;
+}
+
+function script XmasSetBossHero {
+ XMASTIME = XMASTIME | $@xmas_boss_hero_bit;
+ return;
+}
+
+function script XmasSetReward {
+ @xmas_endgame = 0;
+ @xmas_reward_side = 0;
+ @xmas_reward_tally = 0;
+ if(@xmas_side)
+ goto L_SetSide;
+ goto L_NotSetSide;
+
+L_SetSide:
+ @xmas_reward_side = 1;
+ @xmas_reward_tally = (@xmas_reward_tally + ($@xmas_reward_max_karma - @xmas_karma));
+ goto L_SetRewardBonus;
+
+L_NotSetSide:
+ @xmas_reward_tally = (@xmas_reward_tally + @xmas_karma);
+ goto L_SetRewardBonus;
+
+L_SetRewardBonus:
+ if(@xmas_boss_hero)
+ @xmas_reward_tally = (@xmas_reward_tally + $@xmas_reward_hero_boss);
+ if(@xmas_all_helpers)
+ @xmas_reward_tally = (@xmas_reward_tally + $@xmas_reward_all_helpers);
+ if(@xmas_all_lists)
+ @xmas_reward_tally = (@xmas_reward_tally + $@xmas_reward_all_lists);
+ //formula should:
+ if (@xmas_reward_tally > 5)
+ @xmas_reward_lower_bound = 2 * @xmas_reward_tally - rand(5);
+ if (@xmas_reward_tally <= 5)
+ @xmas_reward_lower_bound = @xmas_reward_tally;
+ @xmas_reward_upper_bound = @xmas_reward_lower_bound + ((Luk) / 5);
+ @xmas_reward = (rand(@xmas_reward_lower_bound, @xmas_reward_upper_bound));
+ @xmas_reward_lower_bound = 0;
+ @xmas_reward_upper_bound = 0;
+ return;
+}
+
+function script XmasMainXpBpReward {
+ callfunc "XmasSetReward";
+
+ if(BaseLevel >= 99)
+ goto L_EndGameReward;
+ goto L_LevelingReward;
+
+L_EndGameReward:
+ @xmas_bp_reward = 100 + rand(@xmas_reward, 2 * @xmas_reward);
+ BOSS_POINTS = BOSS_POINTS + @xmas_bp_reward;
+ message strcharinfo(0), "You gain " + @xmas_bp_reward + " Bosspoints, giving you a total of " + BOSS_POINTS + ".";
+ @xmas_bp_reward = 0;
+ return;
+
+L_LevelingReward:
+ if(@xmas_reward >= $@xmas_reward_tally_rare)
+ goto L_XmasLevel;
+ goto L_XmasExp;
+
+L_XmasLevel:
+ BaseLevel = BaseLevel + 1;
+ return;
+
+L_XmasExp:
+ getexp ((@xmas_reward * BaseLevel * (BaseLevel + 10)) / 10), 0;
+ return;
+}
+
+function script XmasMainItemReward {
+ callfunc "XmasSetReward";
+
+ if (($@xmas_time == $@xmas_reward_time) && ((@xmas_reward_start_state) || (@xmas_reward1_done_state)))
+ goto L_FinalGift;
+ if (($@xmas_time == $@xmas_reward_time) && ((@xmas_reward_done_state) || (@xmas_reward2_done_state)))
+ goto L_GotGift;
+ if ($@xmas_time == $@xmas_reward_time)
+ goto L_NoGift;
+ goto L_Return;
+
+L_GotGift:
+ mes "Hey, this is not for you!";
+ goto L_Return;
+
+L_NoGift:
+ mes "Oh someone got a present. Maybe you can get one too if help the right person?";
+ goto L_Return;
+
+L_FinalGift:
+ mes "[To: " + strcharinfo(0) + "]";
+ mes "[From: " + $@xmas_present_from$[@xmas_reward_side] + "]";
+ mes "O look, a present from " + $@xmas_present_from$[@xmas_reward_side];
+ next;
+ getinventorylist;
+ if (@inventorylist_count > 97)
+ goto L_FullInv;
+ @xmas_reward = (@xmas_reward + ((BaseLevel + 10)/10));
+ if (debug > 0)
+ message strcharinfo(0), "Reward variable: " + @xmas_reward;
+ @xmas_uncommon_slot1 = rand(getarraysize($@xmas_uncommon_reward$));
+ @xmas_uncommon_slot2 = rand(getarraysize($@xmas_uncommon_reward$));
+ if(@xmas_reward >= $@xmas_reward_tally_rare)
+ @xmas_reward_item$ = $@xmas_rare_reward$[@xmas_reward_side];
+ if(@xmas_reward >= $@xmas_reward_tally_common)
+ @xmas_reward_item1$ = $@xmas_uncommon_reward$[@xmas_uncommon_slot1];
+ @xmas_reward_item2$ = $@xmas_uncommon_reward$[@xmas_uncommon_slot2];
+ if(checkweight("Iten", 1) == 0)
+ goto L_FullInv;
+ if(@xmas_reward >= $@xmas_reward_tally_rare)
+ getitem @xmas_reward_item$, 1;
+ if(@xmas_reward >= $@xmas_reward_tally_common)
+ getitem @xmas_reward_item1$, 1;
+ getitem @xmas_reward_item2$, 1;
+ @xmas_uncommon_slot1 = 0;
+ @xmas_uncommon_slot2 = 0;
+ @xmas_reward_item$ = "";
+ @xmas_reward_item1$ = "";
+ @xmas_reward_item2$ = "";
+ if (@xmas_reward_start_state)
+ @xmas_state = $@xmas_reward2_done;
+ if (@xmas_reward1_done_state)
+ @xmas_state = $@xmas_reward_done;
+ callfunc "XmasSetState";
+ goto L_Return;
+
+L_FullInv:
+ mes "\"You have no place to put the present.\"";
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+function script XmasCheckOld {
+ if(XMASYEAR == $XMAS_TIME_KEY[5])
+ goto L_Return;
+ goto L_OldMatch;
+
+L_OldMatch:
+ XMASTIME = 0;
+ XMASYEAR = $XMAS_TIME_KEY[5];
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/npc/annuals/xmas/debug.txt b/npc/annuals/xmas/debug.txt
new file mode 100644
index 00000000..f7ba17bd
--- /dev/null
+++ b/npc/annuals/xmas/debug.txt
@@ -0,0 +1,220 @@
+
+function script XmasDebug {
+ if(debug)
+ goto L_Debug;
+ goto L_Live;
+
+L_Live:
+ mes "What do you want to do?";
+ menu
+ "Debug Vars", L_DebugLive,
+ "Xmas Time Key Change.", L_XmasTimeKey,
+ "Reset Xmas Chamber.", L_XmasChamberReset,
+ "Do nothing.", L_close;
+
+L_DebugLive:
+ mes "--Sever--";
+ mes "Event State: " + $@xmas_time;
+ mes "Event Start" + $XMAS_TIME_KEY[0] + "/1";
+ mes "Reward Start: " + $XMAS_TIME_KEY[1] + "/" + $XMAS_TIME_KEY[3];
+ mes "Event End: " + $XMAS_TIME_KEY[2] + "/" + $XMAS_TIME_KEY[4];
+ mes "Event Time Key (year (CCYY)): " + $XMAS_TIME_KEY[5];
+ goto L_close;
+
+L_Debug:
+ mes "What do you want to do?";
+ menu
+ "Debug Vars", L_DebugVars,
+ "Set Quest State.", L_XmasState,
+ "Set Karma. [0-15] 15 Nice", L_XmasKarma,
+ "Set All Lists", L_SetAllLists,
+ "Set All Helpers", L_SetAllHelpers,
+ "Set Boss Hero", L_SetBossHero,
+ "Reset Quest State.", L_Reset,
+ "Set Old Event Flag.", L_LastReset,
+ "Xmas Time Key Change.", L_XmasTimeKey,
+ "Reset Xmas Chamber.", L_XmasChamberReset,
+ "Do nothing.", L_close;
+
+L_DebugVars:
+ callfunc "XmasStates";
+ mes "--Sever--";
+ mes "Event State: " + $@xmas_time;
+ mes "Event Start" + $XMAS_TIME_KEY[0] + "/1";
+ mes "Reward Start: " + $XMAS_TIME_KEY[1] + "/" + $XMAS_TIME_KEY[3];
+ mes "Event End: " + $XMAS_TIME_KEY[2] + "/" + $XMAS_TIME_KEY[4];
+ mes "Event Time Key (year (CCYY)): " + $XMAS_TIME_KEY[5];
+ next;
+ mes "--Player--";
+ mes "Player Event Time Key " + XMASYEAR;
+ mes "xmas_state: " + @xmas_state;
+ mes "xmas_karma: " + @xmas_karma;
+ mes "xmas_side: " + @xmas_side;
+ next;
+ mes "xmas_list_gather: " + @xmas_list_gather;
+ mes "xmas_list_complete: " + @xmas_list_complete;
+ mes "xmas_list_deliver: " + @xmas_list_deliver;
+ mes "xmas_helper_start_state: " + @xmas_helper_start_state;
+ mes "xmas_helper_done_state: " + @xmas_helper_done_state;
+ mes "xmas_reagent_start_state: " + @xmas_reagent_start_state;
+ mes "xmas_reagent_done_state: " + @xmas_reagent_done_state;
+ mes "xmas_boss_door_state: " + @xmas_boss_door_state;
+ mes "xmas_reward_start_state " + @xmas_reward_start_state;
+ mes "xmas_reward1_done_state " + @xmas_reward1_done_state;
+ mes "xmas_reward2_done_state " + @xmas_reward2_done_state;
+ mes "xmas_reward_done_state: " + @xmas_reward_done_state;
+ next;
+ mes "xmas_basement_passage: " + @xmas_basement_passage;
+ mes "xmas_thrown_out: " + @xmas_thrown_out;
+ mes "xmas_hard_mode: " + @xmas_boss_hero;
+ next;
+ mes "xmas_sweater: " + @xmas_sh_done;
+ next;
+ mes "xmas_all_lists: " + @xmas_all_lists;
+ next;
+ mes "xmas_helper_bit: " + @xmas_helper_bit;
+ mes "xmas_all_helpers: " + @xmas_all_helpers;
+ mes "xmas_helper_acorn: " + @xmas_helper_acorn;
+ mes "xmas_helper_bedding: " + @xmas_helper_bedding;
+ mes "xmas_helper_glitter: " + @xmas_helper_glitter;
+ mes "xmas_helper_storage: " + @xmas_helper_storage;
+ mes "xmas_knows_route: " + @xmas_knows_route;
+ goto L_close;
+
+L_LastReset:
+ XMASTIME = 255;
+ XMASYEAR = 2012;
+ goto L_close;
+
+L_Reset:
+ XMASTIME = 0;
+ XMASYEAR = $XMAS_TIME_KEY[5];
+ goto L_close;
+
+L_XmasTimeKey:
+ mes "Xmas Time Key Change.";
+ mes "Start Month?";
+ input @xmas_time_key_smonth;
+ if((@xmas_time_key_smonth == 0) || (@xmas_time_key_smonth > 12))
+ goto L_XmasError;
+ mes "Reward Start Month?";
+ input @xmas_time_key_srmonth;
+ if((@xmas_time_key_srmonth == 0) || (@xmas_time_key_srmonth > 12))
+ goto L_XmasError;
+ mes "End Month?";
+ input @xmas_time_key_emonth;
+ if((@xmas_time_key_emonth == 0) || (@xmas_time_key_emonth > 12))
+ goto L_XmasError;
+ mes "Reward Start Day?";
+ input @xmas_time_key_rsday;
+ if((@xmas_time_key_rsday == 0) || (@xmas_time_key_rsday > 31))
+ goto L_XmasError;
+ mes "Reward End Day?";
+ input @xmas_time_key_reday;
+ if((@xmas_time_key_reday == 0) || (@xmas_time_key_reday > 31))
+ goto L_XmasError;
+ mes "Time Key (CCYY) ";
+ input @xmas_time_key_year;
+ goto L_SetNewKey;
+
+L_XmasError:
+ mes "Incorrect Entry. Try again.";
+ goto L_close;
+
+L_SetNewKey:
+ setarray $XMAS_TIME_KEY, @xmas_time_key_smonth, @xmas_time_key_srmonth, @xmas_time_key_emonth, @xmas_time_key_rsday, @xmas_time_key_reday, @xmas_time_key_year;
+ donpcevent "#XmasConfig::OnCommandRestartQuest";
+ goto L_close;
+
+L_XmasChamberReset:
+ donpcevent "AniManOMat::OnCommandChamberReset";
+ goto L_close;
+
+L_XmasState:
+ mes "Quest state?";
+ input @xmas_state;
+ callfunc "XmasSetState";
+ goto L_close;
+
+L_XmasKarma:
+ mes "Karma (0-15) 0: Naughty, 15: Good";
+ input @xmas_karma;
+ XMASTIME = (XMASTIME & ~(NIBBLE_1_MASK) | (@xmas_karma << NIBBLE_1_SHIFT));
+ goto L_close;
+
+L_SetAllLists:
+ XMASTIME = XMASTIME | $@xmas_all_lists_bit;
+ goto L_close;
+
+L_SetAllHelpers:
+ XMASTIME = XMASTIME | $@xmas_all_helpers_bit;
+ goto L_close;
+
+L_SetBossHero:
+ XMASTIME = XMASTIME | $@xmas_boss_hero_bit;
+ goto L_close;
+
+L_close:
+ @xmas_state = 0;
+ @xmas_karma = 0;
+ @xmas_hard_mode = 0;
+ @xmas_time_key_smonth = 0;
+ @xmas_time_key_emonth = 0;
+ @xmas_time_key_rsday = 0;
+ @xmas_time_key_reday = 0;
+ @xmas_time_key_year = 0;
+ close2;
+ return;
+}
+
+020-1,86,76,0 script XmasDebug#1 NPC105,{
+ callfunc "XmasDebug";
+ goto L_End;
+
+OnInit:
+ if(!(debug))
+ disablenpc "XmasDebug#1";
+ goto L_End;
+
+L_End:
+ end;
+}
+
+030-2,193,62,0 script XmasDebug#2 NPC105,{
+ callfunc "XmasDebug";
+ goto L_End;
+
+OnInit:
+ if(!(debug))
+ disablenpc "XmasDebug#2";
+ goto L_End;
+
+L_End:
+ end;
+}
+
+030-3,26,26,0 script XmasDebug#3 NPC105,{
+ callfunc "XmasDebug";
+ goto L_End;
+
+OnInit:
+ if(!(debug))
+ disablenpc "XmasDebug#3";
+ goto L_End;
+
+L_End:
+ end;
+}
+
+030-4,30,30,0 script XmasDebug#4 NPC111,{
+ callfunc "XmasDebug";
+ goto L_End;
+
+OnInit:
+ if(!(debug))
+ disablenpc "XmasDebug#4";
+ goto L_End;
+
+L_End:
+ end;
+}
diff --git a/npc/annuals/xmas/helpers.txt b/npc/annuals/xmas/helpers.txt
new file mode 100644
index 00000000..28d5e650
--- /dev/null
+++ b/npc/annuals/xmas/helpers.txt
@@ -0,0 +1,44 @@
+
+function script XmasHelperPoints {
+ @xmas_helper_count = 0;
+ @xmas_helper_loop = 0;
+ if((@xmas_helper_done_state) || !(@xmas_helper_start_state))
+ goto L_Return;
+ goto L_Loop;
+
+L_Loop:
+ if(XMASTIME & $@xmas_helper_list[@xmas_helper_loop])
+ goto L_AddOne;
+ goto L_LoopAgain;
+
+L_AddOne:
+ @xmas_helper_count = (@xmas_helper_count + 1);
+ goto L_LoopAgain;
+
+L_LoopAgain:
+ if((@xmas_helper_loop + 1) == getarraysize($@xmas_helper_list))
+ goto L_HelperTally;
+ @xmas_helper_loop = (@xmas_helper_loop + 1);
+ goto L_Loop;
+
+L_HelperTally:
+ if(@xmas_helper_count == $@xmas_perfect_helpers_count)
+ goto L_PerfectHelpers;
+ if(@xmas_helper_count > $@xmas_required_helpers_count)
+ goto L_SetHelperState;
+ goto L_Return;
+
+L_PerfectHelpers:
+ XMASTIME = XMASTIME | $@xmas_all_helpers_bit;
+ goto L_SetHelperState;
+
+L_SetHelperState:
+ @xmas_state = $@xmas_helpers_done_state;
+ callfunc "XmasSetState";
+ goto L_Return;
+
+L_Return:
+ @xmas_helper_count = 0;
+ @xmas_helper_loop = 0;
+ return;
+}
diff --git a/npc/annuals/xmas/list.txt b/npc/annuals/xmas/list.txt
new file mode 100644
index 00000000..6f902e04
--- /dev/null
+++ b/npc/annuals/xmas/list.txt
@@ -0,0 +1,98 @@
+
+function script XmasCheckList {
+ @xmas_list_count = 0;
+ @xmas_list_loop = 0;
+
+ if((@xmas_list_deliver) || !(@xmas_list_gather))
+ goto L_Return;
+ goto L_Loop;
+
+L_Loop:
+ if(XMASTIME & $@xmas_child_list[@xmas_list_loop])
+ goto L_AddOne;
+ goto L_LoopAgain;
+
+L_AddOne:
+ @xmas_list_count = (@xmas_list_count + 1);
+ goto L_LoopAgain;
+
+L_LoopAgain:
+ if((@xmas_list_loop + 1) == getarraysize($@xmas_child_list))
+ goto L_ListTally;
+ @xmas_list_loop = (@xmas_list_loop + 1);
+ goto L_Loop;
+
+L_ListTally:
+ if(@xmas_list_count == $@xmas_perfect_list_count)
+ goto L_PerfectList;
+ if(@xmas_list_count > $@xmas_required_list_count)
+ goto L_SetListState;
+ goto L_Return;
+
+L_PerfectList:
+ XMASTIME = XMASTIME | $@xmas_all_lists_bit;
+ goto L_SetListState;
+
+L_SetListState:
+ @xmas_state = $@xmas_list_complete_state;
+ callfunc "XmasSetState";
+ goto L_Return;
+
+L_Return:
+ @xmas_list_loop = 0;
+ return;
+}
+
+function script XmasList {
+ callfunc "XmasStates";
+
+ if(($@xmas_time) && (@xmas_list_gather) && !(@xmas_list_complete))
+ goto L_QuestTime;
+ goto L_Return;
+
+L_QuestTime:
+ if(XMASTIME & $@xmas_child_list[@child_number])
+ goto L_Return;
+ goto L_GetList;
+
+L_GetList:
+ menu
+ "Hey, I have come to collect your wish list for Santa", L_List,
+ "Oh sorry, what were you going to say?", L_Return;
+
+L_List:
+ mes "[" + $@xmas_child_list_name$[@child_number] + "]";
+ mes "Here is my list. Make sure it gets delivered, please!";
+ next;
+ mes "You store " + $@xmas_child_list_name$[@child_number] + "'s wish list carefully in a hidden pocket of your backpack.";
+ XMASTIME = XMASTIME | $@xmas_child_list[@child_number];
+ callfunc "XmasXpReward";
+ menu
+ "I really should be going.", L_Return;
+
+L_Return:
+ return;
+}
+
+function script XmasListList {
+ @xmas_list_loop = 0;
+ @xmas_child_loop = 0;
+ goto L_Loop;
+
+L_Loop:
+ @xmas_child_loop = ($@xmas_child_list[@xmas_list_loop]);
+ if ((XMASTIME & @xmas_child_loop) != 0) goto L_LoopAgain;
+ mes "\"" + $@xmas_child_list_name$[@xmas_list_loop] + "\"";
+ next;
+ goto L_LoopAgain;
+
+L_LoopAgain:
+ if((@xmas_list_loop + 1) == getarraysize($@xmas_child_list_name$))
+ goto L_Return;
+ @xmas_list_loop = (@xmas_list_loop + 1);
+ goto L_Loop;
+
+L_Return:
+ @xmas_list_loop = 0;
+ return;
+}
diff --git a/npc/annuals/xmas/mobmanager.txt b/npc/annuals/xmas/mobmanager.txt
new file mode 100644
index 00000000..d96b0fb0
--- /dev/null
+++ b/npc/annuals/xmas/mobmanager.txt
@@ -0,0 +1,77 @@
+
+019-1,0,0,0 script XmasSpawnManager NPC400,{
+ end;
+
+OnCommandSpawnStart:
+ if ($@xmas_spawn_started)
+ goto L_End;
+ $@xmas_spawn_started = 1;
+ goto L_InitSpawn;
+
+L_InitSpawn:
+ initnpctimer;
+ $@xmas_current_count = 0;
+ $@xmas_map_loop = 0;
+ goto L_StartLoop;
+
+L_StartLoop:
+ $@xmas_mob_lck = 1;
+ $@mob_count = mobcount($@xmas_map_spawns$[$@xmas_map_loop], "XmasSpawnCounter#" + $@xmas_map_loop + "::OnTally");
+ $@spawn_amount = ($@xmas_mob_counts[$@xmas_map_loop] - $@mob_count);
+ if ($@spawn_amount)
+ goto L_Spawn;
+ goto L_NextMap;
+
+L_Spawn:
+ areamonster $@xmas_map_spawns$[$@xmas_map_loop], $@xmas_spawn_x1, $@xmas_spawn_y1, $@xmas_spawn_x2, $@xmas_spawn_y2, $@xmas_mob_names$[$@xmas_map_loop], $@xmas_mob_spawns[$@xmas_map_loop], $@spawn_amount, "XmasSpawnCounter#" + $@xmas_map_loop + "::OnTally";
+ $@xmas_current_count = ($@xmas_current_count + $@spawn_amount);
+ goto L_NextMap;
+
+L_NextMap:
+ if (($@xmas_map_loop + 1) == getarraysize($@xmas_map_spawns$))
+ goto L_End;
+ $@xmas_map_loop = ($@xmas_map_loop + 1);
+ goto L_StartLoop;
+
+OnCommandTally:
+ $@xmas_map_loop = 0;
+ $@xmas_current_count = ($@xmas_current_count - 1);
+ if (($@xmas_current_count < $@xmas_respawn_count) && !($@xmas_mob_lck))
+ goto L_StartLoop;
+ goto L_End;
+
+OnTimer110000:
+ initnpctimer;
+ goto L_StartLoop;
+
+L_End:
+ $@mob_count = 0;
+ $@spawn_amount = 0;
+ $@xmas_mob_lck = 0;
+ $@xmas_map_loop = 0;
+ end;
+}
+
+019-1,0,0,0 script XmasSpawnCounter#0 NPC400,{
+ end;
+
+OnTally:
+ donpcevent "XmasSpawnManager::OnCommandTally";
+ end;
+}
+
+019-3,0,0,0 script XmasSpawnCounter#1 NPC400,{
+ end;
+
+OnTally:
+ donpcevent "XmasSpawnManager::OnCommandTally";
+ end;
+}
+
+030-3,0,0,0 script XmasSpawnCounter#2 NPC400,{
+ end;
+
+OnTally:
+ donpcevent "XmasSpawnManager::OnCommandTally";
+ end;
+}
diff --git a/npc/annuals/xmas/reagents.txt b/npc/annuals/xmas/reagents.txt
new file mode 100644
index 00000000..dbdf52e7
--- /dev/null
+++ b/npc/annuals/xmas/reagents.txt
@@ -0,0 +1,139 @@
+
+function script CheckReagents {
+ @xmas_reagent_loop = 0;
+ if((@xmas_reagent_done_state) || !(@xmas_reagent_start_state))
+ goto L_Return;
+ if(@xmas_side)
+ goto L_OneLoop;
+ goto L_ZeroLoop;
+
+L_ZeroLoop:
+ if(countitem($@xmas_zero_reagents$[@xmas_reagent_loop]) >= $@xmas_zero_reagents_amounts[@xmas_reagent_loop])
+ goto L_ZeroLoopAgain;
+ goto L_Return;
+
+L_ZeroLoopAgain:
+ if((@xmas_reagent_loop + 1) == getarraysize($@xmas_zero_reagents$))
+ goto L_AllReagents;
+ @xmas_reagent_loop = (@xmas_reagent_loop + 1);
+ goto L_ZeroLoop;
+
+L_OneLoop:
+ if(countitem($@xmas_one_reagents$[@xmas_reagent_loop]) >= $@xmas_one_reagents_amounts[@xmas_reagent_loop])
+ goto L_OneLoopAgain;
+ goto L_Return;
+
+L_OneLoopAgain:
+ if((@xmas_reagent_loop + 1) == getarraysize($@xmas_one_reagents$))
+ goto L_AllReagents;
+ @xmas_reagent_loop = (@xmas_reagent_loop + 1);
+ goto L_OneLoop;
+
+L_AllReagents:
+ @xmas_state = $@xmas_reagents_done;
+ callfunc "XmasSetState";
+ goto L_Return;
+
+L_Return:
+ return;
+}
+
+function script DeleteReagents {
+ @xmas_reagent_loop = 0;
+ if(@xmas_side)
+ goto L_OneLoop;
+ goto L_ZeroLoop;
+
+L_ZeroLoop:
+ delitem $@xmas_zero_reagents$[@xmas_reagent_loop], $@xmas_zero_reagents_amounts[@xmas_reagent_loop];
+ goto L_ZeroLoopAgain;
+
+L_ZeroLoopAgain:
+ if((@xmas_reagent_loop + 1) == getarraysize($@xmas_zero_reagents$))
+ goto L_Return;
+ @xmas_reagent_loop = (@xmas_reagent_loop + 1);
+ goto L_ZeroLoop;
+
+L_OneLoop:
+ delitem $@xmas_one_reagents$[@xmas_reagent_loop], $@xmas_one_reagents_amounts[@xmas_reagent_loop];
+ goto L_OneLoopAgain;
+
+L_OneLoopAgain:
+ if((@xmas_reagent_loop + 1) == getarraysize($@xmas_one_reagents$))
+ goto L_Return;
+ @xmas_reagent_loop = (@xmas_reagent_loop + 1);
+ goto L_OneLoop;
+
+L_Return:
+ return;
+}
+
+function script ListReagents {
+ @xmas_reagent_loop = 0;
+ mes "\"I'm going to need \"";
+ next;
+
+ if(@xmas_side)
+ goto L_OneLoop;
+ goto L_ZeroLoop;
+
+L_ZeroLoop:
+ mes "\"" + $@xmas_zero_reagents_amounts[@xmas_reagent_loop] + " " + $@xmas_zero_reagents_names$[@xmas_reagent_loop] + "\"";
+ next;
+ goto L_ZeroLoopAgain;
+
+L_ZeroLoopAgain:
+ if((@xmas_reagent_loop + 1) == getarraysize($@xmas_zero_reagents$))
+ goto L_AllReagents;
+ @xmas_reagent_loop = (@xmas_reagent_loop + 1);
+ goto L_ZeroLoop;
+
+L_OneLoop:
+ mes "\"" + $@xmas_one_reagents_amounts[@xmas_reagent_loop] + " " + $@xmas_one_reagents_names$[@xmas_reagent_loop] + "\"";
+ next;
+ goto L_OneLoopAgain;
+
+L_OneLoopAgain:
+ if((@xmas_reagent_loop + 1) == getarraysize($@xmas_one_reagents$))
+ goto L_AllReagents;
+ @xmas_reagent_loop = (@xmas_reagent_loop + 1);
+ goto L_OneLoop;
+
+L_AllReagents:
+ return;
+}
+
+function script BadPowderMake {
+ if(countitem("PileOfAsh") < ($@xmas_red_amount + $@xmas_yellow_amount))
+ goto L_NotEnough;
+ if(countitem("RedDye") < $@xmas_red_amount)
+ goto L_NotEnough;
+ if(countitem("YellowDye") < $@xmas_yellow_amount)
+ goto L_NotEnough;
+ getinventorylist;
+ if (@inventorylist_count > 100)
+ goto L_FullInv;
+ goto L_MakePowder;
+
+L_MakePowder:
+ delitem "PileOfAsh", ($@xmas_red_amount + $@xmas_yellow_amount);
+ delitem "RedDye", $@xmas_red_amount;
+ delitem "YellowDye", $@xmas_yellow_amount;
+ getitem "RedPowder", $@xmas_red_amount;
+ getitem "YellowPowder", $@xmas_yellow_amount;
+ mes "\"Here is your powder, now move!\"";
+ goto L_Return;
+
+L_FullInv:
+ mes "\"... Excuse me but where did you expect you were going to hold these powders...\"";
+ mes "\"WAIT! no, I don't want to know. Just come back when you have some room.\"";
+ goto L_Return;
+
+L_NotEnough:
+ mes "\"You don't have enough of eagents to make the powders.\"";
+ mes "\"To replace the glitter we will need get " + ($@xmas_red_amount + $@xmas_yellow_amount) + " Piles of Ash, " + $@xmas_red_amount + " Red Dyes and " + $@xmas_yellow_amount + " Yellow Dyes\"";
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/npc/annuals/xmas/states.txt b/npc/annuals/xmas/states.txt
new file mode 100644
index 00000000..c21ccce5
--- /dev/null
+++ b/npc/annuals/xmas/states.txt
@@ -0,0 +1,51 @@
+
+function script XmasStates {
+ // Check for Old Quest Line Keys. Reset Quest if so.
+ callfunc "XmasCheckOld";
+ // Main Quest
+ @xmas_state = ((XMASTIME & NIBBLE_0_MASK) >> NIBBLE_0_SHIFT);
+ @xmas_karma = ((XMASTIME & NIBBLE_1_MASK) >> NIBBLE_1_SHIFT);
+ @xmas_side = XMASTIME & $@xmas_side_bit;
+
+ @xmas_list_gather = (@xmas_state >= $@xmas_list_path2_state);
+ @xmas_list_path2 = (@xmas_state == $@xmas_list_path2_state);
+ @xmas_list_path1 = (@xmas_state == $@xmas_list_path1_state);
+ @xmas_list_both = (@xmas_state == $@xmas_list_both_state);
+ @xmas_list_complete = (@xmas_state >= $@xmas_list_complete_state);
+ @xmas_list_deliver = (@xmas_state >= $@xmas_list_deliver_state);
+ @xmas_helper_start_state = (@xmas_state >= $@xmas_helpers_start_state);
+ @xmas_helper_done_state = (@xmas_state >= $@xmas_helpers_done_state);
+ @xmas_reagent_start_state = (@xmas_state >= $@xmas_reagents_start);
+ @xmas_reagent_done_state = (@xmas_state >= $@xmas_reagents_done);
+ @xmas_boss_door_state = (@xmas_state >= $@xmas_boss_door_open_state);
+ @xmas_reward_start_state = (@xmas_state == $@xmas_reward_start);
+ @xmas_reward1_done_state = (@xmas_state == $@xmas_reward1_done);
+ @xmas_reward2_done_state = (@xmas_state == $@xmas_reward2_done);
+ @xmas_reward_done_state = (@xmas_state == $@xmas_reward_done);
+
+ // Basement Passage
+ @xmas_basement_passage = XMASTIME & $@xmas_basement_passage;
+ // Thrown Out
+ @xmas_thrown_out = XMASTIME & $@xmas_thrown_out_bit;
+ // Learned Route to Orum
+ @xmas_knows_route = XMASTIME & $@xmas_route_bit;
+ // Santas Helper
+ @xmas_sh_done = XMASTIME & $@xmas_sh_bit;
+ // List Quest
+ @xmas_all_lists = XMASTIME & $@xmas_all_lists_bit;
+ // Helper Quest
+ @xmas_helper_bit = XMASTIME & $@xmas_helper_bit;
+ @xmas_all_helpers = XMASTIME & $@xmas_all_helpers_bit;
+ // Acorns
+ @xmas_helper_acorn = XMASTIME & $@xmas_helper_bit_acorns;
+ // Bedding
+ @xmas_helper_bedding = XMASTIME & $@xmas_helper_bit_bed_starts;
+ // Glitter
+ @xmas_helper_glitter = XMASTIME & $@xmas_helper_bit_glitter_starts;
+ // Storage
+ @xmas_helper_storage = XMASTIME & $@xmas_helper_bit_storage;
+ // Bosses
+ @xmas_boss_start = XMASTIME & $@xmas_boss_start_bit;
+ @xmas_boss_hero = XMASTIME & $@xmas_boss_hero_bit;
+ return;
+}
diff --git a/npc/botcheck/_import.txt b/npc/botcheck/_import.txt
new file mode 100644
index 00000000..eca1724c
--- /dev/null
+++ b/npc/botcheck/_import.txt
@@ -0,0 +1,3 @@
+// Map botcheck: Botcheck Area
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/botcheck/mapflags.txt",
diff --git a/npc/botcheck/mapflags.txt b/npc/botcheck/mapflags.txt
new file mode 100644
index 00000000..6d36e10c
--- /dev/null
+++ b/npc/botcheck/mapflags.txt
@@ -0,0 +1,3 @@
+//botcheck mapflag resave botcheck,37,37
+//botcheck mapflag nosave botcheck,37,37
+botcheck mapflag zone Jail
diff --git a/npc/commands/debug-quest.txt b/npc/commands/debug-quest.txt
new file mode 100644
index 00000000..24363e09
--- /dev/null
+++ b/npc/commands/debug-quest.txt
@@ -0,0 +1,102 @@
+// Evol Script
+// Author: Gumi, Jesusalva
+
+// TODO: This script must be auto-generated from db/quests.conf to be of any use
+function script GlobalQuestDebug {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug") + " - " + l("Other");
+ mes l("This menu gives access to quest debug menus for @@ quests.", strtolower(l("Other")));
+ next;
+ mes l("Please select a quest:");
+
+ menuint
+ menuimage("actions/back", l("Go back")), -1,
+ l("Custom"), -136;
+
+ switch (@menuret)
+ {
+ case -1: return;
+ case -136:
+ mes "Determine the quest number, as stated in db/quests.conf";
+ input .@quest;
+ if (!.@quest) return;
+ mes "";
+ mes l("DEBUG: Changing @@, Values: (@@, @@, @@).", getquestlink(.@quest), getq(.@quest), getq2(.@quest), getq3(.@quest));
+ select
+ "set 1",
+ "set 2",
+ "set 3",
+ "reset";
+ mes l("DEBUG: Changing @@ field @@ to something else.", getquestlink(.@quest), @menu);
+ mes "";
+ mes "Determine the new value (numeric only)";
+ input .@value;
+ if (.@value < 0) return;
+ if (@menu == 1)
+ setq1 .@quest, .@value;
+ if (@menu == 2)
+ setq2 .@quest, .@value;
+ if (@menu == 3)
+ setq3 .@quest, .@value;
+ if (@menu == 4)
+ setq .@quest, .@value, 0, 0;
+
+ return;
+ default: return;
+ }
+ } while (1);
+ return;
+}
+
+
+
+- script @qdebug 32767,{
+ end;
+
+OnCall:
+ if (!is_gm()) {
+ end;
+ }
+ GlobalQuestDebug;
+ closedialog;
+ end;
+
+OnSetq:
+ if (.@atcmd_numparameters < 1) {
+ dispbottom "setq called with invalid arguments (min. 2)";
+ dispbottom "GM Command syntax: @setq <quest_id> <val1> <val2> <val3>";
+ end;
+ }
+ .@q=atoi(.@atcmd_parameters$[0]);
+ if (.@atcmd_numparameters < 2) {
+ if (!is_trusted())
+ charcommand sprintf("@request Quest %d count: %d / %d / %d", .@q,
+ getq(.@q), getq2(.@q), getq3(.@q));
+ else
+ dispbottom sprintf("%s Quest count: %d / %d / %d", getquestlink(.@q),
+ getq(.@q), getq2(.@q), getq3(.@q));
+ end;
+ }
+ switch (.@atcmd_numparameters) {
+ case 4:
+ setq3 .@q, atoi(.@atcmd_parameters$[3]);
+ case 3:
+ setq2 .@q, atoi(.@atcmd_parameters$[2]);
+ case 2:
+ setq1 .@q, atoi(.@atcmd_parameters$[1]);
+ dispbottom l("Quest @@ modified by GM", getquestlink(.@q));
+ specialeffect 50, SELF, playerattached();
+ break;
+ default:
+ dispbottom "setq called with invalid arguments (max. 4)";
+ dispbottom "GM Command syntax: @setq <quest_id> <val1> <val2> <val3>";
+ break;
+ }
+ end;
+
+OnInit:
+ bindatcmd "qdebug", "@qdebug::OnCall", 99, 99, 1;
+ bindatcmd "setq", "@qdebug::OnSetq", 99, 99, 1;
+}
diff --git a/npc/commands/debug.txt b/npc/commands/debug.txt
new file mode 100644
index 00000000..f62b4a97
--- /dev/null
+++ b/npc/commands/debug.txt
@@ -0,0 +1,688 @@
+
+function script Debug {
+ goto L_Begin;
+
+L_Begin:
+ mes "What do you want to do?";
+ mes "Your range: "+readbattleparam(getcharid(3), UDT_ATKRANGE);
+ mes "Bow range: "+getiteminfo(Bow, ITEMINFO_RANGE);
+ menu
+ "Reset stat points.", L_ResetStatusPoints,
+ "Change my level.", L_Level,
+ "Change other stuff.", L_Stats,
+ "Change my basic skills.", L_BasicSkills,
+ "Change my focus skills.", L_FocusSkills,
+ "Change my magic skills.", L_MagicSkills,
+ "Add everything.", L_AddAll,
+ "Reset everything.", L_ResetAll,
+ "Close.", L_close;
+
+L_Stats:
+ mesc l("Stats: %s", col(b("@str/@agi/@vit/@int/@dex/@luk/@allstats"),3));
+ mesc l("GP: %s", col(b("@zeny"),3));
+ mesc l("Items: %s", col(b("/createitems"),3));
+ mesc l("Hide from monsters: %s", col(b("@monsterignore or @safe"),3));
+ mesc l("Reset Stats: %s", col(b("@streset"),3));
+ next;
+ goto L_Begin;
+
+L_Level:
+ mes "What level do you want to be (min: 1 - max: 140)?";
+ input @lvl;
+ if (@lvl < 1)
+ goto L_LevelTooLow;
+ if (@lvl > 140)
+ goto L_LevelTooHigh;
+ if (BaseLevel == @lvl)
+ goto L_SameLevel;
+ BaseLevel = @lvl;
+ resetstatus;
+ mes "You are now level " + BaseLevel + ".";
+ goto L_Begin;
+
+L_LevelTooLow:
+ mes "Bad choice. Minimum level is 1.";
+ next;
+ goto L_Begin;
+
+L_LevelTooHigh:
+ mes "Bad choice. Maximum level is 140.";
+ next;
+ goto L_Begin;
+
+L_SameLevel:
+ mes "You already are level " + @lvl + ".";
+ resetstatus;
+ next;
+ goto L_Begin;
+
+L_ResetStatusPoints:
+ resetstatus;
+ mes "Stats successfully resetted.";
+ next;
+ goto L_Begin;
+
+L_BasicSkills:
+ adddefaultskills();
+ goto L_Begin;
+
+L_FocusSkills:
+ @pool = getskilllv(SKILL_POOL);
+ @mallard = getskilllv(SKILL_MALLARDS_EYE);
+ @brawling = getskilllv(SKILL_BRAWLING);
+ @speed = getskilllv(SKILL_SPEED);
+ @poison = getskilllv(SKILL_RESIST_POISON);
+ @astralsoul = getskilllv(SKILL_ASTRAL_SOUL);
+ @raging = getskilllv(SKILL_RAGING);
+
+ mes "Your focusing skill level is " + @pool + ".";
+ mes "Your mallard's eye skill level is " + @mallard + ".";
+ mes "Your brawling skill level is " + @brawling + ".";
+ mes "Your speed skill level is " + @speed + ".";
+ mes "Your resist poison skill level is " + @poison + ".";
+ mes "Your astral soul skill level is " + @astralsoul + ".";
+ mes "Your raging skill level is " + @raging + ".";
+ next;
+ mes "";
+ mes l("Focus list:");
+ mesc l("%s : %s", l("Mallard's Eye"),
+ (isfocused(SKILL_MALLARDS_EYE) ? l("Yes") : l("No")));
+ mesc l("%s : %s", l("Brawling"),
+ (isfocused(SKILL_BRAWLING) ? l("Yes") : l("No")));
+ mesc l("%s : %s", l("Speed"),
+ (isfocused(SKILL_SPEED) ? l("Yes") : l("No")));
+ mesc l("%s : %s", l("Resist Ailment"),
+ (isfocused(SKILL_RESIST_POISON) ? l("Yes") : l("No")));
+ mesc l("%s : %s", l("Astral Soul"),
+ (isfocused(SKILL_ASTRAL_SOUL) ? l("Yes") : l("No")));
+ mesc l("%s : %s", l("Raging"),
+ (isfocused(SKILL_RAGING) ? l("Yes") : l("No")));
+ .@t=getactivatedpoolskilllist();
+ menuint
+ l("Back"), -3,
+ l("Focus Skill +"), -2,
+ rif(getskilllv(SKILL_POOL), l("Focus Skill -")), -1,
+ l("Add all focus skills"), 0,
+ l("Remove all focus skills"), -4,
+ ("Toggle Focus - Mallards Eye"), SKILL_MALLARDS_EYE,
+ ("Toggle Focus - Brawling"), SKILL_BRAWLING,
+ ("Toggle Focus - Speed"), SKILL_SPEED,
+ ("Toggle Focus - Resist Ailment"), SKILL_RESIST_POISON,
+ ("Toggle Focus - Astral Soul"), SKILL_ASTRAL_SOUL,
+ ("Toggle Focus - Raging"), SKILL_RAGING;
+ mes "";
+ switch (@menuret) {
+ case -3: goto L_Begin;
+ case -2:
+ skill SKILL_POOL, @pool+1, 0; break;
+ case -1:
+ skill SKILL_POOL, max(0, @pool-1), 0; break;
+ case 0:
+ updateskill SKILL_MALLARDS_EYE, 9;
+ updateskill SKILL_BRAWLING, 9;
+ updateskill SKILL_SPEED, 9;
+ updateskill SKILL_RESIST_POISON, 9;
+ updateskill SKILL_ASTRAL_SOUL, 9;
+ updateskill SKILL_RAGING, 9;
+ break;
+ case -4:
+ skill SKILL_POOL, 0, 0; break;
+ updateskill SKILL_MALLARDS_EYE, 0;
+ updateskill SKILL_BRAWLING, 0;
+ updateskill SKILL_SPEED, 0;
+ updateskill SKILL_RESIST_POISON, 0;
+ updateskill SKILL_ASTRAL_SOUL, 0;
+ updateskill SKILL_RAGING, 0;
+ break;
+ default:
+ if (FOCUSING & getpoolskillFID(@menuret)) {
+ unpoolskill(@menuret);
+ mesc "Focus removed", 1;
+ } else {
+ .@s = poolskill(@menuret);
+ if (.@s)
+ mesc "Focus added", 2;
+ else
+ mesc sprintf("Impossible to focus. You can only focus %d skills at a time.", .@t), 1;
+ }
+ }
+ goto L_FocusSkills;
+
+L_MagicSkills:
+ @general = getskilllv(SKILL_MAGIC);
+ @life = getskilllv(SKILL_MAGIC_LIFE);
+ @war = getskilllv(SKILL_MAGIC_WAR);
+ @trans = getskilllv(SKILL_MAGIC_TRANSMUTE);
+ @nature = getskilllv(SKILL_MAGIC_NATURE);
+ @astral = getskilllv(SKILL_MAGIC_ASTRAL);
+ @dark = getskilllv(SKILL_MAGIC_DARK);
+ menu
+ "Overview of my magical skills.", L_MagicSkillsOverview,
+ "Get magic skills.", L_ChangeMagicSkills,
+ "Get magic experience.", L_MagicExperience,
+ "All magic skills to their maximum level and maximum magic experience.", L_GetAllMagic,
+ "Reset magic skills and experience.", L_ResetMagicSkills,
+ "Back to the main menu.", L_Begin,
+ "Close.", L_close;
+
+L_MagicSkillsOverview:
+ mes "Your current magic exp is "+MAGIC_EXP;
+ mes "Your level in the general magic skill is " + @general + ".";
+ mes "Your level in the life magic skill is " + @life + ".";
+ mes "Your level in the war magic skill is " + @war + ".";
+ mes "Your level in the transmutation magic skill is " + @trans + ".";
+ mes "Your level in the nature magic skill is " + @nature + ".";
+ mes "Your level in the astral magic skill is " + @astral + ".";
+ mes "Your level in the dark magic skill is " + @dark + ".";
+ next;
+ goto L_MagicSkills;
+
+L_MagicExperience:
+ mes "Your current magic experience is " + MAGIC_EXP + ".";
+ if (@general == 0
+ && @life == 0
+ && @war == 0
+ && @trans == 0
+ && @nature == 0
+ && @astral == 0
+ && @dark == 0)
+ goto L_NoMagicSkills;
+
+ goto L_ChangeMagicExperience;
+
+L_NoMagicSkills:
+ mes "You can't have magic experience, since you have no magic skills yet.";
+ goto L_MagicSkills;
+
+L_ChangeMagicExperience:
+ mes "Set the desired magic experience (min: 0 - max: 65535).";
+ input @value;
+ if (@value < 0 || @value > 65535)
+ goto L_WrongMagicExperience;
+ MAGIC_EXP = @value;
+ mes "You now have " + MAGIC_EXP + " magic experience points.";
+ goto L_MagicSkills;
+
+L_WrongMagicExperience:
+ mes "Wrong value informed. Aborting.";
+ goto L_MagicSkills;
+
+L_ChangeMagicSkills:
+ menu
+ "General Magic.", L_ChangeGeneralMagicSkill,
+ "Life Magic.", L_ChangeLifeMagicSkill,
+ "War Magic.", L_ChangeWarMagicSkill,
+ "Transmutation Magic.", L_ChangeTransmutationMagicSkill,
+ "Nature Magic.", L_ChangeNatureMagicSkill,
+ "Astral Magic.", L_ChangeAstralMagicSkill,
+ "Dark Magic.", L_ChangeDarkMagicSkill,
+ "Back to the magic skills menu.", L_MagicSkills,
+ "Close.", L_close;
+
+L_ChangeGeneralMagicSkill:
+ mes "Your level in the general magic skill is " + @general + ". What do you want to do?";
+ menu
+ "Get level 0.", L_Next4,
+ "Get level 1.", L_ChangeGeneralMagicSkill1,
+ "Get level 2.", L_ChangeGeneralMagicSkill2;
+
+L_Next4:
+ if (@menu == 1)
+ updateskill SKILL_MAGIC, 0;
+ mes "General Magic skill changed to level 0.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeGeneralMagicSkill1:
+ updateskill SKILL_MAGIC, 1;
+ mes "General Magic skill changed to level 1.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeGeneralMagicSkill2:
+ updateskill SKILL_MAGIC, 2;
+ if (MAGIC_EXP < 100)
+ MAGIC_EXP = 100;
+ mes "General Magic skill changed to level 2.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeLifeMagicSkill:
+ mes "Your level in the life magic skill is " + @life + ". What do you want to do?";
+ menu
+ "Get level 0.", L_Next5,
+ "Get level 1.", L_ChangeLifeMagicSkill1,
+ "Get level 2.", L_ChangeLifeMagicSkill2;
+
+L_Next5:
+ if (@menu == 1)
+ updateskill SKILL_MAGIC_LIFE, 0;
+ mes "Life Magic skill changed to level 0.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeLifeMagicSkill1:
+ updateskill SKILL_MAGIC_LIFE, 1;
+ mes "Life Magic skill changed to level 1.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeLifeMagicSkill2:
+ updateskill SKILL_MAGIC_LIFE, 2;
+ if (MAGIC_EXP < 100)
+ MAGIC_EXP = 100;
+ mes "Life Magic skill changed to level 2.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeWarMagicSkill:
+ mes "Your level in the war magic skill is " + @war + ". What do you want to do?";
+ menu
+ "Get level 0.", L_Next6,
+ "Get level 1.", L_ChangeWarMagicSkill1,
+ "Get level 2.", L_ChangeWarMagicSkill2;
+
+L_Next6:
+ if (@menu == 1)
+ updateskill SKILL_MAGIC_WAR, 0;
+ mes "War Magic skill changed to level 0.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeWarMagicSkill1:
+ updateskill SKILL_MAGIC_WAR, 1;
+ mes "War Magic skill changed to level 1.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeWarMagicSkill2:
+ updateskill SKILL_MAGIC_WAR, 2;
+ if (MAGIC_EXP < 100)
+ MAGIC_EXP = 100;
+ mes "War Magic skill changed to level 2.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeTransmutationMagicSkill:
+ mes "Your level in the transmutation magic skill is " + @trans + ". What do you want to do?";
+ menu
+ "Get level 0.", L_Next7,
+ "Get level 1.", L_ChangeTransmutationMagicSkill1,
+ "Get level 2.", L_ChangeTransmutationMagicSkill2;
+
+L_Next7:
+ if (@menu == 1)
+ updateskill SKILL_MAGIC_TRANSMUTE, 0;
+ mes "Transmutation Magic skill changed to level 0.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeTransmutationMagicSkill1:
+ updateskill SKILL_MAGIC_TRANSMUTE, 1;
+ mes "Transmutation Magic skill changed to level 1.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeTransmutationMagicSkill2:
+ updateskill SKILL_MAGIC_TRANSMUTE, 2;
+ if (MAGIC_EXP < 100)
+ MAGIC_EXP = 100;
+ mes "Transmutation Magic skill changed to level 2.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeNatureMagicSkill:
+ mes "Your level in the nature magic skill is " + @nature + ". What do you want to do?";
+ menu
+ "Get level 0.", L_Next8,
+ "Get level 1.", L_ChangeNatureMagicSkill1,
+ "Get level 2.", L_ChangeNatureMagicSkill2;
+
+L_Next8:
+ if (@menu == 1)
+ updateskill SKILL_MAGIC_NATURE, 0;
+ mes "Nature Magic skill changed to level 0.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeNatureMagicSkill1:
+ updateskill SKILL_MAGIC_NATURE, 1;
+ mes "Nature Magic skill changed to level 1.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeNatureMagicSkill2:
+ updateskill SKILL_MAGIC_NATURE, 2;
+ if (MAGIC_EXP < 100)
+ MAGIC_EXP = 100;
+ mes "Nature Magic skill changed to level 2.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeAstralMagicSkill:
+ mes "Your level in the astral magic skill is " + @astral + ". What do you want to do?";
+ menu
+ "Get level 0.", L_Next9,
+ "Get level 1.", L_ChangeAstralMagicSkill1,
+ "Get level 2.", L_ChangeAstralMagicSkill2;
+
+L_Next9:
+ if (@menu == 1)
+ updateskill SKILL_MAGIC_ASTAL, 0;
+ mes "Astral Magic skill changed to level 0.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeAstralMagicSkill1:
+ updateskill SKILL_MAGIC_ASTRAL, 1;
+ mes "Astral Magic skill changed to level 1.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeAstralMagicSkill2:
+ updateskill SKILL_MAGIC_ASTRAL, 2;
+ if (MAGIC_EXP < 100)
+ MAGIC_EXP = 100;
+ mes "Astral Magic skill changed to level 2.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeDarkMagicSkill:
+ mes "Your level in the dark magic skill is " + @dark + ". What do you want to do?";
+ menu
+ "Get level 0.", L_Next10,
+ "Get level 1.", L_ChangeDarkMagicSkill1,
+ "Get level 2.", L_ChangeDarkMagicSkill2;
+
+L_Next10:
+ if (@menu == 1)
+ updateskill SKILL_MAGIC_DARK, 0;
+ mes "Dark Magic skill changed to level 0.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeDarkMagicSkill1:
+ updateskill SKILL_MAGIC_DARK, 1;
+ mes "Dark Magic skill changed to level 1.";
+ next;
+ goto L_MagicSkills;
+
+L_ChangeDarkMagicSkill2:
+ updateskill SKILL_MAGIC_DARK, 2;
+ if (MAGIC_EXP < 100)
+ MAGIC_EXP = 100;
+ mes "Dark Magic skill changed to level 2.";
+ next;
+ goto L_MagicSkills;
+
+L_GetAllMagic:
+ updateskill SKILL_MAGIC, 5;
+ updateskill SKILL_MAGIC_LIFE, 5;
+ updateskill SKILL_MAGIC_WAR, 5;
+ updateskill SKILL_MAGIC_TRANSMUTE, 5;
+ updateskill SKILL_MAGIC_NATURE, 5;
+ updateskill SKILL_MAGIC_ASTRAL, 5;
+ updateskill SKILL_MAGIC_DARK, 5;
+ mes "Magic skills added.";
+ next;
+ goto L_MagicSkills;
+
+L_ResetMagicSkills:
+ updateskill SKILL_MAGIC, 0;
+ updateskill SKILL_MAGIC_LIFE, 0;
+ updateskill SKILL_MAGIC_WAR, 0;
+ updateskill SKILL_MAGIC_TRANSMUTE, 0;
+ updateskill SKILL_MAGIC_NATURE, 0;
+ updateskill SKILL_MAGIC_ASTRAL, 0;
+ updateskill SKILL_MAGIC_DARK, 0;
+ mes "Magic skills removed.";
+ next;
+ goto L_MagicSkills;
+
+L_AddAll:
+ adddefaultskills();
+ updateskill SKILL_POOL, 1;
+ updateskill SKILL_MALLARDS_EYE, 9;
+ updateskill SKILL_BRAWLING, 9;
+ updateskill SKILL_SPEED, 9;
+ updateskill SKILL_RESIST_POISON, 9;
+ updateskill SKILL_ASTRAL_SOUL, 9;
+ updateskill SKILL_RAGING, 9;
+ updateskill SKILL_MAGIC, 5;
+ updateskill SKILL_MAGIC_LIFE, 5;
+ updateskill SKILL_MAGIC_WAR, 5;
+ updateskill SKILL_MAGIC_TRANSMUTE, 5;
+ updateskill SKILL_MAGIC_NATURE, 5;
+ updateskill SKILL_MAGIC_ASTRAL, 5;
+ updateskill SKILL_MAGIC_DARK, 5;
+
+ // Real skills
+ learnskill SKILL_CONFRINGO, 1;
+ learnskill SKILL_ABIZIT, 1;
+ learnskill SKILL_MONSTERINFO, 1;
+ learnskill EVOL_AREA_PROVOKE, 1;
+ learnskill SKILL_FLAR, 1;
+ learnskill SKILL_CHIZA, 1;
+ learnskill SKILL_MODRIPHOO, 1;
+ learnskill SKILL_MODRISUMP, 1;
+ learnskill SKILL_MODRIYIKAM, 1;
+ learnskill SKILL_MODRILAX, 1;
+ learnskill SKILL_LUM, 1;
+ learnskill SKILL_PARUM, 1;
+ learnskill SKILL_GOLE, 1;
+ learnskill SKILL_KALAKARENK, 1;
+ learnskill SKILL_KALBOO, 1;
+ learnskill SKILL_KALGINA, 1;
+ learnskill SKILL_KALRENK, 1;
+ learnskill SKILL_HALHISS, 1;
+ learnskill SKILL_HELORP, 1;
+ learnskill SKILL_KAFLOSH, 1;
+ learnskill SKILL_BETSANC, 1;
+ learnskill SKILL_ASORM, 1;
+ learnskill SKILL_INGRAV, 1;
+ learnskill SKILL_UPMARMU, 1;
+ learnskill SKILL_PHLEX, 1;
+ learnskill SKILL_KULARZUFRILL, 1;
+ learnskill SKILL_ZUKMINBIRF, 1;
+ learnskill SKILL_PATMUPLOO, 1;
+ learnskill SKILL_PATVILOREE, 1;
+ learnskill SKILL_PATLOREE, 1;
+ learnskill SKILL_MANPAHIL, 1;
+ resetstatus;
+ BaseLevel = 99;
+ mes "All skills added to their maximum level.";
+ mes "Maximum number of Legacy Magic Experience points.";
+ mes "You are now level " + BaseLevel + ".";
+ next;
+ goto L_Begin;
+
+L_ResetAll:
+ //adddefaultskills();
+ updateskill SKILL_POOL, 0;
+ updateskill SKILL_MALLARDS_EYE, 0;
+ updateskill SKILL_BRAWLING, 0;
+ updateskill SKILL_SPEED, 0;
+ updateskill SKILL_RESIST_POISON, 0;
+ updateskill SKILL_ASTRAL_SOUL, 0;
+ updateskill SKILL_RAGING, 0;
+ updateskill SKILL_MAGIC, 0;
+ updateskill SKILL_MAGIC_LIFE, 0;
+ updateskill SKILL_MAGIC_WAR, 0;
+ updateskill SKILL_MAGIC_TRANSMUTE, 0;
+ updateskill SKILL_MAGIC_NATURE, 0;
+ updateskill SKILL_MAGIC_ASTRAL, 0;
+ updateskill SKILL_MAGIC_DARK, 0;
+
+ // Real skills
+ updateskill SKILL_CONFRINGO, 0;
+ updateskill SKILL_ABIZIT, 0;
+ updateskill SKILL_MONSTERINFO, 0;
+ updateskill EVOL_AREA_PROVOKE, 0;
+ updateskill SKILL_FLAR, 0;
+ updateskill SKILL_CHIZA, 0;
+ updateskill SKILL_MODRIPHOO, 0;
+ updateskill SKILL_MODRISUMP, 0;
+ updateskill SKILL_MODRIYIKAM, 0;
+ updateskill SKILL_MODRILAX, 0;
+ updateskill SKILL_LUM, 0;
+ updateskill SKILL_PARUM, 0;
+ updateskill SKILL_GOLE, 0;
+ updateskill SKILL_KALAKARENK, 0;
+ updateskill SKILL_KALBOO, 0;
+ updateskill SKILL_KALGINA, 0;
+ updateskill SKILL_KALRENK, 0;
+ updateskill SKILL_HALHISS, 0;
+ updateskill SKILL_HELORP, 0;
+ updateskill SKILL_KAFLOSH, 0;
+ updateskill SKILL_BETSANC, 0;
+ updateskill SKILL_ASORM, 0;
+ updateskill SKILL_INGRAV, 0;
+ updateskill SKILL_UPMARMU, 0;
+ updateskill SKILL_PHLEX, 0;
+ updateskill SKILL_KULARZUFRILL, 0;
+ updateskill SKILL_ZUKMINBIRF, 0;
+ updateskill SKILL_PATMUPLOO, 0;
+ updateskill SKILL_PATVILOREE, 0;
+ updateskill SKILL_PATLOREE, 0;
+ updateskill SKILL_MANPAHIL, 0;
+ MAGIC_EXP = 0;
+ resetstatus;
+ BaseLevel = 1;
+ mes "All skills removed.";
+ mes "Magic experience reset.";
+ mes "You are now level " + BaseLevel + ".";
+ next;
+ goto L_Begin;
+
+L_close:
+ closeclientdialog;
+ return;
+}
+
+- script Debug Spell NPC32767,{
+ end;
+
+OnDebug:
+ if (!debug && getgmlevel() < CMD_DEBUG) end;
+ callfunc "Debug";
+ end;
+
+OnSetVar:
+ if (getarraysize(.@atcmd_parameters$) != 3)
+ Exception("Usage: @set-var VARIABLE INDEX VALUE", RB_DISPBOTTOM|RB_ISFATAL);
+
+ .@cmd$=array_shift(.@atcmd_parameters$);
+ .@idx=atoi(array_shift(.@atcmd_parameters$));
+ if (charat(.@atcmd_parameters$[0],
+ getstrlen(.@atcmd_parameters$[0])-1) == "$")
+ .@str=true;
+
+ if (.@str)
+ .@val$=array_shift(.@atcmd_parameters$);
+ else
+ .@val=array_shift(.@atcmd_parameters$);
+
+ if (.@str)
+ setd(sprintf("%s[%d]", .@cmd$, .@idx), .@val$);
+ else
+ setd(sprintf("%s[%d]", .@cmd$, .@idx), .@val);
+
+ .@msg$=sprintf("%s[%d] is now: %s", .@cmd$, .@idx,
+ getd(sprintf("%s[%d]", .@cmd$, .@idx)));
+
+ if (!is_trusted())
+ charcommand("@request System Information: "+.@msg$);
+ else
+ dispbottom(.@msg$);
+ end;
+
+// If the char is not a staff member, it'll be sent to GM Log instead
+OnGetVar:
+ if (getarraysize(.@atcmd_parameters$) != 2)
+ Exception("Usage: @get-var VARIABLE INDEX", RB_DISPBOTTOM|RB_ISFATAL);
+
+ .@cmd$=array_shift(.@atcmd_parameters$);
+ .@idx=atoi(array_shift(.@atcmd_parameters$));
+
+ .@mg$=sprintf("%s[%d] == %s", .@cmd$, .@idx,
+ getd(sprintf("%s[%d]", .@cmd$, .@idx)));
+
+ if (!is_trusted())
+ charcommand("@request System Information: "+.@mg$);
+ else
+ dispbottom(.@mg$);
+ end;
+
+OnSClear:
+ sc_end SC_ALL;
+ sc_end SC_DAILYSENDMAILCNT;
+ dispbottom l("Status Condition Cleared");
+ end;
+
+OnAllPerms:
+ if (@allperms) end;
+ charcommand("@addperm all_skill");
+ charcommand("@addperm all_equipment");
+ charcommand("@addperm skill_unconditional");
+ charcommand("@addperm join_chat");
+ charcommand("@addperm hide_session");
+ charcommand("@addperm any_warp");
+ charcommand("@addperm view_hpmeter");
+ charcommand("@addperm view_equipment");
+ charcommand("@addperm receive_requests");
+ charcommand("@addperm can_trade_bound");
+ charcommand("@addperm bypass_nostorage");
+ @allperms=true;
+ end;
+
+OnInit:
+ registercmd "@debug", "Debug Spell::OnDebug";
+ bindatcmd "getvar", "Debug Spell::OnGetVar", 99, 99, 1;
+ bindatcmd "get-var", "Debug Spell::OnGetVar", 99, 99, 1;
+ bindatcmd "setvar", "Debug Spell::OnSetVar", 99, 99, 1;
+ bindatcmd "set-var", "Debug Spell::OnSetVar", 99, 99, 1;
+ bindatcmd "sclear", "Debug Spell::OnSClear", 99, 99, 1;
+ bindatcmd "allperms", "Debug Spell::OnAllPerms", 99, 100, 1;
+ end;
+}
+
+029-2,30,26,0 script Debug#0 NPC154,{
+ @debug_npc = 1;
+ callfunc "Debug";
+ end;
+OnInit:
+ if (!debug)
+ disablenpc "Debug#0";
+ end;
+}
+
+001-1,53,47,0 script Debug#1 NPC154,{
+ @debug_npc = 1;
+ callfunc "Debug";
+ end;
+OnInit:
+ if (!debug)
+ disablenpc "Debug#1";
+ end;
+}
+
+009-1,45,33,0 script Debug#2 NPC154,{
+ @debug_npc = 1;
+ callfunc "Debug";
+ end;
+OnInit:
+ if (!debug)
+ disablenpc "Debug#2";
+ end;
+}
+
+020-1,75,85,0 script Debug#3 NPC154,{
+ @debug_npc = 1;
+ callfunc "Debug";
+ end;
+OnInit:
+ if (!debug)
+ disablenpc "Debug#3";
+ end;
+}
+
diff --git a/npc/commands/force-rename.txt b/npc/commands/force-rename.txt
new file mode 100644
index 00000000..6535ea22
--- /dev/null
+++ b/npc/commands/force-rename.txt
@@ -0,0 +1,46 @@
+// @charrename/@forcerename atcommand
+// FORCEFULLY renames a char. Collision is handled by SQL.
+//
+// group lv: 80+
+// group char lv: 80+
+// log: True
+//
+// usage: npc/commands/force-rename.txt
+// @charrename New Nickname
+// #forcerename "char" <Nickname>
+//
+
+- script @charrename 32767,{
+ end;
+
+OnRename:
+ // array size validation
+ if (getarraysize(.@atcmd_parameters$) <= 0) {
+ dispbottom("Syntax requires argument between 3 and 30 chars long.");
+ end;
+ }
+ // Set new nickname
+ .@nickname$ += implode(.@atcmd_parameters$, " ");
+ .@nickname$ = strip(.@nickname$);
+ // Empty nickname
+ if (.@nickname$ == "" || .@nickname$ == "NULL")
+ end;
+ // Too long or too short nickname
+ if (getstrlen(.@nickname$) > 30 || getstrlen(.@nickname$) < 3)
+ end;
+ // Attempt to rename. If name is taken, will fail at SQL query
+ dispbottom l("Your nickname has been redefined by GM Team.");
+ .@id=getcharid(3);
+ .@n$=strcharinfo(0);
+ detachrid();
+ kick(.@id, 12); // 12 = Pay changed.
+ sleep(25);
+ query_sql(sprintf("UPDATE `char` SET `name`='%s' WHERE `name`='%s'", escape_sql(.@nickname$), escape_sql(.@n$)));
+ debugmes "[SUCCESS] char %s renamed to %s", .@n$, .@nickname$;
+ end;
+
+OnInit:
+ bindatcmd "charrename", "@charrename::OnRename", 80, 80, 1;
+ bindatcmd "forcerename", "@charrename::OnRename", 80, 80, 1;
+ end;
+}
diff --git a/npc/commands/gm.txt b/npc/commands/gm.txt
new file mode 100644
index 00000000..b402cda8
--- /dev/null
+++ b/npc/commands/gm.txt
@@ -0,0 +1,41 @@
+// @showgm/@hidegm atcommand
+// TEMPORALY hides GM level (or revert it)
+//
+// group lv: 20+
+// group char lv: 99
+// log: False
+//
+// usage:
+// @showgm
+// #showgm "char" <delta>
+//
+
+- script @group 32767,{
+ end;
+
+OnHide:
+ .@gm=getgroupid();
+ if (.@gm < 20) end;
+ if (.@gm % 10 != 0) end;
+ setgroupid(.@gm+1);
+ dispbottom "hidelevel : "+l("Your GM level is now hidden.");
+ end;
+
+OnShow:
+ .@gm=getgroupid();
+ if (.@gm < 20) end;
+ if (.@gm % 10 != 1) end;
+ setgroupid(.@gm-1);
+ dispbottom "showlevel : "+l("Your GM level is now visible.");
+ end;
+
+OnInit:
+ bindatcmd "showgroup", "@group::OnShow", 20, 99, 0;
+ bindatcmd "showgm", "@group::OnShow", 20, 99, 0;
+ bindatcmd "showlevel", "@group::OnShow", 20, 99, 0;
+
+ bindatcmd "hidegroup", "@group::OnHide", 20, 99, 0;
+ bindatcmd "hidegm", "@group::OnHide", 20, 99, 0;
+ bindatcmd "hidelevel", "@group::OnHide", 20, 99, 0;
+ end;
+}
diff --git a/npc/commands/ipcheck.txt b/npc/commands/ipcheck.txt
new file mode 100644
index 00000000..a241d3c0
--- /dev/null
+++ b/npc/commands/ipcheck.txt
@@ -0,0 +1,71 @@
+// TMW2 script
+// Author: Jesusalva <admin@tmw2.org>
+//
+// @ipcheck <player_name>
+// #ipcheck <player_name>
+//
+// Returns user IP
+
+
+- script @ipcheck 32767,{
+ end;
+
+OnCall:
+ if (.@atcmd_numparameters == 0)
+ .@request$ = strcharinfo(0);
+ else
+ .@request$ = implode(.@atcmd_parameters$, " ");
+ dispbottom strip(.@request$)+": IP "+getcharip(.@request$);
+ //dispbottom strcharinfo(0)+": IP "+getcharip(.@request$);
+ end;
+
+OnBan:
+ if (.@atcmd_numparameters == 0) {
+ dispbottom col("Syntax: #ipban <reason>", 1);
+ }
+ // Do not allow banning high-level staff
+ if (is_admin() || is_gm())
+ end;
+ .@target$=strcharinfo(0);
+ .@reason$ = implode(.@atcmd_parameters$, " ");
+ dispbottom col(l("You were permanently banned by the GM Team."), 1);
+ sleep2(200);
+ query_sql "INSERT INTO ipbanlist (list,btime,rtime,reason) VALUES ('"+getcharip(.@target$)+"','"+gettime(7)+"-"+gettime(6)+"-"+gettime(5)+" "+gettime(3)+":"+gettime(2)+":"+gettime(1)+"','2037-01-01 00:00:00','"+.@reason$+"')";
+ logmes("was IP-Blocked, and will not connect again."), LOGMES_ATCOMMAND;
+ sleep2(2000);
+ charcommand("@kick "+.@target$);
+ end;
+
+OnInit:
+ bindatcmd "ipcheck", "@ipcheck::OnCall", 60, 100, 0;
+ bindatcmd "ipban", "@ipcheck::OnBan", 99, 100, 1;
+ end;
+}
+
+// TMW2 script
+// Author: Jesusalva <admin@tmw2.org>
+//
+// @checkidle <player_name>
+// #checkidle <player_name>
+//
+// Returns user idle time in seconds.
+// Useful when the game prohibits warping to player.
+
+
+- script @checkidle 32767,{
+ end;
+
+OnCall:
+ if (.@atcmd_numparameters == 0)
+ .@request$ = strcharinfo(0);
+ else
+ .@request$ = implode(.@atcmd_parameters$, " ");
+ dispbottom strip(.@request$)+" idle time: "+checkidle(.@request$);
+ //dispbottom strcharinfo(0)+": IP "+getcharip(.@request$);
+ end;
+
+OnInit:
+ bindatcmd "checkidle", "@checkidle::OnCall", 60, 80, 0;
+ end;
+}
+
diff --git a/npc/commands/kami.txt b/npc/commands/kami.txt
new file mode 100644
index 00000000..1211fae0
--- /dev/null
+++ b/npc/commands/kami.txt
@@ -0,0 +1,86 @@
+// TMW2 Script
+//
+// @k <message>
+// Broadcast, and broadcast to #world too
+//
+// @servmsg <message>
+// Experimental, uses servicemessage() - requires up to date server
+
+- script @k 32767,{
+ end;
+
+OnCall:
+ .@request$ = strcharinfo(0)+": ";
+ .@request$ += implode(.@atcmd_parameters$, " ");
+ channelmes("#world", .@request$);
+ announce l(.@request$), bc_all|bc_npc;
+ end;
+
+OnServMsg:
+ .@request$ = strcharinfo(0)+": ";
+ .@request$ += implode(.@atcmd_parameters$, " ");
+ // This can be slow, beware
+ .@c = getunits(BL_PC, .@players, MAX_CYCLE_PC);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ message(.@players[.@i], .@request$);
+ }
+ end;
+
+OnBuff:
+ // Disabled command, used for debug purposes
+ .@c = getunits(BL_PC, .@players, MAX_CYCLE_PC);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ attachrid(.@players[.@i]);
+ sc_start SC_INCMHPRATE, 300000, 100;
+ sc_start SC_INCMSPRATE, 300000, 100;
+ sc_start SC_INCFLEERATE, 300000, 100;
+ sc_start SC_INCHITRATE, 300000, 100;
+ sc_start SC_WALKSPEED, 300000, 150;
+ sc_start SC_ATTHASTE_POTION3, 300000, 50;
+ percentheal 100, 100;
+ dispbottom l("YOU WERE BLESSED BY JESUSALVA");
+ dispbottom l("YOU CAN FEEL THE POWER FLOWING TROUGH YOU.");
+ detachrid();
+ }
+ end;
+
+OnInstDestroy:
+ .@request = implode(.@atcmd_parameters$, " ");
+ if (.@request != 0)
+ instance_destroy(.@request);
+ end;
+
+OnInstCheck:
+ .@request$ = implode(.@atcmd_parameters$, " ");
+ dispbottom has_instance2(.@request$);
+ end;
+
+OnInit:
+ bindatcmd "k", "@k::OnCall", 60, 80, 1;
+ bindatcmd "servmsg", "@k::OnServMsg", 80, 99, 1;
+
+ bindatcmd "blessing", "@k::OnBuff", 99, 100, 1;
+ bindatcmd "instcheck", "@k::OnInstCheck", 99, 100, 1;
+ bindatcmd "instdestr", "@k::OnInstDestroy", 99, 100, 1;
+ end;
+}
+
+// kamibroadcast( message{, sender} )
+function script kamibroadcast {
+ .@msg$=getarg(0);
+ .@snd$=getarg(1, "");
+
+ // Send to #world
+ if (.@snd$ == "")
+ channelmes("#world", " "+.@msg$);
+ else
+ channelmes("#world", "[ "+.@snd$+" ] : "+.@msg$);
+
+ // Make an announce
+ if (.@snd$ == "")
+ announce .@msg$, bc_all|bc_npc;
+ else
+ announce .@snd$+" : "+.@msg$, bc_all|bc_npc;
+
+ return;
+}
diff --git a/npc/commands/language.txt b/npc/commands/language.txt
new file mode 100644
index 00000000..ce7122f5
--- /dev/null
+++ b/npc/commands/language.txt
@@ -0,0 +1,60 @@
+// TMW2 Script
+// Author: Jesusalva
+// With code parts from Julia (Evol)
+
+// @lang atcommand
+// Changes Language
+//
+// group lv: 0
+// group char lv: 0
+// log: False
+//
+// usage:
+// @lang
+//
+
+function script CMD_lang {
+ callfunc "checkclientversion";
+ mesq l("Which language do you speak?");
+ next;
+ asklanguage(LANG_IN_SHIP);
+ mes "";
+ mesn;
+ mesq l("Ok, done.");
+ return;
+}
+
+- script @lang 32767,{
+ end;
+
+OnCall:
+ CMD_lang();
+ close;
+
+OnTranslate:
+ // Implode, using a slash at whitespaces
+ .@request$ = implode(.@atcmd_parameters$, "%2F");
+ // No NPC provided?
+ if (.@request$ == "") {
+ dispbottom l("Usage: @translate <npc file>");
+ dispbottom l("Example: @translate Nard");
+ dispbottom l("Example: @translate Elmo");
+ dispbottom l("Example: @translate npc/002-1/arpan");
+ dispbottom l("PS. Doesn't always work. You need an account at %s and to be at ManaPlus Team.", "@@https://www.transifex.com/arctic-games|Transifex@@");
+ end;
+ }
+ // Add .txt extension of needed
+ if (!compare(.@request$, ".txt"))
+ .@request$ += ".txt";
+ // Fix stuff for URL format
+ .@request$ = replacestr(.@request$, "/", "%2F");
+ .@request$ = strtolower(.@request$);
+ // Give your translation link
+ dispbottom "@@https://www.transifex.com/arctic-games/moubootaur-legends/translate/#"+languagecode()+"/serverdata?q=occurrence%3A"+.@request$+"|Translate with Transifex@@";
+ close;
+
+OnInit:
+ bindatcmd "lang", "@lang::OnCall", 0, 60, 0;
+ bindatcmd "translate", "@lang::OnTranslate", 0, 60, 0;
+ end;
+}
diff --git a/npc/commands/numa.txt b/npc/commands/numa.txt
new file mode 100644
index 00000000..3fc544eb
--- /dev/null
+++ b/npc/commands/numa.txt
@@ -0,0 +1,100 @@
+
+- script SuperDebug NPC32767,{
+ 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;
+
+// FIXME
+L_XmasDebug:
+ gmlog strcharinfo(0) + " accessed the Xmas debug.";
+ callfunc "XmasDebug";
+ goto L_close;
+
+// FIXME
+L_HalloweenDebug:
+ gmlog strcharinfo(0) + " accessed the Halloween debug.";
+ callfunc "HalloweenDebug";
+ goto L_close;
+
+// FIXME
+L_EasterDebug:
+ gmlog strcharinfo(0) + " accessed the Easter debug.";
+ callfunc "Easter Debug";
+ goto L_close;
+
+// FIXME
+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 "StoneBoard";
+ goto L_close;
+
+// FIXME?
+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 "GlobalQuestDebug";
+ goto L_close;
+
+L_close:
+ close;
+
+OnInit:
+ registercmd "numa", strnpcinfo(0);
+ registercmd "superdebug", strnpcinfo(0);
+ end;
+}
+
+017-9,39,31,0 duplicate(SuperDebug) Numa NPC393
+
+
diff --git a/npc/commands/python.txt b/npc/commands/python.txt
new file mode 100644
index 00000000..3d198f82
--- /dev/null
+++ b/npc/commands/python.txt
@@ -0,0 +1,27 @@
+// The Mana World script
+// Author: Gumi <gumi@themanaworld.org>
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Stomp stomp stomp (use with caution)
+
+- script @python 32767,{
+ end;
+
+OnCall:
+ specialeffect(69, AREA, playerattached());
+ .@zone$=getmapinfo(MAPINFO_ZONE, .@mapa$);
+ if (.@zone$ == "MMO")
+ end;
+ sc_start SC_CASH_DEATHPENALTY, 1000, 1;
+ addtimer 380, .name$+"::OnKill";
+ end;
+
+OnKill:
+ percentheal -100, -100;
+ //dispbottom l("Oh look, it is Cupid!");
+ end;
+
+OnInit:
+ bindatcmd "python", "@python::OnCall", 60, 60, 1;
+ end;
+}
diff --git a/npc/commands/rate-management.txt b/npc/commands/rate-management.txt
new file mode 100644
index 00000000..273ce9ba
--- /dev/null
+++ b/npc/commands/rate-management.txt
@@ -0,0 +1,231 @@
+// Authors: Gumi, Jesusalva
+- script @exprate 32767,{
+ end;
+
+ function rateCleanUp {
+ stopnpctimer;
+ .hours = 0;
+ .max_hours = 0;
+ .current_rate = .original_exp_rate;
+ setbattleflag("base_exp_rate", .original_exp_rate);
+ setbattleflag("quest_exp_rate", .original_quest_rate);
+ charcommand("@reloadmobdb"); // this is on purpose (callable without RID)
+ charcommand("@reloadquestdb");
+ }
+
+ function remainingTime {
+ .@total_seconds = (3600 * .max_hours);
+ .@seconds_elapsed = (3600 * .hours) + (getnpctimer(0) / 1000);
+ .@seconds_remaining = max(1, .@total_seconds - .@seconds_elapsed);
+ return FuzzyTime(time_from_seconds(.@seconds_remaining), 2, 2);
+ }
+
+OnCall:
+ if (!is_evtc())
+ {
+ end;
+ }
+
+ .@special$ = strip(.@atcmd_parameters$[0]); // special value
+ .@new_rate = min(atoi(.@special$), 1000); // or just a regular integer
+ .@hours = min(0x7FFFFFFE, max(1, atoi(strip(.@atcmd_parameters$[1])))); // number of hours
+
+ if (.@new_rate > 0)
+ {
+ // set new exp rate
+ .hours = 0;
+ .max_hours = .@hours;
+ .current_rate = .@new_rate;
+ setbattleflag("base_exp_rate", .@new_rate);
+ setbattleflag("quest_exp_rate", .@new_rate);
+ charcommand("@reloadmobdb");
+ charcommand("@reloadquestdb");
+ initnpctimer; // start counting
+
+ dispbottom l("You successfully set the exp rate to @@%. It will reset to @@% (default value) in @@.",
+ .@new_rate, .original_exp_rate, FuzzyTime(time_from_hours(.max_hours), 2, 2));
+ dispbottom l("You can also manually stop it at any time with: @exprate default");
+ }
+
+ else if (.@new_rate == 0 && .@special$ == "")
+ {
+ // get current exp rate
+ if (.current_rate == .original_exp_rate)
+ {
+ dispbottom l("Current exp rate is set to @@% (default value).", .current_rate);
+ }
+
+ else
+ {
+ dispbottom l("Current exp rate is set to @@%, and will reset to @@% (default value) in @@.",
+ .current_rate, .original_exp_rate, remainingTime());
+
+ dispbottom l("If you meant to reset the exp rate to its default value: @exprate default");
+ }
+ }
+
+ else
+ {
+ // reset
+ rateCleanUp;
+ dispbottom l("Exp rate has been reset to @@% (default value).",
+ .original_exp_rate);
+ }
+
+ end;
+
+OnTimer3600000:
+ // runs every hour
+ if (++.hours == .max_hours)
+ {
+ rateCleanUp;
+ end;
+ }
+ initnpctimer;
+ end;
+
+OnPCLoginEvent:
+ if (.max_hours > 0)
+ {
+ dispbottom col(l("Exp rate is set to @@% for the next @@.",
+ .current_rate, remainingTime()), 6);
+ }
+ end;
+
+OnInit:
+ bindatcmd "exprate", "@exprate::OnCall", 0, 99, 1; // change exp rate
+
+ // WARNING: using @reloadscript will change the "original" value
+ .original_exp_rate = getbattleflag("base_exp_rate");
+ .original_quest_rate = getbattleflag("quest_exp_rate");
+ .current_rate = .original_exp_rate;
+
+ // XXX: maybe in the future:
+ //.original_job_rate = getbattleflag("base_job_rate");
+ //.original_pk_mode = getbattleflag("pk_mode");
+ //.original_death_penalty = getbattleflag("death_penalty_type");
+ end;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////////
+- script @droprate 32767,{
+ end;
+
+ function dropRateReal {
+ return 100; // getbattleflag("item_rate_common") ?
+ }
+
+ function dropRecalc {
+ .@val=getarg(0);
+ return .@val;
+ }
+
+ function rateCleanUp {
+ stopnpctimer;
+ .hours = 0;
+ .max_hours = 0;
+ .current_rate = getbattleflag("item_rate_common");
+ setbattleflag("item_rate_common", dropRateReal());
+ setbattleflag("item_rate_common_boss", dropRateReal());
+ setbattleflag("item_rate_heal", dropRateReal());
+ setbattleflag("item_rate_heal_boss", dropRateReal());
+ setbattleflag("item_rate_use", dropRateReal());
+ setbattleflag("item_rate_use_boss", dropRateReal());
+ setbattleflag("item_rate_equip", dropRateReal());
+ setbattleflag("item_rate_equip_boss", dropRateReal());
+ setbattleflag("item_rate_card", dropRateReal());
+ setbattleflag("item_rate_card_boss", dropRateReal());
+ charcommand("@reloadmobdb"); // this is on purpose (callable without RID) - no idea what is the purpose
+ channelmes("#world", "The Drop Rate Bonus is now over.");
+ }
+
+ function remainingTime {
+ .@total_seconds = (3600 * .max_hours);
+ .@seconds_elapsed = (3600 * .hours) + (getnpctimer(0) / 1000);
+ .@seconds_remaining = max(1, .@total_seconds - .@seconds_elapsed);
+ return FuzzyTime(time_from_seconds(.@seconds_remaining), 2, 2);
+ }
+
+OnCall:
+ if (!is_evtc()) {
+ end;
+ }
+
+ .@special$ = strip(.@atcmd_parameters$[0]); // special value
+ .@new_rate = min(atoi(.@special$), 1000); // or just a regular integer
+ .@hours = min(0x7FFFFFFE, max(1, atoi(strip(.@atcmd_parameters$[1])))); // number of hours
+
+ if (.@new_rate > 0)
+ {
+ // set new exp rate
+ .hours = 0;
+ .max_hours = .@hours;
+ .current_rate = .@new_rate;
+ setbattleflag("item_rate_common", dropRecalc(.@new_rate));
+ setbattleflag("item_rate_common_boss", dropRecalc(.@new_rate));
+ setbattleflag("item_rate_heal", dropRecalc(.@new_rate));
+ setbattleflag("item_rate_heal_boss", dropRecalc(.@new_rate));
+ setbattleflag("item_rate_use", dropRecalc(.@new_rate));
+ setbattleflag("item_rate_use_boss", dropRecalc(.@new_rate));
+ setbattleflag("item_rate_equip", dropRecalc(.@new_rate));
+ setbattleflag("item_rate_equip_boss", dropRecalc(.@new_rate));
+ setbattleflag("item_rate_card", dropRecalc(.@new_rate));
+ setbattleflag("item_rate_card_boss", dropRecalc(.@new_rate));
+ charcommand("@reloadmobdb");
+ initnpctimer; // start counting
+
+ .@msg$=strcharinfo(0)+" modified drop rates to "+str(.@new_rate)+"%. It will only last "+str(FuzzyTime(time_from_hours(.max_hours), 2, 2))+"!";
+
+ announce .@msg$, bc_all;
+ channelmes("#world", .@msg$);
+
+ //dispbottom l("You successfully set the drop rate to @@%. It will reset to @@% (default value) in @@.",
+ // .@new_rate, dropRateReal(), FuzzyTime(time_from_hours(.max_hours), 2, 2));
+ dispbottom l("You can also manually stop it at any time with: @droprate default");
+ } else if (.@new_rate == 0 && .@special$ == "") {
+ // get current exp rate
+ if (.current_rate == dropRateReal()) {
+ atcommand("@rates");
+ dispbottom col(l("Usage of @exprate without argument is deprecated, please use \"@rates\" instead."), 1);
+ } else {
+ dispbottom l("Current drop rate is set to @@%, and will reset to @@% (default value) in @@.",
+ .current_rate, dropRateReal(), remainingTime());
+ dispbottom l("If you meant to reset the drop rate to its default value: @droprate default");
+ }
+ }
+
+ else
+ {
+ // reset
+ rateCleanUp;
+ dispbottom l("Drop rate has been reset to @@% (default value).",
+ dropRateReal());
+ }
+
+ end;
+
+OnTimer3600000:
+ // runs every hour
+ if (++.hours == .max_hours) {
+ rateCleanUp;
+ end;
+ }
+ initnpctimer;
+ end;
+
+OnPCLoginEvent:
+ if (.max_hours > 0) {
+ dispbottom col(l("Drop rate is set to @@% for the next @@.",
+ .current_rate, remainingTime()), 6);
+ }
+ end;
+
+OnInit:
+ bindatcmd "droprate", "@droprate::OnCall", 80, 80, 1; // change drop rate
+
+ // WARNING: using @reloadscript will change the "original" value, use @reloadbattleconf before!
+ .current_rate = getbattleflag("item_rate_common");
+ //force_refreshall();
+ end;
+}
diff --git a/npc/commands/resync.txt b/npc/commands/resync.txt
new file mode 100644
index 00000000..246bfa88
--- /dev/null
+++ b/npc/commands/resync.txt
@@ -0,0 +1,45 @@
+// TMW2 script
+// Author: Jesusalva <admin@tmw2.org>
+//
+// Introduces @resync
+//
+// It'll cast slide to your own position
+// Hopefully making client update your real position without causing server warning
+//
+// This also introduces @resyncall
+// Which is an alias for @refresh and causes client to reload the whole map,
+// Including yourself and monsters.
+
+- script @resync 32767,{
+ end;
+
+// Soft Resync
+OnCall:
+ if (ispcdead()) {
+ dispbottom l("Impossible to resync: You are dead.");
+ end;
+ }
+ if (@rsync_delay > gettimetick(2)) {
+ dispbottom l("Not resync'ing to prevent flood.");
+ end;
+ }
+ getmapxy(.@m$, .@x, .@y, 0);
+ slide .@x, .@y;
+ @rsync_delay=gettimetick(2)+rand2(3,5);
+ end;
+
+// Hard Resync
+OnCallRefresh:
+ if (@rsync_delay > gettimetick(2)) {
+ dispbottom l("Not resync'ing to prevent flood.");
+ end;
+ }
+ @rsync_delay=gettimetick(2)+rand2(3,5);
+ atcommand("@refresh");
+ end;
+
+OnInit:
+ bindatcmd "resync", "@resync::OnCall", 0, 60, 0;
+ bindatcmd "resyncall", "@resync::OnCallRefresh", 0, 60, 0;
+ end;
+}
diff --git a/npc/commands/scheduled-broadcasts.txt b/npc/commands/scheduled-broadcasts.txt
new file mode 100644
index 00000000..1801663a
--- /dev/null
+++ b/npc/commands/scheduled-broadcasts.txt
@@ -0,0 +1,227 @@
+// Evol Script
+// Authors: Gumi
+function script StoneBoard {
+
+ function setMessage {
+ do
+ {
+ clear;
+ mes l("Please enter the message:");
+ next;
+ input .@msg$;
+ .@msg$ = strip(.@msg$);
+ if (.@msg$ != "") {
+ return .@msg$;
+ }
+ mes l("The message cannot be empty");
+ next;
+ } while (1);
+ }
+
+ function setInterval {
+ clear;
+ mes l("Please select the interval:");
+ next;
+ menuint
+ l("Every 1 hour"), 1,
+ l("Every 3 hours"), 3,
+ l("Every 5 hours"), 5,
+ l("Every 6 hours"), 6,
+ l("Every 12 hours"), 12,
+ l("Every 24 hours"), 24,
+ l("Never (only on login)"), 0;
+
+ return @menuret;
+ }
+
+ function setMaxRep {
+ if (getarg(0,0) == 0) {
+ return 0;
+ }
+ clear;
+ mes l("Repeat how many times?");
+ next;
+ menuint
+ l("Send only once"), 1,
+ l("Send 2 times"), 2,
+ l("Send 3 times"), 3,
+ l("Send 5 times"), 5,
+ l("Send 10 times"), 10,
+ l("Send 20 times"), 20,
+ l("Send indefinitely"), 0;
+
+ return @menuret;
+ }
+
+ function setOnLogin {
+ if (getarg(0,0) == 0)
+ {
+ return 1;
+ }
+ clear;
+ mes l("Send this message also on login?");
+ next;
+ select
+ l("No"),
+ l("Yes");
+
+ return (@menu - 1);
+ }
+
+ function newBroadcast {
+ do
+ {
+ setnpcdialogtitle l("Scheduled broadcasts - Create new");
+
+ // go through all steps
+ .@msg$ = setMessage();
+ .@int = setInterval();
+ .@max = setMaxRep(.@int);
+ .@login = setOnLogin(.@int);
+
+ // recap
+ clear;
+ mes l("Message:");
+ mes "---";
+ mes .@msg$;
+ mes "---";
+ if (.@int)
+ {
+ mes l("Interval: every @@ hour(s)", .@int);
+ mes l("Repeat: @@ times", .@max ? .@max : "∞");
+ mes l("Sent on login: @@", .@login ? l("yes") : l("no"));
+ }
+ else
+ {
+ mes l("Interval: (none, only sent on login)");
+ mes l("Sent on login: yes");
+ }
+
+ next;
+ select
+ menuimage("actions/cancel", l("Discard")),
+ menuimage("actions/edit", l("Start over")),
+ menuimage("actions/test", l("Start broadcasting")),
+ menuimage("actions/test", l("Start broadcasting, and make an extra broadcast right now"));
+
+ switch (@menu)
+ {
+ case 3:
+ case 4:
+ stopnpctimer "@sched";
+ $@SCHED_Opt[0] = .@login;
+ $@SCHED_Opt[1] = .@int;
+ $@SCHED_Opt[2] = 0;
+ $@SCHED_Opt[3] = .@max;
+ $@SCHED_Opt[4] = 0;
+ $@SCHED_Msg$ = .@msg$;
+ if (.@int)
+ {
+ initnpctimer "@sched";
+ }
+ if (@menu == 4)
+ {
+ announce $@SCHED_Msg$, bc_all;
+ }
+ logmes "Scheduled Broadcast: A new broadcast was added", LOGMES_ATCOMMAND;
+ case 1: return;
+ }
+
+ } while(1);
+ }
+
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Scheduled broadcasts");
+ mes l("This menu allows you to set the scheduled broadcast that is sent to all players at a specific interval.");
+ mes "";
+
+ .@a = $@SCHED_Msg$ != ""; // any active broadcast?
+ mes "---";
+ mes .@a ? $@SCHED_Msg$ : "(" + l("no active broadcast") +")";
+ mes "---";
+ if (.@a)
+ {
+ mes l("Sent on login: @@", ($@SCHED_Opt[0] ? l("yes") : l("no")));
+ if ($@SCHED_Opt[1])
+ {
+ .@next = max(1, ((3600000 * ($@SCHED_Opt[1] - $@SCHED_Opt[4])) - getnpctimer(0, "@sched")));
+ mes l("Interval: every @@ hour(s)", $@SCHED_Opt[1]);
+ mes l("Next broadcast: @@", FuzzyTime(time_from_ms(.@next)));
+ }
+ else
+ {
+ mes l("Interval: (none, only sent on login)");
+ mes l("Next broadcast: (never)");
+ }
+ mes l("Sent: @@ times out of @@", $@SCHED_Opt[2], ($@SCHED_Opt[3] ? $@SCHED_Opt[3] : "∞"));
+ }
+ next;
+
+ select
+ menuimage("actions/abort", l("Abort")),
+ rif(.@a, menuimage("actions/test", l("Manually trigger the current broadcast"))),
+ rif(.@a, menuimage("actions/remove", l("Stop broadcasting"))),
+ rif(!(.@a), menuimage("actions/add", l("Set a new broadcast"))),
+ rif(getarg(0,0), menuimage("actions/home", l("Return to Super Menu")));
+
+ switch (@menu)
+ {
+ case 2: announce $@SCHED_Msg$, bc_all; break;
+ case 3: $@SCHED_Msg$ = ""; break;
+ case 4: newBroadcast; break;
+ default: return;
+ }
+ } while (1);
+}
+
+
+
+- script @sched 32767,{
+ end;
+
+OnTimer3600000:
+ if ($@SCHED_Msg$ == "")
+ {
+ stopnpctimer;
+ end;
+ }
+
+ ++$@SCHED_Opt[4]; // increase hours counter
+ if ($@SCHED_Opt[4] == $@SCHED_Opt[1])
+ {
+ stopnpctimer;
+ ++$@SCHED_Opt[2]; // increase total counter
+ announce $@SCHED_Msg$, bc_all;
+ $@SCHED_Opt[4] = 0; // reset hours counter
+ if ($@SCHED_Opt[2] >= $@SCHED_Opt[3] && $@SCHED_Opt[3] > 0)
+ {
+ $@SCHED_Msg$ = ""; // reset message
+ end;
+ }
+ }
+ initnpctimer;
+ end;
+
+OnCall:
+ if (!is_gm())
+ {
+ end;
+ }
+
+ StoneBoard;
+ closedialog;
+ end;
+
+OnInit:
+ bindatcmd "sched", "@sched::OnCall", 80, 99, 1;
+}
+
+function script StoneBoardRead {
+ if ($@SCHED_Opt[0] && $@SCHED_Msg$ != "")
+ {
+ announce $@SCHED_Msg$, bc_self;
+ }
+ return;
+}
diff --git a/npc/commands/warp.txt b/npc/commands/warp.txt
new file mode 100644
index 00000000..ddd0449d
--- /dev/null
+++ b/npc/commands/warp.txt
@@ -0,0 +1,86 @@
+// @w atcommand
+// warps using anchors or map name
+//
+// group lv: 1
+// group char lv: 2
+// log: True
+//
+// usage:
+// @w <map or anchor> [, x [, y]]
+// #w "char" <map or anchor> [, x [, y]]
+//
+// example:
+// @w artis
+// #w "char" artis
+
+- script @w 32767,{
+ end;
+
+OnCall:
+ .@params$ = strtoupper(strip(implode(.@atcmd_parameters$[0], " ")));
+ .@request$ = replacestr(.@params$, " ", "");
+
+ cleararray($@regexmatch$[1], "", 3);
+ if (.@params$ ~= "^(.+) ([0-9]+) ([0-9]+)$")
+ {
+ .@request$ = replacestr(strip($@regexmatch$[1]), " ", "");
+ .@req_x = atoi(strip($@regexmatch$[2]));
+ .@req_y = atoi(strip($@regexmatch$[3]));
+ }
+
+ .@ht = getvariableofnpc(.ht, "__anchors__");
+ .@it = htiterator(.@ht);
+ for (.@key$ = htifirstkey(.@it); hticheck(.@it); .@key$ = htinextkey(.@it))
+ {
+ if (.@request$ ~= .@key$)
+ {
+ sscanf(htget(.@ht, .@key$, ""), "%s %d %d", .@map$, .@x, .@y);
+ break;
+ }
+ }
+ htidelete(.@it);
+
+ .@map$ = .@map$ ? .@map$ : .@request$;
+ .@x = .@req_y ? .@req_x : .@x;
+ .@y = .@req_y ? .@req_y : .@y;
+
+ if (getmapinfo(MAPINFO_ID, .@map$) < 0)
+ {
+ if (getmapinfo(MAPINFO_ID, .@atcmd_parameters$[0]) >= 0)
+ {
+ .@map$ = .@atcmd_parameters$[0];
+ }
+ else
+ {
+ dispbottom(l("Map or anchor not found: %s", .@atcmd_parameters$[0]));
+ end;
+ }
+ }
+
+ while (!checkcell(.@map$, .@x, .@y, cell_chkpass))
+ {
+ // FIXME: this whole cell finding loop is DIRTY!
+ // we should have a command to get a random free coordinate
+ // or we should make buildin_warp silently ignore 0,0
+
+ if (.@e == 50) break; // FIXME: triggers a console warning
+ .@x = rand(20, 20 + (.@e * 5));
+ .@y = rand(20, 20 + (.@e * 5));
+ ++.@e;
+ }
+
+ warp(.@map$, .@x, .@y);
+ end;
+
+OnInit:
+ if (debug) {
+ bindatcmd("w", "@w::OnCall", 0, 20, 0);
+ bindatcmd("go", "@w::OnCall", 0, 20, 0);
+ bindatcmd("to", "@w::OnCall", 0, 20, 0);
+ } else {
+ bindatcmd("w", "@w::OnCall", 20, 60, 1);
+ bindatcmd("go", "@w::OnCall", 20, 60, 1);
+ bindatcmd("to", "@w::OnCall", 20, 60, 1);
+ }
+ end;
+}
diff --git a/npc/dev/ci_test.txt b/npc/dev/ci_test.txt
new file mode 100644
index 00000000..6ee12452
--- /dev/null
+++ b/npc/dev/ci_test.txt
@@ -0,0 +1,47 @@
+//================= Hercules Script =======================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2015 Hercules Dev Team
+//= Copyright (C) 2014 Haru
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Script engine self-tests, CI integration
+//================= Description ===========================================
+//= This script depends on npc/dev/test.txt, and extends it so that it can
+//= be called in a CI environment and returns an appropriate value upon
+//= termination.
+//================= Current Version =======================================
+//= 1.0
+//================= Additional Comments ===================================
+//= This script requires the script_mapquit plugin to be loaded.
+//= Usage: ./map-server --load-plugin script_mapquit --load-script npc/dev/test.txt --load-script npc/dev/ci_test.txt
+//=========================================================================
+
+- script HerculesSelfTestCI FAKE_NPC,{
+ end;
+
+OnInit:
+ .@val = callfunc("HerculesSelfTestHelper");
+ mapquit(.@val);
+ end;
+}
diff --git a/npc/dev/test.txt b/npc/dev/test.txt
new file mode 100644
index 00000000..06b59925
--- /dev/null
+++ b/npc/dev/test.txt
@@ -0,0 +1,814 @@
+//================= Hercules Script =======================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2013-2015 Hercules Dev Team
+//= Copyright (C) 2013-2015 Haru
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//=========================================================================
+//= Script engine self-tests
+//================= Description ===========================================
+//= Script to test operators and possibly other elements of the script
+//= engine, useful for regression testing.
+//================= Current Version =======================================
+//= 2.0
+//=========================================================================
+
+function script F_TestReturnValue {
+ return getarg(0);
+}
+
+function script F_TestScopeVars {
+ .@x = 2;
+ return .@x+1;
+}
+
+function script F_TestNPCVars {
+ .xt = 2;
+ return .xt+1;
+}
+
+function script F_TestDeepNestedScope {
+ if (getarg(0) <= 0)
+ return getarg(1); // Stop recursion
+ if (getarg(1))
+ return callfunc("F_TestDeepNestedScope", getarg(0)-1, getarg(1)); // Recursion step
+ .@x = 1;
+ return callfunc("F_TestDeepNestedScope", getarg(0)-1, .@x); // First step
+}
+
+function script F_TestDeepNestedScopeNPC2 {
+ if (getarg(0) <= 0)
+ return getarg(1); // Stop recursion
+ if (getarg(1))
+ return callfunc("F_TestDeepNestedScopeNPC", getarg(0)-1, getarg(1)); // Recursion step
+ .xt = 1;
+ return callfunc("F_TestDeepNestedScopeNPC", getarg(0)-1, .xt); // First step
+}
+
+function script F_TestDeepNestedScopeNPC {
+ if (getarg(0) <= 0)
+ return getarg(1); // Stop recursion
+ if (getarg(1))
+ return callfunc("F_TestDeepNestedScopeNPC2", getarg(0)-1, getarg(1)); // Recursion step
+ .xt = 1;
+ return callfunc("F_TestDeepNestedScopeNPC2", getarg(0)-1, .xt); // First step
+}
+
+function script F_TestNestedScope {
+ .@x = 1;
+ .@y = callfunc("F_TestReturnValue", .@x);
+ return .@y;
+}
+
+function script F_TestNestedScopeNPC {
+ .xt = 1;
+ .yt = callfunc("F_TestReturnValue", .xt);
+ return .yt;
+}
+
+function script F_TestArrayRefs {
+ return getelementofarray(getarg(0), getarraysize(getarg(0)) - 1);
+}
+
+function script F_TestReturnArrayRef {
+ setarray getarg(0), 5, 6, 7, 8;
+ return getarraysize(getarg(0));
+}
+
+function script F_TestScopeArrays {
+ setarray .@x, 1, 2, 3, 4;
+ copyarray .@y, getarg(0), getarraysize(getarg(0));
+ return getarraysize(.@y);
+}
+
+function script F_TestNPCArrays {
+ setarray .xt, 1, 2, 3, 4;
+ copyarray .yt, getarg(0), getarraysize(getarg(0));
+ return getarraysize(.yt);
+}
+
+function script F_TestVarOfAnotherNPC {
+ return getvariableofnpc(.xt, getarg(0));
+}
+
+- script TestVarOfAnotherNPC FAKE_NPC,{
+ // Used to test getvariableofnpc()
+ end;
+}
+
+function script HerculesSelfTestHelper {
+ if (.once > 0)
+ return .errors;
+ .once = 1;
+ .errors = 0;
+
+ // Callsub (basic)
+ callsub(OnCheck, "Callsub", 1, 1);
+ callsub(OnCheck, "Callsub (getarg default values)", 1);
+
+
+ // Array subscript
+ setarray .@a, 3, 2, 1;
+ callsub(OnCheck, "Array subscript", .@a[2]);
+
+
+ // Increment and decrement operators ++, --
+ .@x = 1;
+ .@y = .@x++; // .@y = .@x; .@x = .@x + 1;
+ callsub(OnCheck, "Suffix increment ++", .@y);
+ callsub(OnCheck, "Suffix increment ++", .@x, 2);
+ .@x = 1;
+ .@y = .@x--; // .@y = .@x; .@x = .@x - 1;
+ callsub(OnCheck, "Suffix decrement --", .@y);
+ callsub(OnCheck, "Suffix decrement --", .@x, 0);
+ .@x = 0;
+ .@y = ++.@x; // .@x = .@x + 1; .@y = .@x;
+ callsub(OnCheck, "Prefix increment ++", .@y);
+ callsub(OnCheck, "Prefix increment ++", .@x);
+ .@x = 2;
+ .@y = --.@x; // .@x = .@x - 1; .@y = .@x;
+ callsub(OnCheck, "Prefix decrement --", .@y);
+ callsub(OnCheck, "Prefix decrement --", .@x);
+
+ // Order of [] and --/++
+ .@a[1] = 0;
+ .@a[1]++; // .@a[1] = .@a[1] + 1;
+ callsub(OnCheck, "Order of [] and ++", .@a[1]);
+ .@a[1] = 2;
+ .@a[1]--; // .@a[1] = .@a[1] - 1;
+ callsub(OnCheck, "Order of [] and --", .@a[1]);
+
+
+ // Unary operators -, !, ~
+ .@x = 1;
+ .@y = -.@x; // .@y = 0 - .@x;
+ callsub(OnCheck, "Unary operator -", .@y, -1);
+ .@x = 1;
+ .@y = !.@x; // if(.@x == 0) .@y = 1; else .@y = 0;
+ callsub(OnCheck, "Unary operator !", .@y, 0);
+ .@x = 0x00000001;
+ .@y = ~.@x; // One's complement of 0x00000001 is 0xfffffffe, which is -2
+ callsub(OnCheck, "Unary operator ~", .@y, -2);
+
+ // Associativity of unary operators -, !, ~
+ .@x = 1;
+ .@y = ~ ! .@x; // .@y = ~(!.@x);
+ callsub(OnCheck, "Associativity of unary ~ and !", .@y, -1);
+ .@x = 0;
+ .@y = - ! .@x; // .@y = -(!.@x);
+ callsub(OnCheck, "Associativity of unary - and !", .@y, -1);
+ .@x = 1;
+ .@y = ~ - .@x; // .@y = ~(-.@x);
+ callsub(OnCheck, "Associativity of unary ~ and -", .@y, 0);
+ .@x = 1;
+ .@y = - ~ .@x; // .@y = -(~.@x);
+ callsub(OnCheck, "Associativity of unary - and ~", .@y, 2);
+
+ // Order of unary -, !, ~ and prefix/suffix ++/--
+ .@x = 2;
+ .@y = - --.@x; // .@y = -(--.@x);
+ callsub(OnCheck, "Order of unary - and prefix --", .@y, -1);
+ callsub(OnCheck, "Order of unary - and prefix --", .@x);
+ .@x = 1;
+ .@y = - .@x--; // .@y = -(.@x--);
+ callsub(OnCheck, "Order of unary - and suffix --", .@y, -1);
+ callsub(OnCheck, "Order of unary - and suffix --", .@x, 0);
+ .@x = 0;
+ .@y = - ++.@x; // .@y = -(++.@x);
+ callsub(OnCheck, "Order of unary - and prefix ++", .@y, -1);
+ callsub(OnCheck, "Order of unary - and prefix ++", .@x);
+ .@x = 1;
+ .@y = - .@x++; // .@y = -(.@x++);
+ callsub(OnCheck, "Order of unary - and suffix ++", .@y, -1);
+ callsub(OnCheck, "Order of unary - and suffix ++", .@x, 2);
+ .@x = 1;
+ .@y = !--.@x; // .@y = !(--.@x);
+ callsub(OnCheck, "Order of unary ! and prefix --", .@y);
+ callsub(OnCheck, "Order of unary ! and prefix --", .@x, 0);
+ .@x = 1;
+ .@y = !.@x--; // .@y = !(.@x--);
+ callsub(OnCheck, "Order of unary ! and suffix --", .@y, 0);
+ callsub(OnCheck, "Order of unary ! and suffix --", .@x, 0);
+ .@x = 0;
+ .@y = !++.@x; // .@y = !(++.@x);
+ callsub(OnCheck, "Order of unary ! and prefix ++", .@y, 0);
+ callsub(OnCheck, "Order of unary ! and prefix ++", .@x);
+ .@x = 0;
+ .@y = !.@x++; // .@y = !(.@x++);
+ callsub(OnCheck, "Order of unary ! and suffix ++", .@y);
+ callsub(OnCheck, "Order of unary ! and suffix ++", .@x);
+ .@x = 2;
+ .@y = ~--.@x; // .@y = ~(--.@x);
+ callsub(OnCheck, "Order of unary ~ and prefix --", .@y, -2);
+ callsub(OnCheck, "Order of unary ~ and prefix --", .@x, 1);
+ .@x = 1;
+ .@y = ~.@x--; // .@y = ~(.@x--);
+ callsub(OnCheck, "Order of unary ~ and suffix --", .@y, -2);
+ callsub(OnCheck, "Order of unary ~ and suffix --", .@x, 0);
+ .@x = 0;
+ .@y = ~++.@x; // .@y = ~(++.@x);
+ callsub(OnCheck, "Order of unary ~ and prefix ++", .@y, -2);
+ callsub(OnCheck, "Order of unary ~ and prefix ++", .@x, 1);
+ .@x = 1;
+ .@y = ~.@x++; // .@y = ~(.@x++);
+ callsub(OnCheck, "Order of unary ~ and suffix ++", .@y, -2);
+ callsub(OnCheck, "Order of unary ~ and suffix ++", .@x, 2);
+
+ // Binary *, /, % operators
+ .@x = 2 * 3; // .@x = 6;
+ callsub(OnCheck, "Binary * operator", .@x, 6);
+ .@x = 7 / 2; // .@x = 3;
+ callsub(OnCheck, "Binary / operator", .@x, 3);
+ .@x = 7 % 2; // .@x = 1;
+ callsub(OnCheck, "Binary % operator", .@x, 1);
+
+ // Associativity of *, /, %
+ .@x = 8 * 3 / 2; // .@x = (8 * 3) / 2;
+ callsub(OnCheck, "Associativity of * and /", .@x, 12);
+
+ // Order of binary *%/ and unary !-~
+ .@x = 2 * ! 3; // .@x = 2 * (!3);
+ callsub(OnCheck, "Order of binary * and unary !", .@x, 0);
+ .@x = ~ 1 * 2; // .@x = (~1) * 2;
+ callsub(OnCheck, "Order of unary ~ and binary *", .@x, -4);
+
+
+ // Binary +, - operators
+ .@x = 1 + 3; // .@x = 4;
+ callsub(OnCheck, "Binary + operator", .@x, 4);
+ .@x = 1 - 3; // .@x = -2;
+ callsub(OnCheck, "Binary - operator", .@x, -2);
+
+ // Associativity of +,-
+ .@x = 0x7fffffff - 0x7ffffff0 + 1; // .@x = (0x7fffffff - 0x7ffffff0) + 1; (without overflow)
+ callsub(OnCheck, "Associativity of + and -", .@x, 16);
+
+ // Order of +, - and *, /, %
+ .@x = 1 + 3 * 2; // .@x = 1 + (3 * 2);
+ callsub(OnCheck, "Order of + and *", .@x, 7);
+
+
+ // << and >> operators
+ .@x = 1<<3; // .@x = 1*2*2*2;
+ callsub(OnCheck, "Left shift << operator", .@x, 8);
+ .@x = 12>>2; // .@x = 12/2/2;
+ callsub(OnCheck, "Right shift >> operator", .@x, 3);
+
+ // Associativity of << and >>
+ .@x = 0x40000000 >> 4 << 2; // .@x = (0x40000000 >> 4) << 2
+ callsub(OnCheck, "Associativity of >> and <<", .@x, 0x10000000);
+
+ // Order of <</>> and +/-
+ .@x = 4 << 2 + 1; // .@x = 4 << (2+1);
+ callsub(OnCheck, "Order of << and +", .@x, 32);
+
+
+ // <, <=, >, >= operators
+ .@x = (1 < 2); // true
+ .@y = (2 < 2); // false
+ callsub(OnCheck, "< operator", .@x);
+ callsub(OnCheck, "< operator", .@y, 0);
+ .@x = (1 <= 2); // true
+ .@y = (2 <= 2); // true
+ callsub(OnCheck, "<= operator", .@x);
+ callsub(OnCheck, "<= operator", .@y);
+ .@x = (2 > 1); // true
+ .@y = (2 > 2); // false
+ callsub(OnCheck, "> operator", .@x);
+ callsub(OnCheck, "> operator", .@y, 0);
+ .@x = (2 >= 1); // true
+ .@y = (2 >= 2); // true
+ callsub(OnCheck, ">= operator", .@x);
+ callsub(OnCheck, ">= operator", .@y);
+
+ // Associativity of <,<=,>,>=
+ .@x = 1 > 0 > 0; // (1 > 0) > 0 --> 1 > 0 --> true
+ callsub(OnCheck, "Associativity of > operators", .@x);
+
+ // Order of >>/<< and </<=/>/>=
+ .@x = 1 < 1 << 2; // .@x = 1 < (1<<2);
+ callsub(OnCheck, "Order of < and <<", .@x);
+
+
+ // ==, !=, ~=, ~! operators
+ .@x = (0 == 0); // true
+ .@y = (1 == 0); // false
+ callsub(OnCheck, "== operator", .@x);
+ callsub(OnCheck, "== operator", .@y, 0);
+ .@x = (1 != 0); // true
+ .@y = (1 != 1); // false
+ callsub(OnCheck, "!= operator", .@x);
+ callsub(OnCheck, "!= operator", .@y, 0);
+ .@x$ = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "
+ "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. "
+ "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. "
+ "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+ .@y = (.@x$ ~= "^Lorem.*, ([a-z]*).*(Duis).* ([a-z.]*)$");
+ callsub(OnCheck, "~= operator", .@y, 4);
+ callsub(OnCheck, "~= operator", $@regexmatchcount, 4);
+ if( $@regexmatchcount == 4 ) {
+ callsub(OnCheck, "~= operator", $@regexmatch$[0], .@x$);
+ callsub(OnCheck, "~= operator", $@regexmatch$[1], "quis");
+ callsub(OnCheck, "~= operator", $@regexmatch$[2], "Duis");
+ callsub(OnCheck, "~= operator", $@regexmatch$[3], "laborum.");
+ }
+ .@y = (.@x$ ~! "^Not Lorem.*, ([a-z]*).*(Duis).* ([a-z.]*)$");
+ callsub(OnCheck, "~! operator", .@y);
+
+ // Associativity of ==, !=
+ .@x = (1 == 0 == 0); // (1 == 0) == 0 --> 0 == 0 --> 1
+ .@y = (1 != 0 == 0); // (1 != 0) == 0 --> 1 == 0 --> 0
+ callsub(OnCheck, "Associativity of != and == operators", .@x);
+ callsub(OnCheck, "Associativity of != and == operators", .@y, 0);
+
+ // Order of </<=/>/>= and ==/!=
+ .@x = (1 == 2 > 1); // true
+ .@y = (1 < 2 == 1); // true
+ callsub(OnCheck, "Order of <,>,==", .@x);
+ callsub(OnCheck, "Order of <,>,==", .@y);
+
+
+ .@x$ = "string "
+ "concatenation" /* test */ " succeeded";
+ callsub(OnCheckStr, "String concatenation", .@x$, "string concatenation succeeded");
+
+
+ // Bitwise & operator
+ .@x = (7&4); // 0111 & 0100 --> 0100
+ .@y = (4&1); // 0100 & 0001 --> 0000
+ callsub(OnCheck, "Bitwise & operator", .@x, 4);
+ callsub(OnCheck, "Bitwise & operator", .@y, 0);
+
+ // Order of & and ==/!=
+ .@x = (4 == 7 & 4); // (4 == 7)&4
+ .@y = (1 & 3 != 1); // 1 & (3 != 1)
+ callsub(OnCheck, "Order of ==/!= and &", .@x, 0);
+ callsub(OnCheck, "Order of ==/!= and &", .@y);
+
+
+ // Bitwise ^ operator
+ .@x = (3^1); // 0011 ^ 0001 --> 0010
+ callsub(OnCheck, "Bitwise ^ operator", .@x, 2);
+
+ // Order of ^ and &
+ .@x = (0 & 2 ^ 2); // (0 & 2) ^ 2 --> (0000 & 0010) | 0010 --> 0000 ^ 0010 --> 0010
+ .@y = (2 ^ 2 & 0); // 2 ^ (2 & 0) --> 0010 | (0010 & 0000) --> 0010 ^ 0000 --> 0010
+ callsub(OnCheck, "Order of ^ and &", .@x, 2);
+ callsub(OnCheck, "Order of ^ and &", .@y, 2);
+
+
+ // Bitwise | operator
+ .@x = (3|4); // 0011 | 0100 --> 0111
+ .@y = (4|1); // 0100 | 0001 --> 0101
+ callsub(OnCheck, "Bitwise | operator", .@x, 7);
+ callsub(OnCheck, "Bitwise | operator", .@y, 5);
+
+ // Order of ^ and |
+ .@x = (2 ^ 2 | 2); // (2 ^ 1) | 4 --> (0010 ^ 0010) | 0010 --> 0000 | 0010 --> 0010
+ .@y = (2 | 2 ^ 2); // 4 | (1 ^ 2) --> 0010 | (0010 ^ 0010) --> 0010 | 0000 --> 0010
+ callsub(OnCheck, "Order of | and ^", .@x, 2);
+ callsub(OnCheck, "Order of | and ^", .@y, 2);
+
+
+ // Logical && operator
+ .@x = (1 && 1); // true
+ .@y = (0 && 1); // false
+ callsub(OnCheck, "Logical && operator", .@x);
+ callsub(OnCheck, "Logical && operator", .@y, 0);
+
+ // Associativity of && and short-circuit
+ .@x = 0;
+ .@y = (1 && 0 && (.@x = 1)); // should short circuit as false before evaluating the assignment
+ //FIXME callsub(OnCheck, "Short-circuit of &&", .@x, 0);
+ callsub(OnCheck, "Associativity of &&", .@y, 0);
+
+ // Order of bitwise | and logical &&
+ .@x = (1 && 0 | 4); // 1 && (0|4)
+ .@y = (4 | 0 && 1); // (4|0) && 1
+ callsub(OnCheck, "Order of && and |", .@x);
+ callsub(OnCheck, "Order of && and |", .@y);
+
+
+ // Logical || operator
+ .@x = (1 || 1); // true
+ .@y = (0 || 1); // true
+ callsub(OnCheck, "Logical || operator", .@x);
+ callsub(OnCheck, "Logical || operator", .@y);
+
+ // Associativity of || and short-circuit
+ .@x = 0;
+ .@y = (1 || 0 || (.@x = 1)); // should short circuit as true before evaluating the assignment
+ //FIXME callsub(OnCheck, "Short-circuit of ||", .@x, 0);
+ callsub(OnCheck, "Associativity of ||", .@y);
+
+ // Order of logical && and ||
+ .@x = (0 && 1 || 1); // (0 && 1) || 1
+ .@y = (1 || 1 && 0); // 1 || (1 && 0)
+ callsub(OnCheck, "Order of && and ||", .@x);
+ callsub(OnCheck, "Order of && and ||", .@y);
+
+ // Ternary conditional operator ?:
+ .@x = (1 ? 2 : 3); // 2
+ .@y = (0 ? 2 : 3); // 3
+ callsub(OnCheck, "Ternary conditional operator", .@x, 2);
+ callsub(OnCheck, "Ternary conditional operator", .@y, 3);
+
+ // Associativity of ?:
+ .@x = (1 ? 2 : 0 ? 3 : 4);
+ .@y = (1 ? 1 ? 2 : 3 : 5);
+ callsub(OnCheck, "Associativity of ?:", .@x, 2);
+ callsub(OnCheck, "Associativity of ?:", .@y, 2);
+
+ // Order of logical || and ternary ?:
+ .@x = (1 ? 0 : 0 || 1); // 1 ? 0 : (0 || 1) --> false
+ callsub(OnCheck, "Order of || and ?:", .@x, 0);
+
+
+ // Assignment operators
+ .@x = 1;
+ callsub(OnCheck, "Direct assignment operator =", .@x);
+ .@x += 7; // 1 + 7
+ callsub(OnCheck, "Assignment by sum +=", .@x, 8);
+ .@x -= 1; // 8 - 1
+ callsub(OnCheck, "Assignment by difference -=", .@x, 7);
+ .@x *= 2; // 7 * 2
+ callsub(OnCheck, "Assignment by product *=", .@x, 14);
+ .@x /= 2; // 14 / 2
+ callsub(OnCheck, "Assignment by quotient /=", .@x, 7);
+ .@x %= 4; // 7 % 4
+ callsub(OnCheck, "Assignment by remainder %=", .@x, 3);
+ .@x <<= 2; // 3 << 2
+ callsub(OnCheck, "Assignment by bitwise left shift <<=", .@x, 12);
+ .@x >>= 1; // 12 >> 1
+ callsub(OnCheck, "Assignment by bitwise right shift >>=", .@x, 6);
+ .@x &= 5; // 6 & 5 (0110 & 0101 --> 0100)
+ callsub(OnCheck, "Assignment by bitwise and &=", .@x, 4);
+ .@x ^= 5; // 4 ^ 5 (0100 ^ 0101 --> 0001)
+ callsub(OnCheck, "Assignment by bitwise xor ^=", .@x, 1);
+ .@x |= 2; // 1 | 2 (0001 | 0010 --> 0011)
+ callsub(OnCheck, "Assignment by bitwise or |=", .@x, 3);
+
+ // Associativity of assignment operators
+ .@x = 0; .@y = 0;
+ .@x = .@y = 1;
+ callsub(OnCheck, "Associativity of =", .@x);
+ callsub(OnCheck, "Associativity of =", .@y);
+ .@x = 0; .@y = 1;
+ .@x = .@y += 4;
+ callsub(OnCheck, "Associativity of = and +=", .@x, 5);
+ callsub(OnCheck, "Associativity of = and +=", .@y, 5);
+ .@x = 5; .@y = 3;
+ .@z = 8;
+ .@x *= .@y += 1;
+ callsub(OnCheck, "Associativity of *= and +=", .@x, 20);
+ callsub(OnCheck, "Associativity of *= and +=", .@y, 4);
+
+ .@x = 1; .@y = 3;
+ .@x += .@y * 10;
+ callsub(OnCheck, "Order of += and *", .@x, 31);
+ .@x = 1; .@y = 3;
+ .@x = .@y != 3 ? .@y = 2 : 4;
+ callsub(OnCheck, "Order of = and ?:", .@x, 4);
+ // FIXME callsub(OnCheck, "Short-circuit of ?:", .@y, 3);
+
+ .@x = 0;
+ if (0)
+ if (1)
+ .@x = 2;
+ else
+ .@x = 3;
+ callsub(OnCheck, "Dangling else", .@x, 0);
+
+
+ // Array operations
+ .@x[0] = 1;
+ callsub(OnCheck, "Array size (single value)", getarraysize(.@x), 1);
+ .@x[0] = 0;
+ callsub(OnCheck, "Array size (single value removal)", getarraysize(.@x), 0);
+
+ .@x[0] = 1;
+ .@x[1] = 2;
+ .@x[2] = 3;
+ .@x[5] = 4;
+ .@x[8] = 5;
+ .@x[9] = 0;
+ setarray .@y[0], 1, 2, 3, 0, 0, 4, 0, 0, 5;
+ callsub(OnCheck, "Array size (assignment)", getarraysize(.@x), 9);
+ callsub(OnCheck, "Array size (setarray)", getarraysize(.@y), 9);
+ for (.@i = 0; .@i < 10; ++.@i) {
+ callsub(OnCheck, "Array subscript and setarray [" + .@i + "]", .@x[.@i], .@y[.@i]);
+ }
+
+ cleararray .@x[1], 8, 6;
+ callsub(OnCheck, "cleararray (value) [0]", .@x[0], 1);
+ for (.@i = 1; .@i < 7; ++.@i) {
+ callsub(OnCheck, "cleararray (value) [" + .@i + "]", .@x[.@i], 8);
+ }
+ callsub(OnCheck, "cleararray (value) [7]", .@x[7], 0);
+ callsub(OnCheck, "cleararray (value) [8]", .@x[8], 5);
+ callsub(OnCheck, "cleararray (value) [9]", .@x[9], 0);
+
+ cleararray .@x, 0, getarraysize(.@x);
+ cleararray .@y, 0, getarraysize(.@y);
+ callsub(OnCheck, "cleararray and getarraysize", getarraysize(.@x), 0);
+ for (.@i = 0; .@i < 10; ++.@i) {
+ callsub(OnCheck, "cleararray (zero) [" + .@i + "]", .@x[.@i], 0);
+ }
+
+ cleararray .@x, 0, getarraysize(.@x);
+ setarray .@x[1], 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ deletearray .@x;
+ callsub(OnCheck, "deletearray (clear) and getarraysize", getarraysize(.@x), 0);
+ for (.@i = 0; .@i < 18; ++.@i) {
+ callsub(OnCheck, "deletearray (clear) [" + .@i + "]", .@x[.@i], 0);
+ }
+
+ deletearray .@x;
+ deletearray .@y;
+ setarray .@x[1], 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 0, 13, 14, 15, 16;
+ setarray .@y, 0, 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ deletearray .@x[9], 1;
+ callsub(OnCheck, "deletearray (single) and getarraysize", getarraysize(.@x), 16);
+ for (.@i = 0; .@i < 18; ++.@i) {
+ callsub(OnCheck, "deletearray (single) [" + .@i + "]", .@x[.@i], .@y[.@i]);
+ }
+
+ deletearray .@x;
+ deletearray .@y;
+ setarray .@x[1], 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ setarray .@y, 0, 1, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ deletearray .@x[2], 4;
+ callsub(OnCheck, "deletearray (multiple) and getarraysize", getarraysize(.@x), 12);
+ for (.@i = 0; .@i < 18; ++.@i) {
+ callsub(OnCheck, "deletearray (multiple) [" + .@i + "]", .@x[.@i], .@y[.@i]);
+ }
+
+ deletearray .@x;
+ deletearray .@y;
+ setarray .@x[1], 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ setarray .@y, 0, 1;
+ deletearray .@x[2], 1000;
+ callsub(OnCheck, "deletearray (large count) and getarraysize", getarraysize(.@x), 2);
+ for (.@i = 0; .@i < 18; ++.@i) {
+ callsub(OnCheck, "deletearray (large count) [" + .@i + "]", .@x[.@i], .@y[.@i]);
+ }
+
+ deletearray .@x;
+ deletearray .@y;
+ setarray .@x[1], 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0, 13, 14, 15, 16;
+ setarray .@y, 0, 1;
+ deletearray .@x[2];
+ callsub(OnCheck, "deletearray (truncate) and getarraysize", getarraysize(.@x), 2);
+ for (.@i = 0; .@i < 18; ++.@i) {
+ callsub(OnCheck, "deletearray (truncate) [" + .@i + "]", .@x[.@i], .@y[.@i]);
+ }
+
+ deletearray .@x;
+ .@x[1] = 2;
+ .@x[65536] = 1;
+ callsub(OnCheck, "large array index", .@x[65536], 1);
+ callsub(OnCheck, "large array index and getarraysize", getarraysize(.@x), 65537);
+ .@x[65536] = 0;
+ callsub(OnCheck, "large array index (shrink)", .@x[65536], 0);
+ callsub(OnCheck, "large array index and getarraysize (shrink)", getarraysize(.@x), 2);
+ .@x[1] = 0;
+ callsub(OnCheck, "array shrink", .@x[1], 0);
+ callsub(OnCheck, "array shrink and getarraysize", getarraysize(.@x), 0);
+
+ // min and max
+ callsub(OnCheck, "min()", min(5, -10, 8, 3, -2, 1000), -10);
+ callsub(OnCheck, "max()", max(5, -10, 8, 3, -2, 1000), 1000);
+
+
+ // Constants
+ callsub(OnCheck, "'true' constant", true, 1);
+ callsub(OnCheck, "'false' constant", false, 0);
+ callsub(OnCheck, "'Piou' mob ID", Maggot, 1002);
+ callsub(OnCheck, "'NV_BASIC' skill ID", NV_BASIC, 1);
+ callsub(OnCheck, "'Acorn' item ID", Acorn, 743);
+ callsub(OnCheck, "'CactusDrink' item ID", CactusDrink, 501);
+
+
+ // setd/getd
+ .@x = 1; .@x$ = ".@x";
+ callsub(OnCheck, "getd", getd(".@x"), 1);
+ callsub(OnCheck, "getd arguments", getd(.@x$), 1);
+ .@y = 0; .@y$ = ".@y";
+ setd(".@y", .@x);
+ callsub(OnCheck, "setd", .@y, 1);
+ setd(.@y$, 2);
+ callsub(OnCheck, "setd arguments", .@y, 2);
+ set getd(".@x"), getd(".@y");
+ callsub(OnCheck, "set getd", .@x, .@y);
+ .@y = 1;
+ setd(".@x", getd(".@y"));
+ callsub(OnCheck, "setd getd", .@x, .@y);
+
+ // getvariableofnpc
+ .xt = 2;
+ set getvariableofnpc(.xt, "TestVarOfAnotherNPC"), 1;
+ callsub(OnCheck, "Setting NPC variables of another NPC", getvariableofnpc(.xt, "TestVarOfAnotherNPC"), 1);
+ callsub(OnCheck, "Setting NPC variables of another NPC (local variable overwrite check)", .xt, 2);
+
+ // Callsub (advanced)
+ callsub(OnCheck, "Callsub return value", callsub(OnTestReturnValue, 1));
+ .@x = 1;
+ callsub(OnCheck, "Callsub return with scope variables", callsub(OnTestScopeVars), 3);
+ callsub(OnCheck, "Callsub (parent scope vars isolation)", .@x, 1);
+ callsub(OnCheck, "Callsub (nested scopes)", callsub(OnTestNestedScope), 1);
+ callsub(OnCheck, "Callsub (deeply nested scopes)", callsub(OnTestDeepNestedScope, 30, 0), 1);
+ .@x = 1;
+ .@y = callsub(OnSetReference, .@x);
+ callsub(OnCheck, "Callsub (setting references)", .@y, 2);
+ callsub(OnCheck, "Callsub (setting references)", .@x, 2);
+ deletearray .@x;
+ setarray .@x, 1, 2, 3, 4;
+ callsub(OnCheck, "Callsub (array references)", callsub(OnTestArrayRefs, .@x), 4);
+ deletearray .@x;
+ .@y = callsub(OnTestReturnArrayRef, .@x);
+ callsub(OnCheck, "Callsub return array references (size check)", getarraysize(.@x), .@y);
+ callsub(OnCheck, "Callsub return array references", getelementofarray(.@x, 3), 8);
+ deletearray .@x;
+ deletearray .@y;
+ setarray .@x, 1, 2;
+ .@z = getarraysize(.@x);
+ setarray .@y, 5, 6, 7, 8, 9;
+ callsub(OnCheck, "Callsub (copyarray from reference with the same name)", getarraysize(.@y), callsub(OnTestScopeArrays, .@y));
+ callsub(OnCheck, "Callsub (parent array vars isolation)", getarraysize(.@x), .@z);
+ deletearray .@x;
+ deletearray .@y;
+ .xt = 2;
+ set getvariableofnpc(.xt, "TestVarOfAnotherNPC"), 1;
+ callsub(OnCheck, "Callsub (return NPC variables from another NPC)", callsub(OnTestVarOfAnotherNPC, "TestVarOfAnotherNPC"), 1);
+ callsub(OnCheck, "Callsub (return NPC variables from another NPC - local variable overwrite check)", .xt, 2);
+
+ // Callfunc
+ callsub(OnCheck, "Callfunc return value", callfunc("F_TestReturnValue", 1));
+ .@x = 1;
+ callsub(OnCheck, "Callfunc return with scope variables", callfunc("F_TestScopeVars"), 3);
+ callsub(OnCheck, "Callfunc (parent scope vars isolation)", .@x, 1);
+ callsub(OnCheck, "Callfunc (nested scopes)", callfunc("F_TestNestedScope"), 1);
+ callsub(OnCheck, "Callfunc (deeply nested scopes)", callfunc("F_TestDeepNestedScope", 30, 0), 1);
+ deletearray .@x;
+ setarray .@x, 1, 2, 3, 4;
+ callsub(OnCheck, "Callfunc (array references)", callfunc("F_TestArrayRefs", .@x), 4);
+ deletearray .@x;
+ .@y = callfunc("F_TestReturnArrayRef", .@x);
+ callsub(OnCheck, "Callfunc return array references (size check)", getarraysize(.@x), .@y);
+ callsub(OnCheck, "Callfunc return array references", getelementofarray(.@x, 3), 8);
+ deletearray .@x;
+ deletearray .@y;
+ setarray .@x, 1, 2;
+ .@z = getarraysize(.@x);
+ setarray .@y, 5, 6, 7, 8, 9;
+ callsub(OnCheck, "Callfunc (copyarray from reference with the same name)", getarraysize(.@y), callfunc("F_TestScopeArrays", .@y));
+ callsub(OnCheck, "Callfunc (parent array vars isolation)", getarraysize(.@x), .@z);
+ deletearray .@x;
+ deletearray .@y;
+ .xt = 1;
+ callsub(OnCheck, "Callfunc return with NPC variables", callfunc("F_TestNPCVars"), 3);
+ callsub(OnCheck, "Callfunc (parent NPC vars isolation)", .xt, 1);
+ callsub(OnCheck, "Callfunc (nested scopes and NPC variables)", callfunc("F_TestNestedScopeNPC"), 1);
+ callsub(OnCheck, "Callfunc (deeply nested scopes and NPC variables)", callfunc("F_TestDeepNestedScopeNPC", 30, 0), 1);
+ deletearray .xt;
+ setarray .xt, 1, 2, 3, 4;
+ callsub(OnCheck, "Callfunc (array references and NPC variables)", callfunc("F_TestArrayRefs", .xt), 4);
+ deletearray .xt;
+ .yt = callfunc("F_TestReturnArrayRef", .xt);
+ callsub(OnCheck, "Callfunc return array references with NPC variables (size check)", getarraysize(.xt), .yt);
+ callsub(OnCheck, "Callfunc return array references wuth NPC variables", getelementofarray(.xt, 3), 8);
+ deletearray .xt;
+ deletearray .yt;
+ setarray .xt, 1, 2;
+ .@z = getarraysize(.@x);
+ setarray .yt, 5, 6, 7, 8, 9;
+ callsub(OnCheck, "Callfunc (copyarray from NPC variable reference with the same name)", getarraysize(.@y), callfunc("F_TestNPCArrays", .@y));
+ callsub(OnCheck, "Callfunc (parent array NPC vars isolation)", getarraysize(.@x), .@z);
+ deletearray .xt;
+ deletearray .yt;
+ .xt = 2;
+ set getvariableofnpc(.xt, "TestVarOfAnotherNPC"), 1;
+ callsub(OnCheck, "Callfunc (return NPC variables from another NPC)", callfunc("F_TestVarOfAnotherNPC", "TestVarOfAnotherNPC"), 1);
+ callsub(OnCheck, "Callfunc (return NPC variables from another NPC - local variable overwrite check)", .xt, 2);
+
+ callsub(OnCheckStr, "sprintf (%%)", sprintf("'%%'"), "'%'");
+ callsub(OnCheckStr, "sprintf (%d)", sprintf("'%d'", 5), "'5'");
+ callsub(OnCheckStr, "sprintf (neg. %d)", sprintf("'%d'", -5), "'-5'");
+ callsub(OnCheckStr, "sprintf (%u)", sprintf("'%u'", 5), "'5'");
+ callsub(OnCheckStr, "sprintf (%x)", sprintf("'%x'", 10), "'a'");
+ callsub(OnCheckStr, "sprintf (%X)", sprintf("'%X'", 31), "'1F'");
+ callsub(OnCheckStr, "sprintf (%s)", sprintf("'%s'", "Hello World!"), "'Hello World!'");
+ callsub(OnCheckStr, "sprintf (%c)", sprintf("'%c'", "Hello World!"), "'H'");
+ callsub(OnCheckStr, "sprintf (%+d)", sprintf("'%+d'", 5), "'+5'");
+ callsub(OnCheckStr, "sprintf (%{n}d)", sprintf("'%5d'", 5), "' 5'");
+ callsub(OnCheckStr, "sprintf (%-{n}d)", sprintf("'%-5d'", 5), "'5 '");
+ callsub(OnCheckStr, "sprintf (%-+{n}d)", sprintf("'%-+5d'", 5), "'+5 '");
+ callsub(OnCheckStr, "sprintf (%+0{n}d)", sprintf("'%+05d'", 5), "'+0005'");
+ callsub(OnCheckStr, "sprintf (%0*d)", sprintf("'%0*d'", 5, 10), "'00010'");
+ callsub(OnCheckStr, "sprintf (Two args)", sprintf("'%+05d' '%x'", 5, 0x7f), "'+0005' '7f'");
+ callsub(OnCheckStr, "sprintf (positional)", sprintf("'%2$+05d'", 5, 6), "'+0006'");
+ callsub(OnCheckStr, "sprintf (positional)", sprintf("'%2$s' '%1$c'", "First", "Second"), "'Second' 'F'");
+
+ if (.errors) {
+ consolemes(CONSOLEMES_DEBUG, "Script engine self-test [ \033[0;31mFAILED\033[0m ]");
+ consolemes(CONSOLEMES_ERROR, "**** The test was completed with " + .errors + " errors. ****");
+ } else {
+ consolemes(CONSOLEMES_DEBUG, "Script engine self-test [ \033[0;32mPASSED\033[0m ]");
+ }
+ return .errors;
+ end;
+
+OnTestReturnValue:
+ return getarg(0);
+
+OnTestScopeVars:
+ .@x = 2;
+ return .@x+1;
+
+OnTestDeepNestedScope:
+ if (getarg(0) <= 0)
+ return getarg(1); // Stop recursion
+ if (getarg(1))
+ return callsub(OnTestDeepNestedScope, getarg(0)-1, getarg(1)); // Recursion step
+ .@x = 1;
+ return callsub(OnTestDeepNestedScope, getarg(0)-1, .@x); // First step
+
+OnTestNestedScope:
+ .@x = 1;
+ .@y = callsub(OnTestReturnValue, .@x);
+ return .@y;
+
+OnTestArrayRefs:
+ return getelementofarray(getarg(0), getarraysize(getarg(0)) - 1);
+
+OnTestReturnArrayRef:
+ setarray getarg(0), 5, 6, 7, 8;
+ return getarraysize(getarg(0));
+
+OnTestScopeArrays:
+ setarray .@x, 1, 2, 3, 4;
+ copyarray .@y, getarg(0), getarraysize(getarg(0));
+ return getarraysize(.@y);
+
+OnTestVarOfAnotherNPC:
+ return getvariableofnpc(.xt, getarg(0));
+
+OnReportError:
+ .@msg$ = getarg(0,"Unknown Error");
+ .@val$ = getarg(1,"");
+ .@ref$ = getarg(2,"");
+ if (.errors == 1)
+ consolemes(CONSOLEMES_ERROR, "**** WARNING: Any self-test results past this point are unreliable because of previous errors. ****");
+ consolemes(CONSOLEMES_ERROR, "Error: "+.@msg$+": '"+.@val$+"' (found) != '"+.@ref$+"' (expected)");
+ ++.errors;
+ //end;
+ return;
+
+OnCheck:
+ .@msg$ = getarg(0,"Unknown Error");
+ .@val = getarg(1,0);
+ .@ref = getarg(2,1);
+ if (.@val != .@ref) {
+ callsub(OnReportError, .@msg$, ""+.@val, ""+.@ref); // String coercion
+ }
+ return;
+OnCheckStr:
+ .@msg$ = getarg(0,"Unknown Error");
+ .@val$ = getarg(1,"");
+ .@ref$ = getarg(2,"");
+ if (.@val$ != .@ref$) {
+ callsub(OnReportError, .@msg$, .@val$, .@ref$);
+ }
+ return;
+OnSetReference:
+ set getarg(0), getarg(0) + 1;
+ return getarg(0);
+}
+
+- script HerculesSelfTest FAKE_NPC,{
+ end;
+
+OnInit:
+ callfunc("HerculesSelfTestHelper");
+ end;
+}
diff --git a/npc/fermi/_import.txt b/npc/fermi/_import.txt
new file mode 100644
index 00000000..9c2eafa4
--- /dev/null
+++ b/npc/fermi/_import.txt
@@ -0,0 +1,3 @@
+// Map fermi: Three Fermi Land
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/fermi/_warps.txt",
diff --git a/npc/fermi/_warps.txt b/npc/fermi/_warps.txt
new file mode 100644
index 00000000..bd877484
--- /dev/null
+++ b/npc/fermi/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map fermi: Three Fermi Land warps
+fermi,29,19,0 warp #fermi_29_19 0,0,000-1,22,22
diff --git a/npc/functions/DyeConfig.txt b/npc/functions/DyeConfig.txt
new file mode 100644
index 00000000..60ab1e75
--- /dev/null
+++ b/npc/functions/DyeConfig.txt
@@ -0,0 +1,41 @@
+009-2,32,105,0 script #DyeChecker NPC32767,{
+ end;
+OnInit:
+ /******************************
+ Config Starts Here
+ ******************************/
+ 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$, "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
+ ******************************/
+
+ $@w = 0;
+ freeloop 1; // do not check for infinity loop
+ callsub S_Array;
+ freeloop 0; // re-enable infinity loop check
+ $@w = 0;
+ $@c = 0;
+ end;
+
+S_Array:
+ if(getitemname($@DYE_items$[$@w]) == "null") goto L_Fail;
+ $@c = 0;
+ callsub S_Color;
+ $@w = $@w + 1;
+ if($@w < getarraysize($@DYE_items$)) goto S_Array;
+ return;
+
+L_Fail:
+ debugmes "Dye Fail: "+$@DYE_items$[$@w];
+ mapexit;
+
+S_Color:
+ if(getitemname($@DYE_colors$[$@c] + $@DYE_items$[$@w]) == "null") goto L_Fail;
+ $@c = $@c + 1;
+ if($@c < getarraysize($@DYE_colors$)) goto S_Color;
+ return;
+}
diff --git a/npc/functions/alchemy.txt b/npc/functions/alchemy.txt
new file mode 100644
index 00000000..ea77011e
--- /dev/null
+++ b/npc/functions/alchemy.txt
@@ -0,0 +1,91 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// Description:
+// Alchemy System (oversimplified)
+
+// Usage: AlchemySystem ()
+// Returns true on success, false on failure
+function script AlchemySystem {
+ .success=false;
+
+ setskin "craft2";
+ .@var$ = requestcraft(2);
+ .@craft = initcraft(.@var$);
+ .@entry = findcraftentry(.@craft, CRAFT_ALCHEMY);
+ if (debug || $@GM_OVERRIDE) mes "found craft entry: " + .@entry;
+ if (.@entry < 0) {
+ .success=false;
+ } else {
+ // Determine how many units to make
+ // This code comes from Moubootaur Legends
+ // Where sponsors could make up to 25 units
+ // And you could configure a fixed number to
+ // avoid prompts...
+ // ...
+ // PS. This is not using freeloop()
+ // Max amount is limited for performance.
+ if (GSET_FIXED_ALCHEMY) {
+ .@m=limit(1, GSET_FIXED_ALCHEMY, 25);
+ } else {
+ .@max=(is_trusted() ? 25 : 10);
+ mesc l("How many to brew? (%d-%d)", 1, .@max);
+ input(.@m, 1, .@max);
+ }
+ // Alchemy loop
+ .@i=0;
+ while (.@i < .@m) {
+ .@s=validatecraft(.@craft);
+ // Could not validate (not enough resources)
+ if (!.@s) {
+ mesc l("Insufficient materials to continue."), 1;
+ if (.@i)
+ mesc l("Only %d/%d units were produced.", .@i, .@m), 1;
+ break;
+ }
+ .@s=usecraft(.@craft);
+ .@i++;
+ // Exploiting?!
+ if (!.@s)
+ break;
+ }
+ .success=true;
+ }
+ deletecraft .@craft;
+ setskin "";
+ return .success;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Build the various crafting tables on the world
+001-2,92,76,0 script #AlchemyTable000 NPC_NO_SPRITE,{
+ title l("Alchemy Lab");
+ mes l("This is an alchemy lab.");
+ mes l("With it, you can combine reagents together to create powerful potions.");
+ next;
+ mes b(l("Drag & drop 2 items from your inventory. All items used will be lost."));
+ if (AlchemySystem())
+ mesc l("Success!"), 3;
+ else
+ mesc l("That didn't work!"), 1;
+ close;
+
+OnInit:
+ .distance=2;
+ end;
+}
+
+// Tonori Region (0~99)
+001-2,92,89,0 duplicate(#AlchemyTable000) #AlchemyTable001 NPC_NO_SPRITE
+001-2,98,76,0 duplicate(#AlchemyTable000) #AlchemyTable002 NPC_NO_SPRITE
+001-2,98,89,0 duplicate(#AlchemyTable000) #AlchemyTable003 NPC_NO_SPRITE
+
+// Argaes Region (100~199)
+026-2,35,117,0 duplicate(#AlchemyTable000) #AlchemyTable100 NPC_NO_SPRITE
+
+// Candor Region (200~299)
+029-2,113,57,0 duplicate(#AlchemyTable000) #AlchemyTable200 NPC_NO_SPRITE
+
+
+
+
diff --git a/npc/functions/array.txt b/npc/functions/array.txt
new file mode 100644
index 00000000..d433abd7
--- /dev/null
+++ b/npc/functions/array.txt
@@ -0,0 +1,464 @@
+// Evol Script
+// Author: Gumi
+
+// array_pad(<array>, <size>, <value>)
+// prepend or append <value> until the array is of <size> size
+// returns the amount added on success, or false (0) if nothing changed
+
+function script array_pad {
+ .@index = getarrayindex(getarg(0)); // passed index
+ .@count = getarraysize(getarg(0)) - .@index; // actual size
+ .@size = getarg(1); // desired size
+ .@absolute = (.@size >= 0 ? .@size : -(.@size)); // |size|
+ .@delta = .@absolute - .@count; // amount to fill
+
+ if (.@absolute <= .@count) {
+ return false; // nothing to do
+ }
+
+ if (.@size < 0) {
+ copyarray(getelementofarray(getarg(0), .@index + .@delta), getarg(0), .@count); // shift to the right
+ cleararray(getarg(0), getarg(2), .@delta); // prepend
+ } else {
+ cleararray(getelementofarray(getarg(0), .@index + .@count), getarg(2), .@delta); // append
+ }
+
+ return .@delta;
+}
+
+
+
+// array_replace(<array>, <needle>, <replace>{, <neq>})
+// replace every occurence of <needle> with <replace>
+// returns the number of replaced elements
+
+function script array_replace {
+ .@size = getarraysize(getarg(0));
+ .@neq = getarg(3, false);
+ freeloop(true);
+
+ for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) {
+ if ((.@neq && (getelementofarray(getarg(0), .@i) != getarg(1))) ||
+ (!(.@neq) && (getelementofarray(getarg(0), .@i) == getarg(1)))) {
+ set(getelementofarray(getarg(0), .@i), getarg(2));
+ ++.@count;
+ }
+ }
+
+ freeloop(false);
+ return .@count;
+}
+
+
+
+// array_find(<array>, <needle>{, <neq>})
+// return the index of the first occurence of <needle> in <array>
+// if not found it returns -1
+
+function script array_find {
+ .@size = getarraysize(getarg(0));
+ .@neq = getarg(2, false);
+ freeloop(true);
+
+ for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) {
+ if ((.@neq && (getelementofarray(getarg(0), .@i) != getarg(1))) ||
+ (!(.@neq) && (getelementofarray(getarg(0), .@i) == getarg(1)))) {
+ freeloop(false);
+ return .@i;
+ }
+ }
+
+ freeloop(false);
+ return -1;
+}
+
+
+
+// array_rfind(<array>, <needle>{, <neq>})
+// return the index of the last occurence of <needle> in <array>
+// if not found it returns -1
+
+function script array_rfind {
+ .@min = getarrayindex(getarg(0));
+ .@neq = getarg(2, false);
+ freeloop(true);
+
+ for (.@i = (getarraysize(getarg(0)) - 1); .@i >= .@min; --.@i) {
+ if ((.@neq && (getelementofarray(getarg(0), .@i) != getarg(1))) ||
+ (!(.@neq) && (getelementofarray(getarg(0), .@i) == getarg(1)))) {
+ freeloop(false);
+ return .@i;
+ }
+ }
+
+ freeloop(false);
+ return -1;
+}
+
+
+
+// array_exists(<array>, <needle>{, <neq>})
+// return true or false accordingly if <needle> is found in <array>
+
+function script array_exists {
+ return array_find(getarg(0), getarg(1), getarg(2, false)) > -1;
+}
+
+
+
+// array_count(<array>, <needle>{, <neq>})
+// counts the number of occurrence of <needle> in the <array>
+
+function script array_count {
+ .@size = getarraysize(getarg(0));
+ .@neq = getarg(2, false);
+ freeloop(true);
+
+ for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) {
+ if ((.@neq && (getelementofarray(getarg(0), .@i) != getarg(1))) ||
+ (!(.@neq) && (getelementofarray(getarg(0), .@i) == getarg(1)))) {
+ ++.@count;
+ }
+ }
+
+ freeloop(false);
+ return .@count;
+}
+
+
+
+// array_entries(<array>)
+// returns the number of non-empty entries
+
+function script array_entries {
+ if (isstr(getarg(0)) == 1) {
+ return array_count(getarg(0), "", true);
+ }
+ return array_count(getarg(0), 0, true);
+}
+
+
+
+// array_remove(<array>, <needle>{, <neq>})
+// removes every occurrence of <needle> in the <array> while shifting left
+
+function script array_remove {
+ .@size = getarraysize(getarg(0));
+ .@neq = getarg(2, false);
+ freeloop(true);
+
+ for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) {
+ if ((.@neq && (getelementofarray(getarg(0), .@i) != getarg(1))) ||
+ (!(.@neq) && (getelementofarray(getarg(0), .@i) == getarg(1)))) {
+ deletearray(getelementofarray(getarg(0), .@i), 1); // shift left
+ ++.@count; // increase the counter
+ --.@size; // reduce the size
+ --.@i; // step back
+ }
+ }
+
+ freeloop(false);
+ return .@count;
+}
+
+
+
+// array_reverse(<array>)
+// reverses the array
+
+function script array_reverse {
+ .@index = getarrayindex(getarg(0));
+ .@size = getarraysize(getarg(0));
+ freeloop(true);
+
+ for (.@i = .@index; .@i < ((.@size + .@index) / 2); ++.@i) {
+ swap(getelementofarray(getarg(0), .@i), getelementofarray(getarg(0), .@size + .@index - 1 - .@i)); // a <> b
+ }
+
+ freeloop(false);
+ return true;
+}
+
+
+
+// array_sum(<array>)
+// return the sum of every element of the array
+
+function script array_sum {
+ .@size = getarraysize(getarg(0));
+ freeloop(true);
+
+ for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) {
+ .@sum += getelementofarray(getarg(0), .@i);
+ }
+
+ freeloop(false);
+ return .@sum;
+}
+
+
+
+// array_difference(<array>)
+// return the difference of every element of the array
+
+function script array_difference {
+ .@size = getarraysize(getarg(0));
+ freeloop(true);
+
+ for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) {
+ .@diff -= getelementofarray(getarg(0), .@i);
+ }
+
+ freeloop(false);
+ return .@diff;
+}
+
+
+
+// array_shift(<array>)
+// returns the first element of the array and removes it, while shifting left
+
+function script array_shift {
+ if (isstr(getarg(0)) == 1) {
+ .@val$ = getarg(0);
+ } else {
+ .@int = true;
+ .@val = getarg(0);
+ }
+
+ deletearray(getarg(0), 1); // shift left
+
+ return .@int ? .@val : .@val$;
+}
+
+
+
+// array_unshift(<array>, <value>)
+// adds <value> to the start of the array, while shifting right
+// returns the new size
+
+function script array_unshift {
+ .@size = getarraysize(getarg(0)) + 1;
+ array_pad(getarg(0), -(.@size - getarrayindex(getarg(0))), getarg(1));
+ return .@size;
+}
+
+
+
+// array_pop(<array>)
+// returns the last element of the array and removes it
+
+function script array_pop {
+ .@last = getarraysize(getarg(0)) - 1;
+
+ if (isstr(getelementofarray(getarg(0), .@last)) == 1) {
+ .@val$ = getelementofarray(getarg(0), .@last);
+ } else {
+ .@int = true;
+ .@val = getelementofarray(getarg(0), .@last);
+ }
+
+ deletearray(getelementofarray(getarg(0), .@last), 1);
+
+ return .@int ? .@val : .@val$;
+}
+
+
+
+// TODO: Rename to array_append >.<
+// array_push(<array>, <value>)
+// adds <value> to the end of the array
+// returns the new size
+
+function script array_push {
+ .@size = getarraysize(getarg(0));
+ set(getelementofarray(getarg(0), .@size), getarg(1));
+ return .@size + 1;
+}
+
+
+
+// array_shuffle(<array>)
+// shuffles the array
+
+function script array_shuffle {
+ .@index = getarrayindex(getarg(0));
+ .@size = getarraysize(getarg(0)) - .@index;
+ freeloop(true);
+
+ if (isstr(getarg(0)) == 1) {
+ copyarray(.@tmp$[0], getarg(0), .@size);
+ for (; .@size >= 1; --.@size) {
+ set(getelementofarray(getarg(0), .@index + .@size - 1), array_shift(.@tmp$[rand(.@size)]));
+ }
+ } else {
+ copyarray(.@tmp[0], getarg(0), .@size);
+ for (; .@size >= 1; --.@size) {
+ set(getelementofarray(getarg(0), .@index + .@size - 1), array_shift(.@tmp[rand(.@size)]));
+ }
+ }
+
+ freeloop(false);
+ return true;
+}
+
+
+
+// array_unique(<array>{, <threshold>})
+// allows entries to appear up to <threshold> in the array
+
+function script array_unique {
+ .@size = getarraysize(getarg(0));
+ .@max = getarg(1, 1);
+ freeloop(true);
+
+ for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) {
+ .@count = 1;
+ for (.@e = .@i + 1; .@e < .@size; ++.@e) {
+ if (getelementofarray(getarg(0), .@i) == getelementofarray(getarg(0), .@e)) {
+ if (++.@count >= .@max) {
+ deletearray(getelementofarray(getarg(0), .@e), 1);
+ ++.@removed; // increase counter
+ --.@size; // reduce size
+ --.@e; // step back
+ }
+ }
+ }
+ }
+
+ freeloop(false);
+ return .@removed;
+}
+
+
+
+// array_diff(<array1>, <array2>{, <array>...}, <array>)
+// compares array1 against one or more other arrays and fills the last array
+// with the values in array1 that are not present in any of the other arrays
+// returns the number of entries not matching
+
+function script array_diff {
+ .@size = getarraysize(getarg(0));
+ .@index = getarrayindex(getarg(0));
+ freeloop(true);
+
+ for (.@a = 1; .@a < (getargcount() - 1); ++.@a) {
+ for (.@i = .@index; .@i < .@size; ++.@i) {
+ if (!array_exists(getarg(.@a), getelementofarray(getarg(0), .@i))) {
+ array_push(getarg(getargcount() - 1), getelementofarray(getarg(0), .@i));
+ ++.@count;
+ }
+ }
+ }
+
+ freeloop(false);
+ return .@count;
+}
+
+
+
+// array_filter(<array>, "<function>")
+// filters the array using a callback function
+
+function script array_filter {
+ .@size = getarraysize(getarg(0));
+ .@neq = getarg(2, false);
+ freeloop(true);
+
+ for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) {
+ .@eq = callfunc(getarg(1), getelementofarray(getarg(0), .@i)) != false;
+ if ((.@neq && .@eq) || (!(.@neq) && !(.@eq))) {
+ deletearray(getelementofarray(getarg(0), .@i), 1); // shift left
+ ++.@count; // increase the counter
+ --.@size; // reduce the size
+ --.@i; // step back
+ }
+ }
+
+ freeloop(false);
+ return .@count;
+}
+
+// array_highest(<array>)
+// Returns the index of the highest value in <array>
+// NOTE: Array must be an INT array!
+
+function script array_highest {
+ .@size = getarraysize(getarg(0));
+ .@win=0;
+ .@idx=0;
+ .@dw=false;
+ freeloop(true);
+
+ for (.@i = getarrayindex(getarg(0)); .@i < .@size; ++.@i) {
+ if (getelementofarray(getarg(0), .@i) > .@win) {
+ .@win=getelementofarray(getarg(0), .@i);
+ .@idx=.@i;
+ if (.@dw) {
+ deletearray .@draw;
+ .@dw=false;
+ }
+ } else if (getelementofarray(getarg(0), .@i) == .@win) {
+ if (!.@dw)
+ array_push(.@draw, .@idx);
+ array_push(.@draw, .@i);
+ .@dw=true;
+ }
+ }
+
+ // Will we return .@idx or do we need to draw a loot?
+ freeloop(false);
+ if (.@dw)
+ return any_of(.@draw);
+ else
+ return .@idx;
+}
+
+// relative_array_random(<array: 0, {[value, probability]..}>)
+// returns a random entry from the array, by relative probability
+// the first key of the array should be 0 and every entries are a tuple
+// of [value, probability]
+
+function script relative_array_random {
+ .@is_str = getdatatype(getarg(0)) & DATATYPE_STR;
+ .@total_prob = getelementofarray(getarg(0), 0);
+ .@initial_index = getarrayindex(getarg(0));
+ .@initial_index = .@initial_index ? .@initial_index : 1;
+ freeloop(true);
+
+ if (.@total_prob < 1 || getarg(1, false))
+ {
+ // first calculation, or forced re-calculation
+ .@total_prob = 0;
+ .@size = getarraysize(getarg(0));
+
+ for (.@i = .@initial_index + 1; .@i < .@size; .@i += 2) {
+ if (.@is_str) {
+ .@total_prob += max(1, atoi(getelementofarray(getarg(0), .@i)));
+ } else {
+ .@total_prob += max(1, getelementofarray(getarg(0), .@i));
+ }
+ }
+
+ // we cache on the first key
+ set(getelementofarray(getarg(0), 0), .@total_prob);
+ }
+
+ .@target_sum = rand(0, .@total_prob);
+
+ for (.@i = .@initial_index; .@sum < .@target_sum; .@i += 2) {
+ if (.@is_str) {
+ .@sum += atoi(getelementofarray(getarg(0), .@i + 1));
+ } else {
+ .@sum += getelementofarray(getarg(0), .@i + 1);
+ }
+
+ if (.@sum >= .@target_sum) {
+ break;
+ }
+ }
+
+ freeloop(false);
+ return getelementofarray(getarg(0), .@i);
+}
+
diff --git a/npc/functions/asklanguage.txt b/npc/functions/asklanguage.txt
new file mode 100644
index 00000000..32e0f7bc
--- /dev/null
+++ b/npc/functions/asklanguage.txt
@@ -0,0 +1,72 @@
+// TMW2 script
+// Evol functions.
+// Author:
+// Reid, Jesusalva
+// Description:
+// Function setting the player language
+
+function script languagecode {
+ switch (Lang) {
+ case LANG_PTBR:
+ return "pt_BR";
+ case LANG_FR:
+ return "fr";
+ case LANG_DE:
+ return "de";
+ case LANG_ES:
+ return "es";
+ default:
+ return "en";
+ }
+}
+
+function script asklanguage {
+
+ dispbottom col("We need help with translations. [@@help://translate|Learn more@@]", 1);
+ switch (getarg(0, LANG_IN_SHIP))
+ {
+ case LANG_ON_SEA:
+ setarray .@messages$[0], "I hear you... (English)", // English
+ "Eu te ouço... (Português)", // Portuguese
+ "Je vous entends... (Français)", // French
+ "Ich höre euch... (Deutsch)", // German
+ "Te oigo... (Español)"; // Spanish
+ break;
+ case LANG_IN_SHIP:
+ setarray .@messages$[0], "I speak English.", // English
+ "Eu falo Português.", // Portuguese
+ "Je parle français.", // French
+ "Ich spreche Deutsch.", // German
+ "Hablo Español."; // Spanish
+ break;
+ default:
+ return;
+ }
+
+ setarray .@flags$[0], "flags/en",
+ "flags/pt_BR",
+ "flags/fr",
+ "flags/de",
+ "flags/es";
+
+ .@menustr$ = "";
+ .@separator$ = ":";
+
+ for (.@i = 0; .@i <= MAX_LANG; .@i++)
+ {
+ if (.@i == MAX_LANG) {
+ .@separator$ = "";
+ }
+ .@menustr$ = .@menustr$ + .@flags$[.@i] + "|" + .@messages$[.@i] + .@separator$;
+ }
+
+ select(.@menustr$);
+
+ .@lang = @menu - 1;
+
+ if (.@lang >= 0 || .@lang <= MAX_LANG) {
+ Lang = .@lang;
+ }
+
+ return;
+}
diff --git a/npc/functions/banker.txt b/npc/functions/banker.txt
new file mode 100644
index 00000000..5692d238
--- /dev/null
+++ b/npc/functions/banker.txt
@@ -0,0 +1,182 @@
+// Bank scripts
+function script Banking {
+ do
+ {
+ if (BankVault > 0) {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You currently have @@ GP on your bank account.",
+ format_number(BankVault)),
+ l("What do you want to do with your money?");
+ } else {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("What do you want to do with your money?");
+ }
+
+ select
+ rif(Zeny > 0, l("Deposit.")),
+ rif(BankVault > 0, l("Withdraw.")),
+ l("I'm done.");
+
+ switch (@menu)
+ {
+ case 1:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("How much do you want to deposit?");
+
+ menuint
+ l("Other."), -1,
+ rif(Zeny >= 1000, format_number(1000) + " GP."), 1000,
+ rif(Zeny >= 2500, format_number(2500) + " GP."), 2500,
+ rif(Zeny >= 5000, format_number(5000) + " GP."), 5000,
+ rif(Zeny >= 10000, format_number(10000) + " GP."), 10000,
+ rif(Zeny >= 25000, format_number(25000) + " GP."), 25000,
+ rif(Zeny >= 50000, format_number(50000) + " GP."), 50000,
+ rif(Zeny >= 100000, format_number(100000) + " GP."), 100000,
+ l("All of my money."), -2,
+ l("I changed my mind."), -3;
+
+ switch (@menuret) {
+ case -1:
+ input @menuret;
+ break;
+ case -2:
+ @menuret = Zeny;
+ }
+
+ if (@menuret > 0) {
+ if (@menuret > Zeny) {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You do not have enough Gold on yourself.");
+ break;
+ }
+
+ @menuret = min(MAX_BANK_ZENY, @menuret); // make sure the variable can't overflow
+ .@before = BankVault; // amount before the deposit
+ .@max = MAX_BANK_ZENY - BankVault; // maximum possible deposit
+ .@deposit = min(.@max, @menuret); // actual deposit
+
+ if (.@deposit > 0) {
+ BankVault += .@deposit; // add to bank
+ Zeny -= .@deposit; // remove from inventory
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You made a cash deposit of @@ GP.", format_number(.@deposit));
+ }
+ }
+ break;
+
+ case 2:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("How much do you want to withdraw?");
+
+ menuint
+ l("Other."), -1,
+ rif(BankVault >= 1000, format_number(1000) + " GP."), 1000,
+ rif(BankVault >= 2500, format_number(2500) + " GP."), 2500,
+ rif(BankVault >= 5000, format_number(5000) + " GP."), 5000,
+ rif(BankVault >= 10000, format_number(10000) + " GP."), 10000,
+ rif(BankVault >= 25000, format_number(25000) + " GP."), 25000,
+ rif(BankVault >= 50000, format_number(50000) + " GP."), 50000,
+ rif(BankVault >= 100000, format_number(100000) + " GP."), 100000,
+ l("All of my money."), -2,
+ l("I changed my mind."), -3;
+
+ switch (@menuret)
+ {
+ case -1:
+ input @menuret;
+ break;
+ case -2:
+ @menuret = BankVault;
+ }
+
+ if (@menuret > 0) {
+ if (@menuret > BankVault) {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You do not have enough Gold Pieces on your bank account.");
+ break;
+ }
+
+ @menuret = min(MAX_ZENY, @menuret); // make sure the variable can't overflow
+ .@before = Zeny; // amount before the withdrawal
+ .@max = MAX_ZENY - Zeny; // maximum possible withdrawal
+ .@withdrawal = min(.@max, @menuret); // actual withdrawal
+
+ if (.@withdrawal > 0) {
+ Zeny += .@withdrawal; // add to inventory
+ BankVault -= .@withdrawal; // remove from bank
+
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You withdrew a total of @@ GP.", format_number(.@withdrawal));
+ }
+ }
+ break;
+ default: return;
+ }
+ } while (true);
+}
+
+function script Banker {
+ mesn;
+ mes l("\"Welcome to the bank!");
+ mes l("How can I help you?\"");
+ next;
+ do
+ {
+ select
+ l("I would like to store some items."),
+ l("I would like to perform money transactions."),
+ l("Did I received any mail?"),
+ rif(getcharid(2) > 0, l("I would like to open Guild Storage.")),
+ l("Bye.");
+
+ switch (@menu) {
+ case 1:
+ closeclientdialog;
+ openstorage;
+ close;
+ break;
+ case 2:
+ Banking();
+ // Shader quest
+ if (BankVault >= 10000000 &&
+ BaseLevel >= 85 &&
+ getq(General_Banker) < 1) {
+ mesq l("Oh.");
+ next;
+ mesq l("It seems you managed to amass quite a fortune!");
+ next;
+ mesq l("Thank you for using our services. Please accept this little gift.");
+ setq General_Banker, 1;
+ getitem CashiersShade, 1;
+ next;
+ }
+ break;
+ case 3:
+ // NOTE: These values are HARDCODED, do not try changing it!
+ mesc l("Note: Transfering items on mail cost %s GP/item", fnum(2500));
+ mesc l("Money transference will have a %d %% fee as well.", 2);
+ next;
+ closeclientdialog;
+ openmail();
+ close;
+ break;
+ case 4:
+ if (getcharid(3) != getguildinfo(GUILDINFO_MASTER_CID, getcharid(2))) {
+ mesn;
+ mesq l("Only %s is authorized to use the Guild Storage.", getguildinfo(GUILDINFO_MASTER_NAME, getcharid(2)));
+ break;
+ } else {
+ if (guildopenstorage())
+ mesc l("Storage temporarily unavailable, someone else might be using it.");
+ }
+ }
+ if (@menu != 5) {
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT | S_NO_NPC_NAME,
+ l("Something else?");
+ }
+ } while (@menu != 5);
+ closeclientdialog;
+ goodbye;
+ close;
+}
diff --git a/npc/functions/barber.txt b/npc/functions/barber.txt
new file mode 100644
index 00000000..ee1687dc
--- /dev/null
+++ b/npc/functions/barber.txt
@@ -0,0 +1,223 @@
+// Evol scripts.
+// Authors:
+// omatt
+// Reid
+// Travolta
+// Jesusalva
+// Description:
+// Function for supporting barber NPC.
+
+// BarberSayStyle({what})
+// what: 1 = Style; 2 = Color; 3 = Style + Color in dialog
+function script BarberSayStyle {
+
+ .@get_color = getlook(LOOK_HAIR_COLOR);
+ .@get_look = getlook(LOOK_HAIR);
+ .@style_name$ = $@hairstyle$[.@get_look];
+ .@color_name$ = $@haircolor$[.@get_color];
+
+ switch (getarg(0, 3))
+ {
+ case 1:
+ message strcharinfo(0), l("%s", .@style_name$);
+ break;
+ case 2:
+ message strcharinfo(0), l("%s", .@color_name$);
+ break;
+ case 3:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Your hairstyle is @@ and its color is @@.", .@style_name$, .@color_name$);
+ break;
+ }
+ return;
+}
+function script BarberChangeStyle {
+ do
+ {
+ .@hairsizearray = getarraysize($@hairstyle$);
+ .@get_look = getlook(LOOK_HAIR);
+
+ // Here .@i starts from 1 because hairstyle 0 doesn't exist.
+ for (.@i = 1; .@i < .@hairsizearray; .@i++)
+ {
+ .@menustr$ = .@menustr$
+ + rif(.@get_look != .@i, l("" + $@hairstyle$[.@i] + ""))
+ + ":";
+ }
+
+ .@menustr$ = .@menustr$ + l("I'm fine for now, thank you.");
+
+ .@idx = select(l("As you want!"),.@menustr$);
+
+ if (.@idx == .@i + 1) return; // last choice to quit dialog
+
+ switch (@menu)
+ {
+ case 1:
+ do
+ {
+ // here "- 1" because i don't use the 0 of array
+ .@rand_hair = rand(1,(.@hairsizearray - 1));
+ } while (.@rand_hair == getlook(LOOK_HAIR));
+ setlook LOOK_HAIR, .@rand_hair;
+ setlook LOOK_HAIR_COLOR, getlook(LOOK_HAIR_COLOR);
+ BarberSayStyle(1);
+ break;
+ default:
+ // and here "- 1" because the first choice is taken by the random
+ setlook LOOK_HAIR, (@menu - 1);
+ setlook LOOK_HAIR_COLOR, getlook(LOOK_HAIR_COLOR);
+ break;
+ }
+ .@menustr$ = "";
+ } while (1);
+}
+
+function script BarberChangeColor {
+ do
+ {
+ .@get_look = getlook(LOOK_HAIR_COLOR);
+ .@hairsizearray = getarraysize($@haircolor$);
+
+ for (.@i = 0; .@i < .@hairsizearray; .@i++)
+ {
+ .@menustr$ = .@menustr$
+ + rif(.@get_look != .@i, l("" + $@haircolor$[.@i] + ""))
+ + ":";
+ }
+
+ .@menustr$ = l("Surprise me!") + ":" + .@menustr$ + l("I'm fine for now, thank you.");
+
+ .@idx = select(.@menustr$);
+
+ if (.@idx == .@i + 2) return;
+
+ switch (@menu)
+ {
+ case 1:
+ do
+ {
+ .@rand_color = rand(0, .@hairsizearray);
+ } while (.@rand_color == getlook(LOOK_HAIR_COLOR));
+ setlook LOOK_HAIR_COLOR, .@rand_color;
+ BarberSayStyle(2);
+ break;
+ default:
+ setlook LOOK_HAIR_COLOR, (@menu - 2);
+ break;
+ }
+ .@menustr$ = "";
+ } while (1);
+
+ return;
+}
+
+// 3 = Abs (Real value is 1)
+// 2 = Boobs (Real value is 0)
+// 1 = Shirt (Real value is 3)
+function script BarberChangeBodyType {
+ mesn l("Note");
+ mes b(l("Changing your body type will send you back to the character selection screen."));
+ next();
+
+ mes l("Please select the desired body type:");
+ menuint(
+ rif(BodyType == BODYTYPE_3, "â–º ") + l("Body type %s", "A"), BODYTYPE_3,
+ rif(BodyType == BODYTYPE_2, "â–º ") + l("Body type %s", "B"), BODYTYPE_2,
+ rif(BodyType == BODYTYPE_1, "â–º ") + l("Body type %s", "C"), BODYTYPE_1);
+
+ if (BodyType == @menuret) {
+ return; // don't kick to char selection when not needed
+ }
+
+ // FIXME: when manaplus supports seamless changing for evol2, use a simple return;
+ closedialog();
+ close2();
+ BodyType = @menuret;
+ close;
+}
+
+function script BarberChangeRace {
+
+ mes l("What's your race?");
+ mesc l("WARNING: Changing race may have side effects.");
+ menuint
+ l("Talpan"), Talpan,
+ l("Tritan"), Tritan,
+ l("Ifriton"), Ifriton,
+ rif(is_dev(), l("Gispaan")), Gispaan,
+ rif(is_dev(), l("Sparron")), Sparron,
+ rif(countitem(SkeletonCharm), l("Undead")), Skellie;
+
+ mes "";
+
+ // Not needed
+ if (Class == @menuret)
+ return;
+
+ // Change race and we're done
+ //Class = @menuret;
+ jobchange(@menuret); // STUPID idea, but imposed by Hercules
+ return;
+}
+
+// Jack of all trades
+// Barber({intro=True})
+function script Barber {
+ if (getarg(0, true)) {
+ mesn;
+ mesq l("Hello.");
+ next;
+ }
+ mesq l("What would you like me to do?");
+ next;
+ do
+ {
+ select
+ l("What is my current hairstyle and hair color?"),
+ l("I'd like to get a different style."),
+ l("Can you do something with my color?"),
+ l("How about changing my body type?"),
+ rif(BaseLevel > 70, l("I would like to change my species.")),
+ l("I'm fine for now, thank you.");
+
+ switch (@menu)
+ {
+ case 1:
+ BarberSayStyle();
+ break;
+ case 2:
+ BarberChangeStyle();
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Enjoy your new style."),
+ l("Anything else?");
+ break;
+ case 3:
+ BarberChangeColor();
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("I hope you like this color."),
+ l("Anything else?");
+ break;
+ case 4:
+ BarberChangeBodyType();
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("You look fantastic."),
+ l("Anything else?");
+ break;
+ case 5:
+ BarberChangeRace();
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("This service is provided with no warranties on regards of side effects."),
+ l("Anything else?");
+ break;
+ break;
+ case 6:
+ speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
+ l("Feel free to come visit me another time.");
+ goodbye;
+ return;
+ }
+ } while (true);
+ return;
+}
+
diff --git a/npc/functions/bitwise.txt b/npc/functions/bitwise.txt
new file mode 100644
index 00000000..02360662
--- /dev/null
+++ b/npc/functions/bitwise.txt
@@ -0,0 +1,176 @@
+// The Mana World Script
+// Author: Gumi, Jesusalva
+/**
+ * Gets a bitmasked value in from an integer. If the shift is omitted, it will
+ * be deduced from the mask.
+ *
+ * @arg 0 - the variable
+ * @arg 1 - mask
+ * @arg 2 - shift */
+function script bitwise_get {
+ .@shift = getarg(2, 0);
+
+ if (getargcount() < 3) {
+ // guess the shift from the mask:
+ for (.@shift = 0; .@shift < 32; ++.@shift) {
+ if ((getarg(1) & (1 << .@shift)) != 0) {
+ break;
+ }
+ }
+ }
+
+ return (getarg(0) & getarg(1)) >> .@shift;
+}
+
+/**
+ * sets a bitmasked value in a variable
+ *
+ * @arg 0 - the target variable
+ * @arg 1 - mask
+ * @arg 2 - shift
+ * @arg 3 - new value
+ * @return a reference to the variable
+ */
+function script bitwise_set {
+ if (getargcount() < 4) {
+ // guess the shift from the mask:
+ for (.@shift = 0; .@shift < 32; ++.@shift) {
+ if ((getarg(1) & (1 << .@shift)) != 0) {
+ break;
+ }
+ }
+
+ return set(getarg(0), (getarg(0) & ~(getarg(1))) | (getarg(2, 0) << .@shift));
+ }
+
+ return set(getarg(0), (getarg(0) & ~(getarg(1))) | (getarg(3, 0) << getarg(2, 0)));
+}
+
+// bitmask_count(<int>)
+// returns the number of bits set in <int> (up to 4096?)
+function script bitmask_count {
+ .@n = getarg(0); // Number evaluated
+ .@p=0; // Bits set/unset
+ .@s=0; // Stack and Check
+ .@m=0; // Memory
+
+ // Loop only as needed
+ while (.@s < .@n) {
+ .@s=2**.@m;
+ if (.@n & .@s)
+ .@p++;
+ .@m++;
+ }
+ return .@p;
+}
+
+/////////////////////////////////////////////////////////////////////////////////
+// A Nibble can go up to 15. There are 7 nibbles.
+// get_nibble(VAR, NIBBLEID)
+function script get_nibble {
+ .@v=getarg(0);
+ switch (getarg(1)) {
+ case 0:
+ .@s=0; .@m=0xF; break;
+ case 1:
+ .@s=4; .@m=0xF0; break;
+ case 2:
+ .@s=8; .@m=0xF00; break;
+ case 3:
+ .@s=12; .@m=0xF000; break;
+ case 4:
+ .@s=16; .@m=0xF0000; break;
+ case 5:
+ .@s=20; .@m=0xF00000; break;
+ case 6:
+ .@s=24; .@m=0xF000000; break;
+ default:
+ Exception("Invalid Nibble: "+getarg(1), RB_DEFAULT, .@v);
+ }
+
+ return bitwise_get(.@v, .@m, .@s);
+}
+
+// A Byte can go up to 255. There are 3 bytes. The forth can go up to 127.
+// get_nibble(VAR, BYTEID)
+function script get_byte {
+ .@v=getarg(0);
+ switch (getarg(1)) {
+ case 0:
+ .@s=0; .@m=0xFF; break;
+ case 1:
+ .@s=8; .@m=0xFF00; break;
+ case 2:
+ .@s=16; .@m=0xFF0000; break;
+ case 3:
+ .@s=24; .@m=0x7F000000; break;
+ default:
+ Exception("Invalid Byte: "+getarg(1), RB_DEFAULT, .@v);
+ }
+
+ return bitwise_get(.@v, .@m, .@s);
+}
+
+// A Bitword can go up to 65535 and is fixed in position to handle Soul EXP.
+// get_bitword(VAR)
+function script get_bitword {
+ .@v=getarg(0);
+
+ return bitwise_get(.@v, 0xFFFF, 0);
+}
+
+/////////////////////////////////////////////////////////////////////////////////
+// A Nibble can go up to 15. There are 7 nibbles.
+// set_nibble(VAR, NIBBLEID, VAL)
+function script set_nibble {
+ .@v=getarg(0);
+ switch (getarg(1)) {
+ case 0:
+ .@s=0; .@m=0xF; break;
+ case 1:
+ .@s=4; .@m=0xF0; break;
+ case 2:
+ .@s=8; .@m=0xF00; break;
+ case 3:
+ .@s=12; .@m=0xF000; break;
+ case 4:
+ .@s=16; .@m=0xF0000; break;
+ case 5:
+ .@s=20; .@m=0xF00000; break;
+ case 6:
+ .@s=24; .@m=0xF000000; break;
+ default:
+ Exception("Invalid SNibble: "+getarg(1), RB_DEFAULT);
+ }
+
+ return bitwise_set(getarg(0), .@m, .@s, getarg(2));
+}
+
+// A Byte can go up to 255. There are 3 bytes. The forth can go up to 127.
+// set_nibble(VAR, BYTEID, VAL)
+function script set_byte {
+ .@v=getarg(0);
+ switch (getarg(1)) {
+ case 0:
+ .@s=0; .@m=0xFF; break;
+ case 1:
+ .@s=8; .@m=0xFF00; break;
+ case 2:
+ .@s=16; .@m=0xFF0000; break;
+ case 3:
+ .@s=24; .@m=0x7F000000; break;
+ default:
+ Exception("Invalid SByte: "+getarg(1), RB_DEFAULT);
+ }
+
+ return bitwise_set(getarg(0), .@m, .@s, getarg(2));
+}
+
+// A Bitword can go up to 65535 and is fixed in position to handle Soul EXP.
+// set_bitword(VAR, VAL)
+function script set_bitword {
+ .@v=getarg(0);
+
+ return bitwise_set(getarg(0), 0xFFFF, 0, getarg(1));
+}
+
diff --git a/npc/functions/clear_vars.txt b/npc/functions/clear_vars.txt
new file mode 100644
index 00000000..82ac931f
--- /dev/null
+++ b/npc/functions/clear_vars.txt
@@ -0,0 +1,30 @@
+
+function script ClearVariables {
+ if (@login_event != 1) goto L_Deprecated;
+
+ // Remove old variables to new quest system
+ if (QL_VALON) {
+ setq CandorQuest_Valon, QL_VALON;
+ QL_VALON=0;
+ }
+ if (QL_HIDENSEEK) {
+ setq CandorQuest_HideNSeek, (QL_HIDENSEEK >= 64 ? 2 : 1), (QL_HIDENSEEK-1);
+ }
+
+ // Don't ask me what code below does
+ // ----------------------------------
+ /*
+ if (#BankAccount >= 0) return;
+ if (Zeny >= -#BankAccount) {
+ Zeny = Zeny + #BankAccount;
+ #BankAccount = 0;
+ }
+
+ // Partial fix
+ #BankAccount = #BankAccount + Zeny;
+ Zeny = 0;
+ */
+ return;
+}
+
+
diff --git a/npc/functions/confused-tree-dict.txt b/npc/functions/confused-tree-dict.txt
new file mode 100644
index 00000000..e1c0f555
--- /dev/null
+++ b/npc/functions/confused-tree-dict.txt
@@ -0,0 +1,515 @@
+// Evol scripts.
+// Author:
+// gumi
+// rein
+// Based on CrazyTree, originally made by:
+// gumi
+// pclouds
+// veryape
+// wushin
+// Description:
+// dictionaries for confused tree
+
+// Built-in variables:
+// ~t lowercase hot word regex
+// ~n npc name
+// ~p player name or special name
+// ~P player name only
+//
+// Custom variables:
+// {{var}} random from array .D_var$
+// {{^var}} same but capitalize
+// {{+var}} same but title case
+// {{!var}} same but all caps
+// You can also specify multiple variables, separated by a comma (,)
+//
+// Example:
+// "*drops a {{! size }} {{ color }} {{^ sizeable object, someone }} on ~p's head*"
+
+function script TREE_dictionaries {
+ .npc$ = strnpcinfo(0);
+
+ // special aliases below (regex of lowercase char names)
+ // the substitutions are an array separated by backticks (`)
+ // XXX: this could become a hashtable at some point if it gets too big
+
+ setarray(getvariableofnpc(.alias$[0], .npc$),
+ "^veryape(?:gm)?$", "hairyape",
+
+ "^wu-?shin$", "Dwarven Princess`"
+ "She-Ra",
+
+ "^reid$", "Mistress`"
+ "Milady`"
+ "R'eid",
+
+ "^(?:slicer|madcamel)$", "Camel Toe",
+
+ "^4144(?:4d494e)?$", "NPC",
+
+ "^omatt$", "@@https://youtu.be/S2qiZoqH9OY|omatt@@`"
+ "o'matt",
+
+ "^prsm$", "Refractor`"
+ "Overlord");
+ set(getvariableofnpc(.alias, .npc$), getarraysize(getvariableofnpc(.alias$, .npc$)));
+
+
+
+ // special drops below (regex of lowercase char names)
+ // the substitutions are an array of standard replies separated by backticks (`)
+ // and allow {{variables}}
+ // XXX: this could become a hashtable at some point if it gets too big
+
+ setarray(getvariableofnpc(.sdrops$[0], .npc$),
+ "^reid$", "*drops an empty jar of Nutella on ~p*",
+ "^omatt$", "*drops Elisabeth Granneman on ~p*");
+ set(getvariableofnpc(.sdrops, .npc$), getarraysize(getvariableofnpc(.sdrops$, .npc$)));
+
+
+ // variables below
+
+ setarray(getvariableofnpc(.D_size$[1], .npc$), // {{size}}
+ "tiny", 1,
+ "small", 1,
+ "perfectly sized", 1,
+ "large", 1,
+ "huge", 1,
+ "humongous", 1,
+ "ginormous", 1);
+ set(getvariableofnpc(.D_size, .npc$), getarraysize(getvariableofnpc(.D_size$, .npc$)));
+
+ setarray(getvariableofnpc(.D_color$[1], .npc$), // {{color}}
+ "red", 1,
+ "orange", 1,
+ "yellow", 1,
+ "pink", 1,
+ "aqua", 1,
+ "cyan", 1,
+ "blue", 1,
+ "indigo", 1,
+ "violet", 1,
+ "purple", 1,
+ "magenta", 1,
+ "pink", 1,
+ "black", 1,
+ "white", 1,
+ "grey", 1,
+ "greyscale", 1,
+ "brown", 1,
+ "maroon", 1,
+ "turquoise", 1,
+ "lime", 1,
+ "sky blue", 1,
+ "invisible", 1);
+ set(getvariableofnpc(.D_color, .npc$), getarraysize(getvariableofnpc(.D_color$, .npc$)));
+
+ setarray(getvariableofnpc(.D_violentadverb$[1], .npc$), // {{violent adverb}}
+ "violently", 1,
+ "repeatedly", 1,
+ "casually", 1,
+ "forcefully", 1,
+ "slowly", 1,
+ "carefully", 1,
+ "hopefully", 1,
+ "dangerously", 1,
+ "shockingly", 1,
+ "religiously", 1);
+ set(getvariableofnpc(.D_violentadverb, .npc$), getarraysize(getvariableofnpc(.D_violentadverb$, .npc$)));
+
+ setarray(getvariableofnpc(.D_hello$[1], .npc$), // {{hello}}
+ "hi", 4,
+ "hey", 3,
+ "yo", 2,
+ "hello", 10,
+ "howdy", 1,
+ "bonjour", 1);
+ set(getvariableofnpc(.D_hello, .npc$), getarraysize(getvariableofnpc(.D_hello$, .npc$)));
+
+ setarray(getvariableofnpc(.D_violentverb$[1], .npc$), // {{violent verb}}
+ "slaps", 5,
+ "hits", 1,
+ "pummels", 1,
+ "beats", 1,
+ "flattens", 1,
+ "taunts", 1,
+ "liquidates", 1,
+ "spanks", 1,
+ "affronts", 1,
+ "tranquilizes", 1,
+ "atomizes", 1,
+ "impales", 1,
+ "dismembers", 1);
+ set(getvariableofnpc(.D_violentverb, .npc$), getarraysize(getvariableofnpc(.D_violentverb$, .npc$)));
+
+ // FIXME: Is this even used anywhere?
+ setarray(getvariableofnpc(.D_location$[1], .npc$), // {{location}}
+ "Artis", 1,
+ "Hurnscald", 1,
+ "Tulimshar", 1,
+ "Nivalis", 1,
+ "Candor", 1,
+ "Drasil", 1);
+ set(getvariableofnpc(.D_location, .npc$), getarraysize(getvariableofnpc(.D_location$, .npc$)));
+
+ setarray(getvariableofnpc(.D_sizeableobject$[1], .npc$), // {{sizeable object}}
+ "trout", 1,
+ "whale", 1,
+ "space whale", 1,
+ "penguin", 1,
+ "coelacanth", 1,
+ "squid", 1,
+ "shrimp", 1,
+ "crab", 1,
+ "tentacle", 1,
+ "dictionary", 1,
+ "grammar book", 1,
+ "textbook", 1,
+ "dinosaur", 1,
+ "t-rex", 1,
+ "star-nosed mole", 1,
+ "chimpanzee", 1,
+ "mermaid", 1,
+ "merman", 1,
+ "piano", 1,
+ "prince", 1,
+ "princess", 1,
+ "pinkie", 1,
+ "squirrel", 1,
+ "mouboo", 1,
+ "wet mop", 1,
+ "drunken pirate", 1,
+ "cake", 1,
+ "cookie", 1,
+ "chocobo", 1,
+ "restraining order", 1,
+ "freight train", 1,
+ "carnival hammer", 1,
+ "crate", 1,
+ "bomb", 1,
+ "bowl of petinuas", 1,
+ "box", 1,
+ "platypus", 1,
+ "magic eightball", 1,
+ "vase", 1);
+ set(getvariableofnpc(.D_sizeableobject, .npc$), getarraysize(getvariableofnpc(.D_sizeableobject$, .npc$)));
+
+ setarray(getvariableofnpc(.D_nsizeableobject$[1], .npc$), // {{n sizeable object}}
+ "octopus", 1,
+ "elephant", 1,
+ "angry cat", 1,
+ "anvil", 1,
+ "encyclopedia set", 1);
+ set(getvariableofnpc(.D_nsizeableobject, .npc$), getarraysize(getvariableofnpc(.D_nsizeableobject$, .npc$)));
+
+ setarray(getvariableofnpc(.D_someone$[1], .npc$), // {{someone}}
+ "Voldemort", 1,
+ "Cthulhu", 1,
+ "Platyna", 1,
+ "Hitler", 1,
+ "Luvia", 1,
+ "General Krukan", 1,
+ "Borg Queen", 1,
+ "Freeyorp", 1,
+ "MadCamel", 1);
+ set(getvariableofnpc(.D_someone, .npc$), getarraysize(getvariableofnpc(.D_someone$, .npc$)));
+
+ // replies below
+
+ setarray(getvariableofnpc(.greetings$[1], .npc$),
+ "{{^ hello }} ~p!", 4,
+ "{{^ hello }} ~p.", 6,
+ "{{^ hello }} ~p, what's up?", 1,
+ "{{^ hello }} ~p, anything new?", 1,
+ "{{^ hello }} ~p, how are you?", 1,
+ "~p!!!!", 1,
+ "~p!!!", 1,
+ "~p!!", 1,
+ "{{^ hello }} ~p! You are looking lovely today!", 1,
+ "Welcome back, ~p.", 3,
+ "~p is back!!", 1,
+ "Hello and welcome to the Aperture Science computer-aided enrichment center.", 1,
+ "Greetings ~p.", 1,
+ "What's up ~p?", 2,
+ "How are you ~p?", 1);
+ set(getvariableofnpc(.greetings, .npc$), getarraysize(getvariableofnpc(.greetings$, .npc$)));
+
+ setarray(getvariableofnpc(.jokes$[1], .npc$),
+ "How did the tree get drunk? On root beer.", 1,
+ "Do you think I'm lazy?", 1,
+ "I miss CrazyTree %%S.", 1,
+ "I miss LazyTree %%S.", 1,
+ "I'm not telling you!", 1,
+ "*sighs.*", 1,
+ "If I do it for you, then I have to do it for everybody.", 1,
+ "What did the beaver say to the tree? It's been nice gnawing you.", 1,
+ "What did the little tree say to the big tree? Leaf me alone.", 1,
+ "What did the tree wear to the pool party? Swimming trunks.", 1,
+ "What do trees give to their dogs? Treets.", 1,
+ "What do you call a tree that only eats meat? Carniforous.", 1,
+ "What do you call a tree who's always envious? Evergreen.", 1,
+ "What is the tree's least favourite month? Sep-timber!", 1,
+ "What kind of tree can fit into your hand? A palm-tree.", 1,
+ "What was the tree's favorite subject in school? Chemistree.", 1,
+ "Why did the leaf go to the doctor? It was feeling green.", 1,
+ "Why doesn't the tree need sudo? Because it has root.", 1,
+ "Why was the cat afraid of the tree? Because of its bark.", 1,
+ "Why was the tree executed? For treeson.", 1,
+ "How do trees get on the internet? They log in.", 1,
+ "Why did the pine tree get into trouble? Because it was being knotty.", 1,
+ "Did you hear the one about the oak tree? It's a corn-y one!", 1,
+ "What do you call a blonde in a tree with a briefcase? Branch Manager.", 1,
+ "How is an apple like a lawyer? They both look good hanging from a tree.", 1,
+ "Why did the sheriff arrest the tree? Because its leaves rustled.", 1,
+ "I'm too tired, ask someone else.", 1,
+ "If you are trying to get me to tell jokes you are barking up the wrong tree!", 1,
+ "You wooden think they were funny anyhow. Leaf me alone!", 1,
+ "What is brown and sticky? A stick.", 1,
+ "What's the best way to carve wood? Whittle by whittle.", 1,
+ "What did the tree do when the bank closed? It started its own branch.", 1,
+ "Do you want a brief explanation of an acorn? In a nutshell, it’s an oak tree.", 1,
+ "A snare drum and a crash cymbal fell out of a tree. *BA-DUM TSSSHH*", 1,
+ "How do you properly identify a dogwood tree? By the bark!", 1,
+ "Where do saplings go to learn? Elementree school.", 1,
+ "Why do trees make great thieves? Sticky fingers.", 1,
+ "What is green, has leaves, and a trunk? A houseplant going on vacation.", 1,
+ "Where can Adansonia trees go for a quick trim? To the baobarber.", 1,
+ "What looks like half a spruce tree? The other half.", 1,
+ "What do you give to a sick citrus tree? Lemon aid.", 1,
+ "What did the tree say to the drill? You bore me.", 1,
+ "What happened to the wooden car with wooden wheels and a wooden engine? It wooden go.", 1,
+ "How do trees keep you in suspense? I'll tell you tomorrow.", 1,
+ "Where do birch trees keep their valuables? In a river bank.", 1,
+ "What kind of stories do giant sequoia trees tell? Tall tales.", 1,
+ "What is the most frustrating thing about being a tree? Having so many limbs and not being able to walk.", 1,
+ "What's black, highly dangerous, and lives in a tree? A crow with a machine gun.", 1,
+ "What kind of wood doesn't float? Natalie Wood.", 1,
+ "Two men passed a sign while looking for work. It was for tree fellers. They said: “what a shame, there are only two of usâ€.", 1);
+ set(getvariableofnpc(.jokes, .npc$), getarraysize(getvariableofnpc(.jokes$, .npc$)));
+
+ setarray(getvariableofnpc(.healing$[1], .npc$),
+ "Eat an apple, they're good for you.", 1,
+ "If I do it for you, then I have to do it for everybody.", 1,
+ "Oh, go drink a potion or something.", 1,
+ "Whoops! I lost my spellbook.", 1,
+ "No mana.", 1);
+ set(getvariableofnpc(.healing, .npc$), getarraysize(getvariableofnpc(.healing$, .npc$)));
+
+ setarray(getvariableofnpc(.whoami$[1], .npc$),
+ "An undercover GM.", 1,
+ "An exiled GM.", 1,
+ "I'm not telling you!", 1,
+ "I'm a bot! I'll be level 99 one day! Mwahahahaaha!!!111!", 1,
+ "Somebody said I'm a Chinese copy of CrazyTree.", 1,
+ "I am your evil twin.", 1,
+ "I don't remember anything after I woke up! What happened to me?", 1,
+ "I don't know. Why am I here??", 1,
+ "Who are you?", 1,
+ "On the 8th day, God was bored and said 'There will be bots'. So here I am.", 1,
+ "♪ I'm your hell, I'm your dream, I'm nothing in between ♪♪", 1,
+ "♪♪ Aperture Science. We do what we must, because... we can ♪", 1,
+ "I'm just a reincarnation of a copy.", 1);
+ set(getvariableofnpc(.whoami, .npc$), getarraysize(getvariableofnpc(.whoami$, .npc$)));
+
+ setarray(getvariableofnpc(.drops$[1], .npc$),
+ "*drops a {{ sizeable object }} on ~p's head.*", 8,
+ "*drops an {{ n sizeable object }} on ~p's head.*", 2,
+ "*drops {{ someone }} on ~p's head.*", 1,
+ "*drops a coin on ~p's head.*", 1,
+ "*drops a fruit on ~p's head.*", 1,
+ "*drops an apple on ~p's head.*", 1,
+ "*drops an iten on ~p's head.*", 1,
+ "*drops a GM on ~p.*", 1,
+ "*drops a piece of moon rock on ~p's head.*", 1,
+ "*drops a pin on ~p's head.*", 1,
+ "*drops a rock on ~p's head.*", 1,
+ "*drops a tub of paint on ~p's head.*", 1,
+ "*drops a sandworm on ~p.*", 1,
+ "*drops an idea in ~p's head.*", 1,
+ "*drops The Hitchhiker's Guide to the Galaxy on ~p's head.*", 1,
+ "Ouch.", 1,
+ "Ouchy.", 1,
+ "*drops dead.*", 1,
+ "*sighs.*", 1,
+ "Leaf me alone.", 1,
+ "Stop it! I don't drop branches, try the Druid tree for once!", 1);
+ set(getvariableofnpc(.drops, .npc$), getarraysize(getvariableofnpc(.drops$, .npc$)));
+
+ setarray(getvariableofnpc(.die$[1], .npc$),
+ "*drops an iten on ~p's head.*", 1,
+ "*drops a piece of moon rock on ~p's head.*", 1,
+ "*drops {{ someone }} on ~p's head.*", 1,
+ "*drops a {{ sizeable object }} on ~p's head.*", 3,
+ "*drops an {{ n sizeable object }} on ~p's head.*", 1,
+ "*drops a {{ size }} {{ sizeable object, n sizeable object }} on ~p's head.*", 1,
+ "*drops a {{ size }} {{ color }} {{ sizeable object, n sizeable object }} on ~p's head.*", 1,
+ "*{{ violent adverb }} {{ violent verb }} ~p.*", 1,
+ "*drops dead.*", 1,
+ "*sighs.*", 1,
+ "Avada Kedavra!", 1,
+ "Make me!", 1,
+ "Never!!", 1,
+ "You die, ~p!", 4,
+ "No!", 1,
+ "In a minute.", 1,
+ "Suuure... I'll get right on it...", 1);
+ set(getvariableofnpc(.die, .npc$), getarraysize(getvariableofnpc(.die$, .npc$)));
+
+ setarray(getvariableofnpc(.poke$[1], .npc$),
+ "*tickles.*", 1);
+ set(getvariableofnpc(.poke, .npc$), getarraysize(getvariableofnpc(.poke$, .npc$)));
+
+ setarray(getvariableofnpc(.disgusting$[1], .npc$),
+ "Ewwwww %%^.", 1);
+ set(getvariableofnpc(.disgusting, .npc$), getarraysize(getvariableofnpc(.disgusting$, .npc$)));
+
+ setarray(getvariableofnpc(.answer$[1], .npc$),
+ "42.", 1,
+ "Kittens.", 1);
+ set(getvariableofnpc(.answer, .npc$), getarraysize(getvariableofnpc(.answer$, .npc$)));
+
+ setarray(getvariableofnpc(.burning$[1], .npc$),
+ "*curses ~p and dies %%c.*", 1,
+ "Help! I'm on fire!", 1,
+ "Oh hot.. hot hot!", 1,
+ "*is glowing.*", 1,
+ "*is flaming.*", 1,
+ "Ehemm. Where are firefighters? I need them now!", 1,
+ "*is so hot!.*", 1,
+ "*slowly catches fire.*", 1,
+ "*trembles with trepidation.*", 1,
+ "*is immune to fire.*", 1);
+ set(getvariableofnpc(.burning, .npc$), getarraysize(getvariableofnpc(.burning$, .npc$)));
+
+ setarray(getvariableofnpc(.kill$[1], .npc$),
+ "*curses ~p and dies %%c.*", 1);
+ set(getvariableofnpc(.kill, .npc$), getarraysize(getvariableofnpc(.kill$, .npc$)));
+
+ setarray(getvariableofnpc(.silly$[1], .npc$),
+ "Hahaha, good one!", 1);
+ set(getvariableofnpc(.silly, .npc$), getarraysize(getvariableofnpc(.silly$, .npc$)));
+
+ setarray(getvariableofnpc(.love$[1], .npc$),
+ "♪♪ and IIII.. will alwayyyys loooovvve youuuuu. ♪♪ %%]", 1,
+ "♪♪ nothing's gonna change my love for you, you oughta know by now how much I love you.. ♪ %%]", 1,
+ "♪ ..and then I go and spoil it all, by saying something stupid like: “I love you.†♪", 1,
+ "♪ ..won't you find a place for me? somewhere in your heart... ♪♪", 1,
+ "Thank you.", 1,
+ "♪♪ ..I can't love another when my heart is somewhere far away.. ♪", 1,
+ "%%]", 1);
+ set(getvariableofnpc(.love, .npc$), getarraysize(getvariableofnpc(.love$, .npc$)));
+
+ setarray(getvariableofnpc(.dance$[1], .npc$),
+ "I would but I am rooted to the ground.", 1,
+ "Have you ever seen a tree dance before?", 1,
+ "Hahaha, good one!", 1);
+ set(getvariableofnpc(.dance, .npc$), getarraysize(getvariableofnpc(.dance$, .npc$)));
+
+ setarray(getvariableofnpc(.hate$[1], .npc$),
+ "Right back at you!", 1,
+ "Ok...", 1,
+ "*pats ~p, let it go...*", 1,
+ "Hu hu hu, ~p hates me.", 1);
+ set(getvariableofnpc(.hate, .npc$), getarraysize(getvariableofnpc(.hate$, .npc$)));
+
+ setarray(getvariableofnpc(.bye$[1], .npc$),
+ "*waves goodbye to ~p in tears, come back soon!*", 1);
+ set(getvariableofnpc(.bye, .npc$), getarraysize(getvariableofnpc(.bye$, .npc$)));
+
+ setarray(getvariableofnpc(.pain$[1], .npc$),
+ "Ouch.", 1,
+ "Ouchy.", 1,
+ "Argh.", 1,
+ "Eek.", 1,
+ "*howls.*", 1,
+ "*screams.*", 1,
+ "*groans.*", 1,
+ "*cries.*", 1,
+ "*faints.*", 1,
+ "*shrieks.*", 1,
+ "*hides behind itself.*", 1,
+ "%%k", 1,
+ "Why, what did I do to you? %%i", 1);
+ set(getvariableofnpc(.pain, .npc$), getarraysize(getvariableofnpc(.pain$, .npc$)));
+
+ setarray(getvariableofnpc(.eightball$[1], .npc$),
+ "It is possible.", 1,
+ "Yes!", 1,
+ "Of course.", 1,
+ "Naturally.", 1,
+ "Obviously.", 1,
+ "It shall be.", 1,
+ "The outlook is good.", 1,
+ "It is so.", 1,
+ "One would be wise to think so.", 1,
+ "The answer is certainly yes.", 1,
+ "In your dreams.", 1,
+ "I doubt it very much.", 1,
+ "No chance.", 1,
+ "The outlook is very poor.", 1,
+ "Unlikely.", 1,
+ "About as likely as pigs flying.", 1,
+ "You're kidding, right?", 1,
+ "NO!", 1,
+ "NO.", 1,
+ "No.", 1,
+ "Maybe...", 1,
+ "No clue.", 1,
+ "I don't know.", 1,
+ "The outlook is hazy, please ask again later.", 1,
+ "What are you asking me for?", 1,
+ "Come again?", 1,
+ "You know the answer better than I.", 1,
+ "The answer is def-- oooh! shiny thing!", 1,
+ "No idea.", 1,
+ "Perhaps.", 1,
+ "I think it is better not to tell you.", 1,
+ "Error 417: Expectation failed.", 1);
+ set(getvariableofnpc(.eightball, .npc$), getarraysize(getvariableofnpc(.eightball$, .npc$)));
+
+ setarray(getvariableofnpc(.bad$[1], .npc$),
+ "I'm not bad! You are bad!", 1,
+ "OK, I'm bad.", 1,
+ "I'm just a littttle bad.", 1,
+ "Not as bad as the people that made me.", 1);
+ set(getvariableofnpc(.bad, .npc$), getarraysize(getvariableofnpc(.bad$, .npc$)));
+
+ setarray(getvariableofnpc(.no_idea$[1], .npc$),
+ "What?", 2,
+ "What??", 1,
+ "Whatever.", 1,
+ "Hmm...", 2,
+ "Huh?", 1,
+ "*yawns.*", 1,
+ "Wait a minute...", 1,
+ "What are you talking about?", 1,
+ "Who are you?", 1,
+ "What about me?", 1,
+ "I don't know what you are talking about", 1,
+ "Excuse me?", 1,
+ "Very interesting.", 1,
+ "Really?", 1,
+ "Go on...", 1,
+ "*scratches its leafy head.*", 1,
+ "*feels a disturbance in the force.*", 1,
+ "%%j", 1,
+ "*senses a disturbance in the force.*", 1,
+ "I'm bored...", 1,
+ "%%U", 1,
+ "%%[", 1);
+ set(getvariableofnpc(.no_idea, .npc$), getarraysize(getvariableofnpc(.no_idea$, .npc$)));
+
+ setarray(getvariableofnpc(.shut_up$[1], .npc$),
+ "*goes hide in a corner %%S.*", 1);
+ set(getvariableofnpc(.shut_up, .npc$), getarraysize(getvariableofnpc(.shut_up$, .npc$)));
+
+ setarray(getvariableofnpc(.climb$[1], .npc$),
+ "*sways violently.*", 1,
+ "*bends all the way to the ground.*", 1,
+ "*creaks and bends.*", 1,
+ "*welcomes those who come to play %%I.*", 1,
+ "*beams with pride.*", 1);
+ set(getvariableofnpc(.climb, .npc$), getarraysize(getvariableofnpc(.climb$, .npc$)));
+
+ return;
+}
diff --git a/npc/functions/dailyquest.txt b/npc/functions/dailyquest.txt
new file mode 100644
index 00000000..6f39e59d
--- /dev/null
+++ b/npc/functions/dailyquest.txt
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+function script DailyQuestPointsFunc {
+ @dq_earliest = gettimetick(2) - 86400;
+ if (DailyQuestTime < @dq_earliest)
+ DailyQuestTime = @dq_earliest;
+
+ // how many whole daily quest points the player has earned
+ // we increment DailyQuestTime by the number of seconds in that many increments
+ @dq_increments = (gettimetick(2) - DailyQuestTime)*BaseLevel / 86400;
+ DailyQuestTime = DailyQuestTime + @dq_increments*86400/BaseLevel;
+
+ // player can't regenerate any quest points, but might have a bonus
+ if (DailyQuestPoints >= BaseLevel)
+ goto L_Bonus;
+
+ // normal recharging case - increment, but don't let it recharge more than a day's worth
+ DailyQuestPoints = DailyQuestPoints + @dq_increments;
+ if (DailyQuestPoints > BaseLevel)
+ DailyQuestPoints = BaseLevel;
+ // fallthrough to bonus, which *is* allowed to push DailyQuestPoints above BaseLevel
+ goto L_Bonus;
+
+L_Bonus:
+ DailyQuestPoints = DailyQuestPoints + DailyQuestBonus;
+ DailyQuestBonus = 0;
+
+ return;
+}
+
+function script DailyQuest {
+ callfunc "DailyQuestPointsFunc";
+
+ if (BaseLevel < @dq_level)
+ goto L_Low_Level;
+ if (DailyQuestPoints < @dq_cost)
+ goto L_Not_Enough_Points;
+
+ mes "\"If you bring me " + @dq_count + " " + @dq_friendly_name$ + ", I will give you a reward.\"";
+ menu
+ "I have what you want.", L_Trade,
+ "Take all you need.", L_All,
+ "Ok, I'll get to work.", L_Next,
+ "Nah, I'm not going to help you.", L_Next;
+
+L_Next:
+ @dq_return = 1;
+ goto L_Exit;
+
+L_Trade:
+ if (countitem(@dq_name$) < @dq_count)
+ goto L_Not_Enough;
+ delitem @dq_name$, @dq_count;
+
+ Zeny = Zeny + @dq_money;
+ getexp @dq_exp, 0;
+
+ DailyQuestPoints = DailyQuestPoints - @dq_cost;
+
+ if (@dq_handle_return)
+ goto L_Exit_Good;
+
+ mes "\"Thank you!\"";
+ callsub S_SayPhrase;
+ mes "";
+ mes "[" + @dq_money + " money]";
+ mes "[" + @dq_exp + " experience points]";
+ goto L_Exit_Good;
+
+L_All:
+ if (countitem(@dq_name$) < @dq_count)
+ goto L_Not_Enough;
+
+ @item_multiple = (countitem(@dq_name$) / @dq_count);
+ @dp_multiple = (DailyQuestPoints / @dq_cost);
+
+ if (@dp_multiple > @item_multiple)
+ @multipler = @item_multiple;
+ if (@item_multiple >= @dp_multiple)
+ @multipler = @dp_multiple;
+
+ DailyQuestPoints = DailyQuestPoints - (@dq_cost * @multipler);
+
+ delitem @dq_name$, (@dq_count * @multipler);
+
+ Zeny = Zeny + (@dq_money * @multipler);
+ getexp (@dq_exp * @multipler), 0;
+
+ if (@dq_handle_return)
+ goto L_Exit_Good;
+
+ mes "\"Thank you!\"";
+ callsub S_SayPhrase;
+ mes "";
+ mes "[" + (@dq_money * @multipler) + " money]";
+ mes "[" + (@dq_exp * @multipler) + " experience points]";
+ goto L_Exit_Good;
+
+L_Exit_Good:
+ @dq_return = 4;
+ goto L_Exit;
+
+L_Not_Enough:
+ if (!@dq_handle_return)
+ mes "\"I said " + @dq_count + " " + @dq_friendly_name$ + "; you should learn to count.\"";
+ @dq_return = 3;
+ goto L_Exit;
+
+L_Low_Level:
+ if (!@dq_handle_return)
+ mes "\"Hey, you should go kill some things to get stronger first.\"";
+ @dq_return = 0;
+ goto L_Exit;
+
+L_Not_Enough_Points:
+ mes "\"You look exhausted, maybe you should rest a bit.\"";
+ @dq_return = 2;
+ goto L_Exit;
+
+L_Exit:
+ set @dq_handle_return, 0; // Incase they forget
+ return;
+
+S_SayPhrase:
+ if (@dq_handle_return)
+ goto L_Return;
+ if (DailyQuestPoints < @dq_cost)
+ goto L_Exhausted;
+ if (DailyQuestPoints > BaseLevel)
+ goto L_Over;
+ if (DailyQuestPoints > (BaseLevel*9)/10)
+ goto L_P90;
+ if (DailyQuestPoints > (BaseLevel*7)/10)
+ goto L_P70;
+ if (DailyQuestPoints > (BaseLevel*5)/10)
+ goto L_P50;
+ goto L_Low;
+
+L_Over:
+ mes "\"Woah, you're bursting with power.\"";
+ return;
+L_P90:
+ mes "\"You're in a very good shape.\"";
+ return;
+L_P70:
+ mes "\"You don't seem very exhausted by my tasks.\"";
+ return;
+L_P50:
+ mes "\"Aren't you getting weary yet?\"";
+ return;
+L_Low:
+ mes "\"You look a little tired.\"";
+ return;
+L_Exhausted:
+ mes "\"You look exhausted, maybe you should rest a bit.\"";
+ return;
+
+L_Return:
+ return;
+}
diff --git a/npc/functions/default_npc_checks.txt b/npc/functions/default_npc_checks.txt
new file mode 100644
index 00000000..ee12bc49
--- /dev/null
+++ b/npc/functions/default_npc_checks.txt
@@ -0,0 +1,137 @@
+
+function script PCtoNPCRange {
+ @npc_check = 0;
+ if(!@npc_distance) set @npc_distance, 4; // <== default distance
+ if(@npc_distance < 0) set @npc_distance, ATTACKRANGE;
+ .@x=getvariableofnpc(.x, strnpcinfo(0));
+ .@y=getvariableofnpc(.y, strnpcinfo(0));
+ if (isin(getmap(), .@x, .@y, @npc_distance))
+ goto L_Return;
+ @npc_check = 1;
+ if(@distance_handler) goto L_Return;
+ @dnpc_name$ = strnpcinfo(1);
+ if(@dnpc_name$ != "") goto L_Named;
+ message strcharinfo(0), "Server : ##BYou need to move closer to interact with this npc.";
+ goto L_Return;
+
+L_Named:
+ npctalk3 l(b("Please move closer."));
+ goto L_Return;
+
+L_Return:
+ @dnpc_name$ = "";
+ @distance_handler = 0;
+ @npc_distance = 0;
+ return;
+}
+
+function script CheckInventory {
+ @del_loop = 0;
+ @get_loop = 0;
+ @delitem_loop = 0;
+ @getitem_loop = 0;
+ @check_fail = 0;
+ @msg_loop = 0;
+
+ if (getarraysize(@delitem_ids))
+ goto L_DelItemsLoop;
+ goto L_CheckGet;
+
+L_DelItemsLoop:
+ if(countitem(@delitem_ids[@delitem_loop]) >= @delitem_counts[@delitem_loop])
+ goto L_DelLoopAgain;
+ goto L_ReturnMissing;
+
+L_DelLoopAgain:
+ @delitem_loop = (@delitem_loop + 1);
+ if(@delitem_loop == getarraysize(@delitem_ids))
+ goto L_CheckGet;
+ goto L_DelItemsLoop;
+
+L_CheckGet:
+ if (getarraysize(@getitem_ids))
+ goto L_CheckWeight;
+ goto L_DelCheck;
+
+L_CheckWeight:
+ getinventorylist;
+ if (100 < (@inventorylist_count + getarraysize(@getitem_ids)))
+ goto L_ReturnSpace;
+ goto L_GetItemsLoop;
+
+L_GetItemsLoop:
+ if (checkweight(@getitem_ids[@getitem_loop], @getitem_counts[@getitem_loop]))
+ goto L_GetLoopAgain;
+ goto L_ReturnWeight;
+
+L_GetLoopAgain:
+ @getitem_loop = (@getitem_loop + 1);
+ if(@getitem_loop == getarraysize(@getitem_ids))
+ goto L_DelCheck;
+ goto L_GetItemsLoop;
+
+L_DelCheck:
+ if (getarraysize(@delitem_ids))
+ goto L_DelLoop;
+ goto L_CheckGet2;
+
+L_DelLoop:
+ delitem @delitem_ids[@del_loop], @delitem_counts[@del_loop];
+ goto L_DelAgain;
+
+L_DelAgain:
+ @del_loop = (@del_loop + 1);
+ if(@del_loop == getarraysize(@delitem_ids))
+ goto L_GetLoop;
+ goto L_DelLoop;
+
+L_CheckGet2:
+ if (getarraysize(@getitem_ids))
+ goto L_GetLoop;
+ goto L_Return;
+
+L_GetLoop:
+ misceffect FX_GETITEM, strcharinfo(0);
+ getitem @getitem_ids[@get_loop], @getitem_counts[@get_loop];
+ goto L_GetAgain;
+
+L_GetAgain:
+ @get_loop = (@get_loop + 1);
+ if(@get_loop == getarraysize(@getitem_ids))
+ goto L_Return;
+ goto L_GetLoop;
+
+L_ReturnMissing:
+ @check_fail = 1;
+ mesq l("You are missing required items.");
+ goto L_MissingMsg;
+
+L_MissingMsg:
+ mes "[@@"+@delitem_ids[@msg_loop]+"|"+getitemlink(@delitem_ids[@msg_loop])+"@@] "+countitem(getitemlink(@delitem_ids[@msg_loop]))+"/"+@delitem_counts[@msg_loop];
+ goto L_NextMsgCheck;
+
+L_NextMsgCheck:
+ @msg_loop = (@msg_loop + 1);
+ if(@msg_loop == getarraysize(@delitem_ids))
+ goto L_Return;
+ goto L_MissingMsg;
+
+L_ReturnWeight:
+ mesq l("You need to be carrying less weight.");
+ next;
+ @check_fail = 1;
+ goto L_Return;
+
+L_ReturnSpace:
+ mesq l("You need more room in your inventory.");
+ next;
+ @check_fail = 1;
+ goto L_Return;
+
+L_Return:
+ cleararray @delitem_ids, "", getarraysize(@delitem_ids);
+ cleararray @delitem_counts, "", getarraysize(@delitem_counts);
+ cleararray @getitem_ids, "", getarraysize(@getitem_ids);
+ cleararray @getitem_counts, "", getarraysize(@getitem_counts);
+ return;
+}
diff --git a/npc/functions/dynamic_menu.txt b/npc/functions/dynamic_menu.txt
new file mode 100644
index 00000000..29902bac
--- /dev/null
+++ b/npc/functions/dynamic_menu.txt
@@ -0,0 +1,289 @@
+
+function script DynamicItemMenu {
+set @items_nr, getarraysize(@items);
+if(@items_nr != getarraysize(@item_names$)) goto L_ArrayLengthMismatch;
+if(@default_choice$ == "") set @default_choice$, "Never mind.";
+goto L_pick_one_of_many_items;
+
+L_pick_one_of_many_items:
+ @c = 0;
+ @i = 0;
+
+ setarray @choice_n$, "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "";
+ goto L_pick_choice_loop;
+
+L_pick_choice_loop:
+ if (@i >= @items_nr)
+ goto L_choice_init_done;
+ @current = @items[@i];
+ @current_name$ = @item_names$[@i];
+ @current_index = @i;
+ @i = @i + 1;
+
+ if (countitem(@current) == 0)
+ goto L_pick_choice_loop;
+ @choice_v[@c] = @current;
+ @choice_n$[@c] = @current_name$;
+ @choice_i[@c] = @current_index;
+ @c = @c + 1;
+ goto L_pick_choice_loop;
+
+L_choice_init_done:
+ @choice_v[@c] = 0;
+ @choice_n$[@c] = @default_choice$;
+ @c = @c + 1;
+
+ if (@c < 10)
+ menu
+ @choice_n$[0], L_MenuItems,
+ @choice_n$[1], L_MenuItems,
+ @choice_n$[2], L_MenuItems,
+ @choice_n$[3], L_MenuItems,
+ @choice_n$[4], L_MenuItems,
+ @choice_n$[5], L_MenuItems,
+ @choice_n$[6], L_MenuItems,
+ @choice_n$[7], L_MenuItems,
+ @choice_n$[8], L_MenuItems,
+ @choice_n$[9], L_MenuItems;
+ goto L_MenuItems;
+
+L_MenuItems:
+ if (@c < 10)
+ goto L_choice_join;
+
+ if (@c < 20)
+ menu
+ @choice_n$[0], L_MenuItems1,
+ @choice_n$[1], L_MenuItems1,
+ @choice_n$[2], L_MenuItems1,
+ @choice_n$[3], L_MenuItems1,
+ @choice_n$[4], L_MenuItems1,
+ @choice_n$[5], L_MenuItems1,
+ @choice_n$[6], L_MenuItems1,
+ @choice_n$[7], L_MenuItems1,
+ @choice_n$[8], L_MenuItems1,
+ @choice_n$[9], L_MenuItems1,
+ @choice_n$[10], L_MenuItems1,
+ @choice_n$[11], L_MenuItems1,
+ @choice_n$[12], L_MenuItems1,
+ @choice_n$[13], L_MenuItems1,
+ @choice_n$[14], L_MenuItems1,
+ @choice_n$[15], L_MenuItems1,
+ @choice_n$[16], L_MenuItems1,
+ @choice_n$[17], L_MenuItems1,
+ @choice_n$[18], L_MenuItems1,
+ @choice_n$[19], L_MenuItems1;
+ goto L_MenuItems1;
+
+L_MenuItems1:
+ if (@c < 20)
+ goto L_choice_join;
+
+ menu
+ @choice_n$[0], L_choice_join,
+ @choice_n$[1], L_choice_join,
+ @choice_n$[2], L_choice_join,
+ @choice_n$[3], L_choice_join,
+ @choice_n$[4], L_choice_join,
+ @choice_n$[5], L_choice_join,
+ @choice_n$[6], L_choice_join,
+ @choice_n$[7], L_choice_join,
+ @choice_n$[8], L_choice_join,
+ @choice_n$[9], L_choice_join,
+ @choice_n$[10], L_choice_join,
+ @choice_n$[11], L_choice_join,
+ @choice_n$[12], L_choice_join,
+ @choice_n$[13], L_choice_join,
+ @choice_n$[14], L_choice_join,
+ @choice_n$[15], L_choice_join,
+ @choice_n$[16], L_choice_join,
+ @choice_n$[17], L_choice_join,
+ @choice_n$[18], L_choice_join,
+ @choice_n$[19], L_choice_join,
+ @choice_n$[20], L_choice_join,
+ @choice_n$[21], L_choice_join,
+ @choice_n$[22], L_choice_join,
+ @choice_n$[23], L_choice_join,
+ @choice_n$[24], L_choice_join,
+ @choice_n$[25], L_choice_join,
+ @choice_n$[26], L_choice_join,
+ @choice_n$[27], L_choice_join,
+ @choice_n$[28], L_choice_join,
+ @choice_n$[29], L_choice_join,
+ @choice_n$[30], L_choice_join,
+ @choice_n$[31], L_choice_join;
+
+L_choice_join:
+ @menu = @menu - 1;
+ @item = @choice_v[@menu];
+ @index = @choice_i[@menu];
+ if (@menu >= @c)
+ @item = 0;
+ goto L_Clean;
+
+L_Clean:
+ @menu = 0;
+ @items_nr = 0;
+ @c = 0;
+ @i = 0;
+ @current = 0;
+ @current_name$ = "";
+ cleararray @choice_v, 0, getarraysize(@choice_v);
+ cleararray @choice_n$, "", getarraysize(@choice_n$);
+ cleararray @choice_i, 0, getarraysize(@choice_i);
+ return;
+
+L_ArrayLengthMismatch:
+ debugmes "@items and @item_names$ array length mismatch";
+ mapexit;
+}
+
+
+
+
+
+function script DynamicItemMenu$ {
+set @items_nr, getarraysize(@items$);
+if(@items_nr != getarraysize(@item_names$)) goto L_ArrayLengthMismatch;
+if(@default_choice$ == "") set @default_choice$, "Never mind.";
+goto L_pick_one_of_many_items;
+
+L_pick_one_of_many_items:
+ @c = 0;
+ @i = 0;
+
+ setarray @choice_n$, "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "";
+ goto L_pick_choice_loop;
+
+L_pick_choice_loop:
+ if (@i >= @items_nr)
+ goto L_choice_init_done;
+ @current$ = @items$[@i];
+ @current_name$ = @item_names$[@i];
+ @current_index = @i;
+ @i = @i + 1;
+
+ if (countitem(@current$) == 0)
+ goto L_pick_choice_loop;
+ @choice_v$[@c] = @current$;
+ @choice_n$[@c] = @current_name$;
+ @choice_i[@c] = @current_index;
+ @c = @c + 1;
+ goto L_pick_choice_loop;
+
+L_choice_init_done:
+ @choice_v$[@c] = "";
+ @choice_n$[@c] = @default_choice$;
+ @c = @c + 1;
+
+ if (@c < 10)
+ menu
+ @choice_n$[0], L_MenuItems,
+ @choice_n$[1], L_MenuItems,
+ @choice_n$[2], L_MenuItems,
+ @choice_n$[3], L_MenuItems,
+ @choice_n$[4], L_MenuItems,
+ @choice_n$[5], L_MenuItems,
+ @choice_n$[6], L_MenuItems,
+ @choice_n$[7], L_MenuItems,
+ @choice_n$[8], L_MenuItems,
+ @choice_n$[9], L_MenuItems;
+ goto L_MenuItems;
+
+L_MenuItems:
+ if (@c < 10)
+ goto L_choice_join;
+
+ if (@c < 20)
+ menu
+ @choice_n$[0], L_MenuItems1,
+ @choice_n$[1], L_MenuItems1,
+ @choice_n$[2], L_MenuItems1,
+ @choice_n$[3], L_MenuItems1,
+ @choice_n$[4], L_MenuItems1,
+ @choice_n$[5], L_MenuItems1,
+ @choice_n$[6], L_MenuItems1,
+ @choice_n$[7], L_MenuItems1,
+ @choice_n$[8], L_MenuItems1,
+ @choice_n$[9], L_MenuItems1,
+ @choice_n$[10], L_MenuItems1,
+ @choice_n$[11], L_MenuItems1,
+ @choice_n$[12], L_MenuItems1,
+ @choice_n$[13], L_MenuItems1,
+ @choice_n$[14], L_MenuItems1,
+ @choice_n$[15], L_MenuItems1,
+ @choice_n$[16], L_MenuItems1,
+ @choice_n$[17], L_MenuItems1,
+ @choice_n$[18], L_MenuItems1,
+ @choice_n$[19], L_MenuItems1;
+ goto L_MenuItems1;
+
+L_MenuItems1:
+ if (@c < 20)
+ goto L_choice_join;
+
+ menu
+ @choice_n$[0], L_choice_join,
+ @choice_n$[1], L_choice_join,
+ @choice_n$[2], L_choice_join,
+ @choice_n$[3], L_choice_join,
+ @choice_n$[4], L_choice_join,
+ @choice_n$[5], L_choice_join,
+ @choice_n$[6], L_choice_join,
+ @choice_n$[7], L_choice_join,
+ @choice_n$[8], L_choice_join,
+ @choice_n$[9], L_choice_join,
+ @choice_n$[10], L_choice_join,
+ @choice_n$[11], L_choice_join,
+ @choice_n$[12], L_choice_join,
+ @choice_n$[13], L_choice_join,
+ @choice_n$[14], L_choice_join,
+ @choice_n$[15], L_choice_join,
+ @choice_n$[16], L_choice_join,
+ @choice_n$[17], L_choice_join,
+ @choice_n$[18], L_choice_join,
+ @choice_n$[19], L_choice_join,
+ @choice_n$[20], L_choice_join,
+ @choice_n$[21], L_choice_join,
+ @choice_n$[22], L_choice_join,
+ @choice_n$[23], L_choice_join,
+ @choice_n$[24], L_choice_join,
+ @choice_n$[25], L_choice_join,
+ @choice_n$[26], L_choice_join,
+ @choice_n$[27], L_choice_join,
+ @choice_n$[28], L_choice_join,
+ @choice_n$[29], L_choice_join,
+ @choice_n$[30], L_choice_join,
+ @choice_n$[31], L_choice_join;
+
+L_choice_join:
+ @menu = @menu - 1;
+ @item$ = @choice_v$[@menu];
+ @index = @choice_i[@menu];
+ if (@menu >= @c)
+ @item$ = "";
+ goto L_Clean;
+
+L_Clean:
+ @menu = 0;
+ @items_nr = 0;
+ @c = 0;
+ @current_index = 0;
+ @i = 0;
+ @current$ = 0;
+ @current_name$ = "";
+ cleararray @choice_v$, "", getarraysize(@choice_v$);
+ cleararray @choice_n$, "", getarraysize(@choice_n$);
+ cleararray @choice_i, 0, getarraysize(@choice_i);
+ return;
+
+L_ArrayLengthMismatch:
+ debugmes "@items$ and @item_names$ array length mismatch";
+ mapexit;
+}
diff --git a/npc/functions/evil_obelisk.txt b/npc/functions/evil_obelisk.txt
new file mode 100644
index 00000000..b85884c7
--- /dev/null
+++ b/npc/functions/evil_obelisk.txt
@@ -0,0 +1,96 @@
+function script EvilObelisk {
+ mes "[Evil Obelisk]";
+ mes "(A mystical aura surrounds this stone. It seems to crave money.)";
+ next;
+
+ @Cost_jacko = 6500;
+ @Cost_gy1 = 4000;
+ @Cost_gy2 = 3000;
+ @Cost_skull = 2800;
+ @Cost_snake = 2500;
+
+ menu
+ "Don't pay it anything.", L_close,
+ "Pay it " + @Cost_jacko + " gold.", L_JACKO,
+ "Pay it " + @Cost_gy1 + " gold.", L_GRAVEYARD1,
+ "Pay it " + @Cost_gy2 + " gold.", L_GRAVEYARD2,
+ "Pay it " + @Cost_skull + " gold.", L_SKULL,
+ "Pay it " + @Cost_snake + " gold.", L_SNAKE;
+
+L_JACKO:
+ if (Zeny < @Cost_jacko)
+ goto L_NotEnough;
+ Zeny = Zeny - @Cost_jacko;
+ @mob_id = 1022;
+ @mob_count = rand(1,2);
+ goto L_Summon;
+
+L_GRAVEYARD1:
+ if (Zeny < @Cost_gy1)
+ goto L_NotEnough;
+ @temp = rand(2);
+ if(@temp == 0)
+ set @mob_id, 1036; // Zombie
+ if(@temp == 1)
+ set @mob_id, 1045; // Fallen
+ @mob_count = rand(1,2);
+ Zeny = Zeny - @Cost_gy1;
+ goto L_Summon;
+
+L_GRAVEYARD2:
+ if (Zeny < @Cost_gy2)
+ goto L_NotEnough;
+ @temp = rand(2);
+ if(@temp == 0)
+ set @mob_id, 1044; // Lady Skelly
+ if(@temp == 1)
+ set @mob_id, 1043; // Normal Skelly
+ @mob_count = rand(1,2);
+ Zeny = Zeny - @Cost_gy2;
+ goto L_Summon;
+
+L_SKULL:
+ if (Zeny < @Cost_skull)
+ goto L_NotEnough;
+ @temp = rand(2);
+ if(@temp == 0)
+ set @mob_id, 1024; // Poison
+ if(@temp == 1)
+ set @mob_id, 1023; // Fire
+ @mob_count = rand(1,4);
+ Zeny = Zeny - @Cost_skull;
+ goto L_Summon;
+
+L_SNAKE:
+ if (Zeny < @Cost_snake)
+ goto L_NotEnough;
+ @temp = rand(4);
+ if(@temp == 0)
+ set @mob_id, 1034; // Grass
+ if(@temp == 1)
+ set @mob_id, 1026; // Mnt.
+ if(@temp == 2)
+ set @mob_id, 1010; // Normal
+ if(@temp == 3)
+ set @mob_id, 1021; // Cave
+ @mob_count = rand(1,4);
+ Zeny = Zeny - @Cost_snake;
+ goto L_Summon;
+
+L_Summon:
+ areamonster @map$, @x0, @y0, @x1, @y1, "Evil", @mob_id, @mob_count;
+ goto L_close;
+
+L_NotEnough:
+ mes "You don't have that much money";
+ goto L_close;
+
+L_close:
+ @Cost_jacko = 0;
+ @Cost_gy1 = 0;
+ @Cost_gy2 = 0;
+ @Cost_skull = 0;
+ @Cost_snake = 0;
+ return;
+
+}
diff --git a/npc/functions/ferry.txt b/npc/functions/ferry.txt
new file mode 100644
index 00000000..7feef2c5
--- /dev/null
+++ b/npc/functions/ferry.txt
@@ -0,0 +1,135 @@
+
+017-9,27,28,0 script #FerryConfig NPC32767,{
+ end;
+
+OnInit:
+ disablenpc "Hurnscald South Koga";
+ disablenpc "Candor Koga";
+ disablenpc "Nivalis Koga";
+ disablenpc "Hurnscald North Koga";
+ disablenpc "Tulimshar Koga";
+ $@MainCurrentDock = 0;
+ $@CandorCurrentDock = 0;
+ $@DockTickCount = 0;
+ $@DockLeaveCount = 1;
+ setarray $@MainDocks$, "Hurnscald North", "Nivalis", "Tulimshar";
+ setarray $@CandorDocks$, "Candor", "Hurnscald South";
+ donpcevent "#"+$@MainDocks$[$@MainCurrentDock]+"Dock::OnCommandArrive";
+ donpcevent "#"+$@CandorDocks$[$@CandorCurrentDock]+"Dock::OnCommandArrive";
+ .warp_delay = 430;
+ if (debug >= 2) end;
+ initnpctimer;
+ goto L_k1city2;
+
+L_NextDock:
+ $@MainLastDock = $@MainCurrentDock;
+ $@CandorLastDock = $@CandorCurrentDock;
+ $@MainCurrentDock = $@MainCurrentDock + 1;
+ $@CandorCurrentDock = $@CandorCurrentDock + 1;
+ if($@MainCurrentDock == getarraysize($@MainDocks$))
+ $@MainCurrentDock = 0;
+ if($@CandorCurrentDock == getarraysize($@CandorDocks$))
+ $@CandorCurrentDock = 0;
+ $@DockTickCount = 0;
+ donpcevent "#"+$@MainDocks$[$@MainLastDock]+"Dock::OnCommandWarp";
+ donpcevent "#"+$@MainDocks$[$@MainCurrentDock]+"Dock::OnCommandArrive";
+ donpcevent "#"+$@CandorDocks$[$@CandorLastDock]+"Dock::OnCommandWarp";
+ donpcevent "#"+$@CandorDocks$[$@CandorCurrentDock]+"Dock::OnCommandArrive";
+
+ donpcevent "#k1sound::OnCommandDing";
+ donpcevent "#k2sound::OnCommandDing";
+
+ initnpctimer;
+
+ if($@MainCurrentDock == 2) goto L_k1city1;
+ if($@MainCurrentDock == 0) goto L_k1city2;
+ if($@MainCurrentDock == 1) goto L_k1city3;
+ end;
+
+OnTimer5000:
+ if ($@DockTickCount > $@DockLeaveCount)
+ goto L_NextDock;
+ $@DockTickCount = $@DockTickCount + 1;
+ initnpctimer;
+ end;
+
+
+L_k1city1:
+ enablenpc "#k1city1e"; disablenpc "#k1city2e"; disablenpc "#k1city3e";
+ disablenpc "#k1city1d"; enablenpc "#k1city2d"; enablenpc "#k1city3d";
+ if($@CandorCurrentDock == 1) goto L_k2city1;
+ if($@CandorCurrentDock == 0) goto L_k2city2;
+end;
+
+L_k1city2:
+ disablenpc "#k1city1e"; enablenpc "#k1city2e"; disablenpc "#k1city3e";
+ enablenpc "#k1city1d"; disablenpc "#k1city2d"; enablenpc "#k1city3d";
+ if($@CandorCurrentDock == 1) goto L_k2city1;
+ if($@CandorCurrentDock == 0) goto L_k2city2;
+end;
+
+L_k1city3:
+ disablenpc "#k1city1e"; disablenpc "#k1city2e"; enablenpc "#k1city3e";
+ enablenpc "#k1city1d"; enablenpc "#k1city2d"; disablenpc "#k1city3d";
+ if($@CandorCurrentDock == 1) goto L_k2city1;
+ if($@CandorCurrentDock == 0) goto L_k2city2;
+end;
+
+L_k2city1:
+ enablenpc "#k2city1e"; disablenpc "#k2city2e";
+ disablenpc "#k2city1d"; enablenpc "#k2city2d";
+end;
+
+L_k2city2:
+ disablenpc "#k2city1e"; enablenpc "#k2city2e";
+ enablenpc "#k2city1d"; disablenpc "#k2city2d";
+end;
+}
+
+function script FerryHelp {
+ mes "\"You wait on the dock for the ship to come in. You'll be given a chance to board the boat when it comes into port.\"";
+ mes "\"It lingers in port to allow you some time to board in case you are running behind.\"";
+ mes "\"Once on the ship, it will sail to different ports and annouce where it is docking.\"";
+ mes "\"There are 2 Ferrys, both ferrys are free to ride.\"";
+ mes "\"The Main ferry travels from Argeas, Kaizei and Tonori. It docks in the major ports Hurnscald North, Nivalis and the Tulimshar Dock.\"";
+ mes "\"The Candor Ferry only travels betwen Candor and the Hurnscald South Dock.\"";
+ mes "\"Refreshments and supplies are offered aboard both ships during the voyage.\"";
+ mes "\"We also have some slot machines in case you get bored.\"";
+ return;
+}
+
+function script BoardFerry {
+ if ($@MainCurrentDock == 0 && getmapname() == "008-1") goto L_Board;
+ else if ($@MainCurrentDock == 1 && getmapname() == "031-1") goto L_Board;
+ else if ($@MainCurrentDock == 2 && getmapname() == "001-1") goto L_Board;
+
+ @NextDock = $@MainCurrentDock + 1;
+ if(@NextDock == getarraysize($@MainDocks$)) set @NextDock, 0;
+ message strcharinfo(0),
+ "Ferry : ##3The ferry is currently at ##B"+$@MainDocks$[$@MainCurrentDock]+"##b. "
+ +"It will be arriving at ##B"+$@MainDocks$[@NextDock]+"##b next.";
+ return;
+
+L_Board:
+ warp "035-2",32,29;
+ return;
+}
+
+function script BoardCandorFerry {
+ if ($@CandorCurrentDock == 0 && getmapname() == "029-1") goto L_Board;
+ else if ($@CandorCurrentDock == 1 && getmapname() == "008-1") goto L_Board;
+
+ @NextDock = $@CandorCurrentDock + 1;
+ if(@NextDock == getarraysize($@CandorDocks$)) set @NextDock, 0;
+ message strcharinfo(0),
+ "Ferry : ##3The ferry is currently at ##B"+$@CandorDocks$[$@CandorCurrentDock]+"##b. "
+ +"It will be arriving at ##B"+$@CandorDocks$[@NextDock]+"##b next.";
+ return;
+
+L_Board:
+ warp "036-2",32,29;
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/npc/functions/filters.txt b/npc/functions/filters.txt
new file mode 100644
index 00000000..91e536dc
--- /dev/null
+++ b/npc/functions/filters.txt
@@ -0,0 +1,132 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Several filters
+
+// filter_always( id )
+function script filter_always {
+ return true;
+}
+
+// filter_onlyme( id )
+function script filter_onlyme {
+ return (getarg(0) == getcharid(3));
+}
+
+// filter_notme( id )
+function script filter_notme {
+ return (getarg(0) != getcharid(3));
+}
+
+// filter_sameguild( id )
+function script filter_sameguild {
+ if (getarg(0) == getcharid(3))
+ return true;
+ if (getcharid(2) < 1)
+ return false;
+ return (strcharinfo(2, "~!<mk>@tmw2.org", getarg(0)) == strcharinfo(2));
+}
+
+// filter_sameguildnotyou( id )
+function script filter_sameguildnotyou {
+ if (getcharid(2) < 1)
+ return false;
+ if (getarg(0) == getcharid(3))
+ return false;
+ return (strcharinfo(2, "~!<mk>@tmw2.org", getarg(0)) == strcharinfo(2));
+}
+
+// filter_sameparty( id )
+function script filter_sameparty {
+ if (getarg(0) == getcharid(3))
+ return true;
+ if (getcharid(1) < 1 && getarg(0) != getcharid(3))
+ return false;
+ return (strcharinfo(1, "~!<mk>@tmw2.org", getarg(0)) == strcharinfo(1));
+}
+
+// filter_sameguildorparty( id )
+function script filter_sameguildorparty {
+ if (getarg(0) == getcharid(3))
+ return true;
+ if (getcharid(2) < 1 && getcharid(1) < 1)
+ return false;
+ .@party=(strcharinfo(1, "~!<mk>@tmw2.org", getarg(0)) == strcharinfo(1));
+ .@guild=(strcharinfo(2, "~!<mk>@tmw2.org", getarg(0)) == strcharinfo(2));
+ return ((getcharid(1) > 0 && .@party) || (getcharid(2) > 0 && .@guild));
+}
+
+// filter_sameguildorpartynotyou( id )
+function script filter_sameguildorpartynotyou {
+ if (getarg(0) == getcharid(3))
+ return false;
+ if (getcharid(2) < 1 && getcharid(1) < 1)
+ return false;
+ .@party=(strcharinfo(1, "~!<mk>@tmw2.org", getarg(0)) == strcharinfo(1));
+ .@guild=(strcharinfo(2, "~!<mk>@tmw2.org", getarg(0)) == strcharinfo(2));
+ return ((getcharid(1) > 0 && .@party) || (getcharid(2) > 0 && .@guild));
+}
+
+// filter_hostile( id )
+function script filter_hostile {
+ //.@type=getunitdata(getarg(0), UDT_TYPE);
+ .@type=getunittype(getarg(0));
+ .@chkid=getarg(0);
+
+ // Players outside PVP
+ if (.@type == UNITTYPE_PC) {
+ getmapxy(.@m$, .@x, .@y, .@type, .@chkid);
+ if (!ispvpmap(.@m$))
+ return false;
+ // FIXME: We already have !(filter_sameguildorparty())
+ // We might be over-processing this
+ // Honor party flag
+ if (!getmapflag(.@mapa$, mf_pvp_noparty) &&
+ getcharid(1) == getcharid(1, strcharinfo(0, "", .@chkid)))
+ return false;
+ // Honor guild flag
+ if (!getmapflag(.@mapa$, mf_pvp_noguild) &&
+ getcharid(2) == getcharid(2, strcharinfo(0, "", .@chkid)))
+ return false;
+ }
+
+ // Monsters
+ if (.@type == UNITTYPE_MOB)
+ return true;
+
+ // NPCs
+ if (.@type == UNITTYPE_NPC)
+ return false;
+
+ // Homunculus
+ if (.@type == UNITTYPE_HOM)
+ .@chkid=charid2rid(getunitdata(getarg(0), UDT_MASTERCID));
+
+ // Pets
+ if (.@type == UNITTYPE_PET)
+ .@chkid=getunitdata(getarg(0), UDT_MASTERAID);
+
+ // Mercenaries
+ if (.@type == UNITTYPE_MER)
+ .@chkid=charid2rid(getunitdata(getarg(0), UDT_MASTERCID));
+
+ // Elementals
+ if (.@type == UNITTYPE_ELEM)
+ .@chkid=charid2rid(getunitdata(getarg(0), UDT_MASTERCID));
+
+ //debugmes "filter_hostile: Filtering %d (original %d) (BL %d)", .@chkid, getarg(0), .@type;
+ // Players (and slaves)
+ return !(filter_sameguildorparty(.@chkid));
+}
+
+// filter_friendly( id )
+function script filter_friendly {
+ return !(filter_hostile(getarg(0)));
+}
+
+// filter_notboss( id )
+function script filter_notboss {
+ return (!(getunitdata(getarg(0), UDT_MODE) & MD_BOSS));
+}
+
diff --git a/npc/functions/game_rules.txt b/npc/functions/game_rules.txt
new file mode 100644
index 00000000..9b416a83
--- /dev/null
+++ b/npc/functions/game_rules.txt
@@ -0,0 +1,22 @@
+
+function script GameRules {
+ mes l("##BPlease click submit.");
+ clear;
+ title l("Game Rules");
+ mes l("Players breaking the following rules may be banned for any length of time (even permanently) or have their characters reset at a GM's discretion:");
+ mes l("1) Do not abuse other players. Insults, swearing, and the like are not to be directed towards a particular person or group.");
+ mes l("2) No bots – including ##Bany##b AFK activity or automated actions of any sort.");
+ mes l("3) No spamming or flooding (including messages, whispers, and trade requests).");
+ mes l("4) No begging.");
+ mes l("5) Speak ##Bonly##b English in the public chat.");
+ mes l("6) Treat others how you would like to be treated.");
+ mes l("AFK botting will be determined by talking to players who are moving and/or attacking.");
+ mes l("Automated following will be determined by observation.");
+
+ if (TUT_var == 0)
+ TUT_var = gettimetick(2);
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/npc/functions/ghost.txt b/npc/functions/ghost.txt
new file mode 100644
index 00000000..1325525b
--- /dev/null
+++ b/npc/functions/ghost.txt
@@ -0,0 +1,36 @@
+function script SpawnGhost {
+ if ($GHOSTS_DISABLED)
+ goto L_Return;
+
+ if (BaseLevel >= 40 &&
+ (getmapname() == "026-1" ||
+ getmapname() == "027-1" ||
+ getmapname() == "027-2" ||
+ getmapname() == "027-3" ||
+ getmapname() == "027-4" ||
+ getmapname() == "027-5"))
+ goto L_Spawn;
+ return;
+
+L_Spawn:
+ .@x = POS_X;
+ .@y = POS_Y;
+
+ if (!(iscollision(getmapname(), .@x, .@y - 1))) set .@y, .@y - 1; // up
+ else if (!(iscollision(getmapname(), .@x, .@y + 1))) set .@y, .@y + 1; // down
+ else if (!(iscollision(getmapname(), .@x - 1, .@y))) set .@x, .@x - 1; // left
+ else if (!(iscollision(getmapname(), .@x + 1, .@y))) set .@x, .@x + 1; // right
+ // else on the player
+
+ // FIXME (Is this a valid event label??)
+ if (@GHOST_MAP$ != "")
+ killmonster @GHOST_MAP$, "~GH~" + getcharid(0);
+
+ @GHOST_MAP$ = getmapname();
+ specialeffect(39, SELF, getcharid(3));
+ monster getmapname(), .@x, .@y, strcharinfo(0), 1136, 1, "~GH~" + getcharid(0);
+ return;
+
+L_Return:
+ return;
+}
diff --git a/npc/functions/global_event_handler.txt b/npc/functions/global_event_handler.txt
new file mode 100644
index 00000000..69972292
--- /dev/null
+++ b/npc/functions/global_event_handler.txt
@@ -0,0 +1,49 @@
+
+- script #GlobalHandler NPC32767,{
+ end;
+
+OnPCLoginEvent:
+ @login_event = 1;
+ adddefaultskills();
+ //callfunc "fixHeadStyles"; // convert headstyles
+ ClearVariables(); // removes / converts old variables
+ DisplayMOTD(); // send the motd to the client, if enabled
+ TMWBirthday();
+ // add more here
+ vaultOnLogin();
+ @login_event = 2;
+ end;
+
+OnPCLogoutEvent:
+ vaultOnLogout();
+ end;
+
+OnPCKillEvent:
+ elanore_decrease_exp(); // decrease heal exp for doing bad things
+ end;
+
+OnNPCKillEvent:
+OnMobKillEvent:
+ MobPoints();
+ end;
+
+OnPCDieEvent:
+ @necromancer = 0;
+ callfunc "SpawnGhost";
+ set @killerrid, 0; // reset killer rid
+ end;
+
+// Cleanup: Retain chat logs for 24~48 hours
+// Cleanup: Retain item logs for 2 months
+OnClock0500:
+ query_sql("DELETE FROM `picklog` WHERE `time` < '"+sqldate(0, -2)+"'");
+ query_sql("DELETE FROM `zenylog` WHERE `time` < '"+sqldate(0, -2)+"'");
+OnClock1700:
+ if (gettime(GETTIME_DAYOFMONTH) > 1)
+ query_sql("DELETE FROM `chatlog` WHERE `time` < '"+sqldate(-1)+"'");
+ end;
+
+OnInit:
+ MOTD(); // set the MOTD array
+ end;
+}
diff --git a/npc/functions/gm_island.txt b/npc/functions/gm_island.txt
new file mode 100644
index 00000000..82fc0210
--- /dev/null
+++ b/npc/functions/gm_island.txt
@@ -0,0 +1,71 @@
+- script #GmConfig NPC32767,{
+ end;
+
+OnInit:
+ disablenpc "Gm Event#1";
+ disablenpc "Gm Event#2";
+ disablenpc "Gm Event#3";
+ end;
+}
+function script GmWarp {
+ warp "028-1", 110, 30;
+ return;
+}
+function script GmDebug {
+ mes "[GM Debug]";
+ mes "What do you want to do?";
+ menu
+ "Open Event Portals.", L_GmStart,
+ "Close Event Portals.", L_GmStop,
+ "Disguise.", L_Disguise;
+
+L_GmStart:
+ enablenpc "Gm Event#1";
+ enablenpc "Gm Event#2";
+ enablenpc "Gm Event#3";
+ return;
+
+L_GmStop:
+ disablenpc "Gm Event#1";
+ disablenpc "Gm Event#2";
+ disablenpc "Gm Event#3";
+ return;
+
+L_Disguise:
+ npcaction 9;
+ mes "[GM Debug - Disguise]";
+ mes "The Disguise function allows GMs to disguise themselves as mobs or npcs.";
+ mes "---";
+ mes "Mob IDs: [@@https://www.themanaworld.org/index.php/Monster_Reference|Monster Reference@@]";
+ mes "You can either logout or use id ##B0##b to reset.";
+ mes "---";
+ mes "Please input the mob ID:";
+ input @disguise_id;
+ if (@disguise_id < 1000 || @disguise_id > 32767)
+ goto L_ResetClass;
+ mes "Your disguise has been changed.";
+ if (Class <= 5)
+ @old_class = Class;
+ Class = @disguise_id;
+ mes "";
+ mes "For technical reasons, you are not able to see your own disguise, but other players will see it.";
+ return;
+
+L_ResetClass:
+ mes "Your appearance has been reset.";
+ Class = if_then_else(@old_class, @old_class, 1);
+ callfunc "fixHeadStyles";
+ return;
+}
+001-1,49,68,0 script Gm Event#1 NPC368,0,0,{
+ callfunc "GmWarp";
+ end;
+}
+009-1,46,30,0 script Gm Event#2 NPC368,0,0,{
+ callfunc "GmWarp";
+ end;
+}
+020-1,67,89,0 script Gm Event#3 NPC368,0,0,{
+ callfunc "GmWarp";
+ end;
+}
diff --git a/npc/functions/goodbye.txt b/npc/functions/goodbye.txt
new file mode 100644
index 00000000..b5214618
--- /dev/null
+++ b/npc/functions/goodbye.txt
@@ -0,0 +1,152 @@
+// Evol functions.
+// Authors:
+// gumi
+// Reid
+// Description:
+// script terminator functions
+
+
+
+// goodbye_msg
+// Tell a random goodbye sentence.
+// Variables:
+// .@rand = Random number between the number of "goodbye" choice.
+
+function script goodbye_msg {
+ setarray .byemsg$[0],
+ l("See you!"),
+ l("See you later!"),
+ l("See you soon!"),
+ l("Bye!"),
+ l("Farewell."),
+ l("Bye then!"),
+ l("Goodbye."),
+ l("Bye for now."),
+ l("Talk to you soon!"),
+ l("Talk to you later!"),
+ l("Have a good day!"),
+ l("Cheers!"),
+ l("Take care!");
+
+ return any_of(.byemsg$);
+}
+
+
+
+// cwarp
+// Closes the dialog, then warps the player.
+// You almost always want to use this instead of `warp`.
+// usage:
+// cwarp;
+// cwarp x, y;
+// cwarp map, x, y;
+
+function script cwarp {
+ .@map$ = getarg(0, "");
+ .@x = getarg(1, 0);
+ .@y = getarg(2, 0);
+
+ if (getargcount() > 0 && getargcount() < 3)
+ {
+ .@npc$ = strnpcinfo(0);
+ .@map$ = getvariableofnpc(.map$, .@npc$);
+ .@x = getarg(0);
+ .@y = getarg(1);
+ }
+
+ getmapxy .@pc_map$, .@pc_x, .@pc_y, UNITTYPE_PC; // get char location
+
+ closedialog; // XXX: maybe send closeclientdialog in the future
+
+ if (getargcount() < 1)
+ {
+ warp .@pc_map$, .@pc_x, .@pc_y; // no arguments, just refresh
+ close;
+ }
+
+ if (.@map$ == .@pc_map$)
+ {
+ if (.@pc_x == .@x && .@pc_y == .@y)
+ {
+ close; // same location, don't move
+ }
+
+ else
+ {
+ slide .@x, .@y; // same map, slide instead of full warp
+ close;
+ }
+ }
+
+ warp .@map$, .@x, .@y; // different map, warp to given location
+ close;
+}
+
+
+
+// cshop
+// closes the dialog, then opens a shop
+// if no npc is given, calls "#<npc> $"
+
+function script cshop {
+ closedialog; // XXX: maybe send closeclientdialog in the future
+ shop getarg(0, "#" + strnpcinfo(0) + " $");
+ //close; => the shop buildin already sends close, and is a terminator itself
+}
+
+
+
+// cstorage
+// closes the dialog, then opens storage
+
+function script cstorage {
+ closedialog; // XXX: maybe send closeclientdialog in the future
+ openstorage;
+ close;
+}
+
+
+
+// bye
+// closes the dialog without waiting for the player to press close
+// can also display an emote
+
+function script bye {
+ .@emote = getarg(0, -1);
+ closedialog; // XXX: maybe send closeclientdialog in the future
+
+ if (.@emote >= 0)
+ emotion .@emote;
+
+ close;
+}
+
+
+
+// goodbye
+// same as bye, but also displays a canned message
+// can also display an emote
+
+function script goodbye {
+ npctalkonce(goodbye_msg());
+ bye getarg(0, -1);
+}
+
+
+
+// goodbye2
+// Waits for the player to press close, displays a canned message,
+// ends execution.
+// Can also display an emote
+
+function script goodbye2 {
+ .@emote = getarg(0, -1);
+
+ close2;
+ npctalkonce(goodbye_msg());
+
+ if (.@emote >= 0)
+ emotion .@emote;
+
+ end;
+}
diff --git a/npc/functions/headstyles.txt b/npc/functions/headstyles.txt
new file mode 100644
index 00000000..c56eb900
--- /dev/null
+++ b/npc/functions/headstyles.txt
@@ -0,0 +1,46 @@
+
+function script fixHeadStyles {
+ callfunc "getHeadStyles";
+ if (!HELLOWORLD)
+ goto L_RandomHair;
+ set @style, getlook(LOOK_HAIR); // FIXME: this needs to be a param in the future
+ set @color, getlook(LOOK_HAIR_COLOR); // FIXME: this needs to be a param in the future
+ debugmes "Login OK";
+ return;
+ if (@color >= 123 && @color <= HC_WHITE) // convert shock white
+ @color = (HC_WHITE - Class) + 1;
+ if (@color < 105 && ((@color - (15 * (Class - 1))) < 0 || @color > ((15 * (Class - 1)) + (getarraysize(@HairColors$) - 1))))
+ set @color, 15 * (Class - 1); // it is possible to style color 0 but not style 0 since style is treated as an item
+ setlook LOOK_HAIR_COLOR, @color; // FIXME: this needs to be a param in the future
+ return;
+
+L_RandomHair:
+ HELLOWORLD=true;
+ //resetstatus; // <= important! gives 48 stat points
+ debugmes "Set random look....";
+ setlook LOOK_HAIR, rand(1, getarraysize(@HairStyles$));
+ setlook LOOK_HAIR_COLOR, rand(15);
+ return;
+}
+
+// Hairstyle config
+// set array of style and colors
+- script hairstyle_config NPC_HIDDEN,{
+ end;
+
+OnInit:
+ setarray $@hairstyle$[0], "(none)", "Bald", "Flat Ponytail", "Bowl Cut", // 3
+ "Combed back", "Emo", "Mohawk", "Pompadour", "Center parting", // 8
+ "Long and Slick", "Short and Curly", "Pigtails", "Long and Curly", // 12
+ "Parted", "Perky Ponytail", "Wave", "Mane", "Bun", // 17
+ "Shoulder Length and Flick", "Fizzy", "Long and Clopped", "Bunches", // 21
+ "Long Ponytail", "Indefinitely long";
+
+ setarray $@haircolor$[0], "Light Brown", "Green", "Red",
+ "Purple", "Gray", "Yellow", "Blue",
+ "Light Red", "Light Blue", "Dark Purple", "Black",
+ "Pink", "Brown", "Dark";
+
+ setarray $@REFEXP[0], 400, 900, 2250, 6500, 15000;
+ end;
+}
diff --git a/npc/functions/inc_sc_bonus.txt b/npc/functions/inc_sc_bonus.txt
new file mode 100644
index 00000000..7bd24331
--- /dev/null
+++ b/npc/functions/inc_sc_bonus.txt
@@ -0,0 +1,105 @@
+// TMW-2 Script.
+// Author:
+// Jesusalva
+// Description:
+// Applies effects for INC_* (STR doesn't exist)
+// Valid values: INCAGI INCVIT INCINT INCDEX INCLUK INCHIT INCFLEE SC_FURY
+// Doesn't works: SC_STRUP
+// Works if .@min == .@max: INCMHP INCMHPRATE INCMSP INCMSPRATE
+/// Untested Values: WALKSPEED (reverse logic) INVINCIBLE (broken)
+// PS. SC_FURY causes crit rate to increase
+//
+// Variables:
+// .@delay Second of buffing
+// .@type SC_*
+// .@min Min amount of type
+// .@max Max amount of type (optional)
+
+// SC_Bonus(delay, SC, min{, max})
+function script SC_Bonus {
+ .@delay=getarg(0);
+ .@type=getarg(1);
+ .@min=getarg(2);
+ .@max=getarg(3, .@min);
+ if (.@delay <= 0)
+ return false;
+
+ // Get the bonus value
+ if (.@min != .@max)
+ .@bonus=rand2(.@min, .@max);
+ else
+ .@bonus=.@min;
+
+ // Remaining time and effect conversion
+ .@v=getstatus(.@type, 1);
+ .@t=getstatus(.@type, 5);
+
+ // Convert remaining time to seconds, rounded down
+ if (.@t > 1000)
+ .@t=.@t/1000;
+ else
+ .@t=0;
+
+ // If there was effect previously, get ponderate average
+ if (.@v > 0)
+ .@v=ponderate_avg(.@bonus, .@delay, .@v, .@t);
+ else
+ .@v=.@bonus;
+
+ // Update time value to ms and to stack
+ .@t+=.@delay;
+ .@t*=1000;
+
+ // Debug print if needed
+ if (debug || $@GM_OVERRIDE)
+ debugmes "Effect %d (+%d percent) for %d ms", .@type, .@bonus, .@t;
+
+ // Restart the bonus
+ sc_end .@type;
+ sc_start .@type,.@t,.@v;
+ return true;
+}
+
+// SC_Bonus2(delay, SC1, val1, val2)
+function script SC_Bonus2 {
+ .@delay=getarg(0);
+ .@type=getarg(1);
+ .@val1=getarg(2);
+ .@val2=getarg(3);
+ if (.@delay <= 0)
+ return false;
+
+ // Remaining time and effect conversion
+ .@v1=getstatus(.@type, 1);
+ .@v2=getstatus(.@type, 2);
+ .@ts=getstatus(.@type, 5);
+
+ // Convert remaining time to seconds, rounded down
+ .@ts=.@ts/1000;
+
+ // If there was effect previously, get ponderate average (val1)
+ if (.@v1 > 0)
+ .@v1=ponderate_avg(.@val1, .@delay, .@v1, .@ts);
+ else
+ .@v1=.@val1;
+
+ // If there was effect previously, get ponderate average (val2)
+ if (.@v2 > 0)
+ .@v2=ponderate_avg(.@val2, .@delay, .@v2, .@ts);
+ else
+ .@v2=.@val2;
+
+ // Update time value to ms and to stack
+ .@t+=.@delay;
+ .@t*=1000;
+
+ // Debug print if needed
+ if (debug || $@GM_OVERRIDE)
+ debugmes "Effect %d (%d/%d bonus) for %d ms", .@type, .@v1, .@v2, .@ts;
+
+ // Restart the bonus
+ sc_end .@type;
+ sc_start2 .@type, .@ts, .@v1, .@v2;
+ return true;
+}
+
diff --git a/npc/functions/inn.txt b/npc/functions/inn.txt
new file mode 100644
index 00000000..50f1afd6
--- /dev/null
+++ b/npc/functions/inn.txt
@@ -0,0 +1,34 @@
+
+function script Inn {
+ if(@npcname$ == "") set @npcname$, strnpcinfo(1);
+ mes "[" + @npcname$ + "]";
+ mes "\"Would you like to rest? It's only " + @Cost + " gp.\"";
+ next;
+ menu
+ "Yes", L_Next,
+ "No", L_close;
+
+L_Next:
+ if (Zeny < @Cost)
+ goto L_NoMoney;
+ Zeny = Zeny - @Cost;
+ heal 10000, 10000;
+
+ mes "[" + @npcname$ + "]";
+ mes "\"Sleep well!\"";
+ next;
+ goto L_close;
+
+L_close:
+ mes "[" + @npcname$ + "]";
+ mes "\"See you.\"";
+ @npcname$ = "";
+ close2;
+ return;
+
+L_NoMoney:
+ mes "[" + @npcname$ + "]";
+ mes "\"You don't have enough money to stay here.\"";
+ next;
+ goto L_close;
+}
diff --git a/npc/functions/input.txt b/npc/functions/input.txt
new file mode 100644
index 00000000..0a510b74
--- /dev/null
+++ b/npc/functions/input.txt
@@ -0,0 +1,110 @@
+// Evol functions.
+// Author:
+// 4144
+// Jesusalva
+// Description:
+// Input utility functions
+// Variables:
+// none
+
+function script menuint {
+ deletearray .@vals;
+ .@menustr$ = "";
+ .@cnt = 0;
+
+ for (.@f = 0; .@f < getargcount(); .@f = .@f + 2)
+ {
+ if (getarg(.@f) != "")
+ {
+ .@menustr$ = .@menustr$ + getarg(.@f) + ":";
+ .@vals[.@cnt] = getarg(.@f + 1);
+ .@cnt ++;
+ }
+ }
+
+ .@vals[.@cnt] = -1;
+ @menu = 255;
+ @menuret = -1;
+ select(.@menustr$);
+ if (@menu == 255)
+ return -1;
+
+ @menu --;
+ if (@menu < 0 || @menu >= getarraysize(.@vals) - 1)
+ return -1;
+
+ @menuret = .@vals[@menu];
+ return @menuret;
+}
+
+function script menustr {
+ deletearray .@vals$;
+ .@menustr$ = "";
+ .@cnt = 0;
+
+ for (.@f = 0; .@f < getargcount(); .@f = .@f + 2)
+ {
+ if (getarg(.@f) != "")
+ {
+ .@menustr$ = .@menustr$ + getarg(.@f) + ":";
+ .@vals$[.@cnt] = getarg(.@f + 1);
+ .@cnt ++;
+ }
+ }
+
+ @menu = 255;
+ @menuret = -1;
+ select(.@menustr$);
+ if (@menu == 255)
+ return "";
+
+ @menu --;
+ if (@menu < 0 || @menu >= getarraysize(.@vals$))
+ return "";
+
+ @menuret$ = .@vals$[@menu];
+ return @menuret$;
+}
+
+// menuint2(<array>)
+function script menuint2 {
+ .@menustr$="";
+
+ if (!(getdatatype(getarg(0)) & DATATYPE_VAR))
+ Exception("Inadequate argument type - Must be var", RB_DEFAULT|RB_ISFATAL);
+
+ copyarray(.@ar$, getarg(0), getarraysize(getarg(0)));
+
+ if (getarraysize(.@ar$) % 2 != 0)
+ Exception("Invalid array size: "+getarraysize(.@ar$), RB_DEFAULT|RB_ISFATAL);
+
+ freeloop(true);
+ for (.@f=0; .@f < getarraysize(.@ar$); .@f++) {
+ // String vs Int
+ if (.@f % 2 == 0) {
+ .@menustr$+=.@ar$[.@f]+":";
+ } else {
+ array_push(.@vals, atoi(.@ar$[.@f]));
+ }
+ }
+ freeloop(false);
+
+ // Do the request
+ // We have: .@vals and .@menustr$
+ @menu = 255;
+ @menuret = -1;
+ select(.@menustr$);
+ //debugmes "Option %d", @menu;
+ //debugmes "Array size %d", getarraysize(.@vals);
+
+ if (@menu == 255)
+ return -1;
+
+ @menu-=1;
+ if (@menu < 0 || @menu > getarraysize(.@vals) - 1)
+ return -1;
+
+ @menuret = .@vals[@menu];
+ return @menuret;
+}
+
diff --git a/npc/functions/inventoryplace.txt b/npc/functions/inventoryplace.txt
new file mode 100644
index 00000000..76cdad21
--- /dev/null
+++ b/npc/functions/inventoryplace.txt
@@ -0,0 +1,36 @@
+// Evol functions.
+// Authors:
+// Qwerty Dragon
+// Reid
+// Description:
+// Check if the player have enough place on his inventory to accept new items with arguments:
+// getarg(even numbers) item ID,
+// getarg(odd numbers) number of items,
+
+function script inventoryplace {
+
+ .@argc = getargcount();
+
+ if (.@argc % 2 != 0)
+ {
+ Exception("inventoryplace: Wrong argument count.", RB_SPEECH|RB_ISFATAL|RB_PLEASEREPORT|RB_DEBUGMES);
+ }
+
+ for (.@i = .@j = 0; .@i < .@argc; .@i += 2)
+ {
+ setarray .@item[.@j], getarg(.@i);
+ setarray .@amount[.@j], getarg(.@i + 1);
+ ++.@j;
+ }
+
+ if (!checkweight2(.@item, .@amount))
+ {
+ narrator S_FIRST_BLANK_LINE,
+ l("It looks like you can't carry anything else for now."),
+ l("You should come back when you have some free space.");
+
+ close;
+ }
+
+ return true;
+}
diff --git a/npc/functions/location.txt b/npc/functions/location.txt
new file mode 100644
index 00000000..e40148c4
--- /dev/null
+++ b/npc/functions/location.txt
@@ -0,0 +1,128 @@
+// TMW2 Script
+// Author: Jesusalva
+// Location Config
+
+- script loc_config 32767,{
+ end;
+
+OnInit:
+ // TP_FORT TP_BOSSR
+ setarray $@LOCMASTER_TP, TP_CANDOR,TP_TULIM,TP_HURNS,TP_NIVAL;
+ setarray $@LOCMASTER_LOC$, "Candor", "Tulim", "Hurns", "Nival";
+ setarray $@LOCMASTER_MAP$, "029-1", "001-1", "009-1", "020-1";
+ setarray $@LOCMASTER_X, 46, 51, 52, 75;
+ setarray $@LOCMASTER_Y, 97, 78, 41, 85;
+
+ //debugmes "Locmaster: Index 0: %s [%s.gat (%d, %d)]", $@LOCMASTER_LOC$[0], $@LOCMASTER_MAP$[0], $@LOCMASTER_X[0], $@LOCMASTER_Y[0];
+ //debugmes "Locmaster: Index 2: %s [%s.gat (%d, %d)]", $@LOCMASTER_LOC$[2], $@LOCMASTER_MAP$[2], $@LOCMASTER_X[2], $@LOCMASTER_Y[2];
+ //debugmes "Locmaster: Index 5: %s [%s.gat (%d, %d)]", $@LOCMASTER_LOC$[5], $@LOCMASTER_MAP$[5], $@LOCMASTER_X[5], $@LOCMASTER_Y[5];
+ end;
+}
+
+// Resaves your respawn point
+function script ResaveRespawn {
+ .@i=array_find($@LOCMASTER_LOC$, LOCATION$);
+ savepoint $@LOCMASTER_MAP$[.@i], $@LOCMASTER_X[.@i], $@LOCMASTER_Y[.@i];
+ return;
+}
+
+// Warps you to last visited town
+function script ReturnTown {
+ .@i=array_find($@LOCMASTER_LOC$, LOCATION$);
+ warp $@LOCMASTER_MAP$[.@i], $@LOCMASTER_X[.@i], $@LOCMASTER_Y[.@i];
+ return;
+}
+
+// Convert map name to location id
+// LocToMap( LocName )
+function script LocToMap {
+ // Fill variable
+ .@v$=getarg(0);
+
+ // Error code
+ if (playerattached())
+ .@err=RB_DEFAULT;
+ else
+ .@err=RB_DEBUGMES;
+
+ // Validade variable, see npc/config/location.txt first
+ .@lx=array_find($@LOCMASTER_LOC$, .@v$);
+ if (.@lx < 0)
+ return Exception("Invalid location passed to LocToMap: "+.@v$, .@err);
+
+ return $@LOCMASTER_MAP$[.@lx];
+}
+
+// Convert map name to location id
+// MapToLoc( MapName )
+function script MapToLoc {
+ // Fill variable
+ .@v$=getarg(0);
+
+ // Error code
+ if (playerattached())
+ .@err=RB_DEFAULT;
+ else
+ .@err=RB_DEBUGMES;
+
+ // Validade variable, see npc/config/location.txt first
+ .@lx=array_find($@LOCMASTER_MAP$, .@v$);
+ if (.@lx < 0)
+ return Exception("Invalid map passed to MapToLoc: "+.@v$, .@err);
+
+ return $@LOCMASTER_LOC$[.@lx];
+}
+
+// Gets the location code for TP code
+function script TPToLoc {
+ .@i=array_find($@LOCMASTER_TP, getarg(0));
+ return $@LOCMASTER_MAP$[.@i];
+ return;
+}
+
+// Convert LOC (uppercase) to a TP variable
+// POL_LocToTP( {TOWNCODE} )
+function script POL_LocToTP {
+ .@tw$=strtoupper(getarg(0, LOCATION$));
+
+ // TODO: Change this to use the arrays instead
+ if (.@tw$ == "TULIM")
+ return TP_TULIM;
+
+ if (.@tw$ == "HURNS")
+ return TP_HURNS;
+
+ if (.@tw$ == "NIVAL")
+ return TP_NIVAL;
+
+ if (.@tw$ == "CANDOR")
+ return TP_CANDOR;
+
+ return Exception("Invalid town requested / POL_LocToTP", RB_DEFAULT|RB_SPEECH, -1);
+}
+
+// Upon entering a town
+// EnterTown( LocName )
+function script EnterTown {
+ // Fill variable
+ .@v$=getarg(0);
+
+ // Validade variable, see npc/config/location.txt first
+ if (array_find($@LOCMASTER_LOC$, .@v$) < 0)
+ return Exception("Invalid location passed to EnterTown: "+.@v$);
+
+ LOCATION$=.@v$;
+ return;
+}
+
+// Warps home and updates LOCATION$
+function script teleporthome {
+ warp "Save", 0, 0;
+ .@i=array_find($@LOCMASTER_MAP$, getmap());
+ if (.@i >= 0)
+ EnterTown($@LOCMASTER_LOC$[.@i]);
+ else
+ debugmes("[ERROR] Invalid Town Map for Time Flask: %s", getmap());
+ return;
+}
+
diff --git a/npc/functions/lockpicking.txt b/npc/functions/lockpicking.txt
new file mode 100644
index 00000000..da2da5dd
--- /dev/null
+++ b/npc/functions/lockpicking.txt
@@ -0,0 +1,87 @@
+
+function script LockPicking {
+ @lock_picking_success = 0;
+ setarray @pins, rand(1,3), rand(1,3), rand(1,3);
+ goto L_StartLockPicking;
+
+L_NeedLockPickSet:
+ menu
+ "Unfortunately, I don't have these tools... Let's look around.", L_Return;
+
+L_StartLockPicking:
+ mes "You inspect the lock and notice it isn't sophisticated.";
+ mes "With regular stuff, you should be able to lock pick it.";
+ next;
+ if (countitem ("LockPicks") < 1)
+ goto L_NeedLockPickSet;
+ menu
+ "I can try with these lock picks I just found.", L_Next,
+ "Maybe later.", L_Return;
+
+L_Next:
+ delitem "LockPicks", 1;
+ mes "You insert the hook pick inside the lock, and, without applying any tension, you discover there are only 3 pins to set.";
+ next;
+ mes "You will need to set the 3 pins to align them and turn the lock's cylinder.";
+ mes "A wrong move will make you start over. Remember how you had set the pins!";
+ next;
+ @pin = 0;
+ goto L_HandlePin;
+
+L_NextPinOrEnd:
+ if (@pin >= 2)
+ goto L_OpenDoor;
+ @pin = @pin + 1;
+ mes "Click! This pin is set!";
+ next;
+ goto L_HandlePin;
+
+L_HandlePin:
+ if (@pin == 0)
+ mes "What to do with the first pin?";
+ if (@pin == 1)
+ mes "What to do with the second pin?";
+ if (@pin == 2)
+ mes "What to do with the last pin?";
+ menu
+ "Apply a soft pressure.", L_PinSoft,
+ "Apply a normal pressure.", L_PinNormal,
+ "Apply a strong pressure.", L_PinHard,
+ "Give up. I'm in a rush!", L_GiveUp;
+
+L_GiveUp:
+ @lock_picking_success = 0;
+ @pin = 0;
+ cleararray @pins, 0, 3;
+ @pin_pressure = 0;
+ return;
+
+L_PinSoft:
+ @pin_pressure = 1;
+ goto L_TestPin;
+
+L_PinNormal:
+ @pin_pressure = 2;
+ goto L_TestPin;
+
+L_PinHard:
+ @pin_pressure = 3;
+ goto L_TestPin;
+
+L_TestPin:
+ if (@pin_pressure == @pins[@pin])
+ goto L_NextPinOrEnd;
+ mes "Nope, that did not work. And the pins are unset now...";
+ next;
+ @pin = 0;
+ goto L_HandlePin;
+
+L_Return:
+ return;
+
+L_OpenDoor:
+ @lock_picking_success = 1;
+ mes "The two sets of pins separate. You can now turn the cylinder to open the door!";
+ return;
+
+}
diff --git a/npc/functions/magic.txt b/npc/functions/magic.txt
new file mode 100644
index 00000000..e0962a15
--- /dev/null
+++ b/npc/functions/magic.txt
@@ -0,0 +1,159 @@
+
+
+function script MagicGainBasic {
+ MAGIC_FLAGS = MAGIC_FLAGS | MFLAG_DRANK_POTION;
+ return;
+}
+
+function script MagicTalkOptionsSetup {
+ @QQ_ELANORE = 1;
+ @QQ_MANASEED = 2;
+ @QQ_MANAPOTION = 4;
+ @QQ_WYARA = 8;
+ @QQ_SAGATHA = 16;
+ @QQ_AULDSBEL = 32;
+ @QQ_IMP = 64;
+ @QQ_OLDWIZ = 128;
+ @QQ_ASTRALSOUL = 256;
+ return;
+}
+
+
+function script MagicTalkMenu {
+ setarray @choice$, "", "", "", "", "", "", "", "", "", "";
+ @choices_nr = 0;
+ setarray @choice_idx, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
+
+ if (@ignore & @QQ_ELANORE)
+ goto L_Q_post_elanore;
+ @choice$[@choices_nr] = "...Elanore the Healer?";
+ @choice_idx[@choices_nr] = @QQ_ELANORE;
+ @choices_nr = @choices_nr + 1;
+ goto L_Q_post_elanore;
+
+L_Q_post_elanore:
+ if (@ignore == @QQ_MANASEED)
+ goto L_Q_post_manaseed;
+ if (!(MAGIC_FLAGS & (MFLAG_KNOWS_MANASEED | MFLAG_MANASEED_RUMOUR)))
+ goto L_Q_post_manaseed;
+ @choice$[@choices_nr] = "...the Mana Seed?";
+ @choice_idx[@choices_nr] = @QQ_MANASEED;
+ @choices_nr = @choices_nr + 1;
+ goto L_Q_post_manaseed;
+
+L_Q_post_manaseed:
+ if (@ignore & @QQ_MANAPOTION)
+ goto L_Q_post_manapotion;
+ if (!(MAGIC_FLAGS & MFLAG_KNOWS_MANAPOTION))
+ goto L_Q_post_manapotion;
+ @choice$[@choices_nr] = "...Mana Potions?";
+ @choice_idx[@choices_nr] = @QQ_MANAPOTION;
+ @choices_nr = @choices_nr + 1;
+ goto L_Q_post_manapotion;
+
+L_Q_post_manapotion:
+ if (@ignore & @QQ_WYARA)
+ goto L_Q_post_wyara;
+ if (!(MAGIC_FLAGS & MFLAG_KNOWS_WYARA))
+ goto L_Q_post_wyara;
+ @choice$[@choices_nr] = "...Wyara the Witch?";
+ @choice_idx[@choices_nr] = @QQ_WYARA;
+ @choices_nr = @choices_nr + 1;
+ goto L_Q_post_wyara;
+
+L_Q_post_wyara:
+ if (@ignore & @QQ_SAGATHA)
+ goto L_Q_post_sagatha;
+ if (!(MAGIC_FLAGS & MFLAG_KNOWS_SAGATHA))
+ goto L_Q_post_sagatha;
+ @choice$[@choices_nr] = "...Sagatha the Witch?";
+ @choice_idx[@choices_nr] = @QQ_SAGATHA;
+ @choices_nr = @choices_nr + 1;
+ goto L_Q_post_sagatha;
+
+L_Q_post_sagatha:
+ if (@ignore & @QQ_AULDSBEL)
+ goto L_Q_post_auldsbel;
+ if (!(MAGIC_FLAGS & MFLAG_KNOWS_AULDSBEL))
+ goto L_Q_post_auldsbel;
+ @choice$[@choices_nr] = "...Auldsbel the Wizard?";
+ @choice_idx[@choices_nr] = @QQ_AULDSBEL;
+ @choices_nr = @choices_nr + 1;
+ goto L_Q_post_auldsbel;
+
+L_Q_post_auldsbel:
+ if (@ignore & @QQ_OLDWIZ)
+ goto L_Q_post_oldwiz;
+ if (!(MAGIC_FLAGS & MFLAG_KNOWS_OLD_WIZARD))
+ goto L_Q_post_oldwiz;
+ @choice$[@choices_nr] = "...the Old Wizard?";
+ @choice_idx[@choices_nr] = @QQ_OLDWIZ;
+ @choices_nr = @choices_nr + 1;
+ goto L_Q_post_oldwiz;
+
+L_Q_post_oldwiz:
+ if (@ignore & @QQ_IMP)
+ goto L_Q_post_imp;
+ if (!(MAGIC_FLAGS & MFLAG_KNOWS_IMP))
+ goto L_Q_post_imp;
+ @choice$[@choices_nr] = "...the Earth Spirit in the desert well?";
+ @choice_idx[@choices_nr] = @QQ_IMP;
+ @choices_nr = @choices_nr + 1;
+ goto L_Q_post_imp;
+
+L_Q_post_imp:
+ if (@ignore & @QQ_ASTRALSOUL)
+ goto L_Q_post_astralsoul;
+ if (!(getskilllv(SKILL_MAGIC)))
+ goto L_Q_post_astralsoul;
+ if (!(getskilllv(SKILL_POOL)))
+ goto L_Q_post_astralsoul;
+ @choice$[@choices_nr] = "...ways to improve my magic?";
+ @choice_idx[@choices_nr] = @QQ_ASTRALSOUL;
+ @choices_nr = @choices_nr + 1;
+ goto L_Q_post_astralsoul;
+
+L_Q_post_astralsoul:
+ @choice$[@choices_nr] = "...never mind.";
+ @choice_idx[@choices_nr] = 0;
+ @choices_nr = @choices_nr + 1;
+
+ menu
+ @choice$[0], L_MenuItems,
+ @choice$[1], L_MenuItems,
+ @choice$[2], L_MenuItems,
+ @choice$[3], L_MenuItems,
+ @choice$[4], L_MenuItems,
+ @choice$[5], L_MenuItems,
+ @choice$[6], L_MenuItems,
+ @choice$[7], L_MenuItems,
+ @choice$[8], L_MenuItems,
+ @choice$[9], L_MenuItems;
+
+L_MenuItems:
+ @menu = @menu - 1;
+
+ if (@menu >= @choices_nr)
+ @menu = 0;
+
+ @c = @choice_idx[@menu];
+ return;
+}
+
+
+function script SkillUp {
+ if (getskilllv(@SUP_id) >= @SUP_lvl)
+ goto L_Shortcut;
+
+ misceffect sfx_skillup, strcharinfo(0);
+ updateskill @SUP_id, @SUP_lvl;
+ getexp @SUP_xp, 0;
+ if (@SUP_xp)
+ mes "[" + @SUP_xp + " experience points]";
+ mes "[Level " + @SUP_lvl + " in " + @SUP_name$ + "]";
+ return;
+
+L_Shortcut:
+ mes "[You already have level " + getskilllv(@SUP_id) + " in " + @SUP_name$ + "]";
+ return;
+}
diff --git a/npc/functions/main.txt b/npc/functions/main.txt
new file mode 100644
index 00000000..d072ff60
--- /dev/null
+++ b/npc/functions/main.txt
@@ -0,0 +1,750 @@
+// TMW2 Script
+// Evol functions.
+// Authors:
+// 4144
+// Travolta
+// gumi
+// Jesusalva
+// Description:
+// Built-in essential functions.
+
+function script menuimage {
+ return getarg(0) + "|" + getarg(1);
+}
+
+function script dnext {
+ if (@dnext >= GSET_LONGMENU_DENSITY) {
+ @dnext=0;
+ next;
+ } else {
+ @dnext+=1;
+ }
+ return;
+}
+
+function script menuaction {
+ return "[" + getarg(0) + "]";
+}
+
+function script setq1 {
+ // Quest, val1 , val2 , val3 , time
+ setq getarg(0), getarg(1), getq2(getarg(0)), getq3(getarg(0)), getqtime(getarg(0));
+ return;
+}
+
+function script setq2 {
+ // Quest, val1 , val2 , val3 , time
+ setq getarg(0), getq(getarg(0)), getarg(1), getq3(getarg(0)), getqtime(getarg(0));
+ return;
+}
+
+function script setq3 {
+ // Quest, val1 , val2 , val3 , time
+ setq getarg(0), getq(getarg(0)), getq2(getarg(0)), getarg(1), getqtime(getarg(0));
+ return;
+}
+
+function script setqtime {
+ // Quest, val1 , val2 , val3 , time
+ setq getarg(0), getq(getarg(0)), getq2(getarg(0)), getq3(getarg(0)), getarg(1);
+ return;
+}
+
+function script mesn {
+ if (getargcount() > 0) {
+ .@s$ = "[" + getarg(0) + "]";
+ } else {
+ .@s$ = "[" + strnpcinfo(1) + "]";
+ }
+ mes .@s$;
+ return;
+}
+
+function script mesq {
+ mes "\"" + getarg(0)+ "\"";
+ return;
+}
+
+function script g {
+ return Sex == 0 ? getarg(0) : getarg(1);
+}
+
+function script b {
+ return "##B" + getarg(0) + "##b";
+}
+
+function script col {
+ .@color = getarg(1,9);
+ if (.@color < 0) .@color = 0;
+ if (.@color > 9) .@color = 9;
+ return "##" + .@color + getarg(0) + "##0";
+}
+
+function script adddefaultskills {
+ if (getskilllv(NV_BASIC) < 7) {
+ skill NV_BASIC, 7, 0;
+ }
+ if (getskilllv(TMW2_FAKESKILL) < 1) {
+ skill TMW2_FAKESKILL, 1, 0;
+ }
+ return;
+}
+
+function script addremovemapmask {
+ setmapmask getarg(0), (getmapmask(getarg(0)) | (getarg(1) + getarg(2))) ^ getarg(2);
+ return;
+}
+
+function script mesc {
+ mes col(getarg(0),getarg(1,9));
+ return;
+}
+
+function script get_race {
+ .@g=getarg(0, Class);
+ return l($@allraces$[.@g]);
+}
+
+// tutmes (message, {header=Tutorial, headerfirst=True})
+function script tutmes {
+ .@header$=getarg(1, l("TUTORIAL"));
+ .@showheader=getarg(2, true);
+ .@tcol=9; // Tutorial color code
+
+ if (TUTORIAL) {
+ dnext;
+ if (.@showheader) {
+ mesf(".:: %s ::.", .@header$);
+ mesc getarg(0), .@tcol;
+ } else {
+ mesc .@header$+": "+getarg(0), .@tcol;
+ }
+ }
+ return;
+}
+
+// Function to show narrator text. Accepts string args.
+// If first arg is a number N, then it represents bit flags.
+// Bit flags :
+// 0x1 -- blank line at beginning
+// 0x2 -- blank line at the end
+// 0x4 -- use last "next;"
+// 0x8 -- don't use first "mesn;"
+function script narrator {
+ .@start = 0;
+ .@argc = getargcount();
+ .@flags = 0;
+
+ if (.@argc > 1 && !isstr(getarg(0)))
+ {
+ .@start = 1;
+ .@flags = getarg(0);
+ }
+
+ if (.@flags & 0x1)
+ mes "";
+
+ if (!(.@flags & 0x8))
+ mesn l("Narrator");
+
+ for (.@i = .@start; .@i < .@argc; .@i++)
+ {
+ mes col(getarg(.@i), 9);
+ if (.@i < .@argc - 1)
+ next;
+ }
+
+ if (.@flags & 0x4)
+ next;
+ else if (.@flags & 0x2)
+ mes "";
+
+ return;
+}
+
+// Function to show NPC speech. Accepts string args.
+// If first arg is a number N, then it represents bit flags.
+// Bit flags :
+// 0x1 -- blank line at beginning
+// 0x2 -- blank line at the end
+// 0x4 -- use last "next;"
+// 0x8 -- don't use first "mesn;"
+function script speech {
+ .@start = 0;
+ .@argc = getargcount();
+ .@flags = 0;
+
+ if (.@argc > 1 && !isstr(getarg(0)))
+ {
+ .@start = 1;
+ .@flags = getarg(0);
+ }
+
+ if (.@flags & 0x1)
+ mes "";
+
+ if (!(.@flags & 0x8))
+ mesn;
+
+ for (.@i = .@start; .@i < .@argc; .@i++)
+ {
+ mesq getarg(.@i);
+
+ if (.@i < .@argc - 1)
+ next;
+ }
+
+ if (.@flags & 0x4)
+ next;
+ else if (.@flags & 0x2)
+ mes "";
+
+ return;
+}
+
+// Show debug message if .debug variable of NPC is set to 1
+function script npcdebug {
+ if (getvariableofnpc(.debug, strnpcinfo(3)))
+ debugmes strnpcinfo(3) + ": " + getarg(0);
+ return;
+}
+
+function script askyesno {
+ return select(menuaction(l("Yes")),
+ menuaction(l("No")));
+}
+
+// Argument:
+// 0 Quest variable
+// 1 Current value
+// 2 Next value
+function script compareandsetq {
+ if (getq(getarg(0)) == getarg(1))
+ {
+ setq getarg(0), getarg(2);
+ return true;
+ }
+ return false;
+}
+
+// Use a delay to prevent spams from NPC that display text without the
+// use of (a) close/next function(s).
+// Argument:
+// 0 Text to display
+// 1 Lock delay (default = 1)
+// 2 Message function: (default = 0)
+// 0 = npctalk3
+// 1 = npctalk
+// 2 = message
+// TODO: Use temp player var, because NPC var affect other players
+function script npctalkonce {
+ // lock mechanism
+ switch (getarg(2, 0))
+ {
+ case 1:
+ if (gettimetick(2) <= getvariableofnpc(.talk_lock, strnpcinfo(NPC_NAME_UNIQUE)))
+ return false;
+ set(getvariableofnpc(.talk_lock, strnpcinfo(NPC_NAME_UNIQUE)), gettimetick(2) + getarg(1, 1));
+ break;
+ default:
+ if (gettimetick(2) <= @NPC_TALK_LOCK[getnpcid()])
+ return false;
+ @NPC_TALK_LOCK[getnpcid()] = gettimetick(2) + getarg(1, 1);
+ }
+
+ // talk mechanism
+ switch (getarg(2, 0))
+ {
+ case 0: npctalk3(getarg(0)); break;
+ case 1: npctalk(getarg(0)); break;
+ case 2: message(strcharinfo(0), getarg(0));
+ }
+
+ return true;
+}
+
+// Randomizer functions
+/////////////////////////////////////////////
+
+// pseudo-fix randomness
+// rand2( min, max )
+function script rand2 {
+ if (getargcount() == 2) {
+ .@min=getarg(0)*100;
+ .@max=getarg(1)*100+99;
+ } else {
+ .@min=0;
+ .@max=getarg(0)*100-1;
+ }
+ return rand(.@min, .@max)/100;
+}
+
+// returns one argument randomly
+// any( <arg>{, ...<arg>} )
+function script any {
+ return getarg(rand2(getargcount()));
+}
+
+// returns any member of the array
+// any_of( <array> )
+function script any_of {
+ return getelementofarray(getarg(0), getarrayindex(getarg(0)) + rand2(getarraysize(getarg(0)) - getarrayindex(getarg(0))));
+}
+
+function script die {
+ if ($HARDCORE) {
+ @grace=true;
+ percentheal -100, -100;
+ //setparam(Hp, 1);
+ //warp "000-1", 22, 22;
+ //end; // MUST be end; to mimic official behavior
+ } else {
+ percentheal -100, -100;
+ }
+ return;
+}
+
+// Returns if a map is on PVP Mode or Not
+// ispvpmap( {mapid} )
+function script ispvpmap {
+ .@mapa$=getarg(0, getmapname());
+ return (getmapflag(.@mapa$, mf_pvp) || getmapflag(.@mapa$, mf_pvp_noparty) || getmapflag(.@mapa$, mf_pvpnoguild));
+}
+
+// TMW2 Custom Functions
+/////////////////////////////////////////////
+
+// Function meant to be used by Main Storyline Quest
+// msObjective ( condition , message )
+function script msObjective {
+ if (getarg(0))
+ mesc getarg(1), 2;
+ else
+ mesc getarg(1), 9;
+ return;
+}
+
+function script getmap {
+ if (getmapxy(.@mapName$, .@xpos, .@ypos, getarg(0,0)) != 0)
+ return false;
+ // TODO: Maybe use getmapname() instead of getmapxy?
+ return .@mapName$;
+}
+
+// isin( map, x1, y1, {[x2, y2][radius]} )
+function script isin {
+ if (getmapxy(.@mapName$, .@xpos, .@ypos, 0) != 0)
+ return false;
+ if (.@mapName$ != getarg(0))
+ return false;
+
+ if (getarg(4,-1) < 0) {
+ // Radius Based
+ if (.@xpos >= getarg(1)-getarg(3) && .@xpos <= getarg(1)+getarg(3) && .@ypos >= getarg(2)-getarg(3) && .@ypos <= getarg(2)+getarg(3))
+ return true;
+ } else {
+ // Coordinate based
+ if (.@xpos >= getarg(1) && .@xpos <= getarg(3) && .@ypos >= getarg(2) && .@ypos <= getarg(4))
+ return true;
+ }
+ return false;
+}
+
+// Clear output of getinventorylist()
+// delinventorylist()
+function script delinventorylist {
+ deletearray @inventorylist_id;
+ deletearray @inventorylist_amount;
+ deletearray @inventorylist_equip;
+ deletearray @inventorylist_refine;
+ deletearray @inventorylist_identify;
+ deletearray @inventorylist_attribute;
+ deletearray @inventorylist_card1;
+ deletearray @inventorylist_card2;
+ deletearray @inventorylist_card3;
+ deletearray @inventorylist_card4;
+ deletearray @inventorylist_expire;
+ deletearray @inventorylist_bound;
+ @inventorylist_count=0;
+ return;
+}
+
+// Get some acc id, even if offline
+// ( Name )
+function script gf_accid {
+ .@nb = query_sql("SELECT `account_id` FROM `char` WHERE `name`='"+escape_sql(getarg(0))+"' LIMIT 1", .@value);
+ return .@value[0];
+}
+
+// Get some char id, even if offline
+// ( Name )
+function script gf_charnameid {
+ .@nb = query_sql("SELECT `char_id` FROM `char` WHERE `name`='"+escape_sql(getarg(0))+"' LIMIT 1", .@value);
+ return .@value[0];
+}
+
+// Get some char name from char ID, even if offline
+// ( Name )
+function script gf_charname {
+ .@nb = query_sql("SELECT `name` FROM `char` WHERE `char_id`="+escape_sql(getarg(0))+" LIMIT 1", .@value$);
+ return .@value$[0];
+}
+
+// Get some char ID from account ID, even if offline
+// ( Name )
+function script gf_charid {
+ .@nb = query_sql("SELECT `char_id` FROM `char` WHERE `account_id`="+escape_sql(getarg(0))+" LIMIT 1", .@value$);
+ return .@value$[0];
+}
+
+// Request pincode and validate it. Use any non-4-digits code to cancel. Failure will dc you.
+// Returns 1 if pin check is OK.
+function script validatepin {
+ if (#FIRST_TIME < 2) {
+ mesc l("ERROR: You must set a PinCode to make use of this function."), 1;
+ return 0;
+ }
+ mesc l("Please insert your pincode."), 1;
+ mesc l("WARNING: If you insert wrong pincode, you'll be disconnected.");
+ mesc l("Use @@ to cancel.", "##B-1##b");
+ mes "";
+ input .@pin$;
+ if (getstrlen(.@pin$) != 4)
+ return 0;
+ query_sql("SELECT userid FROM `login` WHERE account_id="+escape_sql(getcharid(3))+" AND pincode='"+escape_sql(.@pin$)+"' LIMIT 2", .@value$);
+ if (getarraysize(.@value$) != 1) {
+ atcommand "@kick "+strcharinfo(0);
+ return 0;
+ }
+ // Enforce some cooldown to prevent an eventual exploit/abuse
+ sleep2(rand2(150, 400));
+ mesc l("Thanks, @@. We just wanted to be sure it was you.", .@value$[0]);
+ mes "";
+ return true;
+}
+
+// Something went wrong and must be reported (named after raise Exception in python)
+// Exception( BugID, {Flags{, Return Code}} )
+function script Exception {
+ // Fill variable
+ .@msg$=getarg(0);
+ .@gf=getarg(1,RB_DEFAULT);
+
+ if (.@gf & RB_DISPBOTTOM)
+ dispbottom("ERROR: "+.@msg$);
+
+ if (.@gf & RB_DEBUGMES)
+ debugmes("[Warning] "+.@msg$);
+
+ if (.@gf & RB_SPEECH)
+ mesc("ERROR, REPORT ME! "+.@msg$, 1);
+
+ if (.@gf & RB_IRCBROADCAST)
+ channelmes("#world", "Error in script: "+.@msg$);
+
+ if (.@gf & RB_GLOBALANNOUNCE)
+ announce("Error in script: "+.@msg$, bc_all);
+
+ if (.@gf & RB_PLEASEREPORT) {
+ if (.@gf & RB_DISPBOTTOM)
+ dispbottom("Please take a screenshot and report this bug, explaining how it happened.");
+
+ if (.@gf & RB_SPEECH)
+ mesc("Please take a screenshot and report this bug, explaining how it happened."), 1;
+ }
+
+ if (.@gf & RB_ISFATAL) {
+ if (.@gf & RB_DISPBOTTOM)
+ dispbottom("This error is fatal, we stop execution.");
+
+ if (.@gf & RB_DEBUGMES)
+ debugmes("[Error] The error is fatal.");
+
+ if (.@gf & RB_SPEECH) {
+ mesc l("This error is fatal, we stop execution."), 1;
+ close;
+ }
+ end;
+ }
+
+ return getarg(2, 0);
+}
+
+// mescordialog(text, color, {dialog=1})
+function script mescordialog {
+ if (getarg(2, true))
+ mesc getarg(0), getarg(1);
+ else
+ dispbottom col(getarg(0), getarg(1));
+ return;
+}
+
+// Delayed healing. Takes 3~5 seconds. Variates with Vit up to +100%.
+// The vit can have an additional 20% bonus as well.
+function script itheal {
+ .@bas=getarg(0);
+ .@vit=readbattleparam(getcharid(3), UDT_VIT);
+ .@vit=cap_value(.@vit-1, 0, 100);
+ if (getargcount() > 2)
+ .@tim=getarg(3);
+ else
+ .@tim=rand2(3,5);
+ .@min=.@bas*(100+.@vit)/100;
+ .@max=.@bas*(100+.@vit*120/100)/100;
+ // Now divide the HP values by the time
+ .@min=max(1, .@min/.@tim);
+ .@max=max(1, .@max/.@tim);
+ callfunc("SC_Bonus", .@tim, SC_S_LIFEPOTION, .@min, .@max);
+ if (getarg(1,0) > 0)
+ heal 0, getarg(1, 0);
+ return;
+}
+
+// sqldate({day variation, month variation})
+function script sqldate {
+ .@d=gettime(GETTIME_DAYOFMONTH)+getarg(0, 0);
+ .@m=gettime(GETTIME_MONTH)+getarg(1, 0);
+ .@y=gettime(GETTIME_YEAR);
+ // Overflow prevention
+ if (.@d <= 0) {
+ .@d=1;
+ }
+ while (.@m > 12) {
+ .@y+=1;
+ .@m-=12;
+ }
+ while (.@m < 1) {
+ .@y-=1;
+ .@m+=12;
+ }
+ .@strdate$=sprintf("%04d-%02d-%02d %02d:%02d:%02d", .@y, .@m, .@d, gettime(GETTIME_HOUR), gettime(GETTIME_MINUTE), gettime(GETTIME_SECOND));
+ return .@strdate$;
+}
+
+// Makes a monster aggro
+// set_aggro( monster{, mode=MD_AGGRESSIVE} )
+function script set_aggro {
+ .@m=getarg(0);
+ .@x=getarg(1, MD_AGGRESSIVE);
+ .@op=getunitdata(.@m, UDT_MODE);
+ .@op=.@op|.@x;
+ setunitdata(.@m, UDT_MODE, .@op);
+ return;
+}
+
+// Special function which makes a date as a number
+// numdate( - )
+function script numdate {
+ .@strdate$=sprintf("%04d%02d%02d", gettime(GETTIME_YEAR), gettime(GETTIME_MONTH), gettime(GETTIME_DAYOFMONTH));
+ // Debug payload
+ if ($@OVERRIDE_NUMDATE)
+ return $@OVERRIDE_NUMDATE;
+ return atoi(.@strdate$);
+}
+
+// json_encode( {varname, varvalue}, {varname 2, varvalue 2}... )
+// returns string
+function script json_encode {
+ if (getargcount() < 2 || getargcount() % 2 != 0)
+ return Exception("json_encode arguments must be paired");
+
+ .@json$="{";
+ .@tab=true;
+
+ // For arguments
+ for (.@i=0;.@i < getargcount(); .@i++) {
+ // Close previous item
+ if (.@tab)
+ .@tab=false;
+ else
+ .@json$+=",";
+
+ // Input variable name
+ .@json$+="\""+getarg(.@i)+"\": ";
+
+ // Input variable value
+ if (isstr(getarg(.@i+1)))
+ .@json$+="\""+getarg(.@i+1)+"\"";
+ else
+ .@json$+=getarg(.@i+1);
+
+ // Advance
+ .@i++;
+ }
+
+ // Close the JSON
+ .@json$+="}";
+ return .@json$;
+}
+
+
+// api_send( code, data )
+// sends to API
+function script api_send {
+ .@cde=getarg(0);
+ .@fm$=escape_sql(getarg(1));
+ query_sql("INSERT INTO `api_export` (`type`, `data`) VALUES ('"+.@cde+"', \""+.@fm$+"\")");
+ return;
+}
+
+// Linking functions
+/////////////////////////////////////////////
+function script getquestlink {
+ return "[@@q" + getarg(0) + "|@@]";
+}
+
+function script getmonsterlink {
+ return "[@@m" + getarg(0) + "|@@]";
+}
+
+function script getpetlink {
+ return "[@@p" + getarg(0) + "|@@]";
+}
+
+function script getmercenarylink {
+ return "[@@M" + getarg(0) + "|@@]";
+}
+
+function script gethomunculuslink {
+ return "[@@h" + getarg(0) + "|@@]";
+}
+
+// Legacy functions
+/////////////////////////////////////////////
+function script mapexit {
+ debugmes "TRYING TO MAPEXIT IS DEPRECATED";
+ return;
+}
+
+function script destroy {
+ disablenpc strnpcinfo(0);
+ return;
+}
+
+function script npcaction {
+ debugmes "Deprecated unitaction (did you mean npcsit; or whatever?)";
+ .@a=getarg(0, 0);
+ if (.@a == 9)
+ clear;
+ return;
+}
+
+function script gmlog {
+ logmes(getarg(0), LOGMES_ATCOMMAND);
+ return;
+}
+
+function script getx {
+ getmapxy(.@m$, .@x, .@y, 0);
+ return .@x;
+}
+
+function script gety {
+ getmapxy(.@m$, .@x, .@y, 0);
+ return .@y;
+}
+
+function script getnpcx {
+ return .x;
+}
+
+function script getnpcy {
+ return .y;
+}
+
+function script title {
+ setnpcdialogtitle getarg(0);
+ return;
+}
+
+function script camera {
+ if (getarg(0, "") != "")
+ setcamnpc getarg(0);
+ else
+ restorecam;
+ return;
+}
+
+function script mapmask {
+ sendmapmask getarg(0);
+ return;
+}
+
+function script getmask {
+ return 1; //getmapmask(getmapname()); // TODO: Return original map masks
+}
+
+// isat( map, x, y )
+function script isat {
+ return isin(getarg(0), getarg(1), getarg(2), 0);
+}
+
+function script if_then_else {
+ return (getarg(0) ? getarg(1) : getarg(2));
+}
+
+function script misceffect {
+ // or SELF + something
+ return specialeffect(getarg(0), AREA, getarg(1, strnpcinfo(0)));
+}
+
+function script fakenpcname {
+ if (getargcount() > 2)
+ setnpcdisplay(getarg(0), getarg(1), getarg(2));
+ else
+ setnpcdisplay(getarg(0), getarg(1));
+ return;
+}
+
+function script npcwarp {
+ if (getargcount() > 2)
+ .@id=getnpcid(getarg(3));
+ else
+ .@id=getnpcid();
+
+ getmapxy(.@m$, .@x, .@y, UNITTYPE_NPC, strnpcinfo(0, "", .@id));
+ unitwarp(.@id, .@m$, getarg(0), getarg(1));
+ return;
+}
+
+function script get {
+ return getvariableofnpc(getarg(0), getarg(1));
+}
+
+function script sc_check {
+ return getstatus(getarg(0), getarg(1, 0));
+}
+
+function script wgm {
+ charcommand("@request "+getarg(0));
+ return;
+}
+
+function script registercmd {
+ // Remove "@" from command start
+ .@cmd$=getarg(1);
+ if (charat(.@cmd$, 0) == "@")
+ delchar(.@cmd$, 0);
+ bindatcmd getarg(0), .@cmd$, getarg(2, 0);
+ return;
+}
+
+function script iscollision {
+ return checknpccell(getarg(0), getarg(1), getarg(2), cell_chkpass);
+}
+
+function script readparam2 {
+ return readbattleparam(getcharid(3), getarg(0));
+}
+
+function script updateskill {
+ skill getarg(0), getarg(1), 0;
+ return;
+}
+
+function script learnskill {
+ if (getskilllv(getarg(0)) < getarg(1, 1))
+ skill getarg(0), getarg(1, 1), 0;
+ return;
+}
+
diff --git a/npc/functions/math.txt b/npc/functions/math.txt
new file mode 100644
index 00000000..941dfa90
--- /dev/null
+++ b/npc/functions/math.txt
@@ -0,0 +1,105 @@
+// Evol functions.
+// Authors:
+// 4144
+// Reid
+// Description:
+// Math functions
+
+
+// abs(<int>)
+// returns the absolute value of the passed integer
+
+function script abs {
+ .@n = getarg(0);
+ return .@n >= 0 ? .@n : -.@n;
+}
+
+
+
+// lognbaselvl({<multiplicator>{, <min value>}})
+// returns BaseLevel * logn (BaseLevel * alpha).
+
+function script lognbaselvl {
+ .@alpha = getarg(0, 1);
+ .@min = getarg(1, 1);
+ .@ret = 0;
+ .@pc_level = BaseLevel * .@alpha;
+
+ while (.@pc_level >>= 1)
+ {
+ ++.@ret;
+ }
+ .@ret *= BaseLevel;
+
+ if (.@ret <= .@min)
+ {
+ .@ret = .@min;
+ }
+
+ return .@ret;
+}
+
+// log2(<int>)
+// returns the log base 2 of the passed integer, up to 20 (2**20=1.048.576) (round down always)
+
+function script log2 {
+ .@v=abs(getarg(0));
+ .@ok=0;
+ .@i=0;
+ if (.@v < 1)
+ return -1;
+
+ freeloop(true);
+ while (!.@ok) {
+ // exact match
+ if (2**.@i == .@v) {
+ .@ok=1;
+ // inexact match, or limit exceeded
+ } else if (2**.@i >= .@v || .@i > 20) {
+ .@ok=1;
+ .@i-=1; // round down
+ // not yet
+ } else {
+ .@i+=1;
+ }
+ }
+ freeloop(false);
+
+ return .@i;
+}
+
+
+// result is: lower < target <= higher
+// is_between ( lower, higher, target)
+function script is_between {
+ .@val=getarg(2);
+ .@min=getarg(0);
+ .@max=getarg(1);
+ return (.@min < .@val && .@val <= .@max);
+}
+
+
+// forces the equation: lower <= target <= higher.
+// Note it still works if higher and target values are swapped.
+// limit ( lower, target, higher)
+function script limit {
+ return max(getarg(0), min(getarg(1), getarg(2)));
+}
+
+
+// result is the ponderate average.
+// ponderate_avg ( arg1, sub1, arg2, sub2)
+function script ponderate_avg {
+ .@a1=getarg(0);
+ .@s1=getarg(1);
+ .@a2=getarg(2);
+ .@s2=getarg(3);
+
+ .@h1=.@a1*.@s1;
+ .@h2=.@a2*.@s2;
+ .@dd=.@s1+.@s2;
+
+ return (.@h1+.@h2)/.@dd;
+}
+
+
diff --git a/npc/functions/miriam.txt b/npc/functions/miriam.txt
new file mode 100644
index 00000000..e59b736b
--- /dev/null
+++ b/npc/functions/miriam.txt
@@ -0,0 +1,17 @@
+function script MiriamGoal {
+ if (QUEST_MIRIAM_run > 0)
+ QUEST_MIRIAM_run = 0 - (gettimetick(2) - QUEST_MIRIAM_run);
+ return;
+}
+
+function script MiriamExpire {
+ if (QUEST_MIRIAM_run > 0)
+ set QUEST_MIRIAM_run, 0 - 2; // force failute (expired)
+ return;
+}
+
+function script MiriamCheat {
+ if (QUEST_MIRIAM_run > 0)
+ set QUEST_MIRIAM_run, 0 - 1; // force failure (cheating)
+ return;
+}
diff --git a/npc/functions/mob_points.txt b/npc/functions/mob_points.txt
new file mode 100644
index 00000000..f4cbedf0
--- /dev/null
+++ b/npc/functions/mob_points.txt
@@ -0,0 +1,83 @@
+// TMW2 Scripts
+// Author: Crazyfefe
+// Jesusalva
+// Desc: Mob Points for Aidan & Ishi. You will gain MONSTER-LEVEL mob points.
+
+// fix_mobkill(mobID) → Manual fix for scripted mobs
+function script fix_mobkill {
+ killedrid=getarg(0);
+ doevent "#GlobalHandler::OnNPCKillEvent";
+ return;
+}
+
+function script MobPoints {
+ $MONSTERS_KILLED+=1;
+ MONSTERS_KILLED+=1;
+ @mobId=killedrid;
+
+ if (MPQUEST) {
+ .@moblv=strmobinfo(3,killedrid);
+
+ // You get MobLv + 20% as MobPoints.
+ // So a level 100 monster gives you 120 MobPt. Slimes gives no bonus.
+ if (compare("slime", strtolower(strmobinfo(1, killedrid))))
+ .@addval=.@moblv;
+ else
+ .@addval=.@moblv*12/10;
+
+ // Penalty/Bonus
+ .@base=(.@moblv-BaseLevel);
+
+ if (BaseLevel < .@moblv) {
+ // Target is stronger, +3% per monster level, capped at +75%
+ .@addval = .@addval * limit(100, 100+(.@base*3), 175) / 100;
+ } else if (BaseLevel > .@moblv) {
+ // Target is weaker, -1% per monster level, capped at -50%
+ .@addval = .@addval * limit(50, 101+.@base, 100) / 100;
+ }
+
+ // Sanitization
+ .@addval=max(0, .@addval);
+
+ // Grant you the Monster Points
+ Mobpt+=.@addval;
+ }
+
+ ValonCount();
+ if (((getq(CandorQuest_Valon) >= 2) &&
+ (getq(CandorQuest_Valon) < 6)) &&
+ (@mobId == $@ValonMob[@valon_mob]))
+ AddValonCntMask();
+
+
+ // Attitude adjustment for Sagatha
+ switch (@mobId) {
+ case 1018:
+ case 1020:
+ case 1027:
+ case 1094:
+ case 1112:
+ case 1113:
+ QuestSagathaAnnoy(3); break;
+ case 1028:
+ QuestSagathaAnnoy(4); break;
+ case 1038:
+ QuestSagathaAnnoy(2); break;
+ case 1003:
+ case 1004:
+ case 1009:
+ case 1057:
+ case 1104:
+ case 1105:
+ case 1106:
+ case 1107:
+ QuestSagathaHappy(1); break;
+ }
+
+ if (QL_CELESTIA >= 5 && QL_CELESTIA < 205 && @mobId == Yeti) {
+ QL_CELESTIA = QL_CELESTIA + 1;
+ if (QL_CELESTIA == 205)
+ message strcharinfo(0), "Yeti : ##3This should be enough yetis killed to please Celestia.";
+ }
+ return;
+}
diff --git a/npc/functions/motd.txt b/npc/functions/motd.txt
new file mode 100644
index 00000000..5ff58480
--- /dev/null
+++ b/npc/functions/motd.txt
@@ -0,0 +1,10 @@
+function script MOTD {
+ setarray $@MOTD$,
+
+ "Welcome to The Mana World! (running on tmwAthena)",
+ "[@@http://ow.ly/MCesp|Website & Wiki@@] [@@http://ow.ly/MCeBR|Vote For GMs@@] [@@http://ow.ly/MCehc|Bug Reports@@] [@@http://ow.ly/MCe5W|Live Support@@]",
+ "Like us on [@@http://ow.ly/MCdZW|Facebook@@] [@@http://ow.ly/MCdTt|G+@@] [@@http://ow.ly/MCdJR|Youtube@@] [@@http://ow.ly/MCePp|Twitter@@]",
+ "You can report abuse by typing in chat: @wgm Player XYZ is abusing me";
+
+ return;
+}
diff --git a/npc/functions/motdconfig.txt b/npc/functions/motdconfig.txt
new file mode 100644
index 00000000..dcb54dcc
--- /dev/null
+++ b/npc/functions/motdconfig.txt
@@ -0,0 +1,38 @@
+function script MOTDConfig {
+ mes "[MOTD]";
+ mes "lines:";
+ mes "---";
+ @line = 0;
+ callsub S_Lines;
+ mes "---";
+ mes "Enabled: " + !($@MOTD_Disabled);
+ next;
+ menu
+ "toggle|Toggle MOTD", L_Toggle;
+
+L_Toggle:
+ gmlog strcharinfo(0) + " enabled or disabled the MOTD.";
+ $@MOTD_Disabled = !$@MOTD_Disabled;
+ close2;
+ return;
+
+S_Lines:
+ mes @line + ": "+ $@MOTD$[@line];
+ @line = @line + 1;
+ if(@line != getarraysize($@MOTD$)) goto S_Lines;
+ return;
+}
+
+function script DisplayMOTD {
+ if($@MOTD_Disabled || $@MOTD$[0] == "") goto L_Return;
+ goto L_MOTD;
+
+L_MOTD:
+ message strcharinfo(0), "Server : " + $@MOTD$[@motd_index];
+ @motd_index = @motd_index + 1;
+ if($@MOTD$[@motd_index] == "") goto L_Return;
+ goto L_MOTD;
+
+L_Return:
+ return;
+}
diff --git a/npc/functions/npcmove.txt b/npc/functions/npcmove.txt
new file mode 100644
index 00000000..612ab036
--- /dev/null
+++ b/npc/functions/npcmove.txt
@@ -0,0 +1,142 @@
+// Evol functions.
+// Author:
+// 4144
+// Description:
+// Moving npc utility functions
+// Variables:
+// none
+
+function script initpath {
+ deletearray getvariableofnpc(.movepathcmd$, strnpcinfo(3));
+ deletearray getvariableofnpc(.movepathy, strnpcinfo(3));
+ deletearray getvariableofnpc(.movepathx, strnpcinfo(3));
+ .@cnt = 0;
+
+ for (.@f = 0; .@f < getargcount(); .@f = .@f + 3)
+ {
+ set getvariableofnpc(.movepathcmd$[.@cnt], strnpcinfo(3)), getarg(.@f);
+ set getvariableofnpc(.movepathx[.@cnt], strnpcinfo(3)), getarg(.@f + 1);
+ set getvariableofnpc(.movepathy[.@cnt], strnpcinfo(3)), getarg(.@f + 2);
+ .@cnt ++;
+ }
+ //debugmes "array size: " + str(getarraysize(getvariableofnpc(.movepath, strnpcinfo(3))));
+ return;
+}
+
+function script domoveaction {
+ //debugmes "domoveaction: " + str(getvariableofnpc(.movepos, strnpcinfo(3)));
+ .@pos = getvariableofnpc(.movepos, strnpcinfo(3));
+ if (.@pos >= getarraysize(getvariableofnpc(.movepathx, strnpcinfo(3))) || .@pos < 0)
+ return;
+ //debugmes "walking";
+ .@cmd$ = getvariableofnpc(.movepathcmd$[.@pos], strnpcinfo(3));
+ //debugmes "cmd: " + .@cmd$;
+
+ if (.@cmd$ == "move")
+ {
+ npcwalkto getvariableofnpc(.movepathx[.@pos], strnpcinfo(3)), getvariableofnpc(.movepathy[.@pos], strnpcinfo(3));
+ }
+ else if (.@cmd$ == "dir")
+ {
+ setnpcdir getvariableofnpc(.movepathx[.@pos], strnpcinfo(3));
+ return 2;
+ }
+ else if (.@cmd$ == "wait")
+ {
+ set getvariableofnpc(.waitticks, strnpcinfo(3)), getvariableofnpc(.movepathx[.@pos], strnpcinfo(3));
+ }
+ else if (.@cmd$ == "emote")
+ {
+ unitemote getnpcid(), getvariableofnpc(.movepathx[.@pos], strnpcinfo(3));
+ return 2;
+ }
+ else if (.@cmd$ == "class")
+ {
+ .class = getvariableofnpc(.movepathx[.@pos], strnpcinfo(3));
+ return 2;
+ }
+ else if (.@cmd$ == "warp")
+ {
+ movenpc strnpcinfo(3), getvariableofnpc(.movepathx[.@pos], strnpcinfo(3)), getvariableofnpc(.movepathy[.@pos], strnpcinfo(3));
+ }
+ else if (.@cmd$ == "goto")
+ {
+ set getvariableofnpc(.movepos, strnpcinfo(3)), getvariableofnpc(.movepathx[.@pos], strnpcinfo(3));
+ return 0;
+ }
+ else if (.@cmd$ == "rmove")
+ {
+ getmapxy(.@mapName$, .@x, .@y, 1);
+ npcwalkto .@x + getvariableofnpc(.movepathx[.@pos], strnpcinfo(3)), .@y + getvariableofnpc(.movepathy[.@pos], strnpcinfo(3));
+ }
+ else if (.@cmd$ == "speed")
+ {
+ .speed = getvariableofnpc(.movepathx[.@pos], strnpcinfo(3));
+ return 2;
+ }
+ else if (.@cmd$ == "sit")
+ {
+ npcsit;
+ }
+ else if (.@cmd$ == "stand")
+ {
+ npcstand;
+ }
+ return 1;
+}
+
+function script movetonextpos {
+ .@wait = getvariableofnpc(.waitticks, strnpcinfo(3));
+ if (.@wait > 0)
+ {
+ .@wait --;
+ //debugmes "wait";
+ set getvariableofnpc(.waitticks, strnpcinfo(3)), .@wait;
+ return;
+ }
+ .@true = 1;
+ while (.@true)
+ {
+ .@true = 0;
+ .@pos = getvariableofnpc(.movepos, strnpcinfo(3));
+ //debugmes "movetonextpos: " + str(.@pos);
+ .@res = domoveaction(.@pos);
+ if (.@res == 1 || .@res == 2)
+ {
+ .@pos++;
+ if (.@pos >= getarraysize(getvariableofnpc(.movepathx, strnpcinfo(3))))
+ .@pos = 0;
+ set getvariableofnpc(.movepos, strnpcinfo(3)), .@pos;
+ }
+ if (.@res == 0 || .@res == 2)
+ {
+ .@true = 1;
+ }
+ }
+ return;
+}
+
+function script initialmove {
+ set getvariableofnpc(.movepos, strnpcinfo(3)), 0;
+ set getvariableofnpc(.waitticks, strnpcinfo(3)), -1;
+ movetonextpos;
+ return;
+}
+
+function script getmovecmd {
+ .@pos = getvariableofnpc(.movepos, strnpcinfo(3));
+ if (.@pos >= getarraysize(getvariableofnpc(.movepathx, strnpcinfo(3))) || .@pos < 0)
+ return "";
+ return getvariableofnpc(.movepathcmd$[.@pos], strnpcinfo(3));
+}
+
+function script domovestep {
+ if (isunitwalking())
+ {
+ initnpctimer;
+ end;
+ }
+ movetonextpos;
+ initnpctimer;
+ end;
+}
diff --git a/npc/functions/npcmovegraph.txt b/npc/functions/npcmovegraph.txt
new file mode 100644
index 00000000..0877b748
--- /dev/null
+++ b/npc/functions/npcmovegraph.txt
@@ -0,0 +1,489 @@
+// Evol functions.
+// Author:
+// Travolta
+// Description:
+// Moving npc utility functions (graph-based)
+// Variables:
+// none
+
+function script initmovegraph {
+ deletearray getvariableofnpc(.movegraphcmd$, strnpcinfo(3));
+ deletearray getvariableofnpc(.movegraphlabels$, strnpcinfo(3));
+ deletearray getvariableofnpc(.movegraphweight, strnpcinfo(3));
+ deletearray getvariableofnpc(.movegraphflags, strnpcinfo(3));
+ deletearray getvariableofnpc(.movepos_y1, strnpcinfo(3));
+ deletearray getvariableofnpc(.movepos_x1, strnpcinfo(3));
+ deletearray getvariableofnpc(.movepos_x2, strnpcinfo(3));
+ deletearray getvariableofnpc(.movepos_y2, strnpcinfo(3));
+ .@cnt = 0;
+
+ for (.@f = 0; .@f < getargcount();)
+ {
+ set getvariableofnpc(.movegraphlabels$[.@cnt], strnpcinfo(3)), getarg(.@f++);
+ set getvariableofnpc(.movepos_x1[.@cnt], strnpcinfo(3)), getarg(.@f++);
+ set getvariableofnpc(.movepos_y1[.@cnt], strnpcinfo(3)), getarg(.@f++);
+ if (!isstr(getarg(.@f, "label")))
+ {
+ set getvariableofnpc(.movepos_x2[.@cnt], strnpcinfo(3)), getarg(.@f++);
+ set getvariableofnpc(.movepos_y2[.@cnt], strnpcinfo(3)), getarg(.@f++);
+ }
+ .@cnt ++;
+ }
+ return;
+}
+
+function script findmovegraphlabel {
+ if (!getargcount())
+ {
+ debugmes "findmovegraphlabel: no argument";
+ return -1;
+ }
+ if (!isstr(getarg(0)))
+ {
+ debugmes "findmovegraphlabel: need string argument";
+ return -1;
+ }
+
+ .@arg$ = getarg(0);
+ for (.@i = 0; .@i < getarraysize(getvariableofnpc(.movegraphlabels$, strnpcinfo(3))); .@i++)
+ {
+ if (getvariableofnpc(.movegraphlabels$[.@i], strnpcinfo(3)) == .@arg$)
+ return .@i;
+ }
+
+ npcdebug "findmovegraphlabel: label not found: " + getarg(0);
+ return -1;
+}
+
+/* setmovegraphcmd(fromPositionLabel,toPositionLabel[,moveChanceWeight[,moveFlags]],postCommand, ...);
+ * This function manipulates NPC moving graph. Before calling it, make sure
+ * `initmovegraph' was called. The function accepts 3-5 parameters (many times):
+ * fromPositionLabel, toPositionLabel -- starting and ending position of NPC move
+ * moveChanceWeight -- positive integer, represents the chance of moving in given direction. (optional)
+ * moveFlags -- if .mg_flags & moveFlags != 0, move is possible. (optional)
+ * postCommand -- either "moveon" (start moving to next location straight after arriving from
+ * fromPositionLabel to toPositionLabel) or a semicolon-separated set of commands
+ * ("wait 3", "emote 5" etc, see `execmovecmd') that will be executed after arrival.
+ * The commands don't have to end with ";moveon", it's executed in the end by default.
+ */
+function script setmovegraphcmd {
+ .@size = getarraysize(getvariableofnpc(.movepos_x1, strnpcinfo(3)));
+
+ for (.@f = 0; .@f < getargcount();)
+ {
+ .@from = findmovegraphlabel(getarg(.@f++));
+ .@to = findmovegraphlabel(getarg(.@f++));
+ .@weight = 1;
+ if (!isstr(getarg(.@f)))
+ .@weight = getarg(.@f++);
+ .@flags = 0xffff;
+ if (!isstr(getarg(.@f)))
+ .@flags = getarg(.@f++);
+ .@cmd$ = getarg(.@f++);
+ .@index = .@from * .@size + .@to; // emulation of 2d array
+ set getvariableofnpc(.movegraphcmd$[.@index], strnpcinfo(3)), .@cmd$;
+ set getvariableofnpc(.movegraphweight[.@index], strnpcinfo(3)), .@weight;
+ set getvariableofnpc(.movegraphflags[.@index], strnpcinfo(3)), .@flags;
+ }
+ return;
+}
+
+function script execmovecmd {
+
+ explode(.@cmd$, getarg(0), " ");
+
+ if (.@cmd$[0] == "moveon")
+ {
+ return 0;
+ }
+ else if (.@cmd$[0] == "dir")
+ {
+ .dir = atoi(.@cmd$[1]);
+ }
+ else if (.@cmd$[0] == "sit")
+ {
+ npcsit;
+ }
+ else if (.@cmd$[0] == "stand")
+ {
+ npcstand;
+ }
+ else if (.@cmd$[0] == "wait")
+ {
+ set getvariableofnpc(.waitticks, strnpcinfo(3)), atoi(.@cmd$[1]);
+ return 1;
+ }
+ else if (.@cmd$[0] == "emote")
+ {
+ unitemote getnpcid(), atoi(.@cmd$[1]);
+ }
+ else if (.@cmd$[0] == "class")
+ {
+ .class = atoi(.@cmd$[1]);
+ }
+ else if (.@cmd$[0] == "warp")
+ {
+ .@pos = -1;
+ .@map$ = "";
+ .@pos_idx = 1;
+ if (getarraysize(.@cmd$) == 3)
+ {
+ .@map$ = .@cmd$[1];
+ .@pos_idx = 2;
+ }
+ .@pos = findmovegraphlabel(.@cmd$[.@pos_idx]);
+ if (.@pos != -1)
+ {
+ .@x = getvariableofnpc(.movepos_x1[.@pos], strnpcinfo(3));
+ .@y = getvariableofnpc(.movepos_y1[.@pos], strnpcinfo(3));
+ if (getstrlen(.@map$) > 0)
+ unitwarp getnpcid(), .@map$, .@x, .@y;
+ else
+ movenpc strnpcinfo(3), .@x, .@y;
+ set getvariableofnpc(.movepos, strnpcinfo(3)), .@pos;
+ }
+ else
+ {
+ debugmes "execmovecmd: unknown WARP destination label: " + .@cmd$[1];
+ }
+ }
+ else if (.@cmd$[0] == "call")
+ {
+ switch (getarraysize(.@cmd$))
+ {
+ case 1:
+ debugmes "execmovecmd: CALL command needs some parameters";
+ return 0;
+ case 2:
+ return callfunc(.@cmd$[1]);
+ break;
+ case 3:
+ return callfunc(.@cmd$[1], .@cmd$[2]);
+ case 4:
+ default:
+ return callfunc(.@cmd$[1], .@cmd$[2], .@cmd$[3]);
+ }
+ }
+ else if (.@cmd$[0] == "speed")
+ {
+ .speed = atoi(.@cmd$[1]);
+ }
+ else if (.@cmd$[0] == "say")
+ {
+ deletearray .@cmd$[0], 1;
+ .@msg$=implode(.@cmd$, " ");
+ if (.@msg$ != "" && .@msg$ != " ")
+ npctalk .@msg$;
+ else
+ debugmes "Invalid message passed to execmovecmd/npctalk";
+ }
+ else if (.@cmd$[0] == "debugmes")
+ {
+ deletearray .@cmd$[0], 1;
+ debugmes implode(.@cmd$, " ");
+ }
+ else if (.@cmd$[0] == "flags")
+ {
+ set getvariableofnpc(.mg_flags, strnpcinfo(3)), axtoi(.@cmd$[1]);
+ }
+ else if (.@cmd$[0] == "flags_0")
+ {
+ .@flags = getvariableofnpc(.mg_flags, strnpcinfo(3));
+ .@flags &= ~axtoi(.@cmd$[1]);
+ set getvariableofnpc(.mg_flags, strnpcinfo(3)), .@flags;
+ }
+ else if (.@cmd$[0] == "flags_1")
+ {
+ .@flags = getvariableofnpc(.mg_flags, strnpcinfo(3));
+ .@flags |= axtoi(.@cmd$[1]);
+ set getvariableofnpc(.mg_flags, strnpcinfo(3)), .@flags;
+ }
+ else
+ {
+ debugmes "Unknown move graph cmd: " + .@cmd$[0];
+ }
+ return 0;
+}
+
+function script getnextmovecmd {
+ .@cmds$ = getvariableofnpc(.nextcmd$, strnpcinfo(3));
+ .@firstCmd$ = .@cmds$;
+ .@restCmd$ = "moveon";
+ .@index = strpos(.@cmds$, ";");
+ if (.@index >= 0)
+ {
+ .@firstCmd$ = substr(.@cmds$, 0, .@index - 1);
+ .@restCmd$ = substr(.@cmds$, .@index + 1, getstrlen(.@cmds$) - 1);
+ }
+ // npcdebug "firstCmd = " + .@firstCmd$ + " restCmd = " + .@restCmd$;
+ set getvariableofnpc(.nextcmd$, strnpcinfo(3)), .@restCmd$;
+ return strip(.@firstCmd$);
+}
+
+// getrandompoint(x1,y1,x2,y2)
+// -- Get a random walkable point within a map rectangle
+// x1, y1 -- top-left corner of rectangle
+// x2, y2 -- bottom-right corner of rectangle
+// Returns 0 on success and -1 on error;
+// Since we cannot return multiple values, the random
+// coordinates are stored in NPC variables .move__rand_x, .move__rand_y
+function script getrandompoint {
+ if (getargcount() < 4)
+ {
+ debugmes "error: getrandompoint(x1, y1, x2, y2) takes 4 arguments";
+ return -1;
+ }
+
+ .@max_pokes = 10;
+ .@x1 = getarg(0);
+ .@y1 = getarg(1);
+ .@x2 = getarg(2);
+ .@y2 = getarg(3);
+ .@rx = -1; .@ry = -1;
+
+ getmapxy(.@map$, .@cx, .@cy, 1); // npc location
+
+ // let's try max_pokes random cells
+ for (.@poke = 0; .@poke < .@max_pokes; .@poke++)
+ {
+ .@rx = rand(.@x1, .@x2);
+ .@ry = rand(.@y1, .@y2);
+ if (checknpccell(.@map$, .@rx, .@ry, cell_chkpass))
+ goto L_Found;
+ }
+
+ // we check each cell from random middle point to the end
+ for (;.@rx <= .@x2; .@rx++)
+ {
+ for (;.@ry <= .@y2; .@ry++)
+ if (checknpccell(.@map$, .@rx, .@ry, cell_chkpass))
+ goto L_Found;
+ .@ry = .@y1;
+ }
+
+ // we check the rectangle from beginning to end
+ for (.@rx = .@x1; .@rx <= .@x2; .@rx++)
+ for (.@ry = .@y1; .@ry <= .@y2; .@ry++)
+ if (checknpccell(.@map$, .@rx, .@ry, cell_chkpass))
+ goto L_Found;
+
+ // finally, if we don't find anything
+ debugmes "error: getrandompoint: cannot find walkable cell in rectangle [(" + .@x1 + "," + .@y1 + ") , (" + .@x2 + "," + .@y2 + ")]";
+ return -1;
+
+L_Found:
+ set getvariableofnpc(.move__rand_x, strnpcinfo(3)), .@rx;
+ set getvariableofnpc(.move__rand_y, strnpcinfo(3)), .@ry;
+ return 0;
+}
+
+// wrapper function for npcwalkto. It can accept 4 parameters.
+// If #3 and #4 params are set, the walkto location is chosen
+// from rectangle (x1,y1,x2,y2).
+// It sets the npc variables .move_target_x, .move_target_y
+// that are used to resume NPC walking
+// Returns 1 if walking is possible, 0 otherwise;
+function script mg_npcwalkto {
+ if (getargcount() < 2)
+ {
+ debugmes "usage: mg_npcwalkto(x1,y1[,x2,y2])";
+ return -1;
+ }
+
+ .@x = getarg(0);
+ .@y = getarg(1);
+ .@x2 = getarg(2);
+ .@y2 = getarg(3);
+
+ if (getargcount() >= 4 && .@x2 > 0 && .@y2 > 0)
+ if (!getrandompoint(.@x, .@y, .@x2, .@y2))
+ {
+ .@x = getvariableofnpc(.move__rand_x, strnpcinfo(3));
+ .@y = getvariableofnpc(.move__rand_y, strnpcinfo(3));
+ }
+ else
+ return 0;
+
+ if (npcwalkto(.@x, .@y))
+ {
+ set getvariableofnpc(.move_target_x, strnpcinfo(3)), .@x;
+ set getvariableofnpc(.move_target_y, strnpcinfo(3)), .@y;
+ return 1;
+ }
+ return 0;
+}
+
+function script movetonextpoint {
+ .@wait = getvariableofnpc(.waitticks, strnpcinfo(3));
+ if (.@wait > 0)
+ {
+ .@wait--;
+ set getvariableofnpc(.waitticks, strnpcinfo(3)), .@wait;
+ return;
+ }
+
+ .@nextcmd$ = "";
+ while (.@nextcmd$ != "moveon")
+ {
+ .@nextcmd$ = getnextmovecmd();
+ npcdebug " " + .@nextcmd$;
+ if (execmovecmd(.@nextcmd$))
+ return;
+ }
+
+ // choose a random path from all possible paths
+ .@size = getarraysize(getvariableofnpc(.movepos_x1, strnpcinfo(3)));
+ .@pos = getvariableofnpc(.movepos, strnpcinfo(3));
+ .@curr_flags = getvariableofnpc(.mg_flags, strnpcinfo(3));
+ .@cur = 0;
+ .@weight_sum = 0;
+ // .@dbg$ = getvariableofnpc(.movegraphlabels$[.@pos], strnpcinfo(3)) + ": ";
+
+ for (.@i = 0; .@i < .@size; .@i++)
+ {
+ .@index = .@pos * .@size + .@i;
+ .@cmd$ = getvariableofnpc(.movegraphcmd$[.@index], strnpcinfo(3));
+ .@flags = getvariableofnpc(.movegraphflags[.@index], strnpcinfo(3));
+ if (.@cmd$ != "" &&
+ .@curr_flags & .@flags)
+ {
+ .@nextpos[.@cur] = .@i;
+ .@weights[.@cur] = getvariableofnpc(.movegraphweight[.@index], strnpcinfo(3));
+ // .@dbg$ += getvariableofnpc(.movegraphlabels$[.@i], strnpcinfo(3)) + "=" + .@weights[.@cur] + " ";
+ .@weight_sum += .@weights[.@cur];
+ .@cur++;
+ }
+ }
+ // npcdebug .@dbg$;
+
+ if (!.@weight_sum)
+ {
+ npcdebug("error: cannot pick next walk point. flags=" +
+ getvariableofnpc(.mg_flags, strnpcinfo(3)));
+ return;
+ }
+
+ .@pick_tries = 0;
+L_TryPick:
+ // pick a random number based on weight_sum
+ .@rnd = rand(.@weight_sum);
+ .@k = -1; .@weight_sum = 0;
+ while (.@rnd >= .@weight_sum)
+ {
+ .@k++;
+ .@weight_sum += .@weights[.@k];
+ }
+
+ .@next_idx = .@nextpos[.@k];
+ .@next_x1 = getvariableofnpc(.movepos_x1[.@next_idx], strnpcinfo(3));
+ .@next_y1 = getvariableofnpc(.movepos_y1[.@next_idx], strnpcinfo(3));
+ .@next_x2 = getvariableofnpc(.movepos_x2[.@next_idx], strnpcinfo(3));
+ .@next_y2 = getvariableofnpc(.movepos_y2[.@next_idx], strnpcinfo(3));
+
+ if (!mg_npcwalkto(.@next_x1, .@next_y1, .@next_x2, .@next_y2))
+ {
+ if (.@pick_tries < 10)
+ {
+ .@pick_tries++;
+ goto L_TryPick;
+ }
+
+ // move to a nearby position
+ .@x1 = getvariableofnpc(.movepos_x1[.@pos], strnpcinfo(3));
+ .@y1 = getvariableofnpc(.movepos_y1[.@pos], strnpcinfo(3));
+ .@x2 = getvariableofnpc(.movepos_x2[.@pos], strnpcinfo(3));
+ .@y2 = getvariableofnpc(.movepos_y2[.@pos], strnpcinfo(3));
+ mg_npcwalkto(.@x1, .@y1, .@x2, .@y2);
+ set getvariableofnpc(.nextcmd$, strnpcinfo(3)), "wait 1";
+
+ return;
+ }
+
+ if (getvariableofnpc(.debug, strnpcinfo(3)))
+ {
+ getmapxy(.@map$, .@cx, .@cy, 1);
+ .@dist = distance(.@cx, .@cy, .@next_x1, .@next_y1);
+ npcdebug("moving to " + getvariableofnpc(.movegraphlabels$[.@next_idx], strnpcinfo(3)) +
+ " ("+ getvariableofnpc(.move_target_x, strnpcinfo(3)) +
+ "," + getvariableofnpc(.move_target_y, strnpcinfo(3)) +
+ ") [distance=" + .@dist +
+ "] flags=" + getvariableofnpc(.mg_flags, strnpcinfo(3)));
+ }
+
+ .@nextcmd$ = getvariableofnpc(.movegraphcmd$[.@pos * .@size + .@next_idx], strnpcinfo(3));
+ set getvariableofnpc(.nextcmd$, strnpcinfo(3)), .@nextcmd$;
+ set getvariableofnpc(.movepos, strnpcinfo(3)), .@next_idx;
+ return;
+}
+
+// initial actions for npc when using move graphs.
+// function can accept 2 arguments:
+// 1: action sequence, for example "speed 200; dir 4". Default is "moveon"
+// 2: start point label. Default is #0 from move graph labels
+function script firstmove {
+ .@nextcmd$ = getarg(0, "moveon");
+ .@initpos = findmovegraphlabel(getarg(1, ""));
+ if (.@initpos < 0) .@initpos = 0;
+
+ set getvariableofnpc(.movepos, strnpcinfo(3)), .@initpos;
+ movenpc strnpcinfo(3), getvariableofnpc(.movepos_x1[.@initpos], strnpcinfo(3)),
+ getvariableofnpc(.movepos_y1[.@initpos], strnpcinfo(3));
+ set getvariableofnpc(.nextcmd$, strnpcinfo(3)), .@nextcmd$;
+ set getvariableofnpc(.waitticks, strnpcinfo(3)), -1;
+ set getvariableofnpc(.mg_flags, strnpcinfo(3)), 0xffff;
+ movetonextpoint;
+ return;
+}
+
+function script npc_pausemove {
+ stopnpctimer;
+ .@move_after = 0;
+
+ if (isunitwalking())
+ {
+ .@move_after = 1;
+ npcwalkto .x, .y;
+ npcstop;
+ }
+ set getvariableofnpc(.move_after_pause, strnpcinfo(3)), .@move_after;
+
+ return 0;
+}
+
+function script npc_resumemove {
+ startnpctimer;
+
+ if (getvariableofnpc(.move_after_pause, strnpcinfo(3)))
+ {
+ .@x = getvariableofnpc(.move_target_x, strnpcinfo(3));
+ .@y = getvariableofnpc(.move_target_y, strnpcinfo(3));
+ npcwalkto .@x, .@y;
+ }
+
+ return 0;
+}
+
+// npc_turntoxy(x,y)
+// turn npc toward an object at position (x,y)
+function script npc_turntoxy {
+ .@target_x = getarg(0);
+ .@target_y = getarg(1);
+ .@dx = abs(.@target_x - .x);
+ .@dy = abs(.@target_y - .y);
+
+ if (.@dx > .@dy)
+ .dir = .@target_x >= .x ? 6 : 2;
+ else
+ .dir = .@target_y >= .y ? 0 : 4;
+
+ return 0;
+}
+
+function script dographmovestep {
+ if (!isunitwalking())
+ {
+ movetonextpoint;
+ }
+ initnpctimer;
+ end;
+}
diff --git a/npc/functions/permissions.txt b/npc/functions/permissions.txt
new file mode 100644
index 00000000..8af2cc29
--- /dev/null
+++ b/npc/functions/permissions.txt
@@ -0,0 +1,36 @@
+// Evol scripts.
+// Author:
+// gumi
+// Description:
+// checks player permissions
+// ** admins are implicitly everything
+
+// administrator
+function script is_admin {
+ return has_permission(PERM_USE_ALL_COMMANDS,
+ getarg(0, getcharid(CHAR_ID_ACCOUNT)));
+}
+
+// any staff member
+function script is_trusted {
+ return has_permission("show_client_version",
+ getarg(0, getcharid(CHAR_ID_ACCOUNT)));
+}
+
+// developer
+function script is_dev {
+ return has_permission(PERM_RECEIVE_REQUESTS,
+ getarg(0, getcharid(CHAR_ID_ACCOUNT)));
+}
+
+// event coordinator
+function script is_evtc {
+ return can_use_command("@monster",
+ getarg(0, getcharid(CHAR_ID_ACCOUNT)));
+}
+
+// game master
+function script is_gm {
+ return can_use_command("@jail",
+ getarg(0, getcharid(CHAR_ID_ACCOUNT)));
+}
diff --git a/npc/functions/process_equip.txt b/npc/functions/process_equip.txt
new file mode 100644
index 00000000..e18045ff
--- /dev/null
+++ b/npc/functions/process_equip.txt
@@ -0,0 +1,26 @@
+
+function script ProcessEquip {
+ @head = getequipid(equip_head);
+ @torso = getequipid(equip_torso);
+ @legs = getequipid(equip_legs);
+
+ @torsoB = @torso;
+ if (@torsoB >= 2050 && @torsoB <= 2059) set @torsoB, 1202; // Cotton shirt
+ if (@torsoB >= 2060 && @torsoB <= 2069) set @torsoB, 624; // V Neck
+ if (@torsoB >= 2070 && @torsoB <= 2079) set @torsoB, 564; // T Neck
+ if (@torsoB >= 2080 && @torsoB <= 2089) set @torsoB, 720; // Silk Robe
+ if (@torsoB >= 2090 && @torsoB <= 2099) set @torsoB, 688; // Tanktop
+ if (@torsoB >= 2120 && @torsoB <= 2129) set @torsoB, 689; // Short tanktop
+ @torsoC = cNone;
+ if (@torso == 1202 || @torso == 624 || @torso == 564 || @torso == 688 || @torso == 689 || @torso == 720) set @torsoC, cWhite;
+ if (@torso >= 2050) set @torsoC, @torso % 10;
+
+ @legsB = @legs;
+ if (@legsB >= 2100 && @legsB <= 2109) set @legsB, 632; // Cotton skirt
+ if (@legsB >= 2110 && @legsB <= 2119) set @legsB, 586; // Cotton shorts
+ @legsC = cNone;
+ if (@legs == 632 || @legs == 586) set @legsC, cWhite;
+ if (@legs >= 2050) set @legsC, @legs % 10;
+
+ return;
+}
diff --git a/npc/functions/quests.txt b/npc/functions/quests.txt
new file mode 100644
index 00000000..4706a517
--- /dev/null
+++ b/npc/functions/quests.txt
@@ -0,0 +1,67 @@
+// The Mana World quest functions script
+
+function script QuestSagathaHappy {
+ .@value = getarg(0, @value);
+ .@unhappiness = (QUEST_MAGIC & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT;
+ if (.@unhappiness < .@value)
+ .@unhappiness = 0;
+
+ .@unhappiness = .@unhappiness - .@value;
+
+ QUEST_MAGIC = (QUEST_MAGIC & ~NIBBLE_3_MASK) | (.@unhappiness << NIBBLE_3_SHIFT);
+ return;
+}
+
+function script QuestSagathaAnnoy {
+ .@value = getarg(0, @value);
+ .@unhappiness = (QUEST_MAGIC & NIBBLE_3_MASK) >> NIBBLE_3_SHIFT;
+ if ((.@unhappiness + .@value) > 15)
+ .@unhappiness = 15;
+
+ .@unhappiness = .@unhappiness + .@value;
+ QUEST_MAGIC = (QUEST_MAGIC & ~NIBBLE_3_MASK) | (.@unhappiness << NIBBLE_3_SHIFT);
+ return;
+}
+
+function script elanore_decrease_exp {
+ .@heal_exp = getq2(MagicQuest_Healing);
+
+ if (.@heal_exp < 8)
+ .@heal_exp = 0;
+ else
+ .@heal_exp -= 8;
+
+ setq2(MagicQuest_Healing, .@heal_exp);
+ return;
+}
+
+function script ValonCount {
+ @valon_mob = 0;
+ if (getq(CandorQuest_Valon) >= 2)
+ @valon_mob = (getq(CandorQuest_Valon) - 2);
+ @valon_count = ((STARTAREA & NIBBLE_2_MASK) >> NIBBLE_2_SHIFT);
+ return;
+}
+
+function script ResetValonCntMask {
+ STARTAREA = (STARTAREA & ~(NIBBLE_2_MASK) | (0 << NIBBLE_2_SHIFT));
+ return;
+}
+
+function script ValonProgress {
+ ValonCount();
+ if ((getq(CandorQuest_Valon) > 1) && (getq(CandorQuest_Valon) < 6))
+ message strcharinfo(0), getmonsterinfo($@ValonMob[@valon_mob], MOB_NAME) + ": " + @valon_count + "/" + $@ValonMobCnt[@valon_mob];
+ return;
+}
+
+function script AddValonCntMask {
+ @valon_tmp = (@valon_count + 1);
+ if (@valon_tmp > $@ValonMobCnt[@valon_mob])
+ @valon_tmp = $@ValonMobCnt[@valon_mob];
+ STARTAREA = (STARTAREA & ~(NIBBLE_2_MASK) | (@valon_tmp << NIBBLE_2_SHIFT));
+ @valon_tmp = 0;
+ ValonProgress();
+ return;
+}
+
diff --git a/npc/functions/quiz.txt b/npc/functions/quiz.txt
new file mode 100644
index 00000000..44227c4f
--- /dev/null
+++ b/npc/functions/quiz.txt
@@ -0,0 +1,92 @@
+
+function script MultiQuiz {
+ if((getarraysize(@quiz_answers$) != getarraysize(@quiz_questions$)) ||
+ (@quiz_answers$[0] == "") || (@quiz_questions$[0] == "")) goto L_ArrayError;
+ @setindex = 1;
+ @index = rand(0,(getarraysize(@quiz_answers$) - 1));
+ @question$ = @quiz_questions$[@index];
+ mes "\""+ @question$ + "\"";
+ next;
+ mes "Pick the correct answer.";
+ callfunc "Quiz";
+ return;
+
+L_ArrayError:
+ if(@quiz_answers$[0] == "") debugmes "@quiz_answers$ is empty";
+ if(@quiz_questions$[0] == "") debugmes "@quiz_questions$ is empty";
+ if(getarraysize(@quiz_answers$) != getarraysize(@quiz_questions$)) debugmes "Size of @quiz_answers$ is not equal to size of @quiz_questions$";
+ mapexit;
+}
+
+function script Quiz {
+ if((@choices_nr < 1) || (@choices_nr > 8)) set @choices_nr, 3;
+ if(@choices_nr > getarraysize(@quiz_answers$)) set @choices_nr, getarraysize(@quiz_answers$);
+ if(@quiz_answers$[0] == "") goto L_ArrayError;
+ @success = 0;
+ if(@setindex < 1) set @index, @answer;
+ @good = rand(0,(@choices_nr - 1));
+ setarray @choices$, "";
+ cleararray @choices$, "", getarraysize(@choices$);
+ @loop = 0;
+ goto L_Shuffle;
+
+L_Shuffle:
+ @nindex = rand(0,(getarraysize(@quiz_answers$) - 1));
+ if(@nindex == @index) goto L_Shuffle; // do not get the good definition
+ @loop2 = 0;
+ goto L_Search;
+
+L_Search:
+ if(@choices$[@loop2] == @quiz_answers$[@nindex]) goto L_Shuffle; // array is already populated with this choice
+ if(@loop2 >= (@choices_nr - 1)) goto L_Shuffle2;
+ @loop2 = @loop2 + 1;
+ goto L_Search;
+
+L_Shuffle2:
+ @choices$[@loop] = @quiz_answers$[@nindex];
+ if(@loop >= (@choices_nr - 1)) goto L_Answer;
+ @loop = @loop + 1;
+ goto L_Shuffle;
+
+L_Answer:
+ set @choices$[@good], @quiz_answers$[@index]; // set the good definition
+ menu
+ @choices$[0], L_Enter,
+ @choices$[1], L_Enter,
+ @choices$[2], L_Enter,
+ @choices$[3], L_Enter,
+ @choices$[4], L_Enter,
+ @choices$[5], L_Enter,
+ @choices$[6], L_Enter,
+ @choices$[7], L_Enter;
+
+L_Enter:
+ if(@menu != (@good + 1)) goto L_Shift;
+ @success = 1;
+ goto L_Shift;
+
+L_Shift:
+ if(@shift < @index) set @shift, @index;
+
+ if(@shift == @index) set @quiz_answers$[@index], ""; // do not allow twice the same question
+
+ if((@quiz_questions$[0] != "") && (@shift == @index)) set @quiz_questions$[@index], "";
+ if((@quiz_questions$[0] != "") && (@quiz_questions$[(@shift + 1)] != "")) set @quiz_questions$[@shift], @quiz_questions$[(@shift + 1)];
+ if((@quiz_questions$[0] != "") && (@quiz_questions$[(@shift + 1)] != "")) set @quiz_questions$[(@shift + 1)], "";
+
+ if(@quiz_answers$[(@shift + 1)] != "") set @quiz_answers$[@shift], @quiz_answers$[(@shift + 1)];
+ if(@quiz_answers$[(@shift + 1)] != "") set @quiz_answers$[(@shift + 1)], "";
+
+ @shift = @shift + 1;
+ if(@quiz_answers$[(@shift + 1)] != "") goto L_Shift;
+ @shift = 0;
+ goto L_close;
+
+L_close:
+ @answer = 0;
+ return;
+
+L_ArrayError:
+ if(@quiz_answers$[0] == "") debugmes "@quiz_answers$ is empty";
+ mapexit;
+}
diff --git a/npc/functions/random-talk.txt b/npc/functions/random-talk.txt
new file mode 100644
index 00000000..e6b6bee8
--- /dev/null
+++ b/npc/functions/random-talk.txt
@@ -0,0 +1,207 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// Description:
+// Random dialog for various random NPCs.
+
+// Functions:
+// hello
+// moubootalk
+// villagertalk
+// sailortalk
+// legiontalk
+// asleep
+
+// Evol authors (some strings and code):
+// Reid
+// Akko Teru
+// Qwerty Dragon
+
+function script hello {
+
+ switch (rand2(3)) {
+ case 0:
+ npctalkonce(l("Heya!"));
+ break;
+ case 1:
+ npctalkonce(l("Hi."));
+ break;
+ case 2:
+ if ($EVENT$ == "Christmas")
+ npctalkonce(l("Merry Christmas!"));
+ else
+ npctalkonce(l("Nice day to you."));
+ break;
+ }
+
+ return;
+}
+
+function script moubootalk {
+ switch (rand2(4)) {
+ case 0:
+ npctalkonce(l("Moooooo!"));
+ break;
+ case 1:
+ npctalkonce(l("Moo!"));
+ break;
+ case 2:
+ npctalkonce(l("Moooooooooooo!"));
+ break;
+ case 3:
+ npctalkonce(l("Moooo!"));
+ break;
+ }
+ return;
+}
+
+function script sailortalk {
+
+ .@rand = rand2(8);
+ if (.@rand == 0) goodbye;
+ if (.@rand == 1) npctalkonce(l("Arr, I'm bored!"));
+ if (.@rand == 2) npctalkonce(l("Hey! Good to hear from you!"));
+ if (.@rand == 3) npctalkonce(l("Yarr arr!"));
+ if (.@rand == 4) {
+ if ($EVENT$ == "Christmas")
+ npctalkonce(l("Merry Christmas, arr yarr!!"));
+ else {
+ speech(
+ l("A sunny and hot day,"),
+ l("a quiet place,"),
+ l("a ground!"),
+ l("What else do you need?"));
+ }
+ close;
+ }
+ if (.@rand == 5) npctalkonce(l("A-hoy matey!"));
+ if (.@rand == 6) npctalkonce(l("Arr!"));
+ if (.@rand == 7) npctalkonce(l("Howdy?"));
+
+ // just to be sure
+ closedialog;
+ close;
+ end;
+}
+
+function script villagertalk {
+
+ function darn_or_smile {
+ .@darn = rand(42);
+
+ if (.@darn < 26) {
+ emotion E_JOY;
+ hello;
+ } else if (.@darn > 26) {
+ emotion E_LOOKAWAY;
+ goodbye;
+ } else {
+ npctalkonce(l("Stop it!"));
+ }
+ return;
+ }
+
+ switch (rand2(4)) {
+ case 0:
+ darn_or_smile();
+ break;
+ case 1:
+ npctalkonce(l("It is a sunny day, don't you think?"));
+ break;
+ case 2:
+ npctalkonce(l("Go fly a kite."));
+ break;
+ case 3:
+ npctalkonce(l("I just want to live my life in peace."));
+ break;
+ default:
+ emotion E_HAPPY;
+ break;
+ }
+
+ return;
+}
+
+function script legiontalk {
+ switch (rand2(15)) {
+ case 0:
+ npctalkonce(l("Do I look like a tree? I feel like one."));
+ //speech(
+ // l("Do you feel too weak even to do damage to this areas wishy-washy wildlife?"),
+ // l("Then concentrate your anger upon the trees hereabouts, you will gain experience whilst leveling your sword skill on them."),
+ // l("Oh, and a fruit may even fall for you if you are lucky! But stay alert to pick up your drops."));
+ //close;
+ break;
+ case 1:
+ npctalkonce(l("I'm a little busy right now."));
+ break;
+ case 2:
+ npctalkonce(l("Not in the mood to chat."));
+ break;
+ case 3:
+ npctalkonce(l("My breath smells bad."));
+ break;
+ case 4:
+ npctalkonce(l("Don't distract me, I have to stay alert."));
+ break;
+ case 5:
+ npctalkonce(l("Give me some space."));
+ break;
+ case 6:
+ if ($EVENT$ == "Christmas")
+ npctalkonce(l("Merry Christmas, adventurer."));
+ else
+ npctalkonce(l("Can you please go away?"));
+ break;
+ case 7:
+ npctalkonce(l("Can't talk right now, I'm on patrol duty."));
+ break;
+ case 8:
+ npctalkonce(l("What're you looking at?!"));
+ break;
+ case 9:
+ npctalkonce(l("I can't stay here and talk all day. I have a job to do."));
+ break;
+ case 10:
+ npctalkonce(l("Keep moving pal."));
+ break;
+ case 11:
+ npctalkonce(l("So you think you're tough? A warrior must also be loyal and patient."));
+ break;
+ case 12:
+ emotion E_LOOKAWAY;
+ break;
+ case 13:
+ npctalkonce(l("Practice! There are no secrets to becoming a warrior."));
+ break;
+ case 14:
+ npctalkonce(l("There is no honor in fighting a weak opponent."));
+ break;
+ }
+
+ return;
+}
+
+function script asleep {
+ switch(rand2(5)) {
+ case 0: npctalkonce(l("Zzzzzzzzz...")); break;
+ case 1: npctalkonce(l("Rrrr... Pchhhh...")); break;
+ case 2: npctalkonce(l("Ggrmm... Grmmmm...")); break;
+ case 3: npctalkonce(l("Hm... Shhhh...")); break;
+ default: emotion(E_SLEEPY);
+ }
+ end;
+}
+
+function script studenttalk {
+ switch(rand2(6)) {
+ case 0: npctalkonce(l("I want to sleep...")); break;
+ case 1: npctalkonce(l("I have homework to do...")); break;
+ case 2: npctalkonce(l("I need to finish studying for my test...")); break;
+ case 3: npctalkonce(l("Ah, the Professors will get mad at me again...")); break;
+ case 4: npctalkonce(l("I'm a little busy right now.")); break;
+
+ default: emotion(E_SLEEPY);
+ }
+ end;
+}
diff --git a/npc/functions/scoreboards.txt b/npc/functions/scoreboards.txt
new file mode 100644
index 00000000..50a5823d
--- /dev/null
+++ b/npc/functions/scoreboards.txt
@@ -0,0 +1,273 @@
+// Moubootaur Legends Script
+// Author:
+// Jesusalva
+// Description:
+// Leaderboards
+
+// Scoreboard functions
+function script HallOfGuild {
+ mes "";
+ mes l("##BHall Of Guild Level: TOP5##b");
+ mesf("1. %s (%d)", $@hoguild_name$[0], $@hoguild_value[0]);
+ mesf("2. %s (%d)", $@hoguild_name$[1], $@hoguild_value[1]);
+ mesf("3. %s (%d)", $@hoguild_name$[2], $@hoguild_value[2]);
+ mesf("4. %s (%d)", $@hoguild_name$[3], $@hoguild_value[3]);
+ mesf("5. %s (%d)", $@hoguild_name$[4], $@hoguild_value[4]);
+ return;
+}
+
+function script HallOfFortune {
+ mes "";
+ mes l("##BHall Of Fortune: TOP15##b");
+ mesf("1. %s (%s GP)", $@hofortune_name$[0], fnum($@hofortune_value[0]));
+ mesf("2. %s (%s GP)", $@hofortune_name$[1], fnum($@hofortune_value[1]));
+ mesf("3. %s (%s GP)", $@hofortune_name$[2], fnum($@hofortune_value[2]));
+ mesf("4. %s (%s GP)", $@hofortune_name$[3], fnum($@hofortune_value[3]));
+ mesf("5. %s (%s GP)", $@hofortune_name$[4], fnum($@hofortune_value[4]));
+ mesf("6. %s (%s GP)", $@hofortune_name$[5], fnum($@hofortune_value[5]));
+ mesf("7. %s (%s GP)", $@hofortune_name$[6], fnum($@hofortune_value[6]));
+ mesf("8. %s (%s GP)", $@hofortune_name$[7], fnum($@hofortune_value[7]));
+ mesf("9. %s (%s GP)", $@hofortune_name$[8], fnum($@hofortune_value[8]));
+ mesf("10. %s (%s GP)", $@hofortune_name$[9], fnum($@hofortune_value[9]));
+ mesf("11. %s (%s GP)", $@hofortune_name$[10], fnum($@hofortune_value[10]));
+ mesf("12. %s (%s GP)", $@hofortune_name$[11], fnum($@hofortune_value[11]));
+ mesf("13. %s (%s GP)", $@hofortune_name$[12], fnum($@hofortune_value[12]));
+ mesf("14. %s (%s GP)", $@hofortune_name$[13], fnum($@hofortune_value[13]));
+ mesf("15. %s (%s GP)", $@hofortune_name$[14], fnum($@hofortune_value[14]));
+ return;
+}
+
+function script HallOfLevel {
+ mes "";
+ mes l("##BHall Of Level: TOP15##b");
+ mesf("1. %s (%d)", $@hoblvl_name$[0], $@hoblvl_value[0]);
+ mesf("2. %s (%d)", $@hoblvl_name$[1], $@hoblvl_value[1]);
+ mesf("3. %s (%d)", $@hoblvl_name$[2], $@hoblvl_value[2]);
+ mesf("4. %s (%d)", $@hoblvl_name$[3], $@hoblvl_value[3]);
+ mesf("5. %s (%d)", $@hoblvl_name$[4], $@hoblvl_value[4]);
+ mesf("6. %s (%d)", $@hoblvl_name$[5], $@hoblvl_value[5]);
+ mesf("7. %s (%d)", $@hoblvl_name$[6], $@hoblvl_value[6]);
+ mesf("8. %s (%d)", $@hoblvl_name$[7], $@hoblvl_value[7]);
+ mesf("9. %s (%d)", $@hoblvl_name$[8], $@hoblvl_value[8]);
+ mesf("10. %s (%d)", $@hoblvl_name$[9], $@hoblvl_value[9]);
+ mesf("11. %s (%d)", $@hoblvl_name$[10], $@hoblvl_value[10]);
+ mesf("12. %s (%d)", $@hoblvl_name$[11], $@hoblvl_value[11]);
+ mesf("13. %s (%d)", $@hoblvl_name$[12], $@hoblvl_value[12]);
+ mesf("14. %s (%d)", $@hoblvl_name$[13], $@hoblvl_value[13]);
+ mesf("15. %s (%d)", $@hoblvl_name$[14], $@hoblvl_value[14]);
+ return;
+}
+
+function script HallOfJob {
+ mes "";
+ mes l("##BHall Of Job Level: TOP15##b");
+ mesf("1. %s (%d)", $@hojlvl_name$[0], $@hojlvl_value[0]);
+ mesf("2. %s (%d)", $@hojlvl_name$[1], $@hojlvl_value[1]);
+ mesf("3. %s (%d)", $@hojlvl_name$[2], $@hojlvl_value[2]);
+ mesf("4. %s (%d)", $@hojlvl_name$[3], $@hojlvl_value[3]);
+ mesf("5. %s (%d)", $@hojlvl_name$[4], $@hojlvl_value[4]);
+ mesf("6. %s (%d)", $@hojlvl_name$[5], $@hojlvl_value[5]);
+ mesf("7. %s (%d)", $@hojlvl_name$[6], $@hojlvl_value[6]);
+ mesf("8. %s (%d)", $@hojlvl_name$[7], $@hojlvl_value[7]);
+ mesf("9. %s (%d)", $@hojlvl_name$[8], $@hojlvl_value[8]);
+ mesf("10. %s (%d)", $@hojlvl_name$[9], $@hojlvl_value[9]);
+ mesf("11. %s (%d)", $@hojlvl_name$[10], $@hojlvl_value[10]);
+ mesf("12. %s (%d)", $@hojlvl_name$[11], $@hojlvl_value[11]);
+ mesf("13. %s (%d)", $@hojlvl_name$[12], $@hojlvl_value[12]);
+ mesf("14. %s (%d)", $@hojlvl_name$[13], $@hojlvl_value[13]);
+ mesf("15. %s (%d)", $@hojlvl_name$[14], $@hojlvl_value[14]);
+ return;
+}
+
+function script HallOfAcorns {
+ mes "";
+ mes l("##BHall Of Acorns: TOP15##b");
+ mesc l("Only %s in storage will be counted.", getitemlink(Acorn));
+ mesf("1. %s (%d)", $@hoa_name$[0], $@hoa_value[0]);
+ mesf("2. %s (%d)", $@hoa_name$[1], $@hoa_value[1]);
+ mesf("3. %s (%d)", $@hoa_name$[2], $@hoa_value[2]);
+ mesf("4. %s (%d)", $@hoa_name$[3], $@hoa_value[3]);
+ mesf("5. %s (%d)", $@hoa_name$[4], $@hoa_value[4]);
+ mesf("6. %s (%d)", $@hoa_name$[5], $@hoa_value[5]);
+ mesf("7. %s (%d)", $@hoa_name$[6], $@hoa_value[6]);
+ mesf("8. %s (%d)", $@hoa_name$[7], $@hoa_value[7]);
+ mesf("9. %s (%d)", $@hoa_name$[8], $@hoa_value[8]);
+ mesf("10. %s (%d)", $@hoa_name$[9], $@hoa_value[9]);
+ mesf("11. %s (%d)", $@hoa_name$[10], $@hoa_value[10]);
+ mesf("12. %s (%d)", $@hoa_name$[11], $@hoa_value[11]);
+ mesf("13. %s (%d)", $@hoa_name$[12], $@hoa_value[12]);
+ mesf("14. %s (%d)", $@hoa_name$[13], $@hoa_value[13]);
+ mesf("15. %s (%d)", $@hoa_name$[14], $@hoa_value[14]);
+ return;
+}
+
+function script HallOfLethality {
+ mes "";
+ mes l("##BHall Of Lethality: TOP15##b");
+ mesc l("Special monsters are not counted.");
+ mesf("1. %s (%d)", $@hol_name$[0], $@hol_value[0]);
+ mesf("2. %s (%d)", $@hol_name$[1], $@hol_value[1]);
+ mesf("3. %s (%d)", $@hol_name$[2], $@hol_value[2]);
+ mesf("4. %s (%d)", $@hol_name$[3], $@hol_value[3]);
+ mesf("5. %s (%d)", $@hol_name$[4], $@hol_value[4]);
+ mesf("6. %s (%d)", $@hol_name$[5], $@hol_value[5]);
+ mesf("7. %s (%d)", $@hol_name$[6], $@hol_value[6]);
+ mesf("8. %s (%d)", $@hol_name$[7], $@hol_value[7]);
+ mesf("9. %s (%d)", $@hol_name$[8], $@hol_value[8]);
+ mesf("10. %s (%d)", $@hol_name$[9], $@hol_value[9]);
+ mesf("11. %s (%d)", $@hol_name$[10], $@hol_value[10]);
+ mesf("12. %s (%d)", $@hol_name$[11], $@hol_value[11]);
+ mesf("13. %s (%d)", $@hol_name$[12], $@hol_value[12]);
+ mesf("14. %s (%d)", $@hol_name$[13], $@hol_value[13]);
+ mesf("15. %s (%d)", $@hol_name$[14], $@hol_value[14]);
+ return;
+}
+
+function script HallOfAlmanach {
+ mes "";
+ mes l("##BHall Of Almanach: TOP15##b");
+ mesc l("The greatest heroes of all time");
+ mesf("1. %s (%s)", $@hob_name$[0], fnum($@hob_value[0]));
+ mesf("2. %s (%s)", $@hob_name$[1], fnum($@hob_value[1]));
+ mesf("3. %s (%s)", $@hob_name$[2], fnum($@hob_value[2]));
+ mesf("4. %s (%s)", $@hob_name$[3], fnum($@hob_value[3]));
+ mesf("5. %s (%s)", $@hob_name$[4], fnum($@hob_value[4]));
+ mesf("6. %s (%s)", $@hob_name$[5], fnum($@hob_value[5]));
+ mesf("7. %s (%s)", $@hob_name$[6], fnum($@hob_value[6]));
+ mesf("8. %s (%s)", $@hob_name$[7], fnum($@hob_value[7]));
+ mesf("9. %s (%s)", $@hob_name$[8], fnum($@hob_value[8]));
+ mesf("10. %s (%s)", $@hob_name$[9], fnum($@hob_value[9]));
+ mesf("11. %s (%s)", $@hob_name$[10], fnum($@hob_value[10]));
+ mesf("12. %s (%s)", $@hob_name$[11], fnum($@hob_value[11]));
+ mesf("13. %s (%s)", $@hob_name$[12], fnum($@hob_value[12]));
+ mesf("14. %s (%s)", $@hob_name$[13], fnum($@hob_value[13]));
+ mesf("15. %s (%s)", $@hob_name$[14], fnum($@hob_value[14]));
+ return;
+}
+
+
+// HallOfGame()
+function script HallOfGame {
+ mes l("Players Killed in PvP: %s", format_number($PLAYERS_KILLED));
+ mes l("Monsters Killed in PvE: %s", format_number($MONSTERS_KILLED));
+ mes "";
+ // season ; weather ; game time ; world story ; etc.
+ mes "";
+ mes l("Notable mentions and thanks for our [@@https://www.patreon.com/themanaworld|sponsors@@] for their continued support.");
+ mes "";
+ return;
+}
+
+
+// Main script handler for scoreboards
+- script @scoreboard NPC_HIDDEN,{
+ end;
+OnHour00:
+OnHour01:
+OnHour02:
+OnHour03:
+OnHour04:
+OnHour05:
+OnHour06:
+OnHour07:
+OnHour08:
+OnHour09:
+OnHour10:
+OnHour11:
+OnHour12:
+OnHour13:
+OnHour14:
+OnHour15:
+OnHour16:
+OnHour17:
+OnHour18:
+OnHour19:
+OnHour20:
+OnHour21:
+OnHour22:
+OnHour23:
+OnInit:
+ consolemes(CONSOLEMES_DEBUG, "Reloading scoreboards...");
+ .@nb = query_sql("select name, zeny from `char` ORDER BY zeny DESC LIMIT 15", $@hofortune_name$, $@hofortune_value);
+ .@nb = query_sql("select name, base_level from `char` ORDER BY base_level DESC LIMIT 15", $@hoblvl_name$, $@hoblvl_value);
+ .@nb = query_sql("select name, job_level from `char` ORDER BY job_level DESC LIMIT 15", $@hojlvl_name$, $@hojlvl_value);
+ .@nb = query_sql("select name, guild_lv from `guild` ORDER BY guild_lv DESC LIMIT 5", $@hoguild_name$, $@hoguild_value);
+ .@nb = query_sql("SELECT c.name, i.amount FROM `storage` AS i, `char` AS c WHERE i.nameid="+Acorn+" AND i.account_id=c.account_id AND c.char_num = 0 ORDER BY i.amount DESC LIMIT 15", $@hoa_name$, $@hoa_value);
+ .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='MONSTERS_KILLED' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 15", $@hol_name$, $@hol_value);
+ .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='BOSS_POINTS' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 15", $@hob_name$, $@hob_value);
+ consolemes(CONSOLEMES_DEBUG, "Scoreboards reloaded");
+ if (!$@SCOREBOARD_BIND) {
+ bindatcmd "scoreboard", "@scoreboard::OnCall", 0, 100, 0;
+ bindatcmd "scoreboards", "@scoreboard::OnCall", 0, 100, 0;
+ $@SCOREBOARD_BIND=true;
+ }
+ end;
+
+OnCall:
+ do {
+ clear;
+ mes l("The Mana World - Legacy");
+ mesc l("All scoreboards are updated hourly."), 1;
+ mes "";
+ select
+ l("Hall Of Fortune"),
+ l("Hall Of Base Level"),
+ l("Hall Of Job Level"),
+ l("Hall Of Guilds"),
+ l("Hall Of Lethality"),
+ l("Hall Of Almanach"),
+ l("Hall Of Acorns"),
+ l("Game Statistics"),
+ l("Personal Information"),
+ l("Quit");
+ mes "";
+ switch (@menu) {
+ case 1:
+ HallOfFortune();
+ next;
+ break;
+ case 2:
+ HallOfLevel();
+ next;
+ break;
+ case 3:
+ HallOfJob();
+ next;
+ break;
+ case 4:
+ HallOfGuild();
+ next;
+ break;
+ case 5:
+ HallOfLethality();
+ next;
+ break;
+ case 6:
+ HallOfAlmanach();
+ next;
+ break;
+ case 7:
+ HallOfAcorns();
+ next;
+ break;
+ case 8:
+ HallOfGame();
+ next;
+ break;
+ case 9:
+ ShowAbizit(true);
+ mes "";
+ mesc l("Total deaths: %s", fnum(PC_DIE_COUNTER));
+ mesc l("Boss points: %s", fnum(BOSS_POINTS));
+ mesc l("Mob points: %s", fnum(Mobpt));
+ mesc l("Total Gold: %s", fnum((Zeny+BankVault)));
+ next;
+ break;
+ default:
+ close;
+ }
+ } while (true);
+ end;
+}
+
+
diff --git a/npc/functions/slot_machine.txt b/npc/functions/slot_machine.txt
new file mode 100644
index 00000000..0d7e4d39
--- /dev/null
+++ b/npc/functions/slot_machine.txt
@@ -0,0 +1,92 @@
+// Slot Machine
+
+function script SlotMachineSymbol {
+ switch (getarg(0)) {
+ case 0:
+ mesn "%%A";
+ break;
+ case 1:
+ mesn "%%B";
+ break;
+ case 2:
+ mesn "%%C";
+ break;
+ case 3:
+ mesn "%%D";
+ break;
+ case 4:
+ mesn "%%E";
+ break;
+ case 5:
+ mesn "%%F";
+ break;
+ case 6:
+ mesn "7";
+ break;
+ default:
+ mesn "%%@";
+ break;
+ }
+ }
+
+function script SlotMachine {
+ mes "Pull the lever...";
+ next;
+ menu
+ "Pull", L_Play,
+ "Maybe later", L_close;
+
+L_Play:
+ if(countitem("CasinoCoins") < 1)
+ goto L_NoCoin;
+ delitem "CasinoCoins", 1;
+ .@Temp1 = rand(7);
+ .@Temp2 = rand(7);
+ .@Temp3 = rand(7);
+ //mes "Numbers: " + .@Temp1 + "/" + .@Temp2 + "/" + .@Temp3 + ".";
+ SlotMachineSymbol(.@Temp1);
+ SlotMachineSymbol(.@Temp2);
+ SlotMachineSymbol(.@Temp3);
+ next;
+
+ if (.@Temp1 != .@Temp2)
+ goto L_Lost;
+ if (.@Temp2 != .@Temp3)
+ goto L_Lost;
+ if (.@Temp1 != .@Temp3)
+ goto L_Lost;
+ if (CSN < 9 && rand(6) < CSN)
+ goto L_Jackpot;
+ mes "Congratulations! You won!";
+ mes "You get 10 casino coins";
+ getitem CasinoCoins, 10;
+ if (CSN < 9)
+ CSN+=1;
+ goto L_close;
+
+L_Jackpot:
+ mes "Congratulations! You won!";
+ mes "However, the slot machine";
+ mes "do not give you the coins!";
+ next;
+ mes "[Staff]";
+ mes "\"I apologize for this problem.";
+ mes "I see you are a huge client of";
+ mes "ours, so I'll give you a Monocle";
+ mes "as a token of apology.\"";
+ getitem Monocle, 1;
+ CSN = 9;
+ goto L_close;
+
+L_Lost:
+ mes "You lost!";
+ goto L_close;
+
+L_NoCoin:
+ mes "Insert coin";
+ goto L_close;
+
+L_close:
+ closeclientdialog;
+ return;
+}
diff --git a/npc/functions/soul_menhir.txt b/npc/functions/soul_menhir.txt
new file mode 100644
index 00000000..056058fa
--- /dev/null
+++ b/npc/functions/soul_menhir.txt
@@ -0,0 +1,60 @@
+function script SoulMenhir {
+ mesn l("Soul Menhir");
+ mes l("(A mystical aura surrounds this stone. You feel mysteriously attracted to it. Something tells you to touch it. What do you do?)");
+
+ select
+ l("Touch it."),
+ l("Leave it alone."),
+ rif(!countitem(HitchhikersTowel), l("I lost my towel..."));
+ mes "";
+ if (@menu == 1) goto L_Bind;
+ if (@menu == 3) goto L_Towel;
+ return;
+
+L_Towel:
+ if (TowelLastUsed > (gettimetick(2) - 1800))
+ goto L_DontPanic;
+ TowelLastUsed = gettimetick(2);
+ mesn l("Soul Menhir");
+ mes "(You touch the mysterious stone. Somehow it feels hard and soft at the same time.)";
+ getitembound HitchhikersTowel, 1, 4;
+ goto L_Return;
+
+L_Bind:
+ if (Menhir_Activated == 1)
+ goto L_Shortversion;
+
+ mesn l("Soul Menhir");
+ mes "(You touch the mysterious stone. Somehow it feels warm and cold at the same time.)";
+ mes "(Suddenly a strange sensation flows through you. It feels like your soul leaves your body and becomes one with the stone.)";
+ mes "(As suddenly as the feeling started it stops. The strange attraction is away from one moment to the next and the menhir feels like just an ordinary stone.)";
+ Menhir_Activated = 1;
+ goto L_Save;
+
+L_Shortversion:
+ mesn l("Soul Menhir");
+ mes "(A strange sensation flows through you. It feels like your soul leaves your body and becomes one with the stone. As suddenly as the feeling started it stops.)";
+ goto L_Save;
+
+L_Save:
+ if (@x == 0 && @y == 0)
+ goto L_FindPoint;
+ goto L_Do_Save;
+
+L_DontPanic:
+ message strcharinfo(0), "(A strange barrier keeps you from touching the stone at this time.)";
+ goto L_Return;
+
+L_Do_Save:
+ savepoint @map$, @x, @y;
+ goto L_Return;
+
+L_FindPoint:
+ @n = rand(getarraysize(@Xs));
+ @x = @Xs[@n];
+ @y = @Ys[@n];
+ goto L_Do_Save;
+
+L_Return:
+ return;
+}
diff --git a/npc/functions/stat_reset.txt b/npc/functions/stat_reset.txt
new file mode 100644
index 00000000..4201865a
--- /dev/null
+++ b/npc/functions/stat_reset.txt
@@ -0,0 +1,49 @@
+
+function script StatReset {
+
+
+ @Cost = BaseLevel * 100;
+
+ mes "[" + @npcname$ + "]";
+ mes "\"I have come across a spell that will";
+ mes "reset your status points.";
+ mes "Normally this spell is expensive, but";
+ mes "due to an unusual constellation of the";
+ mes "stars I can cast it very cheaply!";
+ mes "For you it will cost only "+@Cost+" gp.\"";
+ next;
+ menu
+ "Reset my stats",L_Next,
+ "Forget about it",L_Pass;
+
+L_Next:
+ if (Zeny<@Cost) goto L_NoMoney;
+ goto L_Reset;
+
+
+L_Reset:
+ Zeny = Zeny-@Cost;
+ resetstatus;
+
+ mes "[" + @npcname$ + "]";
+ mes "\"There you are.";
+ mes "";
+ mes "Good as new!\"";
+ goto L_Return;
+
+L_Pass:
+ mes "[" + @npcname$ + "]";
+ mes "\"Very well then, see you.\"";
+ goto L_Return;
+
+L_NoMoney:
+ mes "[" + @npcname$ + "]";
+ mes "\"Oh dear, the price cannot be bargained.";
+ mes "";
+ mes "Perhaps you can borrow from a friend?\"";
+ goto L_Return;
+
+L_Return:
+ @Cost = 0;
+ return;
+}
diff --git a/npc/functions/string.txt b/npc/functions/string.txt
new file mode 100644
index 00000000..2a38d90d
--- /dev/null
+++ b/npc/functions/string.txt
@@ -0,0 +1,211 @@
+// Evol Script
+// Author: Gumi
+
+// safe string manipulation functions
+// ** does not require PCRE
+
+
+// str(<int>)
+// returns whatever is passed, converted to string
+
+function script str {
+ return "" + getarg(0);
+}
+
+
+
+// startswith("<string>", "<search>")
+// returns true if <string> begins with <search>
+
+function script startswith {
+ return substr(getarg(0), 0, getstrlen(getarg(1)) - 1) == getarg(1);
+}
+
+
+
+// endswith("<string>", "<search>")
+// returns true if <string> ends with <search>
+
+function script endswith {
+ .@t = getstrlen(getarg(0)); // total length
+ .@n = getstrlen(getarg(1)); // substring length
+ return substr(getarg(0), .@t - .@n, .@t - 1) == getarg(1);
+}
+
+
+
+// capitalize("<string>")
+// returns <string> with its first letter capitalized
+
+function script capitalize {
+ return setchar(getarg(0), strtoupper(charat(getarg(0), 0)), 0);
+}
+
+
+
+// titlecase("<string>" {, "<delimiter>" {, <camel>}})
+// returns <string> with the first letter of each word capitalized
+// if <camel> is true, the string is joined in a camelCase fashion
+
+function script titlecase {
+ .@delimiter$ = getarg(1, " ");
+ .@c = getarg(2, 0);
+ explode(.@words$, getarg(0), .@delimiter$);
+
+ for (.@i = (.@c ? 1 : 0); .@i < 255; ++.@i)
+ {
+ if (.@words$[.@i] == "")
+ {
+ break;
+ }
+
+ .@words$[.@i] = setchar(.@words$[.@i], strtoupper(charat(.@words$[.@i], 0)), 0);
+ }
+
+ return implode(.@words$, (.@c ? "" : .@delimiter$));
+}
+
+
+
+// camelcase("<string" {, "<delimiter>"})
+
+function script camelcase {
+ return titlecase(getarg(0), getarg(1, " "), true);
+}
+
+
+
+// zfill("<string>" {, <width> {, "<padding>"}})
+// returns <string> padded to the left with <padding> up to width
+
+function script zfill {
+ .@str$ = getarg(0);
+ .@width = getarg(1, 8);
+ .@padding$ = getarg(2, "0");
+
+ for (.@s = getstrlen(.@str$); .@s < .@width; ++.@s)
+ {
+ .@str$ = .@padding$ + .@str$;
+ }
+
+ return .@str$;
+}
+
+
+
+// format_number(<integer> {, "<separator>"})
+// formats a number properly
+
+function script format_number {
+ .@number$ = str(getarg(0));
+ .@len = getstrlen(.@number$);
+ .@separator$ = getarg(1, ",");
+
+ if (getargcount() < 2 && playerattached()) {
+ // get from user language
+ switch (Lang) {
+ case LANG_FR: .@separator$ = " "; break; // French
+ case LANG_DE: .@separator$ = "."; break; // Germanic
+ case LANG_PTBR: .@separator$ = "."; break; // Brazilian
+ default: .@separator$ = ","; // English (default)
+ }
+ }
+
+ for (.@i = .@len - 3; .@i > 0; .@i -= 3) {
+ .@number$ = insertchar(.@number$, .@separator$, .@i);
+ }
+
+ return .@number$;
+}
+
+
+
+// fnum(<integer>)
+// alias for format_number
+
+function script fnum {
+ return format_number(getarg(0));
+}
+
+
+
+// strip("<string>")
+// removes spaces at the start and end
+
+function script strip {
+ .@s$ = getarg(0);
+ if (.@s$ == "") {
+ return "";
+ }
+ .@start = 0;
+ .@end = getstrlen(.@s$) - 1;
+ for (.@i = .@start; .@i < .@end; .@i++)
+ {
+ if (charat(.@s$, .@i) != " ") {
+ break;
+ } else {
+ .@start++;
+ }
+ }
+ for (.@i = .@end; .@i >= .@start; .@i--)
+ {
+ if (charat(.@s$, .@i) != " ") {
+ break;
+ } else {
+ .@end--;
+ }
+ }
+ //debugmes "STRIP.DEBUG MODE ENABLED BY JESUSALVA. PASSING SUBSTRING PARAMS";
+ //debugmes "String \""+.@s$+"\" from "+str(.@start)+" to "+str(.@end);
+ return substr(.@s$, .@start, .@end);
+}
+
+
+
+// reverse("<string>")
+// returns <string> reversed
+
+function script reverse {
+ .@str$ = getarg(0);
+ .@len = getstrlen(.@str$);
+
+ for (.@i = 0; .@i < (.@len / 2); ++.@i) {
+ .@tmp$ = charat(.@str$, .@i);
+ .@str$ = setchar(.@str$, charat(.@str$, (.@len - 1 - .@i)), .@i); // a <= b
+ .@str$ = setchar(.@str$, .@tmp$, (.@len - 1 - .@i)); // b <= a
+ }
+
+ return .@str$;
+}
+
+
+
+// repeat("<string>", <multiplier>)
+// repeats <string> many times and returns it
+
+function script repeat {
+ .@mul = getarg(1);
+
+ for (.@i = 0; .@i < .@mul; ++.@i) {
+ .@str$ += getarg(0);
+ }
+
+ return .@str$;
+}
+
+
+
+// shuffle("<string>")
+// returns <string> shuffled
+
+function script shuffle {
+ .@str$ = getarg(0);
+
+ for (.@len = getstrlen(.@str$); .@len > 0; --.@len) {
+ .@rnd = rand(.@len);
+ .@out$ += charat(.@str$, .@rnd);
+ .@str$ = delchar(.@str$, .@rnd);
+ }
+
+ return .@out$;
+}
diff --git a/npc/functions/time.txt b/npc/functions/time.txt
new file mode 100644
index 00000000..e6e4c70a
--- /dev/null
+++ b/npc/functions/time.txt
@@ -0,0 +1,117 @@
+// Evol Script
+// Authors: Gumi, Jesusalva
+
+function script now {
+ return gettimetick(2);
+}
+
+// Returns current time. A SQL update superseeded this.
+// santime( )
+function script santime {
+ return gettimetick(2);
+}
+
+function script time_from_ms {
+ return now() + (getarg(0) / 1000);
+}
+
+function script time_from_seconds {
+ return now() + getarg(0);
+}
+
+function script time_from_minutes {
+ return now() + (getarg(0) * 60);
+}
+
+function script time_from_hours {
+ return now() + (getarg(0) * 3600);
+}
+
+function script time_from_days {
+ return now() + (getarg(0) * 86400);
+}
+
+
+// FuzzyTime(<unix timestamp>{, <options>{, <precision>}})
+// gives time in a human-readable format
+//
+// <options> is bitmasked:
+// 1 do not show "ago" when in past
+// 2 do not show "in" when in the future
+// 4 show "from now" instead of "in" when in the future
+//
+// <precision> is the number of units to show,
+// by default uses two (eg. 2m30s or 1h20m).
+// Use '99' for max precision
+
+function script FuzzyTime {
+ .@future = getarg(0, now());
+ .@options = getarg(1, 3);
+ .@precision = getarg(2, 2);
+ .@diff = (.@future - now());
+
+ // check if in the past, or in the future
+ if (.@diff < 0) {
+ .@diff *= -1;
+ .@past = true;
+ }
+
+ .@diff = max(1, .@diff);
+
+ if (.@diff >= 31536000) {
+ .@years = (.@diff / 31536000);
+ .@diff = (++.@s == .@precision ? 0 : (.@diff % 31536000));
+ .@ret$ += sprintf("%d %s", .@years, (.@years > 1 ? "years" : "year"));
+ }
+
+ if (.@diff >= 86400) {
+ .@days = (.@diff / 86400);
+ .@diff = (++.@s == .@precision ? 0 : (.@diff % 86400));
+
+ if (.@s > 1) {
+ .@ret$ += (.@diff > 0 ? ", " : " and ");
+ }
+
+ .@ret$ += sprintf("%d %s", .@days, (.@days > 1 ? "days" : "day"));
+ }
+
+ if (.@diff >= 3600) {
+ .@hours = (.@diff / 3600);
+ .@diff = (++.@s == .@precision ? 0 : (.@diff % 3600));
+
+ if (.@s > 1) {
+ .@ret$ += (.@diff > 0 ? ", " : (.@s >= 3 ? ", " : " ") + "and ");
+ }
+
+ .@ret$ += sprintf("%d %s", .@hours, (.@hours > 1 ? "hours" : "hour"));
+ }
+
+ if (.@diff >= 60) {
+ .@minutes = (.@diff / 60);
+ .@diff = (++.@s == .@precision ? 0 : (.@diff % 60));
+
+ if (.@s > 1) {
+ .@ret$ += (.@diff > 0 ? ", " : (.@s >= 3 ? ", " : " ") + "and ");
+ }
+
+ .@ret$ += sprintf("%d %s", .@minutes, (.@minutes > 1 ? "minutes" : "minute"));
+ }
+
+ if (.@diff >= 1) {
+ if (++.@s > 1) {
+ .@ret$ += (.@s >= 3 ? ", " : " ") + "and ";
+ }
+
+ .@ret$ += sprintf("%d %s", .@diff, (.@diff > 1 ? "seconds" : "second"));
+ }
+
+ if (.@past && !(.@options & 1)) {
+ .@ret$ += " ago";
+ }
+
+ if (!(.@past) && !(.@options & 2)) {
+ .@ret$ = ((.@options & 4) ? sprintf("%s from now", .@ret$) : sprintf("in %s", .@ret$));
+ }
+
+ return .@ret$;
+}
diff --git a/npc/functions/timer.txt b/npc/functions/timer.txt
new file mode 100644
index 00000000..27e09f13
--- /dev/null
+++ b/npc/functions/timer.txt
@@ -0,0 +1,89 @@
+// Evol Script
+// Authors: Gumi, Jesusalva
+
+// areatimer("<map>", <x1>, <y1>, <x2>, <y2>, <tick>, "<npc>::<event>")
+function script areatimer {
+ // Legacy
+ if (getargcount() > 7)
+ .@ox=1;
+ // Variables
+ .@m$=getarg(.@ox); .@ox+=1;
+ .@x1=getarg(.@ox); .@ox+=1;
+ .@y1=getarg(.@ox); .@ox+=1;
+ .@x2=getarg(.@ox); .@ox+=1;
+ .@y2=getarg(.@ox); .@ox+=1;
+ .@tk=getarg(.@ox); .@ox+=1;
+ .@e$=getarg(.@ox); .@ox+=1;
+ .@c = getunits(BL_PC, .@players, false, .@m$, .@x1, .@y1, .@x2, .@y2);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ addtimer(.@tk, .@e$, .@players[.@i]);
+ }
+ return .@i;
+}
+
+// areadeltimer("<map>", <x1>, <y1>, <x2>, <y2>, "<npc>::<event>")
+function script areadeltimer {
+ .@c = getunits(BL_PC, .@players, false, getarg(0), getarg(1), getarg(2), getarg(3), getarg(4));
+ for (.@i = 0; .@i < .@c; .@i++) {
+ deltimer(getarg(5), .@players[.@i]);
+ }
+ return .@i;
+}
+
+// areatimer2("<map>", <x1>, <y1>, <x2>, <y2>, <tick>, "<npc>::<event>")
+function script areatimer2 {
+ .@c = getunits(BL_PC, .@players, false, getarg(0), getarg(1), getarg(2), getarg(3), getarg(4));
+ for (.@i = 0; .@i < .@c; .@i++) {
+ deltimer(getarg(6), .@players[.@i]);
+ addtimer(getarg(5), getarg(6), .@players[.@i]);
+ }
+ return .@i;
+}
+
+// addtimer2(<tick>, "<npc>::<event>")
+function script addtimer2 {
+ deltimer(getarg(1));
+ addtimer(getarg(0), getarg(1));
+ return;
+}
+
+
+// maptimer("<map>", <tick>, "<npc>::<event>")
+function script maptimer {
+ .@c = getunits(BL_PC, .@players, false, getarg(0));
+ for (.@i = 0; .@i < .@c; .@i++) {
+ addtimer(getarg(1), getarg(2), .@players[.@i]);
+ }
+ return .@i;
+}
+
+// Same as maptimer() but deletes any previously running timer
+// maptimer2("<map>", <tick>, "<npc>::<event>")
+function script maptimer2 {
+ .@c = getunits(BL_PC, .@players, false, getarg(0));
+ for (.@i = 0; .@i < .@c; .@i++) {
+ deltimer(getarg(2), .@players[.@i]);
+ addtimer(getarg(1), getarg(2), .@players[.@i]);
+ }
+ return .@i;
+}
+
+// mapdeltimer("<map>", "<npc>::<event>")
+function script mapdeltimer {
+ .@c = getunits(BL_PC, .@players, false, getarg(0));
+ for (.@i = 0; .@i < .@c; .@i++) {
+ deltimer(getarg(1), .@players[.@i]);
+ }
+ return .@i;
+}
+
+// partytimer("<map>", <tick>, "<npc>::<event>", partyid)
+function script partytimer {
+ .@c = getunits(BL_PC, .@players, false, getarg(0));
+ for (.@i = 0; .@i < .@c; .@i++) {
+ if (getcharid(2, strcharinfo(0,"",.@players[.@i]) ) == getarg(3))
+ addtimer(getarg(1), getarg(2), .@players[.@i]);
+ }
+ return .@i;
+}
+
diff --git a/npc/functions/travelers.txt b/npc/functions/travelers.txt
new file mode 100644
index 00000000..e76d2130
--- /dev/null
+++ b/npc/functions/travelers.txt
@@ -0,0 +1,235 @@
+
+
+017-9,27,28,0 script #TravelConfig NPC32767,{
+ end;
+
+OnInit:
+ // TravelFound
+ $@tut_bit = (1 << 2);
+ //set $@druid_tree_bit, (1 << 3);
+ $@graveyard_bit = (1 << 4);
+ $@magic_house_bit = (1 << 5);
+ $@terranite_cave_bit = (1 << 6);
+ $@tulimshar_bit = (1 << 7);
+ $@blue_sage_bit = (1 << 8);
+ $@hurnscald_bit = (1 << 9);
+ $@nivalis_bit = (1 << 10);
+ //set $@tul_mine_bit, (1 << 11);
+ $@pachua_bit = (1 << 12);
+ $@barbarians_bit = (1 << 14);
+ $@hurns_farms_bit = (1 << 15);
+ $@candor_bit = (1 << 16);
+ // Travel Base Cost
+ $@tulimshar_cost = 100;
+ $@hurnscald_cost = 100;
+ $@nivalis_cost = 100;
+ //set $@druid_tree_cost, 150;
+ //set $@tul_mine_cost, 150;
+ $@pachua_cost = 200;
+ $@graveyard_cost = 200;
+ $@magic_house_cost = 150;
+ $@terranite_cave_cost = 200;
+ $@blue_sage_cost = 200;
+ $@barbarians_cost = 150;
+ $@hurns_farms_cost = 150;
+ $@candor_cost = 200;
+ end;
+}
+
+function script Traveler {
+ if(@npcname$ == "") set @npcname$, strnpcinfo(1);
+ mes "["+@npcname$+"]";
+ mes "\"Greetings. I am "+@npcname$+" the Traveler.\"";
+ next;
+
+ if (TravelFound & $@tut_bit)
+ goto L_Main;
+ goto L_TravelTut;
+
+L_Main:
+ if (TravelFound & @NpcTravelBit)
+ goto L_BitTravelSet;
+ goto L_SetTravelBit;
+
+L_BitTravelSet:
+ @Cost = 10;
+ if (BaseLevel < 45)
+ @Cost = 5;
+ goto L_Start;
+
+L_TravelTut:
+ mes "["+@npcname$+"]";
+ mes "\"We travelers are found all over the world. Once you have found a traveler at a certain location, you can be sent back there instantly by another traveler.\"";
+ next;
+ if (TravelFound & $@tut_bit)
+ goto L_Main;
+ goto L_SetBit;
+
+L_SetBit:
+ TravelFound = TravelFound | $@tut_bit;
+ goto L_Main;
+
+L_SetTravelBit:
+ mes "["+@npcname$+"]";
+ mes "\"Uplink set. You can now return to this spot for a fee.\"";
+ next;
+ TravelFound = TravelFound | @NpcTravelBit;
+ goto L_BitTravelSet;
+
+L_Start:
+ mes "\"Where would you like to go?\"";
+ menu
+ "Tonori - Tulimshar (" + (@Cost * $@tulimshar_cost) + " GP)", L_TravelTulimshar,
+ "Argeas - Hurnscald (" + (@Cost * $@hurnscald_cost) + " GP)", L_TravelHurnscald,
+ "Kaizei - Nivalis (" + (@Cost * $@nivalis_cost) + " GP)", L_TravelNivalis,
+ "Tonori - Pachua's Village (" + (@Cost * $@pachua_cost) + " GP)", L_TravelPachua,
+ "Argeas - Candor (" + (@Cost * $@candor_cost) + " GP)", L_TravelCandor,
+ "Argeas - Magic House (" + (@Cost * $@magic_house_cost) + " GP)", L_TravelMagicHouse,
+ "Argeas - Farmsteads (" + (@Cost * $@hurns_farms_cost) + " GP)", L_TravelHurnsFarms,
+ "Argeas - Graveyard (" + (@Cost * $@graveyard_cost) + " GP)", L_TravelGraveyard,
+ "Argeas - Terranite Cave (" + (@Cost * $@terranite_cave_cost) + " GP)", L_TravelTerranite,
+ "Kaizei - Barbarian Village (" + (@Cost * $@barbarians_cost) + " GP)", L_TravelBarbarians,
+ "Kaizei - Sage Nikolai's Mansion (" + (@Cost * $@blue_sage_cost) + " GP)", L_TravelBlueSage,
+ "Who are the Travelers?", L_TravelTut,
+ "I'm not interested.", L_TravelNo;
+
+L_TravelChecks:
+ if (@NpcTravelBit == @NextLocationBit)
+ goto L_AlreadyThere;
+ if (!(TravelFound & @NextLocationBit))
+ goto L_NoFound;
+ if (Zeny < @NextLocationCost)
+ goto L_NoMoney;
+ goto L_TravelPlayer;
+
+L_TravelPlayer:
+ mes "["+@npcname$+"]";
+ mes "\"Be fearless!\"";
+ close2;
+ Zeny = Zeny - @NextLocationCost;
+ warp @NextLocationMap$,@NextLocationX,@NextLocationY;
+ goto L_Clearvars;
+
+L_TravelGraveyard:
+ @NextLocationBit = $@graveyard_bit;
+ @NextLocationCost = (@Cost * $@graveyard_cost);
+ @NextLocationMap$ = "026-1";
+ @NextLocationX = 49;
+ @NextLocationY = 45;
+ goto L_TravelChecks;
+
+L_TravelMagicHouse:
+ @NextLocationBit = $@magic_house_bit;
+ @NextLocationCost = (@Cost * $@magic_house_cost);
+ @NextLocationMap$ = "013-1";
+ @NextLocationX = 120;
+ @NextLocationY = 93;
+ goto L_TravelChecks;
+
+L_TravelTerranite:
+ @NextLocationBit = $@terranite_cave_bit;
+ @NextLocationCost = (@Cost * $@terranite_cave_cost);
+ @NextLocationMap$ = "012-3";
+ @NextLocationX = 445;
+ @NextLocationY = 65;
+ goto L_TravelChecks;
+
+L_TravelTulimshar:
+ @NextLocationBit = $@tulimshar_bit;
+ @NextLocationCost = (@Cost * $@tulimshar_cost);
+ @NextLocationMap$ = "002-1";
+ @NextLocationX = 60;
+ @NextLocationY = 42;
+ goto L_TravelChecks;
+
+L_TravelBlueSage:
+ @NextLocationBit = $@blue_sage_bit;
+ @NextLocationCost = (@Cost * $@blue_sage_cost);
+ @NextLocationMap$ = "048-2";
+ @NextLocationX = 26;
+ @NextLocationY = 47;
+ goto L_TravelChecks;
+
+L_TravelHurnscald:
+ @NextLocationBit = $@hurnscald_bit;
+ @NextLocationCost = (@Cost * $@hurnscald_cost);
+ @NextLocationMap$ = "008-1";
+ @NextLocationX = 79;
+ @NextLocationY = 84;
+ goto L_TravelChecks;
+
+L_TravelNivalis:
+ @NextLocationBit = $@nivalis_bit;
+ @NextLocationCost = (@Cost * $@nivalis_cost);
+ @NextLocationMap$ = "020-1";
+ @NextLocationX = 53;
+ @NextLocationY = 122;
+ goto L_TravelChecks;
+
+L_TravelPachua:
+ @NextLocationBit = $@pachua_bit;
+ @NextLocationCost = (@Cost * $@pachua_cost);
+ @NextLocationMap$ = "006-1";
+ @NextLocationX = 28;
+ @NextLocationY = 97;
+ callfunc "MiriamCheat";
+ goto L_TravelChecks;
+
+L_TravelBarbarians:
+ @NextLocationBit = $@barbarians_bit;
+ @NextLocationCost = (@Cost * $@barbarians_cost);
+ @NextLocationMap$ = "033-1";
+ @NextLocationX = 66;
+ @NextLocationY = 33;
+ goto L_TravelChecks;
+
+L_TravelHurnsFarms:
+ @NextLocationBit = $@hurns_farms_bit;
+ @NextLocationCost = (@Cost * $@hurns_farms_cost);
+ @NextLocationMap$ = "055-1";
+ @NextLocationX = 135;
+ @NextLocationY = 60;
+ goto L_TravelChecks;
+
+L_TravelCandor:
+ @NextLocationBit = $@candor_bit;
+ @NextLocationCost = (@Cost * $@candor_cost);
+ @NextLocationMap$ = "029-1";
+ @NextLocationX = 69;
+ @NextLocationY = 69;
+ goto L_TravelChecks;
+
+L_TravelNo:
+ mes "["+@npcname$+"]";
+ mes "\"Perhaps you will have the courage to help us some day.\"";
+ close2;
+ goto L_Clearvars;
+
+L_NoMoney:
+ mes "["+@npcname$+"]";
+ mes "\"I'm sorry, but you don't have enough money. Maybe next time.\"";
+ close2;
+ goto L_Clearvars;
+
+L_NoFound:
+ mes "["+@npcname$+"]";
+ mes "\"Sorry, but you haven't visited a traveler yet at that location. You should find and talk to a traveler there so you can quickly return to that location in the future.\"";
+ close2;
+ goto L_Clearvars;
+
+L_AlreadyThere:
+ mes "["+@npcname$+"]";
+ mes "\"Uh... You're already here. Are you sure you know where you are going?\"";
+ close2;
+ goto L_Clearvars;
+
+L_Clearvars:
+ @npcname$ = "";
+ @Cost = 0;
+ @NextLocationBit = 0;
+ @NextLocationCost = 0;
+ @NextLocationMap$ = "";
+ @NextLocationX = 0;
+ @NextLocationY = 0;
+ return;
+}
diff --git a/npc/functions/undead_debug.txt b/npc/functions/undead_debug.txt
new file mode 100644
index 00000000..693edc13
--- /dev/null
+++ b/npc/functions/undead_debug.txt
@@ -0,0 +1,111 @@
+
+function script UndeadDebug {
+ goto L_Main;
+
+L_Main:
+ if (@undeaddebug == 3)
+ goto L_UndeadDebugThree;
+ if (@undeaddebug == 4)
+ goto L_UndeadDebugFour;
+ if (@undeaddebug == 5)
+ goto L_UndeadDebugFive;
+ goto L_close;
+
+L_UndeadDebugThree:
+ mes "Reset your self to the various states.";
+ mes "Options Limited to Time and Place.";
+ menu
+ "Get Ritual Items.", L_KrukanItems,
+ "Nevermind.", L_close;
+
+L_UndeadDebugFour:
+ mes "Reset your self to the various states.";
+ mes "Options Limited to Time and Place.";
+ menu
+ "Get Ritual Items.", L_RazhaItems,
+ "Nevermind.", L_close;
+
+L_UndeadDebugFive:
+ mes "Reset your self to the various states.";
+ mes "Options Limited to Time and Place.";
+ menu
+ "Get Ritual Items.", L_TeroganItems,
+ "Nevermind.", L_close;
+
+L_InventoryNoSpace:
+ mes "\"Drop some weight then come back.\"";
+ goto L_close;
+
+L_KrukanItems:
+ if ((checkweight("Soul", 1) == 0)
+ || (checkweight("Skull", 5) == 0)
+ || (checkweight("DarkCrystal", 5) == 0)
+ || (checkweight("Bone", 5) == 0)
+ || (@inventorylist_count == 100))
+ goto L_InventoryNoSpace;
+ getitem "Soul", 1;
+ getitem "Skull", 5;
+ getitem "DarkCrystal", 5;
+ getitem "Bone", 5;
+ goto L_Main;
+
+L_RazhaItems:
+ if ((checkweight("Soul", 3) == 0)
+ || (checkweight("DiseasedHeart", 5) == 0)
+ || (checkweight("UndeadEye", 5) == 0)
+ || (checkweight("UndeadEar", 5) == 0)
+ || (@inventorylist_count == 100))
+ goto L_InventoryNoSpace;
+ getitem "Soul", 3;
+ getitem "DiseasedHeart", 5;
+ getitem "UndeadEye", 5;
+ getitem "UndeadEar", 5;
+ goto L_Main;
+
+L_TeroganItems:
+ if ((checkweight("Soul", 5) == 0)
+ || (checkweight("RottenRags", 5) == 0)
+ || (checkweight("UndeadEye", 5) == 0)
+ || (checkweight("UndeadEar", 5) == 0)
+ || (@inventorylist_count == 100))
+ goto L_InventoryNoSpace;
+ getitem "Soul", 5;
+ getitem "RottenRags", 5;
+ getitem "UndeadEye", 5;
+ getitem "UndeadEar", 5;
+ goto L_Main;
+
+L_close:
+ close2;
+ return;
+}
+
+027-3,84,89,0 script UndeadDebug3 NPC155,{
+ @undeaddebug = 3;
+ callfunc "UndeadDebug";
+ end;
+OnInit:
+ if (!debug)
+ disablenpc "UndeadDebug3";
+ end;
+}
+
+027-4,76,79,0 script UndeadDebug4 NPC155,{
+ @undeaddebug = 4;
+ callfunc "UndeadDebug";
+ end;
+OnInit:
+ if (!debug)
+ disablenpc "UndeadDebug4";
+ end;
+}
+
+027-5,72,26,0 script UndeadDebug5 NPC155,{
+ @undeaddebug = 5;
+ callfunc "UndeadDebug";
+ end;
+OnInit:
+ if (!debug)
+ disablenpc "UndeadDebug5";
+ end;
+}
diff --git a/npc/functions/vault.txt b/npc/functions/vault.txt
new file mode 100644
index 00000000..b02d113b
--- /dev/null
+++ b/npc/functions/vault.txt
@@ -0,0 +1,114 @@
+// TMW-2 Script
+// Author:
+// Jesusalva
+// Description:
+// Vault Utilities
+
+function script getvaultid {
+ // FIXME: Make this False
+ if (debug || !debug)
+ return ##VAULT;
+ else
+ return 0;
+}
+
+function script getvaultexp {
+ .@exp=getarg(0);
+ if (.@exp > 100)
+ Exception("ILLEGAL VAULT EXPERIENCE, FIXME URGENTLY. STOPPING SCRIPT BY FORCE WHILE DOING NOTHING.",
+ RB_DEBUGMES | RB_IRCBROADCAST | RB_GLOBALANNOUNCE | RB_ISFATAL);
+ if (getvaultid()) {
+ ##VAULT_EXP+=.@exp;
+ debugmes("Granting %d Soul Exp to %d under Jande's authority.",
+ .@exp, ##VAULT);
+ }
+ return;
+}
+
+function script vaultOnLogin {
+ // Mirror Lake functionality
+ if (getvaultid() && !getstatus(SC_JAILED)) {
+ .@gto=get_byte(##00_INFO, 3);
+ .@mlp=get_nibble(##00_INFO, 5);
+ // Work only on new chars, or chars which cleared Tulimshar.
+ if (.@gto == WORLD_ID) {
+ // Warp to the proper Mirror Lake
+ switch (.@mlp) {
+ //case 1: somewhere
+ default: warp "013-2", 37, 23; LOCATION$ = "Hurns"; break;
+ }
+
+ // Send debug information
+ debugmes("Vault User %d moved to lake %d.", getvaultid(), .@mlp);
+
+ // Handle new user (non-native) accounts - automatic tutorial skip
+ if (QL_BEGIN < 8) {
+ if (!TUT_var) {
+ callfunc "GameRules";
+ next;
+ closeclientdialog;
+ adddefaultskills();
+ getitem Knife, 1;
+ getitem SlingShot, 1;
+ getitem SlingBullet, 500;
+ getitem HitchhikersTowel, 1;
+ getitem CottonShirt, 1;
+ getitem RaggedShorts, 1;
+ set Zeny, Zeny + 35; // tanisha gives 5 Zeny
+ equip(CottonShirt);
+ equip(RaggedShorts);
+ equip(Knife);
+ }
+ QL_BEGIN = 8;
+ dispbottom l("Mirror Lake : Obtain help with Sorfina in Candor.");
+ }
+
+ // Unset the target lake/world
+ set_byte(##00_INFO, 3, 0);
+ set_nibble(##00_INFO, 5, 0);
+ } else if (.@gto) {
+ // Heading somewhere which is not here!
+ mesc l("WARNING: If you use any Mirror Lake feature on this world, the current Mirror Lake Quest will be marked as \"Failed\"."), 1;
+ mesc l("If this is undesired, select the correct world, and if needed create a new char on it."), 1;
+ ##VAULT_GOTO=.@gto;
+ ##VAULT_MLTO=.@mlp;
+ next;
+ closeclientdialog;
+ }
+ }
+ return;
+}
+
+function script vaultOnLogout {
+ // Send updates to Vault API
+ if (getvaultid()) {
+ .@api$=json_encode("UID", ##VAULT,
+ "GID", getcharid(3),
+ "VAR1N", "TMWQUEST",
+ "VAR1V", ##03_TMWQUEST,
+ "VAR2N", "TMWGLOBAL",
+ "VAR2V", ##03_TMWGLOBAL,
+ "VEXP", ##VAULT_EXP,
+ "GOTO", ##VAULT_GOTO,
+ "MLTO", ##VAULT_MLTO);
+ ##VAULT_EXP=0;
+ ##VAULT_GOTO=0;
+ ##VAULT_MLTO=0;
+ api_send(API_FLUSHVAULT, .@api$);
+ }
+ return;
+}
+
+// MirrorLakeSendTo(World, Lake)
+function script MirrorLakeSendTo {
+ .@w=getarg(0);
+ .@t=getarg(1);
+ ##VAULT_GOTO=.@w;
+ ##VAULT_MLTO=.@t;
+ closeclientdialog;
+ dispbottom l("Darkness fills your vision...");
+ sleep2(1000);
+ kick(getcharid(3), 7); // 7 is not a valid kick reason
+ end;
+}
+
diff --git a/npc/functions/water_bottle.txt b/npc/functions/water_bottle.txt
new file mode 100644
index 00000000..bde12a0f
--- /dev/null
+++ b/npc/functions/water_bottle.txt
@@ -0,0 +1,43 @@
+
+function script WaterBottle {
+ @COST_PER_BOTTLE = 150;
+
+ mes "How many empty bottles do you want to fill with water? It costs " + @COST_PER_BOTTLE + "gp per bottle.";
+ input @count;
+
+ if (@count == 0)
+ goto L_close;
+ @Cost = @count * @COST_PER_BOTTLE;
+ @empty = countitem("EmptyBottle");
+
+ if (@empty < @count)
+ goto L_NotEnoughBottles;
+ if (Zeny < @Cost)
+ goto L_NotEnoughMoney;
+ getinventorylist;
+ if (@inventorylist_count == 100
+ && countitem("BottleOfWater") == 0
+ && @empty > @count)
+ goto L_NotEnoughSlots;
+
+ Zeny = Zeny - @Cost;
+ delitem "EmptyBottle", @count;
+ getitem "BottleOfWater", @count;
+ goto L_close;
+
+L_NotEnoughBottles:
+ mes "You don't have that many empty bottles!";
+ goto L_close;
+
+L_NotEnoughMoney:
+ mes "You don't have enough gp! You need " + @Cost + "gp.";
+ goto L_close;
+
+L_NotEnoughSlots:
+ mes "You don't have room for these bottles!";
+ goto L_close;
+
+L_close:
+ close2;
+ return;
+}
diff --git a/npc/functions/weather.txt b/npc/functions/weather.txt
new file mode 100644
index 00000000..75605749
--- /dev/null
+++ b/npc/functions/weather.txt
@@ -0,0 +1,244 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Controls world seasons. RESPECT MASK_* VARS ON CONSTANTS DB
+
+- script #WeatherCore NPC_HIDDEN,{
+ end;
+
+OnInit:
+ // This is weather startup
+ .@init=true;
+ // Bind commands
+ bindatcmd "wsnow", "#WeatherCore::OnSnow", 80, 80, 1;
+ bindatcmd "wrain", "#WeatherCore::OnRain", 80, 80, 1;
+ bindatcmd "wsand", "#WeatherCore::OnSand", 80, 80, 1;
+ bindatcmd "wevil", "#WeatherCore::OnEvil", 80, 80, 1;
+ bindatcmd "wnight", "#WeatherCore::OnNight", 80, 80, 1;
+ bindatcmd "wclear", "#WeatherCore::OnClear", 80, 80, 1;
+ bindatcmd "wreset", "#WeatherCore::OnReset", 99, 99, 1;
+ bindatcmd "wset", "#WeatherCore::OnManual", 99, 99, 1;
+
+
+ // Determine which maps are subject to weather, and how weather works:
+ // eg. it should never snow on a desert, or happen a sandstorm on icelands.
+ .wcore = htnew;
+ .wtime = htnew;
+
+ // Deserts
+ htput(.wcore, "001-1", CLIMATE_DESERT);
+ htput(.wcore, "002-1", CLIMATE_DESERT);
+ htput(.wcore, "003-2", CLIMATE_DESERT);
+ htput(.wcore, "004-1", CLIMATE_DESERT);
+ htput(.wcore, "006-1", CLIMATE_DESERT);
+ htput(.wcore, "023-1", CLIMATE_DESERT);
+ htput(.wcore, "041-1", CLIMATE_DESERT);
+ htput(.wcore, "042-1", CLIMATE_DESERT);
+ htput(.wcore, "043-1", CLIMATE_DESERT);
+
+ // Woodlands
+ htput(.wcore, "007-1", CLIMATE_MODERATE);
+ htput(.wcore, "008-1", CLIMATE_MODERATE);
+ htput(.wcore, "009-1", CLIMATE_MODERATE);
+ htput(.wcore, "010-1", CLIMATE_MODERATE);
+ htput(.wcore, "011-1", CLIMATE_MODERATE);
+ htput(.wcore, "012-1", CLIMATE_MODERATE);
+ htput(.wcore, "013-1", CLIMATE_MODERATE);
+ htput(.wcore, "014-1", CLIMATE_MODERATE);
+ htput(.wcore, "015-1", CLIMATE_MODERATE);
+ htput(.wcore, "016-1", CLIMATE_MODERATE);
+ htput(.wcore, "017-1", CLIMATE_MODERATE);
+ htput(.wcore, "018-1", CLIMATE_MODERATE);
+ htput(.wcore, "025-1", CLIMATE_MODERATE);
+ htput(.wcore, "026-1", CLIMATE_MODERATE);
+ htput(.wcore, "027-1", CLIMATE_MODERATE);
+ htput(.wcore, "028-1", CLIMATE_MODERATE);
+ htput(.wcore, "029-1", CLIMATE_MODERATE);
+ htput(.wcore, "051-1", CLIMATE_MODERATE); // ?
+ htput(.wcore, "052-1", CLIMATE_MODERATE);
+ htput(.wcore, "055-1", CLIMATE_MODERATE);
+ htput(.wcore, "057-1", CLIMATE_MODERATE);
+
+ // Icelands
+ htput(.wcore, "019-1", CLIMATE_ICELAND);
+ htput(.wcore, "020-1", CLIMATE_ICELAND);
+ htput(.wcore, "030-1", CLIMATE_ICELAND);
+ htput(.wcore, "031-1", CLIMATE_ICELAND);
+ htput(.wcore, "033-1", CLIMATE_ICELAND);
+ htput(.wcore, "034-1", CLIMATE_ICELAND);
+ htput(.wcore, "045-1", CLIMATE_ICELAND);
+ htput(.wcore, "046-1", CLIMATE_ICELAND);
+ htput(.wcore, "047-1", CLIMATE_ICELAND);
+
+ // Special
+ htput(.wcore, "099-1", CLIMATE_NONE);
+
+
+ debugmes("[Weather.sys] Total Maps = " + htsize(.wcore));
+ initnpctimer;
+ end;
+
+ ///////////////////////////////////////////////////////////////////
+ // Internal functions to check or change stuff
+ // WeatherSwitch ( MASK )
+ function WeatherSwitch {
+ // Get map
+ .@key$=getmap();
+
+ // Sanitize
+ .@m = htget(.wcore, .@key$, CLIMATE_NONE);
+
+ // Change Weather or abort
+ if (.@m == CLIMATE_NONE)
+ dispbottom l("Command not permitted on this map! Check npc/functions/weather.conf");
+ else
+ addmapmask(.@key$, getarg(0));
+ return;
+ }
+
+ // WeatherClear ( MAP )
+ function WeatherClear {
+ .@key$ = getarg(0);
+ .@mk=getmapmask(.@key$);
+ if (.@mk & MASK_NIGHT)
+ .@mk=.@mk^MASK_NIGHT;
+ if (.@mk & MASK_RAIN)
+ .@mk=.@mk^MASK_RAIN;
+ if (.@mk & MASK_SANDSTORM)
+ .@mk=.@mk^MASK_SANDSTORM;
+ if (.@mk & MASK_SNOW)
+ .@mk=.@mk^MASK_SNOW;
+ setmapmask(.@key$, .@mk);
+ return;
+ }
+
+ ///////////////////////////////////////////////////////////////////
+ // "#WeatherCore"::climate(mapid)
+ public function climate {
+ .@v = htget(.wcore, getarg(0), CLIMATE_NONE);
+ return .@v;
+ }
+
+ // "#WeatherCore"::weather(weather{, mapid})
+ public function weather {
+ .@mk=getarg(0);
+ .@m$=getarg(1, getmapname());
+ return getmapmask(.@m$) & .@mk;
+ }
+
+ // "#WeatherCore"::weather_override(weather, duration{, mapid, override=false})
+ public function weather_override {
+ .@mk=getarg(0);
+ .@tm=getarg(1);
+ .@m$=getarg(2, getmapname());
+ .@force=getarg(3, false);
+
+ if (!.@force) {
+ // Obtain map climate & validate
+ .@cl = htget(.wcore, .@m$, CLIMATE_NONE);
+ if (.@cl == CLIMATE_NONE)
+ return false;
+
+ // Forbidden changes (Disallowed by climate)
+ if (.@cl == CLIMATE_DESERT && (.@mk == MASK_SNOW))
+ return false;
+ if (.@cl == CLIMATE_ICELAND && (.@mk == MASK_SANDSTORM))
+ return false;
+ }
+
+ // Rain is not granted in desert or iceland
+ // But "#WeatherCore"::climate() will have this handled
+ // So we assume it is OK here and apply the changes
+
+ // Maybe there's already a timer running?
+ .@t = htget(.wtime, .@m$, 0);
+ if (.@t <= 0) {
+ addmapmask(.@m$, .@mk);
+ htput(.wtime, .@m$, gettimetick(2)+.@tm);
+ } else {
+ htput(.wtime, .@m$, .@t+.@tm);
+ }
+ return true;
+ }
+
+ ///////////////////////////////////////////////////////////////////
+ // Every 2.5 seconds, we clean up any ongoing weather effects
+OnTimer2500:
+ // No weather effect
+ if (!htsize(.wtime)) {
+ initnpctimer;
+ end;
+ }
+ // We got a job to do
+ .@hti = htiterator(.wtime);
+ .@cur = gettimetick(2);
+ for (.@key$ = htinextkey(.@hti); hticheck(.@hti); .@key$ = htinextkey(.@hti))
+ {
+ .@target=htget(.wtime, .@key$, 0);
+ debugmes "Map %s (Time %d/%d)", .@key$, .@target, .@cur;
+ // Not yet expired
+ if (.@target > .@cur)
+ continue;
+ // Remove the effect
+ htput(.wtime, .@key$, 0);
+ WeatherClear(.@key$);
+ }
+ htidelete(.@hti);
+ initnpctimer;
+ end;
+
+///////////////////////////////////////////////////////////////////
+// Some commands, for GMs manually override weather
+OnRain:
+ WeatherSwitch(MASK_RAIN);
+ end;
+
+OnSand:
+ WeatherSwitch(MASK_SANDSTORM);
+ end;
+
+OnSnow:
+ WeatherSwitch(MASK_SNOW);
+ end;
+
+OnNight:
+ WeatherSwitch(MASK_NIGHT);
+ end;
+
+OnEvil:
+ WeatherSwitch(MASK_EVILSANCTUM);
+ end;
+
+OnManual:
+ if (!.@atcmd_numparameters) {
+ dispbottom l("Syntax: @wset <map_mask>");
+ end;
+ }
+
+ // Never allow negative numbers, or to disable map mask 1 (never, EVER, do such insane thing)
+ .@rq = atoi(.@atcmd_parameters$[0]);
+ if (.@rq <= 1 || .@rq % 2 == 1) {
+ dispbottom l("Invalid map mask");
+ end;
+ }
+
+ // <Insert a helpful comment here>
+ getmapxy(.@key$,.@a,.@b,0);
+ .@mk=getmapmask(.@key$);
+ .@mk=.@mk^.@rq;
+ setmapmask(.@key$, .@mk);
+ end;
+
+// Clear works on any map
+OnClear:
+ WeatherClear(getmap());
+ end;
+
+// Reset the whole map, including season, event and weather masks
+OnReset:
+ getmapxy(.@key$,.@a,.@b,0);
+ setmapmask(.@key$, MASK_NONE);
+ end;
+
+}
diff --git a/npc/items/brawling_item.txt b/npc/items/brawling_item.txt
new file mode 100644
index 00000000..9aa06525
--- /dev/null
+++ b/npc/items/brawling_item.txt
@@ -0,0 +1,15 @@
+// Brawling item
+// callfunc "BrawlingItem", slotId;
+function script BrawlingItem {
+ // If you can equip *anything*, this restriction is moot
+ if (has_permission(PERM_USE_ALL_EQUIPMENT, getcharid(3)))
+ return;
+ // Load stat requisites
+ .@me = getarg(0);
+ // If the requirement isn't met, we set an unequip trigger.
+ // The item is now removed.
+ if (getequipid(EQI_HAND_R) > 0)
+ unequip(.@me);
+ return;
+}
+
diff --git a/npc/items/mirror.txt b/npc/items/mirror.txt
new file mode 100644
index 00000000..5cebed68
--- /dev/null
+++ b/npc/items/mirror.txt
@@ -0,0 +1,18 @@
+function script useMirror {
+ goto L_Rand;
+
+L_Rand:
+ .@mirror_rnd = .@mirror_rnd + 1;
+ @style = rand2(1, getarraysize($@hairstyle$)-1);
+ @color = rand2(getarraysize($@haircolor$));
+ if (((getlook(LOOK_HAIR_STYLE) == @style) ||
+ (getlook(LOOK_HAIR_COLOR) == @color)) &&
+ .@mirror_rnd < 15)
+ goto L_Rand;
+ if (@fixedMirror)
+ setlook LOOK_HAIR_STYLE, @style;
+ setlook LOOK_HAIR_COLOR, @color;
+ //if(!@fixedMirror) getitem "SilverMirror", 1; <== this can be used in the future to have a portable hair color changer (like scissors but for the color)
+ @fixedMirror = 0;
+ return;
+}
diff --git a/npc/items/pickled_beets.txt b/npc/items/pickled_beets.txt
new file mode 100644
index 00000000..a1a418c6
--- /dev/null
+++ b/npc/items/pickled_beets.txt
@@ -0,0 +1,9 @@
+function script usePickledBeets {
+ heal 50, 0;
+ if (Class == 1)
+ setlook LOOK_HAIR_COLOR, HC_PURPLE;
+ else if (Class == 2)
+ setlook LOOK_HAIR_COLOR, 18;
+ // add more here for races that have purple
+ return;
+}
diff --git a/npc/items/purification_potion.txt b/npc/items/purification_potion.txt
new file mode 100644
index 00000000..47f84f3b
--- /dev/null
+++ b/npc/items/purification_potion.txt
@@ -0,0 +1,26 @@
+
+function script usePurificationPotion {
+ if (isat("011-1", 88,67))
+ goto L_Wyara_Pond;
+ goto L_NoUse;
+
+L_NoUse:
+ message strcharinfo(0), "You don't know what to do with this.";
+ getitem "PurificationPotion", 1;
+ return;
+
+L_Wyara_Pond:
+ @Q_MASK = NIBBLE_2_MASK;
+ @Q_SHIFT = NIBBLE_2_SHIFT;
+ @Q_status = (QUEST_MAGIC2 & @Q_MASK) >> @Q_SHIFT;
+
+ if (@Q_status < 1)
+ goto L_NoUse;
+ if (@Q_status <= 2)
+ @Q_status = @Q_status + 1;
+
+ message strcharinfo(0), "You pour the potion into the pond.";
+
+ QUEST_MAGIC2 = (QUEST_MAGIC2 & ~(@Q_MASK) | (@Q_status << @Q_SHIFT));
+ return;
+}
diff --git a/npc/items/require_stat.txt b/npc/items/require_stat.txt
new file mode 100644
index 00000000..815f7b5a
--- /dev/null
+++ b/npc/items/require_stat.txt
@@ -0,0 +1,17 @@
+// Unequip if stat not enough
+// callfunc "RequireStat", bDex, 80, EQI_HAND_R;
+function script RequireStat {
+ // If you can equip *anything*, this restriction is moot
+ if (has_permission(PERM_USE_ALL_EQUIPMENT, getcharid(3)))
+ return;
+ // Load stat requisites
+ .@stat = getarg(0);
+ .@min = getarg(1);
+ .@me = getarg(2);
+ .@val = readparam(.@stat);
+ // If the requirement isn't met, we set an unequip trigger.
+ // The item is now removed.
+ if (.@val < .@min)
+ unequip(.@me);
+ return;
+}
diff --git a/npc/items/rubber_bat.txt b/npc/items/rubber_bat.txt
new file mode 100644
index 00000000..a5921674
--- /dev/null
+++ b/npc/items/rubber_bat.txt
@@ -0,0 +1,10 @@
+function script rubberBat {
+ if (gettimetick(2) - @lastbat < 2) goto L_Return;
+ misceffect 403;
+ @lastbat = gettimetick(2);
+ goto L_Return;
+
+L_Return:
+ getitem "RubberBat", 1;
+ return;
+}
diff --git a/npc/items/scented_candle.txt b/npc/items/scented_candle.txt
new file mode 100644
index 00000000..62ed706d
--- /dev/null
+++ b/npc/items/scented_candle.txt
@@ -0,0 +1,36 @@
+- script ScentedCandle NPC32767,{
+ end;
+
+OnEquip:
+ if (@scented_candle == 1) end;
+ goto L_Check;
+
+OnCheck:
+ if (getequipid(equip_head) != 5229) goto L_Removed;
+ goto L_Check;
+
+L_Check:
+ @scented_candle = 1;
+ getmapxy(.@m$, .@x, .@y, 0);
+ .@r = 12;
+
+ .@c=getunits(BL_MOB, .@mbs, false, .@m$, .@x-.@r, .@y-.@r, .@x+.@r, .@y+.@r);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ @target_id=.@mbs[.@i];
+ //if (target(BL_ID, @target_id, 0x20) != 0x20) end; // line of sight
+ if (getunitdata(@target_id, UDT_CLASS) != 1131 && // mana bug
+ getunitdata(@target_id, UDT_CLASS) != 1055 && // butterfly
+ getunitdata(@target_id, UDT_CLASS) != 1049 && // bee
+ getunitdata(@target_id, UDT_CLASS) != 1088) end; // hyvern
+ aggravate @target_id;
+ }
+ addtimer rand(2000), strnpcinfo(0) + "::OnCheck";
+ end;
+
+OnMob:
+ end;
+
+L_Removed:
+ @scented_candle = 0;
+ end;
+}
diff --git a/npc/items/scissors.txt b/npc/items/scissors.txt
new file mode 100644
index 00000000..95d07b8b
--- /dev/null
+++ b/npc/items/scissors.txt
@@ -0,0 +1,12 @@
+function script useScissors {
+ getitem "Scissors", 1;
+ if (rand(3))
+ goto L_Change;
+ message strcharinfo(0), "Whoops!";
+ heal -20 - rand(Hp >> 1), 0; // ???
+ return;
+
+L_Change:
+ setlook LOOK_HAIR_STYLE, rand(1,getarraysize($@hairstyle$)-1);
+ return;
+}
diff --git a/npc/items/shock_sweet.txt b/npc/items/shock_sweet.txt
new file mode 100644
index 00000000..c35ce37f
--- /dev/null
+++ b/npc/items/shock_sweet.txt
@@ -0,0 +1,14 @@
+function script useShockSweet {
+ if (rand(5))
+ goto L_Change;
+ message strcharinfo(0), "Yuck, this tastes like earwax!";
+ heal -20 - (Hp >> 2), 0;
+ return;
+
+L_Change:
+ setlook LOOK_HAIR_COLOR, 122;
+ message strcharinfo(0), "Gah! That was some strong stuff!";
+ sc_start SC_POISON, 1, 20;
+ misceffect 15, strcharinfo(0);
+ return;
+}
diff --git a/npc/items/unreleased_item.txt b/npc/items/unreleased_item.txt
new file mode 100644
index 00000000..de7ac0f0
--- /dev/null
+++ b/npc/items/unreleased_item.txt
@@ -0,0 +1,14 @@
+// Unreleased items
+function script UnreleasedItem {
+ // If the server allows equipping unreleased items or if the active character is staff, do nothing.
+ // If you can equip *anything*, this restriction is moot
+ if (debug || has_permission(PERM_USE_ALL_EQUIPMENT, getcharid(3)))
+ return;
+ .@me=getarg(0);
+ message strcharinfo(0), "You have difficulties equipping this item, as if it is not yet fully in this world.";
+ unequip(.@me);
+ goto L_Return;
+
+L_Return:
+ return;
+}
diff --git a/npc/items/warpTowels.txt b/npc/items/warpTowels.txt
new file mode 100644
index 00000000..a6ffa8d1
--- /dev/null
+++ b/npc/items/warpTowels.txt
@@ -0,0 +1,150 @@
+function script WarpTowel {
+ @seconds = TowelLastUsed - (gettimetick(2) - 1200);
+ if (@seconds > 0 && !is_trusted())
+ goto L_DontPanic;
+ .@zone = getmapinfo(MAPINFO_ZONE);
+ if (.@zone == "Jail")
+ goto L_Prison;
+ // Zone will never be MMO, though
+ if (.@zone == "MMO" || .@zone == "Event")
+ goto L_Forbid;
+ if (getmapflag(getmapname(), mf_noteleport) || getmapflag(getmapname(), mf_nowarp) || isin("009-7",$@fightclub_x1,$@fightclub_y1,$@fightclub_x2,$@fightclub_y2))
+ goto L_Forbid;
+
+ if (@warpTowelName$ == "HitchhikersTowel")
+ goto L_Save;
+ if(@warpTowelName$ == "WhiteHitchhikersTowel")
+ goto L_White;
+ if(@warpTowelName$ == "RedHitchhikersTowel")
+ goto L_Red;
+ if(@warpTowelName$ == "GreenHitchhikersTowel")
+ goto L_Green;
+ if(@warpTowelName$ == "BlueHitchhikersTowel")
+ goto L_Blue;
+ if(@warpTowelName$ == "YellowHitchhikersTowel")
+ goto L_Yellow;
+ if(@warpTowelName$ == "PurpleHitchhikersTowel")
+ goto L_Purple;
+ if(@warpTowelName$ == "OrangeHitchhikersTowel")
+ goto L_Orange;
+ if(@warpTowelName$ == "PinkHitchhikersTowel")
+ goto L_Pink;
+ if(@warpTowelName$ == "TealHitchhikersTowel")
+ goto L_Teal;
+ if(@warpTowelName$ == "LimeHitchhikersTowel")
+ goto L_Lime;
+ goto L_Save;
+
+L_White:
+ // Koga
+ @NextLocationMap$ = "035-2";
+ @NextLocationX = 20;
+ @NextLocationY = 21;
+ goto L_WarpPlayer;
+
+L_Red:
+ // Barbarians
+ @NextLocationMap$ = "033-1";
+ @NextLocationX = 66;
+ @NextLocationY = 33;
+ goto L_WarpPlayer;
+
+L_Green:
+ // Candor
+ @NextLocationMap$ = "029-1";
+ @NextLocationX = 69;
+ @NextLocationY = 69;
+ goto L_WarpPlayer;
+
+L_Blue:
+ // Blue Sages
+ @NextLocationMap$ = "048-2";
+ @NextLocationX = 26;
+ @NextLocationY = 47;
+ goto L_WarpPlayer;
+
+L_Yellow:
+ // Tulimshar Mines
+ @NextLocationMap$ = "002-1";
+ @NextLocationX = 113;
+ @NextLocationY = 117;
+ goto L_WarpPlayer;
+
+L_Purple:
+ // Dimonds Inn
+ @NextLocationMap$ = "010-1";
+ @NextLocationX = 27;
+ @NextLocationY = 97;
+ goto L_WarpPlayer;
+
+L_Orange:
+ // Graveyard
+ @NextLocationMap$ = "027-1";
+ @NextLocationX = 70;
+ @NextLocationY = 100;
+ goto L_WarpPlayer;
+
+L_Pink:
+ // Terranite Cave
+ @NextLocationMap$ = "012-3";
+ @NextLocationX = 448;
+ @NextLocationY = 66;
+ goto L_WarpPlayer;
+
+L_Teal:
+ // Mana Seed
+ @NextLocationMap$ = "012-3";
+ @NextLocationX = 64;
+ @NextLocationY = 130;
+ goto L_WarpPlayer;
+
+L_Lime:
+ // Pachua
+ @NextLocationMap$ = "006-1";
+ @NextLocationX = 28;
+ @NextLocationY = 97;
+ callfunc "MiriamCheat";
+ goto L_WarpPlayer;
+
+L_Save:
+ // Soul Menhir
+ @NextLocationMap$ = getsavepoint(0);
+ @NextLocationX = getsavepoint(1);
+ @NextLocationY = getsavepoint(2);
+ goto L_WarpPlayer;
+
+L_WarpPlayer:
+ TowelLastUsed = gettimetick(2);
+ warp @NextLocationMap$,@NextLocationX,@NextLocationY;
+ goto L_BreakChance;
+
+L_BreakChance:
+ if (rand2(12))
+ goto L_Keep;
+ getitem HitchhikersTowel, 1;
+ goto L_End;
+
+L_Forbid:
+ message strcharinfo(0), "Towel : This area is protected by a force that doesn't tolerate the power of the Towel.";
+ goto L_Keep;
+
+L_Prison:
+ message strcharinfo(0), "Towel : You must be warped by a GM to leave this area.";
+ goto L_Keep;
+
+L_DontPanic:
+ callfunc "HumanTime";
+ message strcharinfo(0), "Towel : Your towel is still too low on power to jump again. Try again in ##B"+ @time$ + "##b.";
+ goto L_Keep;
+
+L_Keep:
+ getitem @warpTowelName$, 1;
+ goto L_End;
+
+L_End:
+ @NextLocationMap$ = "";
+ @NextLocationX = 0;
+ @NextLocationY = 0;
+ @warpTowelName$ = "";
+ return;
+}
diff --git a/npc/magic/config.txt b/npc/magic/config.txt
new file mode 100644
index 00000000..f8135b43
--- /dev/null
+++ b/npc/magic/config.txt
@@ -0,0 +1,434 @@
+// TMW2 script
+// Author: Jesusalva <admin@tmw2.org>
+//
+// Magic Script Core Functions
+//
+// Used for our pseudo-magic.
+// These are only helpers, you can add more restrictions and effects freely.
+// Here abizit() goes up to 10 instead of 5
+function script abizit {
+ if (!getskilllv(SKILL_MAGIC)) return 0;
+ switch (getskilllv(SKILL_MAGIC)) {
+ case 1:
+ .@base = 10; break;
+ case 2:
+ .@base = 120; break;
+ case 3:
+ .@base = 1500; break;
+ case 4:
+ .@base = 20000; break;
+ case 5:
+ .@base = 250000; break;
+ default:
+ return 0;
+ }
+ return min(MAGIC_EXP/.@base, 10);
+ return 0;
+}
+
+// AdjustSpellpower(power=100, {target=@skillTarget{, type=HARM_MAGI}})
+function script AdjustSpellpower {
+ .@power=getarg(0, 100);
+ .@target=getarg(1, @skillTarget);
+ .@type=getarg(2, HARM_MAGI);
+ .@src=getcharid(3);
+
+ // Prevents a possible glitch
+ if (.@target < 1 || .@target == getcharid(3))
+ .@target=0;
+
+ // Your magic power permanently increases your damage in 5%
+ if (getskilllv(SKILL_MAGIC) > 1)
+ .@power+=getskilllv(SKILL_MAGIC)*5-5;
+
+ // Calculation FIX
+ if (.@type == HARM_MAGI) {
+ .@power+=(readparam2(UDT_INT)/5);
+ .@dmg=rand2(
+ readbattleparam(getcharid(3), UDT_MATKMIN),
+ readbattleparam(getcharid(3), UDT_MATKMAX));
+ // Apply defense
+ //if (.@target)
+ // .@dmg=max(0, .@dmg-getunitdata(.@target, UDT_MDEF));
+ } else if (.@type == HARM_PHYS) {
+ .@power+=(readparam2(UDT_STR)/5);
+ .@dmg=rand2(
+ readbattleparam(getcharid(3), UDT_ATKMIN),
+ readbattleparam(getcharid(3), UDT_ATKMAX));
+ // Apply defense
+ //if (.@target)
+ // .@dmg=max(0, .@dmg-getunitdata(.@target, UDT_DEF));
+ } else {
+ .@dmg = .@power; .@power = 100;
+ }
+ // Abizit Influence (50%~110% at best, perfect ctrl is 100%~110%)
+ .@dmg = .@dmg * (50 + abizit() * rand2(5,6)) / 100;
+ .@dmg = .@dmg * .@power / 100;
+ return .@dmg;
+}
+
+// An alias for simplification
+// AdjustAttackpower(power=100, {target=@skillTarget{, type=HARM_PHYS}})
+function script AdjustAttackpower {
+ .@power=getarg(0, 100);
+ .@target=getarg(1, @skillTarget);
+ .@type=getarg(2, HARM_PHYS);
+ return AdjustSpellpower(.@power, .@target, .@type);
+}
+
+
+// SkillID, EXP Points
+function script GetManaExp {
+ .@sk=getarg(0);
+ .@pt=getarg(1);
+ if (LAST_SKILL != .@sk) {
+ // Update skill memory
+ LAST_SKILL[4]=LAST_SKILL[3];
+ LAST_SKILL[3]=LAST_SKILL[2];
+ LAST_SKILL[2]=LAST_SKILL[1];
+ LAST_SKILL[1]=LAST_SKILL[0];
+ LAST_SKILL[0]=.@sk;
+ // Magic EXP is gained by switching skills often
+ MAGIC_EXP=MAGIC_EXP+.@pt;
+ }
+ return;
+}
+
+
+// SkillID, MobID{, SkillLevelPerMob=2{, Level Override{, Summon=True}}}
+function script SummonMagic {
+ .@sk=getarg(0);
+ .@id=getarg(1);
+ .@adj=getarg(2,2);
+ .@lv=getarg(3,getskilllv(.@sk));
+ .@sm=getarg(4, true);
+
+ if (.@adj < 1) {
+ debugmes "\033[31mInvalid MobPerSkillLevel for SummonMagic (.@adj): "+.@adj+"\033[0m";
+ dispbottom l("Invalid parameter specified, blame saulc.");
+ end;
+ }
+
+ if (!.@sm)
+ getmapxy(.@m$, .@x, .@y, 0);
+
+ // Cause effect
+ // Summoned monsters live from 45 to 60 seconds, and each skill levels grants 10s extra life
+ // The 35~50 is not a defect, remember skill starts at level 1...
+ // PS. Abizit makes a variation from 80% to 130% of official values
+ for (.@i = 0; .@i < (.@lv+(.@adj-1))/.@adj; .@i++) {
+ .@lifetime=rand2(35,50)+.@lv*10;
+ // Abizit makes lifetime vary (like AdjustSpellpower)
+ .@lifetime = .@lifetime * (50 + abizit() * rand2(5,6)) / 100;
+ // Unfortunately this version does not returns the summoned monster GID
+ if (.@sm)
+ summon("Summoned Monster", .@id, .@lifetime);
+ else
+ monster(.@m$, .@x, .@y, "Invoked Monster", .@id, 1);
+ /*
+ .@mids=summon("Summoned Monster", .@id, .@lifetime);
+ .@bhp=getunitdata(.@mids, UDT_MAXHP);
+ // Each skill level raises HP in 5%
+ .@lvx=.@bhp + max(0, (.@lv-1)*.@bhp/20);
+ // Abizit makes bonus HP vary (like AdjustSpellpower)
+ .@lvx = .@lvx * (50 + abizit() * rand2(5,6)) / 100;
+ setunitdata(.@mids, UDT_MAXHP, .@lvx);
+ setunitdata(.@mids, UDT_HP, .@lvx);
+ // Reconfigure monster modes
+ .@opt=getunitdata(.@mids, UDT_MODE);
+ // Disable looting
+ if (.@opt & MD_LOOTER)
+ .@opt=.@opt^MD_LOOTER;
+ // All summons can suffer knockback
+ if (.@opt & MD_NOKNOCKBACK)
+ .@opt=.@opt^MD_NOKNOCKBACK;
+ // Strip summons from BOSS mode and immunity
+ if (.@opt & MD_BOSS)
+ .@opt=.@opt^MD_BOSS;
+ // Save new options
+ setunitdata(.@mids, UDT_MODE, .@opt);
+ */
+ }
+ dispbottom l("All monsters summoned!");
+ return;
+}
+
+
+// SK_summon(ID, amount, mexp{, summon=True})
+function script SK_summon {
+ .@mob=getarg(0);
+ .@amt=getarg(1);
+ .@mex=getarg(2, 1);
+ .@sum=getarg(3, true);
+ .@lvl=getskilllv(SKILL_MAGIC);
+ if ($@GM_OVERRIDE || debug) debugmes "Skill "+@skillId+" Lv "+@skillLv;
+ if (ispcdead() || !.@lvl || !@skillLv)
+ return;
+
+ if (rand2(10) < abizit()) {
+ // Summon Magic (with magic level bonus)
+ SummonMagic(@skillId, .@mob, .@amt, .@lvl+@skillLv-1, @skillLv, .@sum);
+ } else if (rand2(10) < abizit()) {
+ // Re-roll
+ dispbottom l("You cannot complete the casting correctly!");
+ SummonMagic(@skillId, .@mob, 1, 1, 1, .@sum);
+ } else if (abizit() <= rand2(3)) {
+ // Spell overwhelms you, causing it to be spawned as aggro vs you. (33%)
+ dispbottom l("The spell takes a mind of its own backfires!");
+ getmapxy(.@m$, .@x, .@y, 0);
+ .@opo=monster(.@m$, .@x, .@y, "Failed summon", .@mob, 1);
+ unitattack(.@opo, getcharid(3));
+ } else {
+ dispbottom l("The spell fails!");
+ }
+
+ // Get a single mana experience point (FIXME)
+ GetManaExp(@skillId, .@mex);
+ return;
+}
+
+// areaharm(target, range, DMG, {type, element, filter, bl})
+// Defaults to HARM_MISC, Ele_Neutral, filter filter_hostile and all BLs
+// Valid BL: BL_MOB | BL_PC | BL_HOM | BL_MER
+// Do not use: NPC, PET, ELEM
+// Range centers on caster (player), implement and use areaharm2 elsewhere
+function script areaharm {
+ .@t=getarg(0);
+ .@r=getarg(1);
+ .@d=getarg(2);
+ .@h=getarg(3, HARM_MISC);
+ .@e=getarg(4, Ele_Neutral);
+ .@f$=getarg(5, "filter_hostile");
+ .@b=getarg(6, BL_PC | BL_MOB | BL_MER | BL_HOM);
+
+ getmapxy(.@m$, .@x, .@y, getunittype(.@t), .@t);
+
+ .@c=getunits(.@b, .@mbs, false, .@m$, .@x-.@r, .@y-.@r, .@x+.@r, .@y+.@r);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ // Filtering
+ if (!callfunc(.@f$, .@mbs[.@i]))
+ continue;
+ harm(.@mbs[.@i], .@d, .@t, .@e);
+ specialeffect(FX_ATTACK, AREA, .@mbs[.@i]);
+ // TODO: Handle MobPt to don't overload timer system?
+ }
+ return;
+}
+
+
+// rectharm(target, x, y, DMG, {type, element, filter, bl})
+// Same as areaharm() but causes a rectangle in (x,y) size, instead of a square
+function script rectharm {
+ .@t=getarg(0);
+ .@rx=getarg(1);
+ .@ry=getarg(2);
+ .@d=getarg(3);
+ .@h=getarg(4, HARM_MISC);
+ .@e=getarg(5, Ele_Neutral);
+ .@f$=getarg(6, "filter_hostile");
+ .@b=getarg(7, BL_PC | BL_MOB | BL_MER | BL_HOM);
+
+ getmapxy(.@m$, .@x, .@y, getunittype(.@t), .@t);
+
+ .@c=getunits(.@b, .@mbs, false, .@m$, .@x-.@rx, .@y-.@ry, .@x+.@rx, .@y+.@ry);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ // Filtering
+ if (!callfunc(.@f$, .@mbs[.@i]))
+ continue;
+ harm(.@mbs[.@i], .@d, .@t, .@e);
+ specialeffect(FX_ATTACK, AREA, .@mbs[.@i]);
+ // TODO: Handle MobPt to don't overload timer system?
+ }
+ return;
+}
+
+// areasc(range, time, sc, bl, value, filter, target, chances)
+// Defaults to 3x3 square, sleep mob for 500ms. Ignores you.
+// Centered on player attached, 100% success chance
+// Need a player caster. Valid BL: BL_MOB | BL_PC | BL_HOM | BL_MER
+function script areasc {
+ .@r=getarg(0, 3);
+ .@d=getarg(1, 500);
+ .@s=getarg(2, SC_SLEEP);
+ .@b=getarg(3, BL_MOB);
+ .@val=getarg(4, 1);
+ .@f$=getarg(5, "filter_notme");
+ .@t=getarg(6, playerattached());
+ .@sr=getarg(7, 10000);
+
+ getmapxy(.@m$, .@x, .@y, getunittype(.@t), .@t);
+ .@c=getunits(.@b, .@mbs, false, .@m$, .@x-.@r, .@y-.@r, .@x+.@r, .@y+.@r);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ // Filtering
+ if (!callfunc(.@f$, .@mbs[.@i]))
+ continue;
+ sc_start .@s, .@d, .@val, .@sr, SCFLAG_NONE, .@mbs[.@i];
+ specialeffect(FX_BUFF, AREA, .@mbs[.@i]);
+ }
+ return;
+}
+
+// areasc2(map, x, y, {range, time, sc, bl, value, filter}) - can be used by NPC
+// Valid BL: BL_MOB | BL_PC | BL_HOM | BL_MER
+function script areasc2 {
+ .@m$=getarg(0);
+ .@x=getarg(1);
+ .@y=getarg(2);
+ .@r=getarg(3, 3);
+ .@d=getarg(4, 500);
+ .@s=getarg(5, SC_SLEEP);
+ .@b=getarg(6, BL_MOB);
+ .@val=getarg(7, 1);
+ .@f$=getarg(8, "filter_always");
+
+ .@c=getunits(.@b, .@mbs, false, .@m$, .@x-.@r, .@y-.@r, .@x+.@r, .@y+.@r);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ // Filtering
+ if (!callfunc(.@f$, .@mbs[.@i]))
+ continue;
+ sc_start .@s, .@d, .@val, 10000, SCFLAG_NONE, .@mbs[.@i];
+ specialeffect(FX_BUFF, AREA, .@mbs[.@i]);
+ }
+ return;
+}
+
+// areasc3(range, time, sc, bl, val1, val2, filter)
+// Defaults to 3x3 square, sleep mob for 500ms. Ignores you.
+// Need a player caster. Valid BL: BL_MOB | BL_PC | BL_HOM | BL_MER
+function script areasc3 {
+ .@r=getarg(0, 3);
+ .@d=getarg(1, 500);
+ .@s=getarg(2, SC_SLEEP);
+ .@b=getarg(3, BL_MOB);
+ .@v1=getarg(4, 1);
+ .@v2=getarg(5, 1);
+ .@f$=getarg(6, "filter_notme");
+
+ getmapxy(.@m$, .@x, .@y, 0);
+ .@c=getunits(.@b, .@mbs, false, .@m$, .@x-.@r, .@y-.@r, .@x+.@r, .@y+.@r);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ // Filtering
+ if (!callfunc(.@f$, .@mbs[.@i]))
+ continue;
+ sc_start2 .@s, .@d, .@v1, .@v2, 10000, SCFLAG_NONE, .@mbs[.@i];
+ specialeffect(FX_BUFF, AREA, .@mbs[.@i]);
+ }
+ return;
+}
+
+// massprovoke(range, {map, x, y}) - player only
+function script massprovoke {
+ getmapxy(.@m$, .@x, .@y, 0);
+ .@r=getarg(0, 3);
+ .@m$=getarg(1, .@m$);
+ .@x=getarg(2, .@x);
+ .@y=getarg(3, .@y);
+
+ .@c=getunits(BL_MOB, .@mbs, false, .@m$, .@x-.@r, .@y-.@r, .@x+.@r, .@y+.@r);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ //sc_start .@s, .@d, 1, 10000, SCFLAG_NONE, .@mbs[.@i];
+ aggravate .@mbs[.@i];
+ specialeffect(FX_MAGIC, AREA, .@mbs[.@i]);
+ }
+ return;
+}
+
+
+
+// getactivatedpoolskilllist(?)
+function script getactivatedpoolskilllist {
+ return bitmask_count(FOCUSING);
+}
+
+// getdeactivatedpoolskilllist(?)
+function script getdeactivatedpoolskilllist {
+ return (bitmask_count(FOCUSING)-FSKILL_TOTAL);
+}
+
+// getpoolskillFID(ID)
+function script getpoolskillFID {
+ switch (getarg(0)) {
+ case SKILL_MALLARDS_EYE: return FSKILL_MALLARDS_EYE;
+ case SKILL_BRAWLING: return FSKILL_BRAWLING;
+ case SKILL_SPEED: return FSKILL_SPEED;
+ case SKILL_RESIST_POISON: return FSKILL_RESIST_POISON;
+ case SKILL_ASTRAL_SOUL: return FSKILL_ASTRAL_SOUL;
+ case SKILL_RAGING: return FSKILL_RAGING;
+ }
+ return Exception("Invalid focus skill ID: "+getarg(0), RB_DEFAULT|RB_ISFATAL);
+}
+
+// poolskill(skill)
+function script poolskill {
+ if (bitmask_count(FOCUSING) < getskilllv(SKILL_POOL)) {
+ FOCUSING=FOCUSING | getpoolskillFID(getarg(0));
+ recalcstatus();
+ return true;
+ }
+ return false;
+}
+
+// unpoolskill(skill)
+function script unpoolskill {
+ .@f=getpoolskillFID(getarg(0));
+ if (FOCUSING & .@f)
+ FOCUSING=FOCUSING ^ .@f;
+ recalcstatus();
+ return;
+}
+
+// isfocused(skill)
+function script isfocused {
+ .@f=getpoolskillFID(getarg(0));
+ return (FOCUSING & .@f);
+}
+
+// mcharge(item, school, charges) {inheirs = @skillId}
+function script mcharge {
+ .@it=getarg(0);
+ .@sc=getarg(1);
+ .@cr=getarg(2, 0);
+ if (@MCHARGE[@skillId] < 1) {
+ delitem .@it, 1;
+ @MCHARGE[@skillId] = .@cr+getskilllv(SKILL_MAGIC)+getskilllv(.@cr);
+ // Low supply warning
+ if (countitem(.@it) <= 3)
+ dispbottom col(b(l("Warning, %d remaining: %s",
+ countitem(.@it), getitemname(.@it))), 1);
+ }
+ @MCHARGE[@skillId]-=1;
+ return;
+}
+
+// transcheck( {item 1, amount 1}, {item 2, amount 2}... )
+// returns true upon success
+function script transcheck {
+ if (getargcount() < 2 || getargcount() % 2 != 0)
+ return Exception("Faulty transcheck invoked - error");
+
+ // Count items
+ for (.@i=0;.@i < getargcount(); .@i++) {
+ if (countitem(getarg(.@i)) < getarg(.@i+1))
+ return false;
+ .@i++;
+ }
+
+ // Delete Items
+ for (.@i=0;.@i < getargcount(); .@i++) {
+ delitem getarg(.@i), getarg(.@i+1);
+ .@i++;
+ }
+ return true;
+}
+
+- script Magic Load NPC_HIDDEN,{
+OnInit:
+ end;
+OnSkillInvoke:
+ callfunc("HUB_SkillInvoke");
+ end;
+OnPCBonusEvent:
+ callfunc("HUB_PCBonus");
+ end;
+}
+
diff --git a/npc/magic/final.txt b/npc/magic/final.txt
new file mode 100644
index 00000000..30dce5e9
--- /dev/null
+++ b/npc/magic/final.txt
@@ -0,0 +1,259 @@
+// TMW2 scripts.
+// Authors:
+// Jesusalva
+// TMW Org.
+// Description:
+// HUB functions (Magic)
+// HUB_SkillInvoke ( )
+function script HUB_SkillInvoke {
+ // Something is... wrong
+ if (!@skillId) {
+ Exception("ILLEGAL SKILL PASSED TO HUB. It has been compromised, Jim.", RB_DEBUGMES|RB_IRCBROADCAST);
+ debugmes "Legal Caster: %s", strcharinfo(0);
+ debugmes "Effective Caster: %d", @skillCaster;
+ return;
+ }
+
+ /* *********************************************************************** */
+ // TODO: Detect what was script-cast and what was player-case. Then, readd RB_IRCBROADCAST
+ // If you can't do this: You can't do this
+ if (getskilllv(@skillId) < @skillLv && @skillId != BS_GREED)
+ Exception("System ERROR, HSI."+@skillId+" INVALID CAST (got "+@skillLv+" expected "+getskilllv(@skillId)+", sub-LC."+(getcharid(3)-2000000)+")", RB_DEBUGMES|RB_ISFATAL);
+ // You are AFK for over 3 minutes, that's crazy, disregard
+ if (checkidle() > 180)
+ return;
+
+ // Record to database
+ skillInvoke[@skillId] = skillInvoke[@skillId] + 1;
+
+ // Script-based skills
+ /* *********************************************************************** */
+ switch (@skillId) {
+ case TMW2_FAKESKILL:
+ charcommand("@refresh"); // Possibly broken on too up-to-date Herc
+ break;
+ // Level 0
+ case SKILL_CONFRINGO:
+ SK_Confringo(); break;
+ case SKILL_REAPERCRY:
+ Reapercry(); break;
+ // Level 1
+ case SKILL_ABIZIT:
+ SK_Abizit(); break;
+ case SKILL_MONSTERINFO:
+ SK_Miteyo(); break;
+ case EVOL_AREA_PROVOKE:
+ SK_Itenplz(); break;
+ case SKILL_FLAR:
+ SK_Flar(); break;
+ case SKILL_MODRIPHOO:
+ case SKILL_MODRISUMP:
+ case SKILL_MODRIYIKAM:
+ case SKILL_MODRILAX:
+ SK_GrowPlants(); break; // FIXME: Unreleased/cannot be learned
+ case SKILL_LUM:
+ SK_Lum(); break;
+ case SKILL_CHIZA:
+ SK_Chiza(); break;
+ case SKILL_PARUM:
+ case SKILL_GOLE:
+ SK_Transmute(); break;
+ // Level 2
+ case SKILL_INMA:
+ SK_Inma(); break;
+ case SKILL_JOYPLIM:
+ SK_Joyplim(); break;
+ case SKILL_CHIPCHIP:
+ SK_Shear(); break;
+ case SKILL_KALAKARENK:
+ case SKILL_KALBOO:
+ case SKILL_KALGINA:
+ case SKILL_KALRENK:
+ SK_SummonLv2(); break;
+ case SKILL_HALHISS:
+ case SKILL_HELORP:
+ SK_SummonLv2(); break;
+ case SKILL_KAFLOSH:
+ SK_Kaflosh(); break;
+ case SKILL_BETSANC:
+ SK_Betsanc(); break;
+ case SKILL_ASORM:
+ SK_Asorm(); break;
+ case SKILL_INGRAV:
+ SK_Ingrav(); break;
+ case SKILL_UPMARMU:
+ SK_Uparmu(); break;
+ case SKILL_FRILLYAR:
+ SK_Frillyar(); break;
+ case SKILL_PHLEX:
+ SK_Phlex(); break;
+ case SKILL_KULARZUFRILL:
+ case SKILL_ZUKMINBIRF:
+ case SKILL_PATMUPLOO:
+ case SKILL_PATVILOREE:
+ case SKILL_PATLOREE:
+ case SKILL_MANPAHIL:
+ SK_Transmute(); break;
+ // Level 3
+ // Level 4
+ // Level 5
+ ////////////////////////////////
+ /* XXX: Fire Class
+ // (May burn targets for damage over time)
+ case TMW2_ARMAGEDDON:
+ .@PW=140+(10*@skillLv);
+ .@RG=5+(@skillLv/5);
+ // 18% chance, 3s, 3x3 radius
+ areaharm(@skillTarget, .@RG, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Fire);
+ areasc(.@RG, 6000, SC_BLOODING, BL_MOB|BL_PC|BL_HOM|BL_MER, 1, "filter_hostile", @skillTarget, 1800);
+ GetManaExp(TMW2_FIREBALL, 3);
+ break;
+ ////////////////////////////////
+ // XXX: Earth Class
+ case TMW2_GAIABREAK:
+ .@PWA=170+(30*@skillLv);
+ .@PWB=110+(10*@skillLv);
+ .@dmg=AdjustSpellpower(.@PWA);
+ .@dsub=AdjustSpellpower(.@PWB);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Earth);
+ rectharm(@skillTarget, 2, 5, .@dsub, HARM_MAGI, Ele_Earth);
+ areasc(2, 5000, SC_INCDEFRATE, BL_PC, 10, "filter_friendly");
+ GetManaExp(TMW2_METEORSTRIKE, 3);
+ break;
+ ////////////////////////////////
+ // XXX: Physical Class (Regular)
+ case TMW2_FALKONSTRIKE:
+ .@PW=100+(25*@skillLv);
+ .@ST=0+(10*@skillLv);
+ .@TM=100+(90*@skillLv);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ sc_start SC_STUN, .@TM, 1, .@ST, SCFLAG_NONE, @skillTarget;
+ GetManaExp(@skillId, 1);
+ break;
+ case TMW2_GROUNDSTRIKE:
+ .@PW=50+(40*@skillLv);
+ .@dmg=AdjustAttackpower(.@PW);
+ .@RG=2+(@skillLv/5);
+ .@TM=100+(@skillLv*200);
+ .@ST=500+(100*@skillLv);
+ .@EF=any(SC_STUN, SC_BLIND, SC_BLOODING, SC_BLIND, SC_BLOODING);
+ areaharm(@skillTarget, .@RG, .@dmg, HARM_PHYS, Ele_Neutral);
+ areasc(.@RG, .@TM, .@EF, BL_MOB | BL_PC | BL_HOM | BL_MER, 1, "filter_hostile", @skillTarget, .@ST);
+ GetManaExp(@skillId, 1);
+ break;
+ case TMW2_SUPREMEATTACK:
+ .@PW=100+(50*@skillLv);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ GetManaExp(@skillId, 1);
+ break;
+ ////////////////////////////////
+ // Summons which never fail
+ case TMW2_ZARKOR:
+ SummonMagic(@skillId, CaveMaggot, 2, @skillLv);
+ GetManaExp(@skillId, 1);
+ break;
+ // Summons which may fail
+ case TMW2_KALWULF:
+ SK_summon(Wolvern, 4, any(3,4));
+ break;
+ // More complex summons
+ case TMW2_FROZENHEART:
+ .@mobId=Moggun;
+ if (rand2(6,12) < abizit()+1)
+ {
+ .@mobId=Yeti;
+ }
+ SK_summon(.@mobId, 4, any(3,4));
+ break;
+ case TMW2_STONEHEART:
+ .@mobId=Terranite;
+ if (rand2(9,12) < abizit()+1 &&
+ BaseLevel > 80)
+ {
+ .@mobId=TerraniteProtector;
+ }
+ SK_summon(.@mobId, 4, any(4,5));
+ break;
+ */
+
+ // Experience only
+ default:
+ GetManaExp(@skillId, 1);
+ break;
+ }
+
+ // Debug
+ if ($@GM_OVERRIDE)
+ debugmes "Cast skill %d on level %d - Target %d",
+ @skillId, @skillLv, @skillTarget;
+
+ // Cleanup (double-safe)
+ @skillTarget = 0;
+ return;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// HUB_PCBonus ()
+function script HUB_PCBonus {
+ /* Passive Skills */
+ if (FOCUSING & FSKILL_ASTRAL_SOUL) {
+ bonus bMatkRate, 3*getskilllv(SKILL_ASTRAL_SOUL);
+ }
+ if (FOCUSING & FSKILL_RAGING) {
+ bonus bCritical, 2*getskilllv(SKILL_RAGING);
+ }
+ if (FOCUSING & FSKILL_SPEED) {
+ bonus bSpeedAddRate, 1*getskilllv(SKILL_SPEED);
+ bonus bAspd, 2*getskilllv(SKILL_SPEED);
+ }
+ if (FOCUSING & FSKILL_RESIST_POISON) {
+ .@l=5*getskilllv(SKILL_RESIST_POISON);
+ bonus2(bResEff, Eff_Silence, .@l);
+ bonus2(bResEff, Eff_Poison, .@l);
+ bonus2(bResEff, Eff_DPoison, .@l);
+ bonus2(bResEff, Eff_Curse, .@l);
+ bonus2(bResEff, Eff_Blind, .@l);
+ }
+ if (FOCUSING & FSKILL_BRAWLING) {
+ if (getequipid(EQI_HAND_R) < 1) {
+ bonus bAtk, 10*getskilllv(SKILL_BRAWLING);
+ } else if (getiteminfo(
+ getequipid(EQI_HAND_R), ITEMINFO_SUBTYPE) == W_FIST) {
+ bonus bAtk, 10*getskilllv(SKILL_BRAWLING);
+ }
+ }
+ if (FOCUSING & FSKILL_MALLARDS_EYE) {
+ bonus bAtkRange, (2+getskilllv(SKILL_MALLARDS_EYE))/3;
+ bonus bHit, 5*getskilllv(SKILL_MALLARDS_EYE);
+ }
+ return;
+}
+
diff --git a/npc/magic/level0-monsterinfo.txt b/npc/magic/level0-monsterinfo.txt
new file mode 100644
index 00000000..0a891055
--- /dev/null
+++ b/npc/magic/level0-monsterinfo.txt
@@ -0,0 +1,38 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_MONSTERINFO (Level 1)
+// School: General 1
+
+function script SK_Miteyo {
+ .@mobId=getunitdata(@skillTarget, UDT_CLASS);
+ if (.@mobId > 1000) {
+ // Decide how much detail you get based on how much magic you have
+ if (getskilllv(SKILL_MAGIC) > 2) {
+ charcommand("@mi "+.@mobId);
+ } else {
+ .@mhp = getmonsterinfo(.@mobId, MOB_MAXHP);
+ // Truncate HP
+ if (.@mhp > 1000)
+ .@mhp -= .@mhp % 1000;
+ else if (.@mhp > 100)
+ .@mhp -= .@mhp % 100;
+ else
+ .@mhp -= .@mhp % 10;
+ // Randomize atk
+ .@atk = rand2(getmonsterinfo(.@mobId, MOB_ATK1),
+ getmonsterinfo(.@mobId, MOB_ATK2));
+ // Send the obfuscated information
+ dispbottom l("%s - Level %d (~%s HP, ~%s ATK)",
+ getmonsterinfo(.@mobId, MOB_NAME),
+ getmonsterinfo(.@mobId, MOB_LV),
+ fnum(.@mhp),
+ fnum(.@atk));
+ }
+ } else {
+ // Not a valid monster
+ dispbottom l("This is not a monster; I cannot use monsterinfo on it.");
+ }
+ return;
+}
+
diff --git a/npc/magic/level0-reapercry.txt b/npc/magic/level0-reapercry.txt
new file mode 100644
index 00000000..1b6f07d5
--- /dev/null
+++ b/npc/magic/level0-reapercry.txt
@@ -0,0 +1,228 @@
+// #reapercry
+// Spell to warp to Keshlam Outskirts
+// Variable: @reapercry -> Holds summon state
+//
+// If this was Evol2 engine, I would be able to easily use bitmasks,
+// Having a custom password sequence unique per character.
+// But alas, on TMWA, I can't really abuse player variables.
+// So I allow you to cheat. Or not. Lemme think. Account variable...
+// This is actually an old script and I'm too lazy to redo.
+
+// Returns true if player inside candle area
+// call("alacriuspos", bitwise)
+
+function script alacriuspos {
+ @alacriusp = 0;
+
+ // Left side
+ if (1 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_25_53_29_56;
+ if (2 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_20_47_22_51;
+ if (4 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_22_40_25_43;
+ if (8 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_29_40_32_43;
+ if (16 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_32_47_35_50;
+ if (32 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_25_53_29_56;
+ // Left not set
+ if (1 == getarg(0))
+ goto L_29_40_32_43;
+ if (2 == getarg(0))
+ goto L_32_47_35_50;
+ if (4 == getarg(0))
+ goto L_25_53_29_56;
+ if (8 == getarg(0))
+ goto L_20_47_22_51;
+ if (16 == getarg(0))
+ goto L_22_40_25_43;
+ if (32 == getarg(0))
+ goto L_29_40_32_43;
+ // Right side
+ if (64 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_49_53_53_56;
+ if (128 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_43_47_46_51;
+ if (256 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_46_40_49_43;
+ if (512 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_53_40_56_43;
+ if (1024 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_56_47_58_50;
+ if (2048 == getarg(0) && #CRYPT_PASSWORD & getarg(0))
+ goto L_49_53_53_56;
+ // Right side not set
+ if (64 == getarg(0))
+ goto L_53_40_56_43;
+ if (128 == getarg(0))
+ goto L_56_47_58_50;
+ if (256 == getarg(0))
+ goto L_49_53_53_56;
+ if (512 == getarg(0))
+ goto L_43_47_46_51;
+ if (1024 == getarg(0))
+ goto L_46_40_49_43;
+ if (2048 == getarg(0))
+ goto L_53_40_56_43;
+
+ // Nope, all wrong
+ @alacriusp = 0;
+ return;
+
+L_29_40_32_43:
+ @alacriusp = isin("027-8", 29, 40, 32, 43);
+ return;
+L_22_40_25_43:
+ @alacriusp = isin("027-8", 22, 40, 25, 43);
+ return;
+L_20_47_22_51:
+ @alacriusp = isin("027-8", 20, 47, 22, 51);
+ return;
+L_25_53_29_56:
+ @alacriusp = isin("027-8", 25, 53, 29, 56);
+ return;
+L_32_47_35_50:
+ @alacriusp = isin("027-8", 32, 47, 35, 50);
+ return;
+
+L_53_40_56_43:
+ @alacriusp = isin("027-8", 53, 40, 56, 43);
+ return;
+L_46_40_49_43:
+ @alacriusp = isin("027-8", 46, 40, 49, 43);
+ return;
+L_43_47_46_51:
+ @alacriusp = isin("027-8", 43, 47, 46, 51);
+ return;
+L_49_53_53_56:
+ @alacriusp = isin("027-8", 49, 53, 53, 56);
+ return;
+L_56_47_58_50:
+ @alacriusp = isin("027-8", 56, 47, 58, 50);
+ return;
+
+}
+
+function script Reapercry {
+ // Not in Terogan's Room
+ if (getmapname() != "027-8") end;
+
+ // Terogan is asleep
+ if (!$@CRYPT_FIGHT3) end;
+
+ // No password is set o.o
+ if (!#CRYPT_PASSWORD) end;
+
+ // Switch the quest state
+ if (@reapercry == 0)
+ goto L_Check0;
+ if (@reapercry == 1)
+ goto L_Check1;
+ if (@reapercry == 2)
+ goto L_Check2;
+ if (@reapercry == 3)
+ goto L_Check3;
+ if (@reapercry == 4)
+ goto L_Check4;
+ if (@reapercry == 5)
+ goto L_Check5;
+
+ // Something went wrong!!
+ end;
+
+L_Check0:
+ callfunc("alacriuspos", 1);
+ if (@alacriusp) goto L_Exec0;
+ callfunc("alacriuspos", 64);
+ if (@alacriusp) goto L_Exec0;
+
+ @reapercry = 0;
+ misceffect FX_MAGIC_DARK_EXPLOSION, strcharinfo(0);
+ end;
+
+L_Exec0:
+ misceffect FX_FIRE_EXPLOSION, strcharinfo(0); // Hmm FIXME
+ @reapercry = 1;
+ end;
+
+L_Check1:
+ callfunc("alacriuspos", 2);
+ if (@alacriusp) goto L_Exec1;
+ callfunc("alacriuspos", 128);
+ if (@alacriusp) goto L_Exec1;
+
+ @reapercry = 0;
+ misceffect FX_MAGIC_DARK_EXPLOSION, strcharinfo(0);
+ end;
+
+L_Exec1:
+ misceffect FX_FIRE_EXPLOSION, strcharinfo(0); // Hmm FIXME
+ @reapercry = 2;
+ end;
+
+L_Check2:
+ callfunc("alacriuspos", 4);
+ if (@alacriusp) goto L_Exec2;
+ callfunc("alacriuspos", 256);
+ if (@alacriusp) goto L_Exec2;
+
+ @reapercry = 0;
+ misceffect FX_MAGIC_DARK_EXPLOSION, strcharinfo(0);
+ end;
+
+L_Exec2:
+ misceffect FX_FIRE_EXPLOSION, strcharinfo(0); // Hmm FIXME
+ @reapercry = 3;
+ end;
+
+L_Check3:
+ callfunc("alacriuspos", 8);
+ if (@alacriusp) goto L_Exec3;
+ callfunc("alacriuspos", 512);
+ if (@alacriusp) goto L_Exec3;
+
+ @reapercry = 0;
+ misceffect FX_MAGIC_DARK_EXPLOSION, strcharinfo(0);
+ end;
+
+L_Exec3:
+ misceffect FX_FIRE_EXPLOSION, strcharinfo(0); // Hmm FIXME
+ @reapercry = 4;
+ end;
+
+L_Check4:
+ callfunc("alacriuspos", 16);
+ if (@alacriusp) goto L_Exec4;
+ callfunc("alacriuspos", 1024);
+ if (@alacriusp) goto L_Exec4;
+
+ @reapercry = 0;
+ misceffect FX_MAGIC_DARK_EXPLOSION, strcharinfo(0);
+ end;
+
+L_Exec4:
+ misceffect FX_FIRE_EXPLOSION, strcharinfo(0); // Hmm FIXME
+ @reapercry = 5;
+ end;
+
+L_Check5:
+ callfunc("alacriuspos", 32);
+ if (@alacriusp) goto L_Exec5;
+ callfunc("alacriuspos", 2048);
+ if (@alacriusp) goto L_Exec5;
+
+ @reapercry = 0;
+ misceffect FX_MAGIC_DARK_EXPLOSION, strcharinfo(0);
+ end;
+
+L_Exec5:
+ // This means cast sequence complete
+ // Maybe FX_MAGIC_BLUE_TELEPORT? (iilia's effect)
+ @reapercry = 0;
+ getexp 100000, 0;
+ misceffect FX_MAGIC_TELEPORT, strcharinfo(0);
+ warp "099-7", 75, 36;
+ end;
+}
diff --git a/npc/magic/level0-wand.txt b/npc/magic/level0-wand.txt
new file mode 100644
index 00000000..1c3d7b2b
--- /dev/null
+++ b/npc/magic/level0-wand.txt
@@ -0,0 +1,25 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_CONFRINGO (Level 1)
+// School: General 0
+
+function script SK_Confringo {
+ // Additional checks
+ if (QL_MORGAN == 2)
+ set QL_MORGAN, 3;
+ // Effective magic code
+ .@PW=90+(7*@skillLv);
+ .@dmg=AdjustSpellpower(.@PW);
+ .@max=(1+getskilllv(SKILL_MAGIC))*100;
+ // Noobs adjustment
+ if (.@dmg < readparam(bInt))
+ .@dmg=rand2(.@dmg, readparam(bInt));
+ // Pro adjustment
+ if (.@dmg > .@max)
+ .@dmg = .@max + ((.@dmg - .@max) * 30 / 100);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Neutral);
+ return;
+}
+
+
diff --git a/npc/magic/level1-aggravate.txt b/npc/magic/level1-aggravate.txt
new file mode 100644
index 00000000..c97d8b47
--- /dev/null
+++ b/npc/magic/level1-aggravate.txt
@@ -0,0 +1,16 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: EVOL_AREA_PROVOKE (Level 1)
+// School: Nature 1
+
+function script SK_Itenplz {
+ /*
+ if (@skillTargetX && @skillTargetY)
+ massprovoke(1+@skillLv, getmap(), @skillTargetX, @skillTargetY);
+ else
+ */
+ massprovoke(1+@skillLv);
+ return;
+}
+
diff --git a/npc/magic/level1-experience.txt b/npc/magic/level1-experience.txt
new file mode 100644
index 00000000..7435fb71
--- /dev/null
+++ b/npc/magic/level1-experience.txt
@@ -0,0 +1,55 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_ABIZIT (Level 1)
+// School: General 1
+
+// ShowAbizit({dialog=true})
+function script ShowAbizit {
+ .@dial=getarg(0, true);
+ if (.@dial)
+ mesn l("Current Magic Control");
+
+ switch (abizit()) {
+ case 10:
+ mescordialog l("Magic flows naturally from you, readily and with ease. You feel in perfect control of your magic."), 3, .@dial;
+ break;
+ case 9:
+ mescordialog l("You feel in almost perfect control of your magic."), 2, .@dial;
+ break;
+ case 8:
+ mescordialog l("You feel that you have very good control of your magic."), 2, .@dial;
+ break;
+ case 7:
+ mescordialog l("You feel quite in control of your magic."), 4, .@dial;
+ break;
+ case 6:
+ mescordialog l("You feel mostly in control of your magic."), 4, .@dial;
+ break;
+ case 5:
+ mescordialog l("You feel somewhat in control of your magic."), 7, .@dial;
+ break;
+ case 4:
+ mescordialog l("You feel you still have a few difficulties in controlling your magic."), 7, .@dial;
+ break;
+ case 3:
+ mescordialog l("Trying to control your magic is still rather troublesome."), 6, .@dial;
+ break;
+ case 2:
+ mescordialog l("You feel that you have only the bare minimum of control over your magic."), 6, .@dial;
+ break;
+ case 1:
+ mescordialog l("You feel quite overwhelmed by your magic, but are beginning to see patterns."), 1, .@dial;
+ break;
+ case 0:
+ mescordialog l("You feel completely overwhelmed by your magic."), 1, .@dial;
+ break;
+ }
+ return;
+}
+
+function script SK_Abizit {
+ ShowAbizit(false);
+ return;
+}
+
diff --git a/npc/magic/level1-flare-dart.txt b/npc/magic/level1-flare-dart.txt
new file mode 100644
index 00000000..2446fa9c
--- /dev/null
+++ b/npc/magic/level1-flare-dart.txt
@@ -0,0 +1,23 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_FLAR (Level 1)
+// School: War 1
+
+function script SK_Flar {
+ // Charge code, item check is in skill_db.conf (FIXME)
+ mcharge(SulphurPowder, SKILL_MAGIC_WAR, 1);
+ // Effective magic code
+ .@PW=70+(5*@skillLv);
+ // Weather modifiers
+ if ("#WeatherCore"::weather(MASK_RAIN))
+ .@PW-=10;
+ if ("#WeatherCore"::weather(MASK_SANDSTORM))
+ .@PW+=10;
+ // Calculate real damage
+ .@dmg=AdjustSpellpower(.@PW);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Fire);
+ GetManaExp(@skillId, 1);
+ return;
+}
+
diff --git a/npc/magic/level1-grow-plants.txt b/npc/magic/level1-grow-plants.txt
new file mode 100644
index 00000000..66e105b4
--- /dev/null
+++ b/npc/magic/level1-grow-plants.txt
@@ -0,0 +1,29 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: Multiple (Level 1)
+// School: Nature 1
+
+function script SK_GrowPlants {
+ // Setup
+ switch (@skillId) {
+ case SKILL_MODRIPHOO:
+ .@it = AlizarinHerb; .@mobId = AlizarinPlant; break;
+ case SKILL_MODRISUMP:
+ .@it = CobaltHerb; .@mobId = CobaltPlant; break;
+ case SKILL_MODRIYIKAM:
+ .@it = GambogeHerb; .@mobId = GambogePlant; break;
+ case SKILL_MODRILAX:
+ .@it = MauveHerb; .@mobId = MauvePlant; break;
+ default: return;
+ }
+ if (getarg(0, true)) {
+ // Consume reagents
+ delitem Root, 1;
+ delitem .@it, 1;
+ }
+ // Continue but with a special flag
+ SK_summon(.@mobId, 2, 1, false);
+ return;
+}
+
diff --git a/npc/magic/level1-lesser-heal.txt b/npc/magic/level1-lesser-heal.txt
new file mode 100644
index 00000000..b65f9625
--- /dev/null
+++ b/npc/magic/level1-lesser-heal.txt
@@ -0,0 +1,63 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_LUM (Level 1)
+// School: Life 1
+
+function script SK_Lum {
+ // In some cases it is... aborted
+ if (getunittype(@skillTarget) == UNITTYPE_PC) {
+ .@me=getcharid(3);
+ .@ok=true;
+ attachrid(@skillTarget);
+ // Kill the GM Event
+ if (isequipped(MagicGMTopHat))
+ .@ok=false;
+ // Ailments cannot be bypassed nor healed until Lv 3 Life Magic
+ if (getstatus(SC_BLOODING) ||
+ getstatus(SC_HALT_REGENERATION) ||
+ getstatus(SC_CURSE))
+ .@ok=false;
+ if (getstatus(SC_POISON) && !getstatus(SC_SLOWPOISON))
+ .@ok=false;
+ if (getstatus(SC_DPOISON) && !getstatus(SC_SLOWPOISON))
+ .@ok=false;
+ // Already dead
+ if (Hp < 1)
+ .@ok=false;
+ // Finished
+ .@limit=MaxHp-Hp;
+ detachrid();
+ attachrid(.@me);
+ if (!.@ok) return;
+ } else {
+ if (getunitdata(@skillTarget, UDT_HP) < 1) return;
+ .@limit=getunitdata(@skillTarget, UDT_MAXHP)-
+ getunitdata(@skillTarget, UDT_HP);
+ }
+
+ // No need for healing? Otherwise, take reagent
+ if (.@limit <= 0) return;
+ delitem Lifestone, 1;
+
+ // Real healing happens here
+ .@PW=60+(10*@skillLv);
+ .@dmg=AdjustSpellpower(.@PW);
+ sc_start(SC_M_LIFEPOTION, 5000, 1+max(0, .@dmg/5), 10000,
+ SCFLAG_NOAVOID|SCFLAG_FIXEDTICK|SCFLAG_FIXEDRATE, @skillTarget);
+ specialeffect(FX_MAGIC_WHITE, AREA, @skillTarget);
+ if (@skillTarget != getcharid(3))
+ specialeffect(FX_MAGIC_WHITE, AREA, getcharid(3));
+
+ // Specifics
+ if (getskilllv(SKILL_MAGIC_DARK) >= 1)
+ SC_Bonus(2, SC_HALT_REGENERATION, 1);
+
+ // Gives EXP according to how much you healed
+ if (@skillTarget != getcharid(3))
+ setq2(MagicQuest_Healing, getq2(MagicQuest_Healing)+1);
+ getexp min(.@dmg, .@limit)*getskilllv(SKILL_MAGIC_LIFE), .@PW/10;
+ GetManaExp(@skillId, 1);
+ return;
+}
+
diff --git a/npc/magic/level1-magic-blade.txt b/npc/magic/level1-magic-blade.txt
new file mode 100644
index 00000000..ae98d4c4
--- /dev/null
+++ b/npc/magic/level1-magic-blade.txt
@@ -0,0 +1,27 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_CHIZA (Level 1)
+// School: War 1
+
+function script SK_Chiza {
+ // Charge code, item check is here =( FIXME
+ if (countitem(Dagger)) {
+ mcharge(Dagger, SKILL_MAGIC_WAR, 8); .@PW=100;
+ } else if (countitem(SharpKnife)) {
+ mcharge(SharpKnife, SKILL_MAGIC_WAR, 6); .@PW=95;
+ } else if (countitem(Knife)) {
+ mcharge(Knife, SKILL_MAGIC_WAR, 4); .@PW=90;
+ } else {
+ dispbottom b("Chiza: ")+l("You need a Dagger, Sharp Knife or Knife to use!");
+ return;
+ }
+ .@PW+=(10*@skillLv);
+ // Effective magic code
+ .@dmg=(AdjustSpellpower(.@PW)+AdjustAttackpower(.@PW))/2;
+ harm(@skillTarget, .@dmg, HARM_PHYS, Ele_Neutral);
+ GetManaExp(@skillId, 1);
+ return;
+}
+
+
diff --git a/npc/magic/level1-summon-maggots.txt b/npc/magic/level1-summon-maggots.txt
new file mode 100644
index 00000000..7ca9f74d
--- /dev/null
+++ b/npc/magic/level1-summon-maggots.txt
@@ -0,0 +1,15 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_KALMURK (Level 1)
+// School: Astral 1
+
+function script SK_Kalmurk {
+ delitem Root, 1;
+ delitem .@it, 1;
+ specialeffect(FX_MAGIC_MAGGOT_CAST, AREA, getcharid(3));
+ sleep2(cap_value(5400-AdjustSpellpower(100)-@skillLv*400, 500, 5000));
+ SK_summon(Maggot, 2, 1);
+ return;
+}
+
diff --git a/npc/magic/level1-transmutations.txt b/npc/magic/level1-transmutations.txt
new file mode 100644
index 00000000..88e916fc
--- /dev/null
+++ b/npc/magic/level1-transmutations.txt
@@ -0,0 +1,95 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: MULTIPLE (Level 1)
+// School: Transmutation *
+
+function script SK_Transmute {
+ // Setup
+ switch (@skillId) {
+ case SKILL_PARUM:
+ .@prize = MoubooFigurine; .@pc = 1;
+ .@mexp = 1; .@fx = FX_MAGIC_WOOD_CAST;
+ setarray .@component, RawLog;
+ setarray .@co_amount, 1;
+ setarray .@failure, Iten, WarpedLog, WarpedLog;
+ break;
+ case SKILL_KULARZUFRILL:
+ .@prize = Arrow; .@pc = AdjustSpellpower(40+@skillLv*2);
+ .@mexp = 2; .@fx = FX_MAGIC_ARROW_CAST;
+ setarray .@component, RawLog;
+ setarray .@co_amount, 1;
+ setarray .@failure, WarpedLog, WarpedLog;
+ break;
+ case SKILL_ZUKMINBIRF:
+ .@prize = IronPowder; .@pc = 1+AdjustSpellpower(@skillLv*5);
+ .@mexp = 2; .@fx = FX_MAGIC_IRON_CAST;
+ setarray .@component, IronOre;
+ setarray .@co_amount, 1;
+ setarray .@failure, Iten, IronOre, IronOre;
+ break;
+ case SKILL_PATMUPLOO:
+ .@prize = CottonShirt; .@pc = 1;
+ .@mexp = 2; .@fx = FX_MAGIC_SHIRT_CAST;
+ setarray .@component, CottonCloth;
+ setarray .@co_amount, 5;
+ setarray .@failure, CottonCloth, CottonCloth;
+ break;
+ case SKILL_PATVILOREE:
+ .@prize = ShortTankTop; .@pc = 1;
+ .@mexp = 2; .@fx = FX_MAGIC_SHIRT_CAST;
+ setarray .@component, CottonCloth;
+ setarray .@co_amount, 3;
+ setarray .@failure, CottonCloth, CottonCloth;
+ break;
+ case SKILL_PATLOREE:
+ .@prize = TankTop; .@pc = 1;
+ .@mexp = 2; .@fx = FX_MAGIC_SHIRT_CAST;
+ setarray .@component, CottonCloth;
+ setarray .@co_amount, 4;
+ setarray .@failure, CottonCloth, CottonCloth;
+ break;
+ case SKILL_GOLE:
+ .@prize = SulphurPowder; .@pc = 1+AdjustSpellpower(@skillLv*20);
+ .@mexp = 1; .@fx = FX_MAGIC_SULPHUR_CAST;
+ setarray .@component, PileOfAsh;
+ setarray .@co_amount, 1;
+ setarray .@failure, PileOfAsh, PileOfAsh;
+ break;
+ case SKILL_MANPAHIL:
+ .@prize = Lifestone; .@pc = 10;
+ .@mexp = 2; .@fx = FX_MAGIC_STONE_CAST;
+ setarray .@component, BugLeg, MaggotSlime, MauveHerb, AlizarinHerb, CobaltHerb, GambogeHerb;
+ setarray .@co_amount, 1, 1, 1, 1, 1, 1;
+ setarray .@failure, Lifestone, Lifestone;
+ break;
+ default: return;
+ }
+ // Check for items
+ for (.@i=0; .@i < getarraysize(.@component); .@i++) {
+ if (countitem(.@component[.@i]) < .@co_amount[.@i]) {
+ dispbottom l("You do not have enough %s (min %d)",
+ getitemname(.@component[.@i]), .@co_amount[.@i]);
+ return;
+ }
+ }
+ // Delete reagents
+ inventoryplace Iten, 1, .@prize, .@pc;
+ for (.@i=0; .@i < getarraysize(.@component); .@i++) {
+ delitem(.@component[.@i], .@co_amount[.@i]);
+ }
+ // Effect and EXP
+ specialeffect(.@fx, AREA, getcharid(3));
+ GetManaExp(@skillId, .@mexp);
+ // The chances of success are based on magic exp, abizit and skill level
+ .@rand100 = abizit()*10 + cap_value(MAGIC_EXP/100, 0, 50) + (@skillLv*5);
+ if (.@rand100 > rand2(100)) {
+ getitem .@prize, .@pc;
+ } else {
+ dispbottom l("Your magic takes a mind of its own!");
+ getitem any_of(.@failure), 1;
+ }
+ return;
+}
+
+
diff --git a/npc/magic/level2-arrow-hail.txt b/npc/magic/level2-arrow-hail.txt
new file mode 100644
index 00000000..217f7fb0
--- /dev/null
+++ b/npc/magic/level2-arrow-hail.txt
@@ -0,0 +1,44 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_FRILLYAR (Level 1)
+// School: War 2
+
+function script SK_Frillyar {
+ // Additional check for ammo
+ .@it=getequipid(EQI_AMMO);
+ if (.@it < 1) {
+ dispbottom l("Please equip your ammo first!");
+ return;
+ }
+ if (countitem(.@it) < 15) {
+ dispbottom l("You need at least %d %s to use this spell!",
+ 15, getitemname(.@it));
+ return;
+ }
+ // Delete items
+ delitem(SulphurPowder, 1);
+ delitem(.@it, 15);
+ // Proccess attack power
+ .@RG=4+(@skillLv/2);
+ .@PW=90+(10*@skillLv);
+ .@PW+=getiteminfo(.@it, ITEMINFO_ATK);
+ // Weather modifiers
+ if ("#WeatherCore"::weather(MASK_RAIN))
+ .@PW-=10;
+ if ("#WeatherCore"::weather(MASK_SANDSTORM))
+ .@PW-=10;
+ if ("#WeatherCore"::weather(MASK_SNOW))
+ .@PW-=10;
+ // Effective magic code
+ .@dmg=AdjustSpellpower(.@PW);
+ .@dmg+=getiteminfo(.@it, ITEMINFO_ATK);
+ specialeffect(FX_MAGIC_AHAIL_CAST, AREA, @skillTarget);
+ areaharm(@skillTarget, .@RG, .@dmg, HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, .@dmg/20, HARM_MAGI, Ele_Holy);
+ specialeffect(FX_ARROW_HAIL, AREA, @skillTarget);
+ GetManaExp(@skillId, 2);
+ return;
+}
+
+
diff --git a/npc/magic/level2-happy-curse.txt b/npc/magic/level2-happy-curse.txt
new file mode 100644
index 00000000..1e1096a1
--- /dev/null
+++ b/npc/magic/level2-happy-curse.txt
@@ -0,0 +1,32 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_JOYPLIM (Level 1)
+// School: General 2
+
+function script SK_Joyplim {
+ if (getarg(0, true))
+ delitem GingerBreadMan, 1;
+
+ .@b=(BL_PC | BL_PET | BL_MER | BL_HOM); // | BL_MOB
+ .@r=3+cap_value(getskilllv(SKILL_MAGIC)+(@skillLv/2), 1, 12); // Your radius
+ .@s=AdjustSpellpower(100); // Your magical stamina
+ .@c=cap_value(11-@skillLv, 1, 10)*2; // MATK stamina cost per char
+ .@e=(getskilllv(SKILL_MAGIC_DARK) ? E_EVIL : E_HAPPY); // Emote
+
+ getmapxy(.@m$, .@x, .@y, 0);
+
+ // TODO: Maybe put this loop in a timer, etc? But... Do we want to?
+ .@c=getunits(.@b, .@mbs, false, .@m$, .@x-.@r, .@y-.@r, .@x+.@r, .@y+.@r);
+ for (.@i = 0; .@i < .@c; .@i++) {
+ unitemote(.@mbs[.@i], E_HAPPY);
+ // Stamina cost
+ .@s-=.@c;
+ if (.@s < 0)
+ break;
+ }
+ specialeffect(FX_MAGIC_JOY_CAST, AREA, getcharid(3));
+ GetManaExp(@skillId, 2);
+ return;
+}
+
diff --git a/npc/magic/level2-lay-on-hands.txt b/npc/magic/level2-lay-on-hands.txt
new file mode 100644
index 00000000..1d515324
--- /dev/null
+++ b/npc/magic/level2-lay-on-hands.txt
@@ -0,0 +1,71 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_INMA (Level 1)
+// School: Life 2
+
+function script SK_Inma {
+ // FIXME: #inma Mouboo
+ // In some cases it is... aborted
+ if (getunittype(@skillTarget) == UNITTYPE_PC) {
+ .@me=getcharid(3);
+ .@ok=true;
+ attachrid(@skillTarget);
+ // TODO: detect if is a bot...
+ // FIXME: 099-4 and 099-5 special rules
+ // Kill the GM Event
+ if (isequipped(MagicGMTopHat))
+ .@ok=false;
+ // Ailments which prevent inma from working
+ if (getstatus(SC_BLOODING) ||
+ getstatus(SC_HALT_REGENERATION) ||
+ getstatus(SC_CURSE))
+ .@ok=false;
+ if (getstatus(SC_POISON) && !getstatus(SC_SLOWPOISON))
+ .@ok=false;
+ if (getstatus(SC_DPOISON) && !getstatus(SC_SLOWPOISON))
+ .@ok=false;
+ // Already dead
+ if (Hp < 1)
+ .@ok=false;
+ // Finished
+ .@limit=MaxHp-Hp;
+ detachrid();
+ attachrid(.@me);
+ if (!.@ok) return;
+ } else {
+ if (getunitdata(@skillTarget, UDT_HP) < 1) return;
+ .@limit=getunitdata(@skillTarget, UDT_MAXHP)-
+ getunitdata(@skillTarget, UDT_HP);
+ }
+ if (@skillTarget == getcharid(3)) return; // No self casting
+ if (isequipped(MagicGMTopHat)) return; // Kill the GM event
+ if (.@limit <= 0) return; // No need for healing
+ // Apply effects
+ .@PW=60+(20*@skillLv);
+ .@dmg=AdjustSpellpower(.@PW);
+
+ // Capped to what you need or your own health - the smallest of them
+ .@dmg = min(.@dmg, .@limit, Hp);
+
+ // Pay with 20% of your healing total
+ heal -(.@dmg/5), 0;
+
+ // Heal the target instantly
+ harm(@skillTarget, -(.@dmg), HARM_MISC);
+ specialeffect(FX_MAGIC_WHITE, AREA, @skillTarget);
+ specialeffect(FX_MAGIC_WHITE, AREA, getcharid(3));
+
+ // Specifics
+ if (getskilllv(SKILL_MAGIC_DARK) >= 2)
+ SC_Bonus(10, SC_HALT_REGENERATION, 1);
+ else
+ SC_Bonus(5, SC_HALT_REGENERATION, 1);
+
+ // Gives EXP according to how much you healed
+ setq2(MagicQuest_Healing, getq2(MagicQuest_Healing)+1);
+ getexp .@dmg*getskilllv(SKILL_MAGIC_LIFE), .@PW/10;
+ GetManaExp(@skillId, 2);
+ return;
+}
+
diff --git a/npc/magic/level2-lightning-strike.txt b/npc/magic/level2-lightning-strike.txt
new file mode 100644
index 00000000..97692d3e
--- /dev/null
+++ b/npc/magic/level2-lightning-strike.txt
@@ -0,0 +1,24 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_INGRAV (Level 1)
+// School: War 2
+
+function script SK_Ingrav {
+ // This one time, effects will come before
+ specialeffect(FX_MAGIC_BOLT_CAST, AREA, getcharid(3));
+ specialeffect(FX_LIGHTNING1+rand2(3), AREA, @skillTarget);
+ // Charge code, item check is in skill_db.conf (FIXME)
+ mcharge(IronPowder, SKILL_MAGIC_WAR, 1);
+ .@PW=110+(20*@skillLv);
+ // Weather modifiers
+ .@dmg=AdjustSpellpower(.@PW);
+ if ("#WeatherCore"::weather(MASK_RAIN))
+ harm(getcharid(3), .@dmg*2/3, HARM_MAGI, Ele_Nature);
+ // Effective magic code
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Nature);
+ GetManaExp(@skillId, 2);
+ return;
+}
+
+
diff --git a/npc/magic/level2-magic-knuckles.txt b/npc/magic/level2-magic-knuckles.txt
new file mode 100644
index 00000000..d14c8981
--- /dev/null
+++ b/npc/magic/level2-magic-knuckles.txt
@@ -0,0 +1,19 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_UPMARMU (Level 1)
+// School: War 2
+
+function script SK_Uparmu {
+ // Charge code, item check is in skill_db.conf (FIXME)
+ mcharge(Beer, SKILL_MAGIC_WAR, 5);
+ .@PW=100+(10*@skillLv);
+ // TODO: What's the diff from Chiza?
+ // Effective magic code
+ .@dmg=AdjustSpellpower(.@PW);
+ harm(@skillTarget, .@dmg, HARM_PHYS, Ele_Neutral);
+ GetManaExp(@skillId, 2);
+ return;
+}
+
+
diff --git a/npc/magic/level2-protect.txt b/npc/magic/level2-protect.txt
new file mode 100644
index 00000000..36e25b45
--- /dev/null
+++ b/npc/magic/level2-protect.txt
@@ -0,0 +1,51 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: Betsanc and Asorm (Level 1)
+// School: Nature/Astral 2
+
+function script SK_Betsanc {
+ // party-guild filter
+ if (!filter_sameguildorparty(@skillTarget)) {
+ dispbottom b("Betsanc: ")+l("Skill can only be cast on party or guild members!");
+ return;
+ }
+ // no GM Hat/Bots? Not needed due filter?
+ delitem HardSpike, 1;
+ // Same duration as Kaflosh
+ .@PW=80+(20*@skillLv);
+ .@dmg=AdjustSpellpower(.@PW);
+ .@time=5+.@dmg/11;
+ .@PX=10+cap_value(.@dmg/33, 0, 20);
+ // SC, Time, DEF+, ASPD-
+ sc_start2(SC_PHYSICAL_SHIELD, .@time*1000, .@PX*2, .@PX, 10000,
+ SCFLAG_NOAVOID|SCFLAG_FIXEDTICK|SCFLAG_FIXEDRATE, @skillTarget);
+ specialeffect FX_MAGIC_SHIELD_CAST, AREA, @skillTarget;
+ GetManaExp(@skillId, 2);
+ return;
+}
+
+function script SK_Asorm {
+ // party-guild filter
+ if (!filter_sameguildorparty(@skillTarget)) {
+ dispbottom b("Betsanc: ")+l("Skill can only be cast on party or guild members!");
+ return;
+ }
+ // no GM Hat/Bots? Not needed due filter?
+ delitem SmallMushroom, 1;
+ // Same duration as Kaflosh
+ .@PW=80+(20*@skillLv);
+ .@dmg=AdjustSpellpower(.@PW);
+ .@time=5+.@dmg/11;
+ .@PX=10+cap_value(.@dmg/33, 0, 20);
+ // SC_STONESKIN(??, def, mdef); Usually for mobs. Skill NPC_ANTIMAGIC
+ // SC_FREYJASCROLL(MDEF, PerfectFlee)
+ // SC_MDEFSET(MDEF)
+ // SC, Time, MDEF+
+ sc_start(SC_MDEFSET, .@time*1000, .@PX*2, 10000,
+ SCFLAG_NOAVOID|SCFLAG_FIXEDTICK|SCFLAG_FIXEDRATE, @skillTarget);
+ specialeffect FX_MAGIC_BARRIER_CAST, AREA, @skillTarget;
+ GetManaExp(@skillId, 2);
+ return;
+}
+
diff --git a/npc/magic/level2-rain.txt b/npc/magic/level2-rain.txt
new file mode 100644
index 00000000..30171c06
--- /dev/null
+++ b/npc/magic/level2-rain.txt
@@ -0,0 +1,55 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_KAFLOSH (Level 1)
+// School: Nature 2
+
+function script SK_Kaflosh {
+ .@m$=getmap();
+ .@cl="#WeatherCore"::climate(.@m$);
+
+ // Bad Climate
+ if (.@cl == CLIMATE_NONE) {
+ dispbottom l("It was impossible to conjure rain clouds on this map.");
+ return;
+ }
+
+ // Techinically not needed
+ .@rain="#WeatherCore"::weather(MASK_RAIN);
+ if (.@rain) {
+ dispbottom l("It is already raining!");
+ return;
+ }
+
+ // From now on, you'll have the cost paid and the MEXP deposited
+ delitem BottleOfWater, 1;
+ GetManaExp(@skillId, 2);
+
+ // Adjusted MATK will determine rain duration (11 ATK = 1s)
+ .@PW=80+(20*@skillLv);
+ .@dmg=AdjustSpellpower(.@PW);
+ .@time=.@dmg/11;
+ //debugmes "KAFLOSH: Damage %d Time %d Climate %d", .@dmg, .@time, .@cl;
+ .@time+=getskilllv(SKILL_MAGIC_NATURE)-2; // +1 second per nature magic lv
+
+ // Adverse climate (eg. desert and icelands) will cut this to 1/3
+ if (.@cl != CLIMATE_MODERATE)
+ .@time=.@time/3;
+
+ // Rain must last at least 5 seconds or the clouds won't even gather
+ if (.@time < 5) {
+ dispbottom l("You do not have suffice magic power to make rain.");
+ return;
+ }
+
+ // Invoke the rain clouds; Everything else should work out of the box
+ // The builtin checks are not necessary in this case =D
+ // But would be for a sandstorm or snowstorm.
+ "#WeatherCore"::weather_override(MASK_RAIN, .@time, .@m$, true);
+
+ // Eventually, a quest or another will depend on Kaflosh, so
+ if (isin("006-1", 82, 59, 14))
+ callfunc "QuestTreeTrigger", 1;
+ return;
+}
+
diff --git a/npc/magic/level2-shear.txt b/npc/magic/level2-shear.txt
new file mode 100644
index 00000000..f848b36d
--- /dev/null
+++ b/npc/magic/level2-shear.txt
@@ -0,0 +1,54 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_CHIPCHIP (Level 1)
+// School: Nature 2
+
+function script SK_Shear {
+ .@mobGD=getarg(0, @skillTarget);
+ if (.@mobGD <= 0)
+ return;
+
+ // We only want monsters
+ if (getunittype(.@mobGD) != UNITTYPE_MOB) {
+ dispbottom l("This skill can only be used on monsters!");
+ return;
+ }
+
+ // Global data
+ setarray .@valid, Fluffy, EasterFluffy, SpikyMushroom, Mouboo, MauvePlant, CobaltPlant, GambogePlant, AlizarinPlant, Silkworm, Pinkie;
+ setarray .@prize, WhiteFur, WhiteFur, HardSpike, CottonCloth, MauveHerb, CoblatHerb, GambogeHerb, AlizarinHerb, SilkCocoon, PinkAntenna;
+ setarray .@score, 300, 300, 250, 175, 700, 700, 700, 700, 300, 180;
+
+ // Specific data
+ .@mobID=getunitdata(.@mobGD, UDT_CLASS);
+ .@matk=AdjustSpellpower(40+(10*@skillLv));
+ .@idx=array_find(.@valid, .@mobID);
+
+ // Invalid target
+ if (.@idx < 0) return;
+
+ // Not yet sheared
+ if (array_rfind(@shear, .@mobGD) < 0) {
+ array_push(@shear, @mobGD);
+ if (.@matk > .@score[.@idx])
+ getitem .@prize[.@idx], 1;
+ }
+
+ // Sagratha bonus
+ if (.@mobId == Fluffy || .@mobId == Mouboo || .@mobId == Pinkie)
+ QuestSagathaHappy(any(true, true, false));
+
+ // Special effect
+ specialeffect(FX_MAGIC_SHEAR_CAST, AREA, getcharid(3));
+ specialeffect(FX_MAGIC_SHEAR_CAST, AREA, .@mobGD);
+
+ // Truncate.
+ // We're saving the GID so it must be "big enough"
+ // But not too big so rfind() is not expensive
+ if (getarraysize(@study) > 99) {
+ deletearray(@study, 30);
+ }
+ return;
+}
+
diff --git a/npc/magic/level2-summon-monsters.txt b/npc/magic/level2-summon-monsters.txt
new file mode 100644
index 00000000..9c28e639
--- /dev/null
+++ b/npc/magic/level2-summon-monsters.txt
@@ -0,0 +1,53 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: Multiple (Level 1)
+// School: Astral/Dark 2
+
+// SK_SummonLv2()
+function script SK_SummonLv2 {
+ // Setup
+ switch (@skillId) {
+ case SKILL_KALAKARENK:
+ .@it = WhiteFur; .@mobId = Fluffy; .@am = 3; .@cl = Root;
+ .@fx1 = FX_MAGIC_FLUFFY_CAST; .@fx2 = FX_MAGIC_FLUFFY_SPAWN; break;
+ case SKILL_KALBOO:
+ .@it = MoubooFigurine; .@mobId = Mouboo; .@am = 4; .@cl = Root;
+ .@fx1 = FX_MAGIC_MOUBOO_CAST; .@fx2 = FX_MAGIC_MOUBOO_SPAWN; break;
+ case SKILL_KALGINA:
+ .@it = PinkAntenna; .@mobId = Pinkie; .@am = 2; .@cl = Root;
+ .@fx1 = FX_MAGIC_PINKY_CAST; .@fx2 = FX_MAGIC_PINKY_SPAWN; break;
+ case SKILL_KALRENK:
+ .@it = HardSpike; .@mobId = SpikyMushroom; .@am = 2; .@cl = Root;
+ .@fx1 = FX_MAGIC_SPIKY_CAST; .@fx2 = FX_MAGIC_SPIKY_SPAWN; break;
+
+ // Should non-astral magic be here?
+ case SKILL_HALHISS:
+ .@it = SnakeEgg; .@mobId = Snake; .@am = 4; .@cl = DarkCrystal;
+ .@fx1 = FX_MAGIC_SNAKE_CAST; .@fx2 = FX_MAGIC_SNAKE_SPAWN; break;
+ case SKILL_HELORP:
+ .@it = SmallMushroom; .@am = 3; .@cl = DarkCrystal;
+ .@mobId = any(WickedMushroom, WickedMushroom, WickedMushroom,
+ WickedMushroom, WickedMushroom, WickedMushroom,
+ EvilMushroom, Moonshroom, Moonshroom, Moonshroom);
+ .@fx1 = FX_MAGIC_WICKED_CAST; .@fx2 = FX_MAGIC_WICKED_SPAWN; break;
+
+ default: return;
+ }
+ // Consume reagents
+ delitem .@cl, 1;
+ delitem .@it, 1;
+ // Estimate the cast time
+ if (.@cl == Root)
+ .@ct = 400+rand2(1001-getskilllv(MAGIC_SKILL_ASTRAL)*100);
+ else if (.@cl == DarkCrystal)
+ .@ct = 400+rand2(1001-getskilllv(MAGIC_SKILL_DARK)*100);
+ // Summon the monsters (or fail trying to)
+ specialeffect(.@fx1, AREA, getcharid(3));
+ sleep2(.@ct);
+ SK_summon(.@mobId, .@am, 2);
+ specialeffect(.@fx2, AREA, getcharid(3));
+ return;
+}
+
+
diff --git a/npc/magic/level2-toxic-dart.txt b/npc/magic/level2-toxic-dart.txt
new file mode 100644
index 00000000..df21b89c
--- /dev/null
+++ b/npc/magic/level2-toxic-dart.txt
@@ -0,0 +1,23 @@
+// The Mana World script
+// Author: Jesusalva <jesusalva@themanaworld.org>
+//
+// Magic Script: SKILL_PHLEX (Level 1)
+// School: Dark 2
+
+function script SK_Phlex {
+ // Charge code, item check is in skill_db.conf (FIXME)
+ mcharge(Root, SKILL_MAGIC_DARK, 1);
+ .@PW=100+(10*@skillLv);
+ // Effective magic code
+ .@dmg=AdjustSpellpower(.@PW);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Dark);
+ // May inflict poison
+ .@sc=(getskilllv(SKILL_MAGIC_DARK) > 3 ? SC_DPOISON : SC_POISON);
+ .@time=(1+.@dmg/33)*1000;
+ .@cth=1+rand2(.@time)/15;
+ sc_start .@sc, .@time, 1, .@cth, SCFLAG_NONE, @skillTarget;
+ GetManaExp(@skillId, 2);
+ return;
+}
+
+
diff --git a/npc/pre-re/scripts_main.conf b/npc/pre-re/scripts_main.conf
new file mode 100644
index 00000000..8574cb92
--- /dev/null
+++ b/npc/pre-re/scripts_main.conf
@@ -0,0 +1,4 @@
+// Only files that are included here will be read by the server
+npc_global_list: (
+@include "npc/scripts.conf"
+) // npc_global_list
diff --git a/npc/scripts.conf b/npc/scripts.conf
new file mode 100644
index 00000000..fa3407b1
--- /dev/null
+++ b/npc/scripts.conf
@@ -0,0 +1,135 @@
+// Critical functions
+"npc/functions/main.txt",
+"npc/functions/string.txt",
+"npc/functions/array.txt",
+"npc/functions/math.txt",
+"npc/functions/bitwise.txt",
+"npc/functions/permissions.txt",
+
+// General-Purpose Framework Functions
+"npc/functions/input.txt",
+"npc/functions/time.txt",
+"npc/functions/timer.txt",
+"npc/functions/goodbye.txt",
+"npc/functions/vault.txt",
+
+// Pre-Loading Functions
+"npc/functions/clear_vars.txt",
+"npc/functions/asklanguage.txt",
+"npc/functions/inventoryplace.txt",
+"npc/functions/random-talk.txt",
+"npc/functions/inc_sc_bonus.txt",
+"npc/commands/kami.txt",
+"npc/functions/filters.txt",
+"npc/functions/quests.txt",
+
+// Main Functions
+"npc/functions/alchemy.txt",
+"npc/functions/banker.txt",
+"npc/functions/barber.txt",
+"npc/functions/dailyquest.txt",
+"npc/functions/ferry.txt",
+"npc/functions/travelers.txt",
+"npc/functions/game_rules.txt",
+"npc/functions/inn.txt",
+"npc/functions/magic.txt",
+"npc/functions/mob_points.txt",
+"npc/functions/process_equip.txt",
+"npc/functions/slot_machine.txt",
+"npc/functions/soul_menhir.txt",
+"npc/functions/time.txt",
+"npc/functions/water_bottle.txt",
+"npc/functions/evil_obelisk.txt",
+"npc/functions/lockpicking.txt",
+"npc/functions/default_npc_checks.txt",
+"npc/functions/undead_debug.txt",
+"npc/functions/headstyles.txt",
+"npc/functions/stat_reset.txt",
+"npc/functions/quiz.txt",
+"npc/functions/dynamic_menu.txt",
+"npc/functions/DyeConfig.txt",
+"npc/functions/motd.txt",
+"npc/functions/motdconfig.txt",
+"npc/functions/miriam.txt",
+"npc/functions/ghost.txt",
+"npc/functions/location.txt",
+"npc/functions/weather.txt",
+
+// Items
+"npc/items/purification_potion.txt",
+"npc/items/scissors.txt",
+"npc/items/scented_candle.txt",
+"npc/items/pickled_beets.txt",
+"npc/items/shock_sweet.txt",
+"npc/items/unreleased_item.txt",
+"npc/items/brawling_item.txt",
+"npc/items/require_stat.txt",
+"npc/items/warpTowels.txt",
+"npc/items/mirror.txt",
+"npc/items/rubber_bat.txt",
+
+//Magic
+"npc/magic/config.txt",
+"npc/magic/level0-monsterinfo.txt",
+"npc/magic/level0-reapercry.txt",
+"npc/magic/level0-wand.txt",
+"npc/magic/level1-aggravate.txt",
+"npc/magic/level1-experience.txt",
+"npc/magic/level1-flare-dart.txt",
+"npc/magic/level1-grow-plants.txt",
+"npc/magic/level1-lesser-heal.txt",
+"npc/magic/level1-magic-blade.txt",
+"npc/magic/level1-summon-maggots.txt",
+"npc/magic/level1-transmutations.txt",
+"npc/magic/level2-arrow-hail.txt",
+"npc/magic/level2-happy-curse.txt",
+"npc/magic/level2-lay-on-hands.txt",
+"npc/magic/level2-lightning-strike.txt",
+"npc/magic/level2-magic-knuckles.txt",
+"npc/magic/level2-protect.txt",
+"npc/magic/level2-rain.txt",
+"npc/magic/level2-shear.txt",
+"npc/magic/level2-summon-monsters.txt",
+"npc/magic/level2-toxic-dart.txt",
+"npc/magic/final.txt",
+
+// Commands
+"npc/commands/debug-quest.txt",
+"npc/commands/debug.txt",
+"npc/commands/force-rename.txt",
+"npc/commands/gm.txt",
+"npc/commands/ipcheck.txt",
+"npc/commands/language.txt",
+"npc/commands/numa.txt",
+"npc/commands/python.txt",
+"npc/commands/rate-management.txt",
+"npc/commands/resync.txt",
+"npc/commands/scheduled-broadcasts.txt",
+"npc/commands/warp.txt",
+
+// Events
+"npc/functions/gm_island.txt",
+"npc/functions/confused-tree-dict.txt",
+"npc/annuals/fathertime.txt",
+"npc/annuals/check_time.txt",
+"npc/annuals/tree_beard.txt",
+"npc/annuals/xmas/config.txt",
+"npc/annuals/xmas/states.txt",
+"npc/annuals/xmas/barriers.txt",
+"npc/annuals/xmas/core.txt",
+"npc/annuals/xmas/debug.txt",
+"npc/annuals/xmas/helpers.txt",
+"npc/annuals/xmas/list.txt",
+"npc/annuals/xmas/reagents.txt",
+"npc/annuals/xmas/mobmanager.txt",
+"npc/annuals/halloween/config.txt",
+"npc/annuals/halloween/debug.txt",
+"npc/annuals/halloween/munro.txt",
+"npc/annuals/halloween/trick_or_treat.txt",
+
+// Post Loading Functions
+"npc/functions/scoreboards.txt",
+"npc/functions/global_event_handler.txt",
+
+@include "npc/_import.txt"
+
diff --git a/npc/sec_pri/_import.txt b/npc/sec_pri/_import.txt
new file mode 100644
index 00000000..eb01ab3b
--- /dev/null
+++ b/npc/sec_pri/_import.txt
@@ -0,0 +1,2 @@
+// Map sec_pri: Jail
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
diff --git a/script-checker b/script-checker
new file mode 100755
index 00000000..066704a2
--- /dev/null
+++ b/script-checker
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+# Copyright (c) Hercules Dev Team, licensed under GNU GPL.
+# See the LICENSE file
+# Base Author: Haru @ http://herc.ws
+
+ORIG_CWD="$(pwd)"
+BASEDIR="$(dirname "$0")"
+EXECUTABLE="./map-server"
+
+cd "${BASEDIR}"
+if [ -z "$1" ]; then
+ echo "No file specified."
+ echo "Usage: $0 <path to the script>"
+ echo " (you may use a relative or absolute path)"
+ exit 1
+fi
+case "$1" in
+ /*)
+ FILE="$1"
+ ;;
+ *)
+ FILE="${ORIG_CWD}/$1"
+ ;;
+esac
+if [ ! -x "$EXECUTABLE" ]; then
+ exit 1
+fi
+
+while [ -n "$1" ]; do
+ [ -n "$FILES" ] && FILES="${FILES}!"
+ if [[ "$1" =~ ^\/ ]]; then
+ FILES="${FILES}--load-script!$1"
+ else
+ FILES="${FILES}--load-script!${ORIG_CWD}/$1"
+ fi
+ shift
+done
+
+# We assume that filenames don't contain exclamation marks.
+IFS=!
+"$EXECUTABLE" --script-check $FILES 2>&1
diff --git a/sql-files/init.sql b/sql-files/init.sql
new file mode 100644
index 00000000..060245a0
--- /dev/null
+++ b/sql-files/init.sql
@@ -0,0 +1,4 @@
+CREATE DATABASE evol;
+CREATE USER 'evol'@'localhost' IDENTIFIED BY 'evol';
+GRANT ALTER,CREATE,SELECT,INSERT,UPDATE,DELETE,DROP,INDEX ON `evol`.* TO 'evol'@'localhost';
+FLUSH PRIVILEGES;
diff --git a/sql-files/initremote.sql b/sql-files/initremote.sql
new file mode 100644
index 00000000..fa87edb1
--- /dev/null
+++ b/sql-files/initremote.sql
@@ -0,0 +1,4 @@
+CREATE DATABASE evol;
+CREATE USER 'evol'@'%' IDENTIFIED BY 'evol';
+GRANT ALTER,CREATE,SELECT,INSERT,UPDATE,DELETE,DROP,INDEX ON `evol`.* TO 'evol'@'%';
+FLUSH PRIVILEGES;
diff --git a/sql-files/logs.sql b/sql-files/logs.sql
new file mode 100644
index 00000000..499afcfd
--- /dev/null
+++ b/sql-files/logs.sql
@@ -0,0 +1,186 @@
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2012-2020 Hercules Dev Team
+-- Copyright (C) Athena Dev Teams
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+-- PickLog Types
+-- (M)onsters Drop
+-- (P)layers Drop/Take
+-- Mobs Drop (L)oot Drop/Take
+-- Players (T)rade Give/Take
+-- Players (V)ending Sell/Take
+-- (S)hop Sell/Take
+-- (N)PC Give/Take
+-- (C)onsumable Items
+-- (A)dministrators Create/Delete
+-- Sto(R)age
+-- (G)uild Storage
+-- (E)mail attachment
+-- (B)uying Store
+-- Pr(O)duced Items/Ingredients
+-- Auct(I)oned Items
+-- (X) Other
+-- (D) Stolen from mobs
+-- (U) MVP Prizes
+
+--
+-- Table structure for table `atcommandlog`
+--
+
+CREATE TABLE IF NOT EXISTS `atcommandlog` (
+ `atcommand_id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `atcommand_date` DATETIME NULL,
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `char_name` VARCHAR(25) NOT NULL DEFAULT '',
+ `map` VARCHAR(11) NOT NULL DEFAULT '',
+ `command` VARCHAR(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`atcommand_id`),
+ INDEX (`account_id`),
+ INDEX (`char_id`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 ;
+
+--
+-- Table structure for table `branchlog`
+--
+
+CREATE TABLE IF NOT EXISTS `branchlog` (
+ `branch_id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `branch_date` DATETIME NULL,
+ `account_id` INT NOT NULL DEFAULT '0',
+ `char_id` INT NOT NULL DEFAULT '0',
+ `char_name` VARCHAR(25) NOT NULL DEFAULT '',
+ `map` VARCHAR(11) NOT NULL DEFAULT '',
+ PRIMARY KEY(`branch_id`),
+ INDEX (`account_id`),
+ INDEX (`char_id`)
+) ENGINE=MyISAM AUTO_INCREMENT=1;
+
+--
+-- Table structure for table `chatlog`
+--
+
+CREATE TABLE IF NOT EXISTS `chatlog` (
+ `id` BIGINT NOT NULL AUTO_INCREMENT,
+ `time` DATETIME NULL,
+ `type` ENUM('O','W','P','G','M','C') NOT NULL DEFAULT 'O',
+ `type_id` INT NOT NULL DEFAULT '0',
+ `src_charid` INT NOT NULL DEFAULT '0',
+ `src_accountid` INT NOT NULL DEFAULT '0',
+ `src_map` VARCHAR(11) NOT NULL DEFAULT '',
+ `src_map_x` SMALLINT NOT NULL DEFAULT '0',
+ `src_map_y` SMALLINT NOT NULL DEFAULT '0',
+ `dst_charname` VARCHAR(25) NOT NULL DEFAULT '',
+ `message` VARCHAR(150) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`),
+ INDEX (`src_accountid`),
+ INDEX (`src_charid`)
+) ENGINE=MyISAM AUTO_INCREMENT=1;
+
+--
+-- Table structure for table `loginlog`
+--
+
+CREATE TABLE IF NOT EXISTS `loginlog` (
+ `time` DATETIME NULL,
+ `ip` VARCHAR(15) NOT NULL DEFAULT '',
+ `user` VARCHAR(23) NOT NULL DEFAULT '',
+ `rcode` TINYINT NOT NULL DEFAULT '0',
+ `log` VARCHAR(255) NOT NULL DEFAULT '',
+ INDEX (`ip`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `mvplog`
+--
+
+CREATE TABLE IF NOT EXISTS `mvplog` (
+ `mvp_id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `mvp_date` DATETIME NULL,
+ `kill_char_id` INT NOT NULL DEFAULT '0',
+ `monster_id` SMALLINT NOT NULL DEFAULT '0',
+ `prize` INT NOT NULL DEFAULT '0',
+ `mvpexp` MEDIUMINT NOT NULL DEFAULT '0',
+ `map` VARCHAR(11) NOT NULL DEFAULT '',
+ PRIMARY KEY (`mvp_id`)
+) ENGINE=MyISAM AUTO_INCREMENT=1;
+
+--
+-- Table structure for table `npclog`
+--
+
+CREATE TABLE IF NOT EXISTS `npclog` (
+ `npc_id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `npc_date` DATETIME NULL,
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `char_name` VARCHAR(25) NOT NULL DEFAULT '',
+ `map` VARCHAR(11) NOT NULL DEFAULT '',
+ `mes` VARCHAR(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`npc_id`),
+ INDEX (`account_id`),
+ INDEX (`char_id`)
+) ENGINE=MyISAM AUTO_INCREMENT=1;
+
+--
+-- Table structure for table `picklog`
+--
+
+CREATE TABLE IF NOT EXISTS `picklog` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `time` DATETIME NULL,
+ `char_id` INT NOT NULL DEFAULT '0',
+ `type` ENUM('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','K','Y','Z','W','Q','J','H','@','0','1','2','3') NOT NULL DEFAULT 'P',
+ `nameid` INT NOT NULL DEFAULT '0',
+ `amount` INT NOT NULL DEFAULT '1',
+ `refine` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `card0` INT NOT NULL DEFAULT '0',
+ `card1` INT NOT NULL DEFAULT '0',
+ `card2` INT NOT NULL DEFAULT '0',
+ `card3` INT NOT NULL DEFAULT '0',
+ `opt_idx0` SMALLINT unsigned NOT NULL default '0',
+ `opt_val0` SMALLINT unsigned NOT NULL default '0',
+ `opt_idx1` SMALLINT unsigned NOT NULL default '0',
+ `opt_val1` SMALLINT unsigned NOT NULL default '0',
+ `opt_idx2` SMALLINT unsigned NOT NULL default '0',
+ `opt_val2` SMALLINT unsigned NOT NULL default '0',
+ `opt_idx3` SMALLINT unsigned NOT NULL default '0',
+ `opt_val3` SMALLINT unsigned NOT NULL default '0',
+ `opt_idx4` SMALLINT unsigned NOT NULL default '0',
+ `opt_val4` SMALLINT unsigned NOT NULL default '0',
+ `unique_id` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ `map` VARCHAR(11) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`),
+ INDEX (`type`)
+) ENGINE=MyISAM AUTO_INCREMENT=1;
+
+--
+-- Table structure for table `zenylog`
+--
+
+CREATE TABLE IF NOT EXISTS `zenylog` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `time` DATETIME NULL,
+ `char_id` INT NOT NULL DEFAULT '0',
+ `src_id` INT NOT NULL DEFAULT '0',
+ `type` ENUM('T','V','P','M','S','N','D','C','A','E','I','B','K') NOT NULL DEFAULT 'S',
+ `amount` INT NOT NULL DEFAULT '0',
+ `map` VARCHAR(11) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`),
+ INDEX (`type`)
+) ENGINE=MyISAM AUTO_INCREMENT=1;
+
diff --git a/sql-files/main.sql b/sql-files/main.sql
new file mode 100644
index 00000000..b2a7d7e4
--- /dev/null
+++ b/sql-files/main.sql
@@ -0,0 +1,1105 @@
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2012-2020 Hercules Dev Team
+-- Copyright (C) Athena Dev Teams
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+--
+-- Table structure for table `account_data`
+--
+
+CREATE TABLE IF NOT EXISTS `account_data` (
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `bank_vault` INT UNSIGNED NOT NULL DEFAULT '0',
+ `base_exp` SMALLINT UNSIGNED NOT NULL DEFAULT '100',
+ `base_drop` SMALLINT UNSIGNED NOT NULL DEFAULT '100',
+ `base_death` SMALLINT UNSIGNED NOT NULL DEFAULT '100',
+ PRIMARY KEY (`account_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `acc_reg_num_db`
+--
+
+CREATE TABLE IF NOT EXISTS `acc_reg_num_db` (
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT UNSIGNED NOT NULL DEFAULT '0',
+ `value` INT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `acc_reg_str_db`
+--
+
+CREATE TABLE IF NOT EXISTS `acc_reg_str_db` (
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT UNSIGNED NOT NULL DEFAULT '0',
+ `value` VARCHAR(255) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `auction`
+--
+
+CREATE TABLE IF NOT EXISTS `auction` (
+ `auction_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `seller_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `seller_name` VARCHAR(30) NOT NULL DEFAULT '',
+ `buyer_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `buyer_name` VARCHAR(30) NOT NULL DEFAULT '',
+ `price` INT UNSIGNED NOT NULL DEFAULT '0',
+ `buynow` INT UNSIGNED NOT NULL DEFAULT '0',
+ `hours` SMALLINT NOT NULL DEFAULT '0',
+ `timestamp` INT UNSIGNED NOT NULL DEFAULT '0',
+ `nameid` INT UNSIGNED NOT NULL DEFAULT '0',
+ `item_name` VARCHAR(50) NOT NULL DEFAULT '',
+ `type` SMALLINT NOT NULL DEFAULT '0',
+ `refine` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `attribute` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `card0` INT NOT NULL DEFAULT '0',
+ `card1` INT NOT NULL DEFAULT '0',
+ `card2` INT NOT NULL DEFAULT '0',
+ `card3` INT NOT NULL DEFAULT '0',
+ `opt_idx0` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val0` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx1` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val1` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx2` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val2` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx3` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val3` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx4` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val4` SMALLINT NOT NULL DEFAULT '0',
+ `unique_id` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`auction_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `autotrade_data`
+--
+
+CREATE TABLE IF NOT EXISTS `autotrade_data` (
+ `char_id` INT NOT NULL DEFAULT '0',
+ `itemkey` INT NOT NULL DEFAULT '0',
+ `amount` INT NOT NULL DEFAULT '0',
+ `price` INT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`,`itemkey`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `autotrade_merchants`
+--
+
+CREATE TABLE IF NOT EXISTS `autotrade_merchants` (
+ `account_id` INT NOT NULL DEFAULT '0',
+ `char_id` INT NOT NULL DEFAULT '0',
+ `sex` TINYINT NOT NULL DEFAULT '0',
+ `title` VARCHAR(80) NOT NULL DEFAULT 'Buy From Me!',
+ PRIMARY KEY (`account_id`,`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `char_achievements`
+--
+
+CREATE TABLE IF NOT EXISTS `char_achievements` (
+ `char_id` INT UNSIGNED NOT NULL,
+ `ach_id` INT UNSIGNED NOT NULL,
+ `completed_at` INT UNSIGNED NOT NULL DEFAULT '0',
+ `rewarded_at` INT UNSIGNED NOT NULL DEFAULT '0',
+ `obj_0` INT UNSIGNED NOT NULL DEFAULT '0',
+ `obj_1` INT UNSIGNED NOT NULL DEFAULT '0',
+ `obj_2` INT UNSIGNED NOT NULL DEFAULT '0',
+ `obj_3` INT UNSIGNED NOT NULL DEFAULT '0',
+ `obj_4` INT UNSIGNED NOT NULL DEFAULT '0',
+ `obj_5` INT UNSIGNED NOT NULL DEFAULT '0',
+ `obj_6` INT UNSIGNED NOT NULL DEFAULT '0',
+ `obj_7` INT UNSIGNED NOT NULL DEFAULT '0',
+ `obj_8` INT UNSIGNED NOT NULL DEFAULT '0',
+ `obj_9` INT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`, `ach_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `cart_inventory`
+--
+
+CREATE TABLE IF NOT EXISTS `cart_inventory` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `char_id` INT NOT NULL DEFAULT '0',
+ `nameid` INT NOT NULL DEFAULT '0',
+ `amount` INT NOT NULL DEFAULT '0',
+ `equip` INT UNSIGNED NOT NULL DEFAULT '0',
+ `identify` SMALLINT NOT NULL DEFAULT '0',
+ `refine` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `attribute` TINYINT NOT NULL DEFAULT '0',
+ `card0` INT NOT NULL DEFAULT '0',
+ `card1` INT NOT NULL DEFAULT '0',
+ `card2` INT NOT NULL DEFAULT '0',
+ `card3` INT NOT NULL DEFAULT '0',
+ `opt_idx0` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val0` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx1` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val1` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx2` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val2` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx3` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val3` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx4` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val4` SMALLINT NOT NULL DEFAULT '0',
+ `expire_time` INT UNSIGNED NOT NULL DEFAULT '0',
+ `bound` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `unique_id` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `char`
+--
+
+CREATE TABLE IF NOT EXISTS `char` (
+ `char_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `char_num` TINYINT NOT NULL DEFAULT '0',
+ `name` VARCHAR(30) NOT NULL DEFAULT '',
+ `class` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `base_level` SMALLINT UNSIGNED NOT NULL DEFAULT '1',
+ `job_level` SMALLINT UNSIGNED NOT NULL DEFAULT '1',
+ `base_exp` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ `job_exp` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ `zeny` INT UNSIGNED NOT NULL DEFAULT '0',
+ `str` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `agi` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `vit` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `int` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `dex` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `luk` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `max_hp` INT UNSIGNED NOT NULL DEFAULT '0',
+ `hp` INT UNSIGNED NOT NULL DEFAULT '0',
+ `max_sp` INT UNSIGNED NOT NULL DEFAULT '0',
+ `sp` INT UNSIGNED NOT NULL DEFAULT '0',
+ `status_point` INT UNSIGNED NOT NULL DEFAULT '0',
+ `skill_point` INT UNSIGNED NOT NULL DEFAULT '0',
+ `option` INT NOT NULL DEFAULT '0',
+ `karma` TINYINT NOT NULL DEFAULT '0',
+ `manner` SMALLINT NOT NULL DEFAULT '0',
+ `party_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `guild_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `clan_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `pet_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `homun_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `elemental_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `hair` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `hair_color` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `clothes_color` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `body` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `weapon` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `shield` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `head_top` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `head_mid` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `head_bottom` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `robe` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `last_login` BIGINT NULL DEFAULT '0',
+ `last_map` VARCHAR(11) NOT NULL DEFAULT '',
+ `last_x` SMALLINT UNSIGNED NOT NULL DEFAULT '53',
+ `last_y` SMALLINT UNSIGNED NOT NULL DEFAULT '111',
+ `save_map` VARCHAR(11) NOT NULL DEFAULT '',
+ `save_x` SMALLINT UNSIGNED NOT NULL DEFAULT '53',
+ `save_y` SMALLINT UNSIGNED NOT NULL DEFAULT '111',
+ `partner_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `online` TINYINT NOT NULL DEFAULT '0',
+ `father` INT UNSIGNED NOT NULL DEFAULT '0',
+ `mother` INT UNSIGNED NOT NULL DEFAULT '0',
+ `child` INT UNSIGNED NOT NULL DEFAULT '0',
+ `fame` INT UNSIGNED NOT NULL DEFAULT '0',
+ `rename` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `delete_date` INT UNSIGNED NOT NULL DEFAULT '0',
+ `slotchange` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `char_opt` INT UNSIGNED NOT NULL DEFAULT '0',
+ `font` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `unban_time` INT UNSIGNED NOT NULL DEFAULT '0',
+ `uniqueitem_counter` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ `sex` ENUM('M','F','U') NOT NULL DEFAULT 'U',
+ `hotkey_rowshift` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `hotkey_rowshift2` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `attendance_count` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `attendance_timer` BIGINT NULL DEFAULT '0',
+ `title_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `inventory_size` INT UNSIGNED NOT NULL DEFAULT '100',
+ PRIMARY KEY (`char_id`),
+ UNIQUE KEY `name_key` (`name`),
+ KEY `account_id` (`account_id`),
+ KEY `party_id` (`party_id`),
+ KEY `guild_id` (`guild_id`),
+ KEY `online` (`online`)
+) ENGINE=MyISAM AUTO_INCREMENT=150000;
+
+--
+-- Table structure for table `char_reg_num_db`
+--
+
+CREATE TABLE IF NOT EXISTS `char_reg_num_db` (
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT UNSIGNED NOT NULL DEFAULT '0',
+ `value` INT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`,`key`,`index`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `char_reg_str_db`
+--
+
+CREATE TABLE IF NOT EXISTS `char_reg_str_db` (
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT UNSIGNED NOT NULL DEFAULT '0',
+ `value` VARCHAR(255) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`,`key`,`index`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `charlog`
+--
+
+CREATE TABLE IF NOT EXISTS `charlog` (
+ `time` DATETIME NULL,
+ `char_msg` VARCHAR(255) NOT NULL DEFAULT 'char select',
+ `account_id` INT NOT NULL DEFAULT '0',
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `char_num` TINYINT NOT NULL DEFAULT '0',
+ `class` MEDIUMINT NOT NULL DEFAULT '0',
+ `name` VARCHAR(23) NOT NULL DEFAULT '',
+ `str` INT UNSIGNED NOT NULL DEFAULT '0',
+ `agi` INT UNSIGNED NOT NULL DEFAULT '0',
+ `vit` INT UNSIGNED NOT NULL DEFAULT '0',
+ `int` INT UNSIGNED NOT NULL DEFAULT '0',
+ `dex` INT UNSIGNED NOT NULL DEFAULT '0',
+ `luk` INT UNSIGNED NOT NULL DEFAULT '0',
+ `hair` TINYINT NOT NULL DEFAULT '0',
+ `hair_color` INT NOT NULL DEFAULT '0'
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `elemental`
+--
+
+CREATE TABLE IF NOT EXISTS `elemental` (
+ `ele_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `char_id` INT NOT NULL,
+ `class` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `mode` INT UNSIGNED NOT NULL DEFAULT '1',
+ `hp` INT NOT NULL DEFAULT '1',
+ `sp` INT NOT NULL DEFAULT '1',
+ `max_hp` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `max_sp` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `atk1` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `atk2` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `matk` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `aspd` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `def` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `mdef` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `flee` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `hit` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `life_time` INT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ele_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `friends`
+--
+
+CREATE TABLE IF NOT EXISTS `friends` (
+ `char_id` INT NOT NULL DEFAULT '0',
+ `friend_account` INT NOT NULL DEFAULT '0',
+ `friend_id` INT NOT NULL DEFAULT '0',
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `hotkey`
+--
+
+CREATE TABLE IF NOT EXISTS `hotkey` (
+ `char_id` INT NOT NULL,
+ `hotkey` TINYINT UNSIGNED NOT NULL,
+ `type` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `itemskill_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `skill_lvl` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`,`hotkey`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `global_acc_reg_num_db`
+--
+
+CREATE TABLE IF NOT EXISTS `global_acc_reg_num_db` (
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT UNSIGNED NOT NULL DEFAULT '0',
+ `value` INT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `global_acc_reg_str_db`
+--
+
+CREATE TABLE IF NOT EXISTS `global_acc_reg_str_db` (
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT UNSIGNED NOT NULL DEFAULT '0',
+ `value` VARCHAR(255) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `guild`
+--
+
+CREATE TABLE IF NOT EXISTS `guild` (
+ `guild_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `master` VARCHAR(24) NOT NULL DEFAULT '',
+ `guild_lv` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `connect_member` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `max_member` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `average_lv` SMALLINT UNSIGNED NOT NULL DEFAULT '1',
+ `exp` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ `next_exp` INT UNSIGNED NOT NULL DEFAULT '0',
+ `skill_point` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `mes1` VARCHAR(60) NOT NULL DEFAULT '',
+ `mes2` VARCHAR(120) NOT NULL DEFAULT '',
+ `emblem_len` INT UNSIGNED NOT NULL DEFAULT '0',
+ `emblem_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `emblem_data` blob,
+ PRIMARY KEY (`guild_id`,`char_id`),
+ UNIQUE KEY `guild_id` (`guild_id`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `guild_alliance`
+--
+
+CREATE TABLE IF NOT EXISTS `guild_alliance` (
+ `guild_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `opposition` INT UNSIGNED NOT NULL DEFAULT '0',
+ `alliance_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ PRIMARY KEY (`guild_id`,`alliance_id`),
+ KEY `alliance_id` (`alliance_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `guild_castle`
+--
+
+CREATE TABLE IF NOT EXISTS `guild_castle` (
+ `castle_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `guild_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `economy` INT UNSIGNED NOT NULL DEFAULT '0',
+ `defense` INT UNSIGNED NOT NULL DEFAULT '0',
+ `triggerE` INT UNSIGNED NOT NULL DEFAULT '0',
+ `triggerD` INT UNSIGNED NOT NULL DEFAULT '0',
+ `nextTime` INT UNSIGNED NOT NULL DEFAULT '0',
+ `payTime` INT UNSIGNED NOT NULL DEFAULT '0',
+ `createTime` INT UNSIGNED NOT NULL DEFAULT '0',
+ `visibleC` INT UNSIGNED NOT NULL DEFAULT '0',
+ `visibleG0` INT UNSIGNED NOT NULL DEFAULT '0',
+ `visibleG1` INT UNSIGNED NOT NULL DEFAULT '0',
+ `visibleG2` INT UNSIGNED NOT NULL DEFAULT '0',
+ `visibleG3` INT UNSIGNED NOT NULL DEFAULT '0',
+ `visibleG4` INT UNSIGNED NOT NULL DEFAULT '0',
+ `visibleG5` INT UNSIGNED NOT NULL DEFAULT '0',
+ `visibleG6` INT UNSIGNED NOT NULL DEFAULT '0',
+ `visibleG7` INT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`castle_id`),
+ KEY `guild_id` (`guild_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `guild_expulsion`
+--
+
+CREATE TABLE IF NOT EXISTS `guild_expulsion` (
+ `guild_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `mes` VARCHAR(40) NOT NULL DEFAULT '',
+ PRIMARY KEY (`guild_id`,`name`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `guild_member`
+--
+
+CREATE TABLE IF NOT EXISTS `guild_member` (
+ `guild_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `hair` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `hair_color` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `gender` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `class` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `lv` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `exp` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ `exp_payper` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `online` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `position` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ PRIMARY KEY (`guild_id`,`char_id`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `guild_position`
+--
+
+CREATE TABLE IF NOT EXISTS `guild_position` (
+ `guild_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `position` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `mode` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `exp_mode` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`guild_id`,`position`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `guild_skill`
+--
+
+CREATE TABLE IF NOT EXISTS `guild_skill` (
+ `guild_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `id` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `lv` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`guild_id`,`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `guild_storage`
+--
+
+CREATE TABLE IF NOT EXISTS `guild_storage` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `guild_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `nameid` INT UNSIGNED NOT NULL DEFAULT '0',
+ `amount` INT UNSIGNED NOT NULL DEFAULT '0',
+ `equip` INT UNSIGNED NOT NULL DEFAULT '0',
+ `identify` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `refine` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `attribute` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `card0` INT NOT NULL DEFAULT '0',
+ `card1` INT NOT NULL DEFAULT '0',
+ `card2` INT NOT NULL DEFAULT '0',
+ `card3` INT NOT NULL DEFAULT '0',
+ `opt_idx0` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val0` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx1` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val1` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx2` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val2` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx3` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val3` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx4` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val4` SMALLINT NOT NULL DEFAULT '0',
+ `expire_time` INT UNSIGNED NOT NULL DEFAULT '0',
+ `bound` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `unique_id` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `guild_id` (`guild_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `homunculus`
+--
+
+CREATE TABLE IF NOT EXISTS `homunculus` (
+ `homun_id` INT NOT NULL AUTO_INCREMENT,
+ `char_id` INT NOT NULL,
+ `class` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `prev_class` MEDIUMINT NOT NULL DEFAULT '0',
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `level` SMALLINT NOT NULL DEFAULT '0',
+ `exp` INT NOT NULL DEFAULT '0',
+ `intimacy` INT NOT NULL DEFAULT '0',
+ `hunger` SMALLINT NOT NULL DEFAULT '0',
+ `str` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `agi` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `vit` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `INT` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `dex` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `luk` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `hp` INT NOT NULL DEFAULT '1',
+ `max_hp` INT NOT NULL DEFAULT '1',
+ `sp` INT NOT NULL DEFAULT '1',
+ `max_sp` INT NOT NULL DEFAULT '1',
+ `skill_point` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `alive` TINYINT NOT NULL DEFAULT '1',
+ `rename_flag` TINYINT NOT NULL DEFAULT '0',
+ `vaporize` TINYINT NOT NULL DEFAULT '0',
+ `autofeed` TINYINT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`homun_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `interlog`
+--
+
+CREATE TABLE IF NOT EXISTS `interlog` (
+ `time` DATETIME NULL,
+ `log` VARCHAR(255) NOT NULL DEFAULT ''
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `inventory`
+--
+
+CREATE TABLE IF NOT EXISTS `inventory` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `nameid` INT UNSIGNED NOT NULL DEFAULT '0',
+ `amount` INT UNSIGNED NOT NULL DEFAULT '0',
+ `equip` INT UNSIGNED NOT NULL DEFAULT '0',
+ `identify` SMALLINT NOT NULL DEFAULT '0',
+ `refine` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `attribute` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `card0` INT NOT NULL DEFAULT '0',
+ `card1` INT NOT NULL DEFAULT '0',
+ `card2` INT NOT NULL DEFAULT '0',
+ `card3` INT NOT NULL DEFAULT '0',
+ `opt_idx0` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val0` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx1` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val1` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx2` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val2` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx3` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val3` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx4` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val4` SMALLINT NOT NULL DEFAULT '0',
+ `expire_time` INT UNSIGNED NOT NULL DEFAULT '0',
+ `favorite` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `bound` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `unique_id` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `ipbanlist`
+--
+
+CREATE TABLE IF NOT EXISTS `ipbanlist` (
+ `list` VARCHAR(39) NOT NULL DEFAULT '',
+ `btime` DATETIME NULL,
+ `rtime` DATETIME NULL,
+ `reason` VARCHAR(255) NOT NULL DEFAULT '',
+ KEY (`list`)
+) ENGINE=InnoDB;
+
+--
+-- Table structure for table `login`
+--
+
+CREATE TABLE IF NOT EXISTS `login` (
+ `account_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `userid` VARCHAR(23) NOT NULL,
+ `user_pass` VARCHAR(32) NOT NULL DEFAULT '',
+ `sex` ENUM('M','F','S') NOT NULL DEFAULT 'M',
+ `email` VARCHAR(39) NOT NULL DEFAULT '',
+ `group_id` TINYINT NOT NULL DEFAULT '0',
+ `state` INT UNSIGNED NOT NULL DEFAULT '0',
+ `unban_time` INT UNSIGNED NOT NULL DEFAULT '0',
+ `expiration_time` INT UNSIGNED NOT NULL DEFAULT '0',
+ `logincount` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `lastlogin` DATETIME NULL,
+ `last_ip` VARCHAR(100) NOT NULL DEFAULT '',
+ `birthdate` DATE NULL,
+ `character_slots` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `pincode` VARCHAR(4) NOT NULL DEFAULT '',
+ `pincode_change` INT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`),
+ UNIQUE KEY `name` (`userid`)
+) ENGINE=MyISAM AUTO_INCREMENT=2000000;
+
+-- added standard accounts for servers, VERY INSECURE!!!
+-- inserted into the table called login which is above
+
+INSERT IGNORE INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('1', 's1', 'p1', 'S','athena@athena.com');
+
+--
+-- Table structure for table `map_reg_num_db`
+--
+
+CREATE TABLE IF NOT EXISTS `map_reg_num_db` (
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT UNSIGNED NOT NULL DEFAULT '0',
+ `value` INT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`key`, `index`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `map_reg_str_db`
+--
+
+CREATE TABLE IF NOT EXISTS `map_reg_str_db` (
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT UNSIGNED NOT NULL DEFAULT '0',
+ `value` VARCHAR(255) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`key`, `index`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `npc_market_data`
+--
+
+CREATE TABLE IF NOT EXISTS `npc_market_data` (
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `itemid` INT UNSIGNED NOT NULL DEFAULT '0',
+ `amount` INT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`name`,`itemid`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `sc_data`
+--
+
+CREATE TABLE IF NOT EXISTS `sc_data` (
+ `account_id` INT UNSIGNED NOT NULL,
+ `char_id` INT UNSIGNED NOT NULL,
+ `type` SMALLINT UNSIGNED NOT NULL,
+ `tick` INT NOT NULL,
+ `total_tick` INT NOT NULL,
+ `val1` INT NOT NULL DEFAULT '0',
+ `val2` INT NOT NULL DEFAULT '0',
+ `val3` INT NOT NULL DEFAULT '0',
+ `val4` INT NOT NULL DEFAULT '0',
+ KEY (`account_id`),
+ KEY (`char_id`),
+ PRIMARY KEY (`account_id`,`char_id`,`type`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `mail`
+--
+
+CREATE TABLE IF NOT EXISTS `mail` (
+ `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `send_name` VARCHAR(30) NOT NULL DEFAULT '',
+ `send_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `dest_name` VARCHAR(30) NOT NULL DEFAULT '',
+ `dest_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `title` VARCHAR(45) NOT NULL DEFAULT '',
+ `message` VARCHAR(255) NOT NULL DEFAULT '',
+ `time` INT UNSIGNED NOT NULL DEFAULT '0',
+ `status` TINYINT NOT NULL DEFAULT '0',
+ `zeny` INT UNSIGNED NOT NULL DEFAULT '0',
+ `nameid` INT UNSIGNED NOT NULL DEFAULT '0',
+ `amount` INT UNSIGNED NOT NULL DEFAULT '0',
+ `refine` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `attribute` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `identify` SMALLINT NOT NULL DEFAULT '0',
+ `card0` INT NOT NULL DEFAULT '0',
+ `card1` INT NOT NULL DEFAULT '0',
+ `card2` INT NOT NULL DEFAULT '0',
+ `card3` INT NOT NULL DEFAULT '0',
+ `opt_idx0` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val0` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx1` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val1` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx2` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val2` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx3` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val3` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx4` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val4` SMALLINT NOT NULL DEFAULT '0',
+ `unique_id` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `memo`
+--
+
+CREATE TABLE IF NOT EXISTS `memo` (
+ `memo_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `map` VARCHAR(11) NOT NULL DEFAULT '',
+ `x` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `y` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`memo_id`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `mercenary`
+--
+
+CREATE TABLE IF NOT EXISTS `mercenary` (
+ `mer_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `char_id` INT NOT NULL,
+ `class` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `hp` INT NOT NULL DEFAULT '1',
+ `sp` INT NOT NULL DEFAULT '1',
+ `kill_counter` INT NOT NULL,
+ `life_time` INT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`mer_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `mercenary_owner`
+--
+
+CREATE TABLE IF NOT EXISTS `mercenary_owner` (
+ `char_id` INT NOT NULL,
+ `merc_id` INT NOT NULL DEFAULT '0',
+ `arch_calls` INT NOT NULL DEFAULT '0',
+ `arch_faith` INT NOT NULL DEFAULT '0',
+ `spear_calls` INT NOT NULL DEFAULT '0',
+ `spear_faith` INT NOT NULL DEFAULT '0',
+ `sword_calls` INT NOT NULL DEFAULT '0',
+ `sword_faith` INT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `party`
+--
+
+CREATE TABLE IF NOT EXISTS `party` (
+ `party_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `exp` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `item` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `leader_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `leader_char` INT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`party_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `pet`
+--
+
+CREATE TABLE IF NOT EXISTS `pet` (
+ `pet_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `class` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `level` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `egg_id` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `equip` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `intimate` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `hungry` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `rename_flag` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `incubate` INT UNSIGNED NOT NULL DEFAULT '0',
+ `autofeed` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`pet_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `quest`
+--
+
+CREATE TABLE IF NOT EXISTS `quest` (
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `quest_id` INT UNSIGNED NOT NULL,
+ `state` ENUM('0','1','2') NOT NULL DEFAULT '0',
+ `time` INT UNSIGNED NOT NULL DEFAULT '0',
+ `count1` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0',
+ `count2` INT SIGNED NOT NULL DEFAULT '0',
+ `count3` INT SIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`,`quest_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `ragsrvinfo`
+--
+
+CREATE TABLE IF NOT EXISTS `ragsrvinfo` (
+ `index` INT NOT NULL DEFAULT '0',
+ `name` VARCHAR(255) NOT NULL DEFAULT '',
+ `exp` INT UNSIGNED NOT NULL DEFAULT '0',
+ `jexp` INT UNSIGNED NOT NULL DEFAULT '0',
+ `drop` INT UNSIGNED NOT NULL DEFAULT '0'
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `api_export`
+--
+
+CREATE TABLE IF NOT EXISTS `api_export` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `type` INT(11) NOT NULL DEFAULT '0',
+ `data` VARCHAR(2040) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=1;
+
+--
+-- Table structure for table `skill`
+--
+
+CREATE TABLE IF NOT EXISTS `skill` (
+ `char_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `id` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `lv` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `flag` TINYINT UNSIGNED NOT NULL DEFAULT 0,
+ PRIMARY KEY (`char_id`,`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `skill_homunculus`
+--
+
+CREATE TABLE IF NOT EXISTS `skill_homunculus` (
+ `homun_id` INT NOT NULL,
+ `id` INT NOT NULL,
+ `lv` SMALLINT NOT NULL,
+ PRIMARY KEY (`homun_id`,`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `sql_updates`
+--
+
+CREATE TABLE IF NOT EXISTS `sql_updates` (
+ `timestamp` INT UNSIGNED NOT NULL,
+ `ignored` ENUM('Yes','No') NOT NULL DEFAULT 'No',
+ PRIMARY KEY (`timestamp`)
+) ENGINE=MyISAM;
+
+-- Existent updates to enter
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1360858500); -- 2013-02-14--16-15.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1360951560); -- 2013-02-15--18-06.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1362445531); -- 2013-03-05--01-05.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1362528000); -- 2013-03-06--00-00.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1362794218); -- 2013-03-09--01-56.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1364409316); -- 2013-03-27--18-35.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1366075474); -- 2013-04-16--01-24.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1366078541); -- 2013-04-16--02-15.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1381354728); -- 2013-10-09--21-38.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1381423003); -- 2013-10-10--16-36.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1382892428); -- 2013-10-27--16-47.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1383162785); -- 2013-10-30--19-53.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1383167577); -- 2013-10-30--21-12.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1383205740); -- 2013-10-31--07-49.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1383955424); -- 2013-11-09--00-03.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1384473995); -- 2013-11-15--00-06.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1384545461); -- 2013-11-15--19-57.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1384588175); -- 2013-11-16--07-49.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1384763034); -- 2013-11-18--08-23.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1387844126); -- 2013-12-24--00-15.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1388854043); -- 2014-01-04--16-47.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1389028967); -- 2014-01-06--17-22.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1392832626); -- 2014-02-19--17-57.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1395789302); -- 2014-03-25--23-57.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1396893866); -- 2014-04-07--22-04.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1398477600); -- 2014-04-26--10-00.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1400256139); -- 2014-05-17--00-06.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1409590380); -- 2014-09-01--16-53.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1414975503); -- 2014-11-03--00-45.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1435860840); -- 2015-07-02--18-14.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1436360978); -- 2015-07-08--13-08.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1440688342); -- 2015-08-27--20-42.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1450241859); -- 2015-12-16--12-57.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1450367880); -- 2015-12-17--15-58.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1457638175); -- 2016-03-10--22-18.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1467934919); -- 2016-07-08--02-42.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1467935469); -- 2016-07-08--02-51.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1475526420); -- 2016-10-03--20-27.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1477434595); -- 2016-10-26--10-29.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1488454834); -- 2017-03-02--11-40.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1488744559); -- 2017-03-05--08-09.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1489588190); -- 2017-03-15--14-29.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1496588640); -- 2017-06-04--15-04.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1496588700); -- 2017-06-04--15-05.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1509835214); -- 2017-11-04--10-39.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1519671456); -- 2018-02-26--15-57.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1520654809); -- 2018-03-10--04-06.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1527964800); -- 2018-06-03--00-10.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1528026381); -- 2018-06-03--17-16.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1528180320); -- 2018-06-05--12-02.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1532403228); -- 2018-07-24--03-23.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1535865732); -- 2018-09-01--05-22.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1544738447); -- 2018-12-14--01-02.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1546059075); -- 2018-12-29--07-51.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1554760320); -- 2019-04-08--21-52.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1556147483); -- 2019-04-25--02-12.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1557414445); -- 2019-05-09--18-07.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1565293394); -- 2019-08-08--19-43.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1570309293); -- 2019-10-05--19-01.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1570870260); -- 2019-10-21--14-21.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1574463539); -- 2019-11-22--23-58.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1579817630); -- 2020-01-24--01-09.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1584838560); -- 2020-03-22--01-56.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1584842940); -- 2020-03-22--03-09.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1588301040); -- 2020-05-01--04-44.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1589145060); -- 2020-05-10--23-11.sql
+
+--
+-- Table structure for table `storage`
+--
+
+CREATE TABLE IF NOT EXISTS `storage` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+ `account_id` INT UNSIGNED NOT NULL DEFAULT '0',
+ `nameid` INT UNSIGNED NOT NULL DEFAULT '0',
+ `amount` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `equip` INT UNSIGNED NOT NULL DEFAULT '0',
+ `identify` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `refine` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `attribute` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `card0` INT NOT NULL DEFAULT '0',
+ `card1` INT NOT NULL DEFAULT '0',
+ `card2` INT NOT NULL DEFAULT '0',
+ `card3` INT NOT NULL DEFAULT '0',
+ `opt_idx0` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val0` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx1` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val1` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx2` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val2` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx3` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val3` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx4` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val4` SMALLINT NOT NULL DEFAULT '0',
+ `expire_time` INT UNSIGNED NOT NULL DEFAULT '0',
+ `bound` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `unique_id` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+
+CREATE TABLE IF NOT EXISTS `rodex_items` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `mail_id` BIGINT NOT NULL DEFAULT '0',
+ `nameid` INT NOT NULL DEFAULT '0',
+ `amount` INT NOT NULL DEFAULT '0',
+ `equip` INT UNSIGNED NOT NULL DEFAULT '0',
+ `identify` SMALLINT NOT NULL DEFAULT '0',
+ `refine` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `attribute` TINYINT NOT NULL DEFAULT '0',
+ `card0` INT NOT NULL DEFAULT '0',
+ `card1` INT NOT NULL DEFAULT '0',
+ `card2` INT NOT NULL DEFAULT '0',
+ `card3` INT NOT NULL DEFAULT '0',
+ `opt_idx0` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val0` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx1` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val1` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx2` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val2` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx3` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val3` SMALLINT NOT NULL DEFAULT '0',
+ `opt_idx4` SMALLINT UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val4` SMALLINT NOT NULL DEFAULT '0',
+ `expire_time` INT UNSIGNED NOT NULL DEFAULT '0',
+ `bound` TINYINT UNSIGNED NOT NULL DEFAULT '0',
+ `unique_id` BIGINT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `mail_id` (`mail_id`)
+) ENGINE=InnoDB;
+
+CREATE TABLE IF NOT EXISTS `rodex_mail` (
+ `mail_id` BIGINT NOT NULL AUTO_INCREMENT,
+ `sender_name` VARCHAR(30) NOT NULL,
+ `sender_id` INT NOT NULL,
+ `receiver_name` VARCHAR(30) NOT NULL,
+ `receiver_id` INT NOT NULL,
+ `receiver_accountid` INT NOT NULL,
+ `title` VARCHAR(50) NOT NULL,
+ `body` VARCHAR(510) NOT NULL,
+ `zeny` BIGINT NOT NULL,
+ `type` TINYINT UNSIGNED NOT NULL,
+ `is_read` TINYINT NOT NULL,
+ `sender_read` TINYINT NOT NULL,
+ `send_date` INT NOT NULL,
+ `expire_date` INT NOT NULL,
+ `weight` INT NOT NULL,
+ PRIMARY KEY (`mail_id`),
+ KEY `sender_id` (`sender_id`),
+ KEY `receiver_id` (`receiver_id`),
+ KEY `receiver_accountid` (`receiver_accountid`),
+ KEY `send_date` (`send_date`),
+ KEY `expire_date` (`expire_date`)
+) ENGINE=MyISAM;
+
+CREATE TABLE IF NOT EXISTS `npc_barter_data` (
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `itemId` INT UNSIGNED NOT NULL DEFAULT '0',
+ `amount` INT UNSIGNED NOT NULL DEFAULT '0',
+ `priceId` INT UNSIGNED NOT NULL DEFAULT '0',
+ `priceAmount` INT UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`name`, `itemid`, `priceId`, `priceAmount`)
+) ENGINE=MyISAM;
+
+CREATE TABLE IF NOT EXISTS `npc_expanded_barter_data` (
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `itemId` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `amount` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `zeny` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyId1` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount1` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine1` INT(11) NOT NULL DEFAULT '0',
+ `currencyId2` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount2` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine2` INT(11) NOT NULL DEFAULT '0',
+ `currencyId3` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount3` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine3` INT(11) NOT NULL DEFAULT '0',
+ `currencyId4` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount4` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine4` INT(11) NOT NULL DEFAULT '0',
+ `currencyId5` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount5` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine5` INT(11) NOT NULL DEFAULT '0',
+ `currencyId6` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount6` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine6` INT(11) NOT NULL DEFAULT '0',
+ `currencyId7` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount7` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine7` INT(11) NOT NULL DEFAULT '0',
+ `currencyId8` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount8` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine8` INT(11) NOT NULL DEFAULT '0',
+ `currencyId9` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount9` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine9` INT(11) NOT NULL DEFAULT '0',
+ `currencyId10` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount10` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine10` INT(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`name`, `itemid`, `zeny`,
+ `currencyId1`, `currencyAmount1`, `currencyRefine1`,
+ `currencyId2`, `currencyAmount2`, `currencyRefine2`,
+ `currencyId3`, `currencyAmount3`, `currencyRefine3`,
+ `currencyId4`, `currencyAmount4`, `currencyRefine4`
+)
+) ENGINE=MyISAM;
diff --git a/sql-files/tools/convert_engine_innodb.sql b/sql-files/tools/convert_engine_innodb.sql
new file mode 100644
index 00000000..0b727017
--- /dev/null
+++ b/sql-files/tools/convert_engine_innodb.sql
@@ -0,0 +1,56 @@
+--
+-- Hercules Database Converter
+-- MyISAM Engine -> InnoDB Engine
+--
+
+ALTER TABLE `account_data` ENGINE = InnoDB;
+ALTER TABLE `acc_reg_num_db` ENGINE = InnoDB;
+ALTER TABLE `acc_reg_str_db` ENGINE = InnoDB;
+ALTER TABLE `auction` ENGINE = InnoDB;
+ALTER TABLE `autotrade_data` ENGINE = InnoDB;
+ALTER TABLE `autotrade_merchants` ENGINE = InnoDB;
+ALTER TABLE `cart_inventory` ENGINE = InnoDB;
+ALTER TABLE `char` ENGINE = InnoDB;
+ALTER TABLE `char_reg_num_db` ENGINE = InnoDB;
+ALTER TABLE `char_reg_str_db` ENGINE = InnoDB;
+ALTER TABLE `charlog` ENGINE = InnoDB;
+ALTER TABLE `elemental` ENGINE = InnoDB;
+ALTER TABLE `friends` ENGINE = InnoDB;
+ALTER TABLE `hotkey` ENGINE = InnoDB;
+ALTER TABLE `global_acc_reg_num_db` ENGINE = InnoDB;
+ALTER TABLE `global_acc_reg_str_db` ENGINE = InnoDB;
+ALTER TABLE `guild` ENGINE = InnoDB;
+ALTER TABLE `guild_alliance` ENGINE = InnoDB;
+ALTER TABLE `guild_castle` ENGINE = InnoDB;
+ALTER TABLE `guild_expulsion` ENGINE = InnoDB;
+ALTER TABLE `guild_member` ENGINE = InnoDB;
+ALTER TABLE `guild_position` ENGINE = InnoDB;
+ALTER TABLE `guild_skill` ENGINE = InnoDB;
+ALTER TABLE `guild_storage` ENGINE = InnoDB;
+ALTER TABLE `homunculus` ENGINE = InnoDB;
+ALTER TABLE `interlog` ENGINE = InnoDB;
+ALTER TABLE `inventory` ENGINE = InnoDB;
+ALTER TABLE `ipbanlist` ENGINE = InnoDB;
+-- ALTER TABLE `item_db` ENGINE = InnoDB;
+-- ALTER TABLE `item_db2` ENGINE = InnoDB;
+ALTER TABLE `login` ENGINE = InnoDB;
+ALTER TABLE `mapreg` ENGINE = InnoDB;
+ALTER TABLE `sc_data` ENGINE = InnoDB;
+ALTER TABLE `mail` ENGINE = InnoDB;
+ALTER TABLE `memo` ENGINE = InnoDB;
+ALTER TABLE `mercenary` ENGINE = InnoDB;
+ALTER TABLE `mercenary_owner` ENGINE = InnoDB;
+-- ALTER TABLE `mob_db` ENGINE = InnoDB;
+-- ALTER TABLE `mob_db2` ENGINE = InnoDB;
+ALTER TABLE `npc_market_data` ENGINE = InnoDB;
+ALTER TABLE `party` ENGINE = InnoDB;
+ALTER TABLE `pet` ENGINE = InnoDB;
+ALTER TABLE `quest` ENGINE = InnoDB;
+ALTER TABLE `ragsrvinfo` ENGINE = InnoDB;
+ALTER TABLE `skill` ENGINE = InnoDB;
+ALTER TABLE `skill_homunculus` ENGINE = InnoDB;
+ALTER TABLE `sql_updates` ENGINE = InnoDB;
+ALTER TABLE `sstatus` ENGINE = InnoDB;
+ALTER TABLE `storage` ENGINE = InnoDB;
+ALTER TABLE `interreg` ENGINE = InnoDB;
+
diff --git a/sql-files/tools/convert_engine_myisam.sql b/sql-files/tools/convert_engine_myisam.sql
new file mode 100644
index 00000000..e8703713
--- /dev/null
+++ b/sql-files/tools/convert_engine_myisam.sql
@@ -0,0 +1,56 @@
+--
+-- Hercules Database Converter
+-- InnoDB Engine -> MyISAM Engine
+--
+
+ALTER TABLE `account_data` ENGINE = MyISAM;
+ALTER TABLE `acc_reg_num_db` ENGINE = MyISAM;
+ALTER TABLE `acc_reg_str_db` ENGINE = MyISAM;
+ALTER TABLE `auction` ENGINE = MyISAM;
+ALTER TABLE `autotrade_data` ENGINE = MyISAM;
+ALTER TABLE `autotrade_merchants` ENGINE = MyISAM;
+ALTER TABLE `cart_inventory` ENGINE = MyISAM;
+ALTER TABLE `char` ENGINE = MyISAM;
+ALTER TABLE `char_reg_num_db` ENGINE = MyISAM;
+ALTER TABLE `char_reg_str_db` ENGINE = MyISAM;
+ALTER TABLE `charlog` ENGINE = MyISAM;
+ALTER TABLE `elemental` ENGINE = MyISAM;
+ALTER TABLE `friends` ENGINE = MyISAM;
+ALTER TABLE `hotkey` ENGINE = MyISAM;
+ALTER TABLE `global_acc_reg_num_db` ENGINE = MyISAM;
+ALTER TABLE `global_acc_reg_str_db` ENGINE = MyISAM;
+ALTER TABLE `guild` ENGINE = MyISAM;
+ALTER TABLE `guild_alliance` ENGINE = MyISAM;
+ALTER TABLE `guild_castle` ENGINE = MyISAM;
+ALTER TABLE `guild_expulsion` ENGINE = MyISAM;
+ALTER TABLE `guild_member` ENGINE = MyISAM;
+ALTER TABLE `guild_position` ENGINE = MyISAM;
+ALTER TABLE `guild_skill` ENGINE = MyISAM;
+ALTER TABLE `guild_storage` ENGINE = MyISAM;
+ALTER TABLE `homunculus` ENGINE = MyISAM;
+ALTER TABLE `interlog` ENGINE = MyISAM;
+ALTER TABLE `inventory` ENGINE = MyISAM;
+ALTER TABLE `ipbanlist` ENGINE = MyISAM;
+-- ALTER TABLE `item_db` ENGINE = MyISAM;
+-- ALTER TABLE `item_db2` ENGINE = MyISAM;
+ALTER TABLE `login` ENGINE = MyISAM;
+ALTER TABLE `mapreg` ENGINE = MyISAM;
+ALTER TABLE `sc_data` ENGINE = MyISAM;
+ALTER TABLE `mail` ENGINE = MyISAM;
+ALTER TABLE `memo` ENGINE = MyISAM;
+ALTER TABLE `mercenary` ENGINE = MyISAM;
+ALTER TABLE `mercenary_owner` ENGINE = MyISAM;
+-- ALTER TABLE `mob_db` ENGINE = MyISAM;
+-- ALTER TABLE `mob_db2` ENGINE = MyISAM;
+ALTER TABLE `npc_market_data` ENGINE = MyISAM;
+ALTER TABLE `party` ENGINE = MyISAM;
+ALTER TABLE `pet` ENGINE = MyISAM;
+ALTER TABLE `quest` ENGINE = MyISAM;
+ALTER TABLE `ragsrvinfo` ENGINE = MyISAM;
+ALTER TABLE `skill` ENGINE = MyISAM;
+ALTER TABLE `skill_homunculus` ENGINE = MyISAM;
+ALTER TABLE `sql_updates` ENGINE = MyISAM;
+ALTER TABLE `sstatus` ENGINE = MyISAM;
+ALTER TABLE `storage` ENGINE = MyISAM;
+ALTER TABLE `interreg` ENGINE = MyISAM;
+
diff --git a/sql-files/tools/convert_passwords.sql b/sql-files/tools/convert_passwords.sql
new file mode 100644
index 00000000..9ee35e13
--- /dev/null
+++ b/sql-files/tools/convert_passwords.sql
@@ -0,0 +1,3 @@
+-- Convert passwords to MD5 Hash
+
+UPDATE `login` SET `user_pass`=MD5(`user_pass`);
diff --git a/sql-files/upgrades/2013-02-14--16-15.sql b/sql-files/upgrades/2013-02-14--16-15.sql
new file mode 100644
index 00000000..b7db70d4
--- /dev/null
+++ b/sql-files/upgrades/2013-02-14--16-15.sql
@@ -0,0 +1,7 @@
+#1360858500
+CREATE TABLE IF NOT EXISTS `sql_updates` (
+ `timestamp` INT(11) UNSIGNED NOT NULL,
+ `ignored` ENUM('Yes','No') NOT NULL DEFAULT 'No'
+) ENGINE=MyISAM;
+ALTER TABLE `skill` ADD COLUMN `flag` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1360858500);
diff --git a/sql-files/upgrades/2013-02-15--18-06.sql b/sql-files/upgrades/2013-02-15--18-06.sql
new file mode 100644
index 00000000..efb0b2ad
--- /dev/null
+++ b/sql-files/upgrades/2013-02-15--18-06.sql
@@ -0,0 +1,3 @@
+#1360951560
+ALTER TABLE `sql_updates` ADD PRIMARY KEY (`timestamp`);
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1360951560);
diff --git a/sql-files/upgrades/2013-03-05--01-05.sql b/sql-files/upgrades/2013-03-05--01-05.sql
new file mode 100644
index 00000000..b1a0e402
--- /dev/null
+++ b/sql-files/upgrades/2013-03-05--01-05.sql
@@ -0,0 +1,3 @@
+#1362445531
+ALTER TABLE `login` ADD `character_slots` TINYINT(3) UNSIGNED NOT NULL;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1362445531);
diff --git a/sql-files/upgrades/2013-03-06--00-00.sql b/sql-files/upgrades/2013-03-06--00-00.sql
new file mode 100644
index 00000000..8d46be76
--- /dev/null
+++ b/sql-files/upgrades/2013-03-06--00-00.sql
@@ -0,0 +1,9 @@
+#1362528000
+-- This script resets all dewata quests that were done by your users before this revision
+-- Author: Euphy
+DELETE FROM `quest` WHERE `quest_id` > 5034 AND `quest_id` < 5055;
+DELETE FROM `quest` WHERE `quest_id` > 9154 AND `quest_id` < 9166;
+DELETE FROM `global_reg_value` WHERE `str` = 'dewata_gatti';
+DELETE FROM `global_reg_value` WHERE `str` = 'dewata_legend';
+DELETE FROM `global_reg_value` WHERE `str` = 'dewata_oldman';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1362528000);
diff --git a/sql-files/upgrades/2013-03-09--01-56.sql b/sql-files/upgrades/2013-03-09--01-56.sql
new file mode 100644
index 00000000..6edfa79c
--- /dev/null
+++ b/sql-files/upgrades/2013-03-09--01-56.sql
@@ -0,0 +1,4 @@
+#1362794218
+ALTER TABLE `login` ADD COLUMN `pincode` VARCHAR(4) NOT NULL DEFAULT '';
+ALTER TABLE `login` ADD COLUMN `pincode_change` INT(11) unsigned NOT NULL DEFAULT '0';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1362794218);
diff --git a/sql-files/upgrades/2013-03-27--18-35.sql b/sql-files/upgrades/2013-03-27--18-35.sql
new file mode 100644
index 00000000..323aa2ac
--- /dev/null
+++ b/sql-files/upgrades/2013-03-27--18-35.sql
@@ -0,0 +1,3 @@
+#1364409316
+ALTER TABLE `char` ADD COLUMN `slotchange` SMALLINT(3) unsigned NOT NULL default '0';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1364409316);
diff --git a/sql-files/upgrades/2013-04-16--01-24.sql b/sql-files/upgrades/2013-04-16--01-24.sql
new file mode 100644
index 00000000..951ca8cd
--- /dev/null
+++ b/sql-files/upgrades/2013-04-16--01-24.sql
@@ -0,0 +1,3 @@
+#1366075474
+-- Info http://herc.ws/board/topic/410-skill-script-command-updatefix/
+UPDATE `skill` SET `flag` = 0 WHERE `flag` = 4 AND `id` != 2535 AND `id` != 681;
diff --git a/sql-files/upgrades/2013-04-16--02-15.sql b/sql-files/upgrades/2013-04-16--02-15.sql
new file mode 100644
index 00000000..458d1dc3
--- /dev/null
+++ b/sql-files/upgrades/2013-04-16--02-15.sql
@@ -0,0 +1,4 @@
+#1366078541
+ALTER TABLE `char` ADD `char_opt` INT(11) UNSIGNED NOT NULL DEFAULT '0';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1366075474); -- for the previous that missed it..
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1366078541);
diff --git a/sql-files/upgrades/2013-10-09--21-38.sql b/sql-files/upgrades/2013-10-09--21-38.sql
new file mode 100644
index 00000000..d8854bcd
--- /dev/null
+++ b/sql-files/upgrades/2013-10-09--21-38.sql
@@ -0,0 +1,3 @@
+#1381354728
+ALTER TABLE `zenylog` MODIFY `type` ENUM('T','V','P','M','S','N','D','C','A','E','I','B','K') NOT NULL DEFAULT 'S';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1381354728);
diff --git a/sql-files/upgrades/2013-10-10--16-36.sql b/sql-files/upgrades/2013-10-10--16-36.sql
new file mode 100644
index 00000000..88db7609
--- /dev/null
+++ b/sql-files/upgrades/2013-10-10--16-36.sql
@@ -0,0 +1,7 @@
+#1381423003
+CREATE TABLE IF NOT EXISTS `account_data` (
+ `account_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `bank_vault` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`)
+) ENGINE=MyISAM;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1381423003);
diff --git a/sql-files/upgrades/2013-10-27--16-47.sql b/sql-files/upgrades/2013-10-27--16-47.sql
new file mode 100644
index 00000000..2a9a73f3
--- /dev/null
+++ b/sql-files/upgrades/2013-10-27--16-47.sql
@@ -0,0 +1,6 @@
+#1382892428
+ALTER TABLE `inventory` MODIFY `equip` INT(11) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `storage` MODIFY `equip` INT(11) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `cart_inventory` MODIFY `equip` INT(11) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `guild_storage` MODIFY `equip` INT(11) UNSIGNED NOT NULL DEFAULT '0';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1382892428);
diff --git a/sql-files/upgrades/2013-10-30--19-53.sql b/sql-files/upgrades/2013-10-30--19-53.sql
new file mode 100644
index 00000000..6e89015e
--- /dev/null
+++ b/sql-files/upgrades/2013-10-30--19-53.sql
@@ -0,0 +1,5 @@
+#1383162785
+ALTER TABLE `account_data` ADD `base_exp` TINYINT(4) UNSIGNED NOT NULL DEFAULT '100';
+ALTER TABLE `account_data` ADD `base_drop` TINYINT(4) UNSIGNED NOT NULL DEFAULT '100';
+ALTER TABLE `account_data` ADD `base_death` TINYINT(4) UNSIGNED NOT NULL DEFAULT '100';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1383162785);
diff --git a/sql-files/upgrades/2013-10-30--21-12.sql b/sql-files/upgrades/2013-10-30--21-12.sql
new file mode 100644
index 00000000..e0fbda87
--- /dev/null
+++ b/sql-files/upgrades/2013-10-30--21-12.sql
@@ -0,0 +1,3 @@
+#1383167577
+ALTER TABLE `char` ADD `font` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1383167577);
diff --git a/sql-files/upgrades/2013-10-31--07-49.sql b/sql-files/upgrades/2013-10-31--07-49.sql
new file mode 100644
index 00000000..25f489f5
--- /dev/null
+++ b/sql-files/upgrades/2013-10-31--07-49.sql
@@ -0,0 +1,6 @@
+#1383205740
+ALTER TABLE `inventory` ADD COLUMN `bound` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' AFTER `favorite`;
+ALTER TABLE `cart_inventory` ADD COLUMN `bound` TINYINT(1) UNSIGNED NOT NULL default '0' AFTER `expire_time`;
+ALTER TABLE `storage` ADD COLUMN `bound` TINYINT(1) UNSIGNED NOT NULL default '0' AFTER `expire_time`;
+ALTER TABLE `guild_storage` ADD COLUMN `bound` TINYINT(1) UNSIGNED NOT NULL default '0' AFTER `expire_time`;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1383205740);
diff --git a/sql-files/upgrades/2013-11-09--00-03.sql b/sql-files/upgrades/2013-11-09--00-03.sql
new file mode 100644
index 00000000..92fe1b76
--- /dev/null
+++ b/sql-files/upgrades/2013-11-09--00-03.sql
@@ -0,0 +1,5 @@
+#1383955424
+ALTER TABLE `account_data` MODIFY `base_exp` TINYINT(4) UNSIGNED NOT NULL DEFAULT '100';
+ALTER TABLE `account_data` MODIFY `base_drop` TINYINT(4) UNSIGNED NOT NULL DEFAULT '100';
+ALTER TABLE `account_data` MODIFY `base_death` TINYINT(4) UNSIGNED NOT NULL DEFAULT '100';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1383955424);
diff --git a/sql-files/upgrades/2013-11-15--00-06.sql b/sql-files/upgrades/2013-11-15--00-06.sql
new file mode 100644
index 00000000..dafc5615
--- /dev/null
+++ b/sql-files/upgrades/2013-11-15--00-06.sql
@@ -0,0 +1,105 @@
+#1384473995
+
+-- Note: If you're running a MySQL version earlier than 5.0 (or if this scripts fails for you for any reason)
+-- you'll need to run the following queries manually:
+--
+-- [ Pre-Renewal only ]
+-- ALTER TABLE item_db2 ADD COLUMN `matk` SMALLINT(5) UNSIGNED DEFAULT NULL AFTER atk;
+-- ALTER TABLE item_db2 CHANGE COLUMN `equip_level` `equip_level_min` SMALLINT(5) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 ADD COLUMN `equip_level_max` SMALLINT(5) UNSIGNED DEFAULT NULL AFTER equip_level_min;
+-- [ Both Pre-Renewal and Renewal ]
+-- ALTER TABLE item_db2 MODIFY COLUMN `price_buy` MEDIUMINT(10) DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `price_sell` MEDIUMINT(10) DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `weight` SMALLINT(5) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `atk` SMALLINT(5) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `matk` SMALLINT(5) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `defence` SMALLINT(5) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `range` TINYINT(2) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `slots` TINYINT(2) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `equip_jobs` INT(12) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `equip_upper` TINYINT(8) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `equip_genders` TINYINT(2) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `equip_locations` SMALLINT(4) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `weapon_level` TINYINT(2) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `equip_level_min` SMALLINT(5) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `equip_level_max` SMALLINT(5) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `refineable` TINYINT(1) UNSIGNED DEFAULT NULL;
+-- ALTER TABLE item_db2 MODIFY COLUMN `view` SMALLINT(3) UNSIGNED DEFAULT NULL;
+-- INSERT INTO `sql_updates` (`timestamp`) VALUES (1384473995);
+--
+-- [ End ]
+-- What follows is the automated script that does all of the above.
+
+DELIMITER $$
+
+DROP PROCEDURE IF EXISTS alter_if_not_exists $$
+DROP PROCEDURE IF EXISTS alter_if_exists $$
+
+CREATE PROCEDURE alter_if_not_exists(my_table TINYTEXT, my_column TINYTEXT, my_command TINYTEXT, my_predicate TEXT)
+BEGIN
+ set @dbname = DATABASE();
+ IF EXISTS (
+ SELECT * FROM information_schema.TABLES
+ WHERE TABLE_SCHEMA = @dbname
+ AND TABLE_NAME = my_table
+ ) AND NOT EXISTS (
+ SELECT * FROM information_schema.COLUMNS
+ WHERE TABLE_SCHEMA = @dbname
+ AND TABLE_NAME = my_table
+ AND COLUMN_NAME = my_column
+ )
+ THEN
+ SET @q = CONCAT('ALTER TABLE ', @dbname, '.', my_table, ' ',
+ my_command, ' `', my_column, '` ', my_predicate);
+ PREPARE STMT FROM @q;
+ EXECUTE STMT;
+ END IF;
+
+END $$
+
+CREATE PROCEDURE alter_if_exists(my_table TINYTEXT, my_column TINYTEXT, my_command TINYTEXT, my_predicate TEXT)
+BEGIN
+ set @dbname = DATABASE();
+ IF EXISTS (
+ SELECT * FROM information_schema.COLUMNS
+ WHERE TABLE_SCHEMA = @dbname
+ AND TABLE_NAME = my_table
+ AND COLUMN_NAME = my_column
+ )
+ THEN
+ SET @q = CONCAT('ALTER TABLE ', @dbname, '.', my_table, ' ',
+ my_command, ' `', my_column, '` ', my_predicate);
+ PREPARE STMT FROM @q;
+ EXECUTE STMT;
+ END IF;
+
+END $$
+
+CALL alter_if_not_exists('item_db2', 'matk', 'ADD COLUMN', 'SMALLINT(5) UNSIGNED DEFAULT NULL AFTER atk') $$
+CALL alter_if_exists('item_db2', 'equip_level', 'CHANGE COLUMN', 'equip_level_min SMALLINT(5) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_not_exists('item_db2', 'equip_level_max', 'ADD COLUMN', 'SMALLINT(5) UNSIGNED DEFAULT NULL AFTER equip_level_min') $$
+
+CALL alter_if_exists('item_db2', 'price_buy', 'MODIFY COLUMN', 'MEDIUMINT(10) DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'price_sell', 'MODIFY COLUMN', 'MEDIUMINT(10) DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'weight', 'MODIFY COLUMN', 'SMALLINT(5) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'atk', 'MODIFY COLUMN', 'SMALLINT(5) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'matk', 'MODIFY COLUMN', 'SMALLINT(5) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'defence', 'MODIFY COLUMN', 'SMALLINT(5) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'range', 'MODIFY COLUMN', 'TINYINT(2) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'slots', 'MODIFY COLUMN', 'TINYINT(2) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'equip_jobs', 'MODIFY COLUMN', 'INT(12) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'equip_upper', 'MODIFY COLUMN', 'TINYINT(8) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'equip_genders', 'MODIFY COLUMN', 'TINYINT(2) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'equip_locations', 'MODIFY COLUMN', 'SMALLINT(4) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'weapon_level', 'MODIFY COLUMN', 'TINYINT(2) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'equip_level_min', 'MODIFY COLUMN', 'SMALLINT(5) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'equip_level_max', 'MODIFY COLUMN', 'SMALLINT(5) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'refineable', 'MODIFY COLUMN', 'TINYINT(1) UNSIGNED DEFAULT NULL') $$
+CALL alter_if_exists('item_db2', 'view', 'MODIFY COLUMN', 'SMALLINT(3) UNSIGNED DEFAULT NULL') $$
+
+DROP PROCEDURE IF EXISTS alter_if_not_exists $$
+DROP PROCEDURE IF EXISTS alter_if_exists $$
+
+DELIMITER ';'
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1384473995);
diff --git a/sql-files/upgrades/2013-11-15--19-57.sql b/sql-files/upgrades/2013-11-15--19-57.sql
new file mode 100644
index 00000000..d4d8ec50
--- /dev/null
+++ b/sql-files/upgrades/2013-11-15--19-57.sql
@@ -0,0 +1,5 @@
+#1384545461
+UPDATE `account_data` SET `base_exp` = '100' WHERE `base_exp` = '0';
+UPDATE `account_data` SET `base_drop` = '100' WHERE `base_drop` = '0';
+UPDATE `account_data` SET `base_death` = '100' WHERE `base_death` = '0';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1384545461);
diff --git a/sql-files/upgrades/2013-11-16--07-49.sql b/sql-files/upgrades/2013-11-16--07-49.sql
new file mode 100644
index 00000000..fce74aab
--- /dev/null
+++ b/sql-files/upgrades/2013-11-16--07-49.sql
@@ -0,0 +1,3 @@
+#1384588175
+ALTER TABLE `char` ADD COLUMN `unban_time` INT(11) UNSIGNED NOT NULL DEFAULT '0';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1384588175);
diff --git a/sql-files/upgrades/2013-11-18--08-23.sql b/sql-files/upgrades/2013-11-18--08-23.sql
new file mode 100644
index 00000000..d7100d78
--- /dev/null
+++ b/sql-files/upgrades/2013-11-18--08-23.sql
@@ -0,0 +1,65 @@
+#1384763034
+
+-- Note: If you're running a MySQL version earlier than 5.0 (or if this scripts fails for you for any reason)
+-- you'll need to run the following queries manually:
+--
+-- [ Both Pre-Renewal and Renewal ]
+-- ALTER TABLE item_db2 ADD COLUMN `bindonequip` TINYINT(1) UNSIGNED DEFAULT NULL AFTER `view`;
+-- INSERT INTO `sql_updates` (`timestamp`) VALUES (1384763034);
+--
+-- [ End ]
+-- What follows is the automated script that does all of the above.
+
+DELIMITER $$
+
+DROP PROCEDURE IF EXISTS alter_if_not_exists $$
+DROP PROCEDURE IF EXISTS alter_if_exists $$
+
+CREATE PROCEDURE alter_if_not_exists(my_table TINYTEXT, my_column TINYTEXT, my_command TINYTEXT, my_predicate TEXT)
+BEGIN
+ set @dbname = DATABASE();
+ IF EXISTS (
+ SELECT * FROM information_schema.TABLES
+ WHERE TABLE_SCHEMA = @dbname
+ AND TABLE_NAME = my_table
+ ) AND NOT EXISTS (
+ SELECT * FROM information_schema.COLUMNS
+ WHERE TABLE_SCHEMA = @dbname
+ AND TABLE_NAME = my_table
+ AND COLUMN_NAME = my_column
+ )
+ THEN
+ SET @q = CONCAT('ALTER TABLE ', @dbname, '.', my_table, ' ',
+ my_command, ' `', my_column, '` ', my_predicate);
+ PREPARE STMT FROM @q;
+ EXECUTE STMT;
+ END IF;
+
+END $$
+
+CREATE PROCEDURE alter_if_exists(my_table TINYTEXT, my_column TINYTEXT, my_command TINYTEXT, my_predicate TEXT)
+BEGIN
+ set @dbname = DATABASE();
+ IF EXISTS (
+ SELECT * FROM information_schema.COLUMNS
+ WHERE TABLE_SCHEMA = @dbname
+ AND TABLE_NAME = my_table
+ AND COLUMN_NAME = my_column
+ )
+ THEN
+ SET @q = CONCAT('ALTER TABLE ', @dbname, '.', my_table, ' ',
+ my_command, ' `', my_column, '` ', my_predicate);
+ PREPARE STMT FROM @q;
+ EXECUTE STMT;
+ END IF;
+
+END $$
+
+CALL alter_if_not_exists('item_db2', 'bindonequip', 'ADD COLUMN', 'TINYINT(1) UNSIGNED DEFAULT NULL AFTER `view`') $$
+
+DROP PROCEDURE IF EXISTS alter_if_not_exists $$
+DROP PROCEDURE IF EXISTS alter_if_exists $$
+
+DELIMITER ';'
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1384763034);
diff --git a/sql-files/upgrades/2013-12-24--00-15.sql b/sql-files/upgrades/2013-12-24--00-15.sql
new file mode 100644
index 00000000..2de4771a
--- /dev/null
+++ b/sql-files/upgrades/2013-12-24--00-15.sql
@@ -0,0 +1,8 @@
+#1387844126
+CREATE TABLE IF NOT EXISTS `npc_market_data` (
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `itemid` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `amount` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`name`,`itemid`)
+) ENGINE=MyISAM;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1387844126);
diff --git a/sql-files/upgrades/2014-01-04--16-47.sql b/sql-files/upgrades/2014-01-04--16-47.sql
new file mode 100644
index 00000000..40be437d
--- /dev/null
+++ b/sql-files/upgrades/2014-01-04--16-47.sql
@@ -0,0 +1,61 @@
+#1388854043
+ALTER TABLE `mapreg` ADD PRIMARY KEY (`varname`, `index`);
+ALTER TABLE `mapreg` DROP INDEX `varname`;
+ALTER TABLE `mapreg` DROP INDEX `index`;
+ALTER TABLE `mapreg` MODIFY `varname` VARCHAR(32) BINARY NOT NULL;
+CREATE TABLE IF NOT EXISTS `acc_reg_num_db` (
+ `account_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `value` INT(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `acc_reg_str_db` (
+ `account_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `value` VARCHAR(254) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `char_reg_num_db` (
+ `char_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `value` INT(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`,`key`,`index`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `char_reg_str_db` (
+ `char_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `value` VARCHAR(254) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`,`key`,`index`),
+ KEY `char_id` (`char_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `global_acc_reg_num_db` (
+ `account_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `value` INT(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `global_acc_reg_str_db` (
+ `account_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `value` VARCHAR(254) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`,`key`,`index`),
+ KEY `account_id` (`account_id`)
+) ENGINE=MyISAM;
+INSERT INTO `acc_reg_num_db` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 2 AND `str` NOT LIKE '%$';
+INSERT INTO `acc_reg_str_db` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 2 AND `str` LIKE '%$';
+INSERT INTO `char_reg_num_db` (`char_id`, `key`, `index`, `value`) SELECT `char_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 3 AND `str` NOT LIKE '%$';
+INSERT INTO `char_reg_str_db` (`char_id`, `key`, `index`, `value`) SELECT `char_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 3 AND `str` LIKE '%$';
+INSERT INTO `global_acc_reg_num_db` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 1 AND `str` NOT LIKE '%$';
+INSERT INTO `global_acc_reg_str_db` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 1 AND `str` LIKE '%$';
+# DROP TABLE `global_reg_value`;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1388854043);
diff --git a/sql-files/upgrades/2014-01-06--17-22.sql b/sql-files/upgrades/2014-01-06--17-22.sql
new file mode 100644
index 00000000..e3ca8935
--- /dev/null
+++ b/sql-files/upgrades/2014-01-06--17-22.sql
@@ -0,0 +1,16 @@
+#1389028967
+CREATE TABLE IF NOT EXISTS `autotrade_merchants` (
+ `account_id` INT(11) NOT NULL DEFAULT '0',
+ `char_id` INT(11) NOT NULL DEFAULT '0',
+ `sex` TINYINT(2) NOT NULL DEFAULT '0',
+ `title` varchar(80) NOT NULL DEFAULT 'Buy From Me!',
+ PRIMARY KEY (`account_id`,`char_id`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `autotrade_data` (
+ `char_id` INT(11) NOT NULL DEFAULT '0',
+ `itemkey` INT(11) NOT NULL DEFAULT '0',
+ `amount` INT(11) NOT NULL DEFAULT '0',
+ `price` INT(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`,`itemkey`)
+) ENGINE=MyISAM;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1389028967);
diff --git a/sql-files/upgrades/2014-02-19--17-57.sql b/sql-files/upgrades/2014-02-19--17-57.sql
new file mode 100644
index 00000000..63abc335
--- /dev/null
+++ b/sql-files/upgrades/2014-02-19--17-57.sql
@@ -0,0 +1,4 @@
+#1392832626
+DELETE FROM `sc_data` WHERE `tick` = '-1';
+ALTER TABLE `sc_data` ADD PRIMARY KEY (`account_id`,`char_id`,`type`);
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1392832626);
diff --git a/sql-files/upgrades/2014-03-25--23-57.sql b/sql-files/upgrades/2014-03-25--23-57.sql
new file mode 100644
index 00000000..40d3fb2f
--- /dev/null
+++ b/sql-files/upgrades/2014-03-25--23-57.sql
@@ -0,0 +1,3 @@
+#1395789302
+ALTER TABLE `charlog` ADD COLUMN `char_id` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `account_id`;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1395789302);
diff --git a/sql-files/upgrades/2014-04-07--22-04.sql b/sql-files/upgrades/2014-04-07--22-04.sql
new file mode 100644
index 00000000..56c54eac
--- /dev/null
+++ b/sql-files/upgrades/2014-04-07--22-04.sql
@@ -0,0 +1,3 @@
+#1396893866
+ALTER TABLE `char` ADD COLUMN `uniqueitem_counter` BIGINT(20) NOT NULL AFTER `unban_time`;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1396893866);
diff --git a/sql-files/upgrades/2014-04-26--10-00.sql b/sql-files/upgrades/2014-04-26--10-00.sql
new file mode 100644
index 00000000..0c0b571e
--- /dev/null
+++ b/sql-files/upgrades/2014-04-26--10-00.sql
@@ -0,0 +1,3 @@
+#1398477600
+ALTER TABLE `char` CHANGE COLUMN `uniqueitem_counter` `uniqueitem_counter` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1398477600);
diff --git a/sql-files/upgrades/2014-05-17--00-06.sql b/sql-files/upgrades/2014-05-17--00-06.sql
new file mode 100644
index 00000000..4e5d0d32
--- /dev/null
+++ b/sql-files/upgrades/2014-05-17--00-06.sql
@@ -0,0 +1,3 @@
+#1400256139
+ALTER TABLE `pet` CHANGE `incuvate` `incubate` int(11) unsigned NOT NULL default '0';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1400256139);
diff --git a/sql-files/upgrades/2014-09-01--16-53.sql b/sql-files/upgrades/2014-09-01--16-53.sql
new file mode 100644
index 00000000..9827c002
--- /dev/null
+++ b/sql-files/upgrades/2014-09-01--16-53.sql
@@ -0,0 +1,5 @@
+#1409590380
+ALTER TABLE `account_data` CHANGE `base_exp` `base_exp` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '100',
+CHANGE `base_drop` `base_drop` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '100',
+CHANGE `base_death` `base_death` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '100';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1409590380);
diff --git a/sql-files/upgrades/2014-11-03--00-45.sql b/sql-files/upgrades/2014-11-03--00-45.sql
new file mode 100644
index 00000000..19d0a8ff
--- /dev/null
+++ b/sql-files/upgrades/2014-11-03--00-45.sql
@@ -0,0 +1,3 @@
+#1414975503
+ALTER TABLE `char` ADD COLUMN `sex` ENUM('M','F','U') NOT NULL DEFAULT 'U';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1414975503);
diff --git a/sql-files/upgrades/2015-07-02--18-14.sql b/sql-files/upgrades/2015-07-02--18-14.sql
new file mode 100644
index 00000000..68a02e30
--- /dev/null
+++ b/sql-files/upgrades/2015-07-02--18-14.sql
@@ -0,0 +1,74 @@
+#1435860840
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2015-2020 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+DELIMITER $$
+
+DROP PROCEDURE IF EXISTS alter_if_not_exists $$
+DROP PROCEDURE IF EXISTS alter_if_exists $$
+
+CREATE PROCEDURE alter_if_not_exists(my_table TINYTEXT, my_column TINYTEXT, my_command TINYTEXT, my_predicate TEXT)
+BEGIN
+ set @dbname = DATABASE();
+ IF EXISTS (
+ SELECT * FROM information_schema.TABLES
+ WHERE TABLE_SCHEMA = @dbname
+ AND TABLE_NAME = my_table
+ ) AND NOT EXISTS (
+ SELECT * FROM information_schema.COLUMNS
+ WHERE TABLE_SCHEMA = @dbname
+ AND TABLE_NAME = my_table
+ AND COLUMN_NAME = my_column
+ )
+ THEN
+ SET @q = CONCAT('ALTER TABLE ', @dbname, '.', my_table, ' ',
+ my_command, ' `', my_column, '` ', my_predicate);
+ PREPARE STMT FROM @q;
+ EXECUTE STMT;
+ END IF;
+
+END $$
+
+CREATE PROCEDURE alter_if_exists(my_table TINYTEXT, my_column TINYTEXT, my_command TINYTEXT, my_predicate TEXT)
+BEGIN
+ set @dbname = DATABASE();
+ IF EXISTS (
+ SELECT * FROM information_schema.COLUMNS
+ WHERE TABLE_SCHEMA = @dbname
+ AND TABLE_NAME = my_table
+ AND COLUMN_NAME = my_column
+ )
+ THEN
+ SET @q = CONCAT('ALTER TABLE ', @dbname, '.', my_table, ' ',
+ my_command, ' `', my_column, '` ', my_predicate);
+ PREPARE STMT FROM @q;
+ EXECUTE STMT;
+ END IF;
+
+END $$
+
+CALL alter_if_not_exists('item_db', 'forceserial', 'ADD COLUMN', 'TINYINT(1) UNSIGNED DEFAULT NULL AFTER `bindonequip`') $$
+CALL alter_if_not_exists('item_db2', 'forceserial', 'ADD COLUMN', 'TINYINT(1) UNSIGNED DEFAULT NULL AFTER `bindonequip`') $$
+
+DROP PROCEDURE IF EXISTS alter_if_not_exists $$
+DROP PROCEDURE IF EXISTS alter_if_exists $$
+
+DELIMITER ';'
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1435860840);
diff --git a/sql-files/upgrades/2015-07-08--13-08.sql b/sql-files/upgrades/2015-07-08--13-08.sql
new file mode 100644
index 00000000..4d720858
--- /dev/null
+++ b/sql-files/upgrades/2015-07-08--13-08.sql
@@ -0,0 +1,6 @@
+#1436360978
+
+DROP TABLE IF EXISTS interreg;
+DROP TABLE IF EXISTS sstatus;
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1436360978);
diff --git a/sql-files/upgrades/2015-08-27--20-42.sql b/sql-files/upgrades/2015-08-27--20-42.sql
new file mode 100644
index 00000000..e95e1836
--- /dev/null
+++ b/sql-files/upgrades/2015-08-27--20-42.sql
@@ -0,0 +1,3 @@
+#1440688342
+ALTER TABLE `char` ADD COLUMN `hotkey_rowshift` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1440688342);
diff --git a/sql-files/upgrades/2015-12-16--12-57.sql b/sql-files/upgrades/2015-12-16--12-57.sql
new file mode 100644
index 00000000..cc9ce799
--- /dev/null
+++ b/sql-files/upgrades/2015-12-16--12-57.sql
@@ -0,0 +1,26 @@
+#1450241859
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2015-2016 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `char` MODIFY COLUMN `max_hp` INT(9) NOT NULL DEFAULT '0';
+ALTER TABLE `char` MODIFY COLUMN `max_sp` INT(9) NOT NULL DEFAULT '0';
+ALTER TABLE `char` MODIFY COLUMN `hp` INT(9) NOT NULL DEFAULT '0';
+ALTER TABLE `char` MODIFY COLUMN `sp` INT(9) NOT NULL DEFAULT '0';
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1450241859);
diff --git a/sql-files/upgrades/2015-12-17--15-58.sql b/sql-files/upgrades/2015-12-17--15-58.sql
new file mode 100644
index 00000000..8d3dc51a
--- /dev/null
+++ b/sql-files/upgrades/2015-12-17--15-58.sql
@@ -0,0 +1,22 @@
+#1450367880
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2015 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `char` ADD `body` smallint(5) unsigned NOT NULL default '0' AFTER `clothes_color`;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1450367880);
diff --git a/sql-files/upgrades/2016-03-10--22-18.sql b/sql-files/upgrades/2016-03-10--22-18.sql
new file mode 100644
index 00000000..80266bcc
--- /dev/null
+++ b/sql-files/upgrades/2016-03-10--22-18.sql
@@ -0,0 +1,22 @@
+#1457638175
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2015-2016 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `picklog` MODIFY `type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','K','Y','Z','W','Q','J','H','@','0','1','2') NOT NULL default 'P';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1457638175)
diff --git a/sql-files/upgrades/2016-07-08--02-42.sql b/sql-files/upgrades/2016-07-08--02-42.sql
new file mode 100644
index 00000000..94ca7e6d
--- /dev/null
+++ b/sql-files/upgrades/2016-07-08--02-42.sql
@@ -0,0 +1,35 @@
+#1467934919
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2015-2016 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `charlog` MODIFY `time` DATETIME NULL;
+ALTER TABLE `interlog` MODIFY `time` DATETIME NULL;
+ALTER TABLE `ipbanlist` MODIFY `btime` DATETIME NULL;
+ALTER TABLE `ipbanlist` MODIFY `rtime` DATETIME NULL;
+ALTER TABLE `login` MODIFY `lastlogin` DATETIME NULL;
+ALTER TABLE `login` MODIFY `birthdate` DATE NULL;
+
+UPDATE `charlog` SET `time` = NULL WHERE `time` = '0000-00-00 00:00:00';
+UPDATE `interlog` SET `time` = NULL WHERE `time` = '0000-00-00 00:00:00';
+UPDATE `ipbanlist` SET `btime` = NULL WHERE `btime` = '0000-00-00 00:00:00';
+UPDATE `ipbanlist` SET `rtime` = NULL WHERE `rtime` = '0000-00-00 00:00:00';
+UPDATE `login` SET `lastlogin` = NULL WHERE `lastlogin` = '0000-00-00 00:00:00';
+UPDATE `login` SET `birthdate` = NULL WHERE `birthdate` = '0000-00-00';
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1467934919)
diff --git a/sql-files/upgrades/2016-07-08--02-51.sql b/sql-files/upgrades/2016-07-08--02-51.sql
new file mode 100644
index 00000000..8ecf1a25
--- /dev/null
+++ b/sql-files/upgrades/2016-07-08--02-51.sql
@@ -0,0 +1,30 @@
+#1467935469
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2015-2016 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `atcommandlog` MODIFY `atcommand_date` DATETIME NULL;
+ALTER TABLE `branchlog` MODIFY `branch_date` DATETIME NULL;
+ALTER TABLE `chatlog` MODIFY `time` DATETIME NULL;
+ALTER TABLE `loginlog` MODIFY `time` DATETIME NULL;
+ALTER TABLE `mvplog` MODIFY `mvp_date` DATETIME NULL;
+ALTER TABLE `npclog` MODIFY `npc_date` DATETIME NULL;
+ALTER TABLE `picklog` MODIFY `time` DATETIME NULL;
+ALTER TABLE `zenylog` MODIFY `time` DATETIME NULL;
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1467935469)
diff --git a/sql-files/upgrades/2016-10-03--20-27.sql b/sql-files/upgrades/2016-10-03--20-27.sql
new file mode 100644
index 00000000..6ad840e0
--- /dev/null
+++ b/sql-files/upgrades/2016-10-03--20-27.sql
@@ -0,0 +1,23 @@
+#1475526420
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2015-2016 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `charlog` ADD `class` MEDIUMINT(9) NOT NULL DEFAULT '0' AFTER `char_num`;
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1475526420);
diff --git a/sql-files/upgrades/2016-10-26--10-29.sql b/sql-files/upgrades/2016-10-26--10-29.sql
new file mode 100644
index 00000000..cabd7db1
--- /dev/null
+++ b/sql-files/upgrades/2016-10-26--10-29.sql
@@ -0,0 +1,23 @@
+#1477434595
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2015-2016 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `zenylog` CHANGE `type` `type` ENUM('T','V','P','M','S','N','D','C','A','E','I','B','K') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'S';
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1477434595 , 'No');
diff --git a/sql-files/upgrades/2017-03-02--11-40.sql b/sql-files/upgrades/2017-03-02--11-40.sql
new file mode 100644
index 00000000..30798b5d
--- /dev/null
+++ b/sql-files/upgrades/2017-03-02--11-40.sql
@@ -0,0 +1,93 @@
+#1488454834
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2015-2016 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `auction`
+ ADD COLUMN `opt_idx0` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `card3`,
+ ADD COLUMN `opt_val0` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx0`,
+ ADD COLUMN `opt_idx1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val0`,
+ ADD COLUMN `opt_val1` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx1`,
+ ADD COLUMN `opt_idx2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val1`,
+ ADD COLUMN `opt_val2` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx2`,
+ ADD COLUMN `opt_idx3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val2`,
+ ADD COLUMN `opt_val3` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx3`,
+ ADD COLUMN `opt_idx4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val3`,
+ ADD COLUMN `opt_val4` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx4`;
+
+ALTER TABLE `cart_inventory`
+ ADD COLUMN `opt_idx0` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `card3`,
+ ADD COLUMN `opt_val0` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx0`,
+ ADD COLUMN `opt_idx1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val0`,
+ ADD COLUMN `opt_val1` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx1`,
+ ADD COLUMN `opt_idx2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val1`,
+ ADD COLUMN `opt_val2` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx2`,
+ ADD COLUMN `opt_idx3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val2`,
+ ADD COLUMN `opt_val3` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx3`,
+ ADD COLUMN `opt_idx4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val3`,
+ ADD COLUMN `opt_val4` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx4`;
+
+ALTER TABLE `guild_storage`
+ ADD COLUMN `opt_idx0` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `card3`,
+ ADD COLUMN `opt_val0` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx0`,
+ ADD COLUMN `opt_idx1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val0`,
+ ADD COLUMN `opt_val1` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx1`,
+ ADD COLUMN `opt_idx2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val1`,
+ ADD COLUMN `opt_val2` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx2`,
+ ADD COLUMN `opt_idx3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val2`,
+ ADD COLUMN `opt_val3` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx3`,
+ ADD COLUMN `opt_idx4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val3`,
+ ADD COLUMN `opt_val4` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx4`;
+
+ALTER TABLE `inventory`
+ ADD COLUMN `opt_idx0` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `card3`,
+ ADD COLUMN `opt_val0` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx0`,
+ ADD COLUMN `opt_idx1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val0`,
+ ADD COLUMN `opt_val1` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx1`,
+ ADD COLUMN `opt_idx2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val1`,
+ ADD COLUMN `opt_val2` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx2`,
+ ADD COLUMN `opt_idx3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val2`,
+ ADD COLUMN `opt_val3` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx3`,
+ ADD COLUMN `opt_idx4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val3`,
+ ADD COLUMN `opt_val4` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx4`;
+
+ALTER TABLE `mail`
+ ADD COLUMN `opt_idx0` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `card3`,
+ ADD COLUMN `opt_val0` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx0`,
+ ADD COLUMN `opt_idx1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val0`,
+ ADD COLUMN `opt_val1` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx1`,
+ ADD COLUMN `opt_idx2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val1`,
+ ADD COLUMN `opt_val2` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx2`,
+ ADD COLUMN `opt_idx3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val2`,
+ ADD COLUMN `opt_val3` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx3`,
+ ADD COLUMN `opt_idx4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val3`,
+ ADD COLUMN `opt_val4` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx4`;
+
+ALTER TABLE `storage`
+ ADD COLUMN `opt_idx0` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `card3`,
+ ADD COLUMN `opt_val0` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx0`,
+ ADD COLUMN `opt_idx1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val0`,
+ ADD COLUMN `opt_val1` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx1`,
+ ADD COLUMN `opt_idx2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val1`,
+ ADD COLUMN `opt_val2` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx2`,
+ ADD COLUMN `opt_idx3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val2`,
+ ADD COLUMN `opt_val3` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx3`,
+ ADD COLUMN `opt_idx4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val3`,
+ ADD COLUMN `opt_val4` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx4`;
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1488454834 , 'No');
diff --git a/sql-files/upgrades/2017-03-05--08-09.sql b/sql-files/upgrades/2017-03-05--08-09.sql
new file mode 100644
index 00000000..3b5ee1a2
--- /dev/null
+++ b/sql-files/upgrades/2017-03-05--08-09.sql
@@ -0,0 +1,15 @@
+#1488744559
+
+ALTER TABLE `picklog`
+ ADD COLUMN `opt_idx0` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `card3`,
+ ADD COLUMN `opt_val0` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx0`,
+ ADD COLUMN `opt_idx1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val0`,
+ ADD COLUMN `opt_val1` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx1`,
+ ADD COLUMN `opt_idx2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val1`,
+ ADD COLUMN `opt_val2` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx2`,
+ ADD COLUMN `opt_idx3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val2`,
+ ADD COLUMN `opt_val3` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx3`,
+ ADD COLUMN `opt_idx4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `opt_val3`,
+ ADD COLUMN `opt_val4` SMALLINT(5) NOT NULL DEFAULT '0' AFTER `opt_idx4`;
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1488744559 , 'No');
diff --git a/sql-files/upgrades/2017-03-15--14-29.sql b/sql-files/upgrades/2017-03-15--14-29.sql
new file mode 100644
index 00000000..6e604473
--- /dev/null
+++ b/sql-files/upgrades/2017-03-15--14-29.sql
@@ -0,0 +1,74 @@
+#1489588190
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2017 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+CREATE TABLE IF NOT EXISTS `rodex_items` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `mail_id` BIGINT(20) NOT NULL DEFAULT '0',
+ `nameid` INT(11) NOT NULL DEFAULT '0',
+ `amount` INT(11) NOT NULL DEFAULT '0',
+ `equip` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `identify` SMALLINT(6) NOT NULL DEFAULT '0',
+ `refine` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
+ `attribute` TINYINT(4) NOT NULL DEFAULT '0',
+ `card0` SMALLINT(11) NOT NULL DEFAULT '0',
+ `card1` SMALLINT(11) NOT NULL DEFAULT '0',
+ `card2` SMALLINT(11) NOT NULL DEFAULT '0',
+ `card3` SMALLINT(11) NOT NULL DEFAULT '0',
+ `opt_idx0` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val0` SMALLINT(5) NOT NULL DEFAULT '0',
+ `opt_idx1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val1` SMALLINT(5) NOT NULL DEFAULT '0',
+ `opt_idx2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val2` SMALLINT(5) NOT NULL DEFAULT '0',
+ `opt_idx3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val3` SMALLINT(5) NOT NULL DEFAULT '0',
+ `opt_idx4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
+ `opt_val4` SMALLINT(5) NOT NULL DEFAULT '0',
+ `expire_time` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `bound` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
+ `unique_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `mail_id` (`mail_id`)
+) ENGINE=InnoDB;
+
+CREATE TABLE IF NOT EXISTS `rodex_mail` (
+ `mail_id` BIGINT(20) NOT NULL AUTO_INCREMENT,
+ `sender_name` VARCHAR(30) NOT NULL COLLATE 'utf8_unicode_ci',
+ `sender_id` INT(11) NOT NULL,
+ `receiver_name` VARCHAR(30) NOT NULL COLLATE 'utf8_unicode_ci',
+ `receiver_id` INT(11) NOT NULL,
+ `receiver_accountid` INT(11) NOT NULL,
+ `title` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
+ `body` VARCHAR(510) NOT NULL COLLATE 'utf8_unicode_ci',
+ `zeny` BIGINT(20) NOT NULL,
+ `type` TINYINT(8) UNSIGNED NOT NULL,
+ `is_read` TINYINT(8) NOT NULL,
+ `send_date` INT(11) NOT NULL,
+ `expire_date` INT(11) NOT NULL,
+ `weight` INT(11) NOT NULL,
+ PRIMARY KEY (`mail_id`),
+ KEY `sender_id` (`sender_id`),
+ KEY `receiver_id` (`receiver_id`),
+ KEY `receiver_accountid` (`receiver_accountid`),
+ KEY `send_date` (`send_date`),
+ KEY `expire_date` (`expire_date`)
+) ENGINE=MyISAM;
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1489588190 , 'No');
diff --git a/sql-files/upgrades/2017-06-04--15-04.sql b/sql-files/upgrades/2017-06-04--15-04.sql
new file mode 100644
index 00000000..0805d054
--- /dev/null
+++ b/sql-files/upgrades/2017-06-04--15-04.sql
@@ -0,0 +1,24 @@
+#1496588640
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2017 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `char` ADD COLUMN `clan_id` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `guild_id`;
+ALTER TABLE `char` ADD COLUMN `last_login` BIGINT(20) NULL DEFAULT '0' AFTER `robe`;
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1496588640 , 'No');
diff --git a/sql-files/upgrades/2017-06-04--15-05.sql b/sql-files/upgrades/2017-06-04--15-05.sql
new file mode 100644
index 00000000..550197a1
--- /dev/null
+++ b/sql-files/upgrades/2017-06-04--15-05.sql
@@ -0,0 +1,23 @@
+#1496588700
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2017 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `chatlog` MODIFY COLUMN `type` enum('O','W','P','G','M','C') NOT NULL DEFAULT 'O' AFTER `time`;
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1496588700 , 'No');
diff --git a/sql-files/upgrades/2017-11-04--10-39.sql b/sql-files/upgrades/2017-11-04--10-39.sql
new file mode 100644
index 00000000..f95dbef0
--- /dev/null
+++ b/sql-files/upgrades/2017-11-04--10-39.sql
@@ -0,0 +1,6 @@
+#1509835214
+
+ALTER TABLE `homunculus`
+ ADD COLUMN `autofeed` TINYINT(2) NOT NULL DEFAULT '0' AFTER `vaporize`;
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1509835214 , 'No');
diff --git a/sql-files/upgrades/2018-02-26--15-57.sql b/sql-files/upgrades/2018-02-26--15-57.sql
new file mode 100644
index 00000000..a2090bb3
--- /dev/null
+++ b/sql-files/upgrades/2018-02-26--15-57.sql
@@ -0,0 +1,6 @@
+#1519671456
+
+ALTER TABLE `rodex_mail`
+ ADD COLUMN `sender_read` TINYINT(2) NOT NULL DEFAULT '0' AFTER `is_read`;
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1519671456 , 'No');
diff --git a/sql-files/upgrades/2018-03-10--04-06.sql b/sql-files/upgrades/2018-03-10--04-06.sql
new file mode 100644
index 00000000..ee827735
--- /dev/null
+++ b/sql-files/upgrades/2018-03-10--04-06.sql
@@ -0,0 +1,24 @@
+#1520654809
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2017 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `char` ADD COLUMN `attendance_count` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `hotkey_rowshift`;
+ALTER TABLE `char` ADD COLUMN `attendance_timer` BIGINT(20) NULL DEFAULT '0' AFTER `attendance_count`;
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1520654809 , 'No');
diff --git a/sql-files/upgrades/2018-06-03--00-10.sql b/sql-files/upgrades/2018-06-03--00-10.sql
new file mode 100644
index 00000000..c7f6ac48
--- /dev/null
+++ b/sql-files/upgrades/2018-06-03--00-10.sql
@@ -0,0 +1,40 @@
+#1527964800
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2018 Hercules Dev Team
+-- Copyright (C) Smokexyz
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+CREATE TABLE `char_achievements` (
+ `char_id` INT(11) UNSIGNED NOT NULL,
+ `ach_id` INT(11) UNSIGNED NOT NULL,
+ `completed_at` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `rewarded_at` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `obj_0` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `obj_1` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `obj_2` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `obj_3` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `obj_4` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `obj_5` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `obj_6` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `obj_7` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `obj_8` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ `obj_9` INT(10) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`char_id`, `ach_id`)
+) ENGINE=MyISAM;
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1527964800, 'No');
diff --git a/sql-files/upgrades/2018-06-03--17-16.sql b/sql-files/upgrades/2018-06-03--17-16.sql
new file mode 100644
index 00000000..e14ca62c
--- /dev/null
+++ b/sql-files/upgrades/2018-06-03--17-16.sql
@@ -0,0 +1,24 @@
+#1528026381
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2018 Hercules Dev Team
+-- Copyright (C) Dastgir
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `char` ADD `title_id` INT(11) UNSIGNED NOT NULL DEFAULT '0';
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1528026381, 'No');
diff --git a/sql-files/upgrades/2018-06-05--12-02.sql b/sql-files/upgrades/2018-06-05--12-02.sql
new file mode 100644
index 00000000..26c22243
--- /dev/null
+++ b/sql-files/upgrades/2018-06-05--12-02.sql
@@ -0,0 +1,24 @@
+#1528180320
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2018 Hercules Dev Team
+-- Copyright (C) 2018 Dastgir
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `pet` ADD COLUMN `autofeed` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0';
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1528180320 , 'No');
diff --git a/sql-files/upgrades/2018-07-24--03-23.sql b/sql-files/upgrades/2018-07-24--03-23.sql
new file mode 100644
index 00000000..a8d2d8f7
--- /dev/null
+++ b/sql-files/upgrades/2018-07-24--03-23.sql
@@ -0,0 +1,22 @@
+#1532403228
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2018 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+UPDATE `inventory` SET `identify` = 1, `attribute` = 1 WHERE `card0` = -256 and `identify` = 0;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1532403228);
diff --git a/sql-files/upgrades/2018-09-01--05-22.sql b/sql-files/upgrades/2018-09-01--05-22.sql
new file mode 100644
index 00000000..7a834edd
--- /dev/null
+++ b/sql-files/upgrades/2018-09-01--05-22.sql
@@ -0,0 +1,63 @@
+#1535865732
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2018 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `auction`
+ MODIFY `card0` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card1` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card2` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card3` INT(11) NOT NULL DEFAULT '0';
+
+ALTER TABLE `cart_inventory`
+ MODIFY `card0` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card1` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card2` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card3` INT(11) NOT NULL DEFAULT '0';
+
+ALTER TABLE `guild_storage`
+ MODIFY `card0` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card1` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card2` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card3` INT(11) NOT NULL DEFAULT '0';
+
+ALTER TABLE `inventory`
+ MODIFY `card0` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card1` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card2` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card3` INT(11) NOT NULL DEFAULT '0';
+
+ALTER TABLE `mail`
+ MODIFY `card0` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card1` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card2` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card3` INT(11) NOT NULL DEFAULT '0';
+
+ALTER TABLE `rodex_items`
+ MODIFY `card0` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card1` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card2` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card3` INT(11) NOT NULL DEFAULT '0';
+
+ALTER TABLE `storage`
+ MODIFY `card0` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card1` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card2` INT(11) NOT NULL DEFAULT '0',
+ MODIFY `card3` INT(11) NOT NULL DEFAULT '0';
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1535865732, 'No');
diff --git a/sql-files/upgrades/2018-12-14--01-02.sql b/sql-files/upgrades/2018-12-14--01-02.sql
new file mode 100644
index 00000000..7bcd583c
--- /dev/null
+++ b/sql-files/upgrades/2018-12-14--01-02.sql
@@ -0,0 +1,24 @@
+#1544738447
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2018 Hercules Dev Team
+-- Copyright (C) 4144
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `char` ADD `inventory_size` INT(11) UNSIGNED NOT NULL DEFAULT '100';
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1544738447, 'No');
diff --git a/sql-files/upgrades/2018-12-29--07-51.sql b/sql-files/upgrades/2018-12-29--07-51.sql
new file mode 100644
index 00000000..64117939
--- /dev/null
+++ b/sql-files/upgrades/2018-12-29--07-51.sql
@@ -0,0 +1,29 @@
+#1546059075
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2013-2015 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+CREATE TABLE IF NOT EXISTS `npc_barter_data` (
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `itemId` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `amount` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `priceId` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `priceAmount` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`name`, `itemid`, `priceId`, `priceAmount`)
+) ENGINE=MyISAM;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1546059075);
diff --git a/sql-files/upgrades/2019-04-08--21-52.sql b/sql-files/upgrades/2019-04-08--21-52.sql
new file mode 100644
index 00000000..bd015acf
--- /dev/null
+++ b/sql-files/upgrades/2019-04-08--21-52.sql
@@ -0,0 +1,29 @@
+#1554760320
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2013-2019 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+UPDATE `auction` SET `card3` = `card2` >> 16, `card2` = `card2` % 65536 WHERE `card2` > 65536 AND (`card0` = 255 OR `card0` = 254);
+UPDATE `cart_inventory` SET `card3` = `card2` >> 16, `card2` = `card2` % 65536 WHERE `card2` > 65536 AND (`card0` = 255 OR `card0` = 254);
+UPDATE `inventory` SET `card3` = `card2` >> 16, `card2` = `card2` % 65536 WHERE `card2` > 65536 AND (`card0` = 255 OR `card0` = 254);
+UPDATE `guild_storage` SET `card3` = `card2` >> 16, `card2` = `card2` % 65536 WHERE `card2` > 65536 AND (`card0` = 255 OR `card0` = 254);
+UPDATE `mail` SET `card3` = `card2` >> 16, `card2` = `card2` % 65536 WHERE `card2` > 65536 AND (`card0` = 255 OR `card0` = 254);
+UPDATE `rodex_items` SET `card3` = `card2` >> 16, `card2` = `card2` % 65536 WHERE `card2` > 65536 AND (`card0` = 255 OR `card0` = 254);
+UPDATE `storage` SET `card3` = `card2` >> 16, `card2` = `card2` % 65536 WHERE `card2` > 65536 AND (`card0` = 255 OR `card0` = 254);
+
+INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1554760320, 'No');
diff --git a/sql-files/upgrades/2019-04-25--02-12.sql b/sql-files/upgrades/2019-04-25--02-12.sql
new file mode 100644
index 00000000..64abe45b
--- /dev/null
+++ b/sql-files/upgrades/2019-04-25--02-12.sql
@@ -0,0 +1,24 @@
+#1556147483
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2013-2019 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+TRUNCATE TABLE `guild_expulsion`;
+ALTER TABLE `guild_expulsion` ADD `char_id` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `account_id`;
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1556147483);
diff --git a/sql-files/upgrades/2019-05-09--18-07.sql b/sql-files/upgrades/2019-05-09--18-07.sql
new file mode 100644
index 00000000..96d80c29
--- /dev/null
+++ b/sql-files/upgrades/2019-05-09--18-07.sql
@@ -0,0 +1,22 @@
+#1557414445
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2015 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `char` ADD COLUMN `hotkey_rowshift2` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `hotkey_rowshift`;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1557414445);
diff --git a/sql-files/upgrades/2019-08-08--19-43.sql b/sql-files/upgrades/2019-08-08--19-43.sql
new file mode 100644
index 00000000..15bc4a89
--- /dev/null
+++ b/sql-files/upgrades/2019-08-08--19-43.sql
@@ -0,0 +1,95 @@
+#1565293394
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2019-2020 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `guild_castle` DROP PRIMARY KEY;
+ALTER TABLE `guild_castle` ADD COLUMN `castle_name` VARCHAR(24) AFTER `castle_id`;
+UPDATE `guild_castle` SET `castle_name` = 'aldeg_cas01' WHERE castle_id = 0;
+UPDATE `guild_castle` SET `castle_name` = 'aldeg_cas02' WHERE castle_id = 1;
+UPDATE `guild_castle` SET `castle_name` = 'aldeg_cas03' WHERE castle_id = 2;
+UPDATE `guild_castle` SET `castle_name` = 'aldeg_cas04' WHERE castle_id = 3;
+UPDATE `guild_castle` SET `castle_name` = 'aldeg_cas05' WHERE castle_id = 4;
+UPDATE `guild_castle` SET `castle_name` = 'gefg_cas01' WHERE castle_id = 5;
+UPDATE `guild_castle` SET `castle_name` = 'gefg_cas02' WHERE castle_id = 6;
+UPDATE `guild_castle` SET `castle_name` = 'gefg_cas03' WHERE castle_id = 7;
+UPDATE `guild_castle` SET `castle_name` = 'gefg_cas04' WHERE castle_id = 8;
+UPDATE `guild_castle` SET `castle_name` = 'gefg_cas05' WHERE castle_id = 9;
+UPDATE `guild_castle` SET `castle_name` = 'payg_cas01' WHERE castle_id = 10;
+UPDATE `guild_castle` SET `castle_name` = 'payg_cas02' WHERE castle_id = 11;
+UPDATE `guild_castle` SET `castle_name` = 'payg_cas03' WHERE castle_id = 12;
+UPDATE `guild_castle` SET `castle_name` = 'payg_cas04' WHERE castle_id = 13;
+UPDATE `guild_castle` SET `castle_name` = 'payg_cas05' WHERE castle_id = 14;
+UPDATE `guild_castle` SET `castle_name` = 'prtg_cas01' WHERE castle_id = 15;
+UPDATE `guild_castle` SET `castle_name` = 'prtg_cas02' WHERE castle_id = 16;
+UPDATE `guild_castle` SET `castle_name` = 'prtg_cas03' WHERE castle_id = 17;
+UPDATE `guild_castle` SET `castle_name` = 'prtg_cas04' WHERE castle_id = 18;
+UPDATE `guild_castle` SET `castle_name` = 'prtg_cas05' WHERE castle_id = 19;
+UPDATE `guild_castle` SET `castle_name` = 'nguild_alde' WHERE castle_id = 20;
+UPDATE `guild_castle` SET `castle_name` = 'nguild_gef' WHERE castle_id = 21;
+UPDATE `guild_castle` SET `castle_name` = 'nguild_pay' WHERE castle_id = 22;
+UPDATE `guild_castle` SET `castle_name` = 'nguild_prt' WHERE castle_id = 23;
+UPDATE `guild_castle` SET `castle_name` = 'schg_cas01' WHERE castle_id = 24;
+UPDATE `guild_castle` SET `castle_name` = 'schg_cas02' WHERE castle_id = 25;
+UPDATE `guild_castle` SET `castle_name` = 'schg_cas03' WHERE castle_id = 26;
+UPDATE `guild_castle` SET `castle_name` = 'schg_cas04' WHERE castle_id = 27;
+UPDATE `guild_castle` SET `castle_name` = 'schg_cas05' WHERE castle_id = 28;
+UPDATE `guild_castle` SET `castle_name` = 'arug_cas01' WHERE castle_id = 29;
+UPDATE `guild_castle` SET `castle_name` = 'arug_cas02' WHERE castle_id = 30;
+UPDATE `guild_castle` SET `castle_name` = 'arug_cas03' WHERE castle_id = 31;
+UPDATE `guild_castle` SET `castle_name` = 'arug_cas04' WHERE castle_id = 32;
+UPDATE `guild_castle` SET `castle_name` = 'arug_cas05' WHERE castle_id = 33;
+
+-- Change the castle ids
+UPDATE `guild_castle` SET `castle_id` = 1 WHERE castle_name = 'prtg_cas01';
+UPDATE `guild_castle` SET `castle_id` = 2 WHERE castle_name = 'prtg_cas02';
+UPDATE `guild_castle` SET `castle_id` = 3 WHERE castle_name = 'prtg_cas03';
+UPDATE `guild_castle` SET `castle_id` = 4 WHERE castle_name = 'prtg_cas04';
+UPDATE `guild_castle` SET `castle_id` = 5 WHERE castle_name = 'prtg_cas05';
+UPDATE `guild_castle` SET `castle_id` = 6 WHERE castle_name = 'aldeg_cas01';
+UPDATE `guild_castle` SET `castle_id` = 7 WHERE castle_name = 'aldeg_cas02';
+UPDATE `guild_castle` SET `castle_id` = 8 WHERE castle_name = 'aldeg_cas03';
+UPDATE `guild_castle` SET `castle_id` = 9 WHERE castle_name = 'aldeg_cas04';
+UPDATE `guild_castle` SET `castle_id` = 10 WHERE castle_name = 'aldeg_cas05';
+UPDATE `guild_castle` SET `castle_id` = 11 WHERE castle_name = 'gefg_cas01';
+UPDATE `guild_castle` SET `castle_id` = 12 WHERE castle_name = 'gefg_cas02';
+UPDATE `guild_castle` SET `castle_id` = 13 WHERE castle_name = 'gefg_cas03';
+UPDATE `guild_castle` SET `castle_id` = 14 WHERE castle_name = 'gefg_cas04';
+UPDATE `guild_castle` SET `castle_id` = 15 WHERE castle_name = 'gefg_cas05';
+UPDATE `guild_castle` SET `castle_id` = 16 WHERE castle_name = 'payg_cas01';
+UPDATE `guild_castle` SET `castle_id` = 17 WHERE castle_name = 'payg_cas02';
+UPDATE `guild_castle` SET `castle_id` = 18 WHERE castle_name = 'payg_cas03';
+UPDATE `guild_castle` SET `castle_id` = 19 WHERE castle_name = 'payg_cas04';
+UPDATE `guild_castle` SET `castle_id` = 20 WHERE castle_name = 'payg_cas05';
+UPDATE `guild_castle` SET `castle_id` = 21 WHERE castle_name = 'arug_cas01';
+UPDATE `guild_castle` SET `castle_id` = 22 WHERE castle_name = 'arug_cas02';
+UPDATE `guild_castle` SET `castle_id` = 23 WHERE castle_name = 'arug_cas03';
+UPDATE `guild_castle` SET `castle_id` = 24 WHERE castle_name = 'arug_cas04';
+UPDATE `guild_castle` SET `castle_id` = 25 WHERE castle_name = 'arug_cas05';
+UPDATE `guild_castle` SET `castle_id` = 26 WHERE castle_name = 'schg_cas01';
+UPDATE `guild_castle` SET `castle_id` = 27 WHERE castle_name = 'schg_cas02';
+UPDATE `guild_castle` SET `castle_id` = 29 WHERE castle_name = 'schg_cas04';
+UPDATE `guild_castle` SET `castle_id` = 28 WHERE castle_name = 'schg_cas03';
+UPDATE `guild_castle` SET `castle_id` = 30 WHERE castle_name = 'schg_cas05';
+UPDATE `guild_castle` SET `castle_id` = 31 WHERE castle_name = 'nguild_prt';
+UPDATE `guild_castle` SET `castle_id` = 32 WHERE castle_name = 'nguild_alde';
+UPDATE `guild_castle` SET `castle_id` = 33 WHERE castle_name = 'nguild_gef';
+UPDATE `guild_castle` SET `castle_id` = 34 WHERE castle_name = 'nguild_pay';
+ALTER TABLE `guild_castle` ADD PRIMARY KEY (`castle_id`);
+ALTER TABLE `guild_castle` DROP COLUMN `castle_name`;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1565293394);
diff --git a/sql-files/upgrades/2019-10-05--19-01.sql b/sql-files/upgrades/2019-10-05--19-01.sql
new file mode 100644
index 00000000..165764a8
--- /dev/null
+++ b/sql-files/upgrades/2019-10-05--19-01.sql
@@ -0,0 +1,28 @@
+#1570309293
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2019-2020 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+-- Adds new total_tick column
+ALTER TABLE `sc_data` ADD COLUMN `total_tick` INT(11) NOT NULL AFTER `tick`;
+
+-- Copy current tick to total_tick so players doesn't lose their current
+-- status_changes, although those will still appear wrong until they end
+UPDATE `sc_data` SET `total_tick` = `tick`;
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1570309293);
diff --git a/sql-files/upgrades/2019-10-12--14-21.sql b/sql-files/upgrades/2019-10-12--14-21.sql
new file mode 100644
index 00000000..7da66e9b
--- /dev/null
+++ b/sql-files/upgrades/2019-10-12--14-21.sql
@@ -0,0 +1,23 @@
+#1570870260
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2019 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+ALTER TABLE `picklog` MODIFY `type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','K','Y','Z','W','Q','J','H','@','0','1','2', '3') NOT NULL DEFAULT 'P';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1570870260);
diff --git a/sql-files/upgrades/2019-11-22--23-58.sql b/sql-files/upgrades/2019-11-22--23-58.sql
new file mode 100644
index 00000000..34ffc2c7
--- /dev/null
+++ b/sql-files/upgrades/2019-11-22--23-58.sql
@@ -0,0 +1,23 @@
+#1574463539
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2019-2020 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+ALTER TABLE `ipbanlist` MODIFY `list` VARCHAR(13) NOT NULL DEFAULT '';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1574463539);
diff --git a/sql-files/upgrades/2020-01-24--01-09.sql b/sql-files/upgrades/2020-01-24--01-09.sql
new file mode 100644
index 00000000..2370b267
--- /dev/null
+++ b/sql-files/upgrades/2020-01-24--01-09.sql
@@ -0,0 +1,63 @@
+#1579817630
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2013-2020 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+CREATE TABLE IF NOT EXISTS `npc_expanded_barter_data` (
+ `name` VARCHAR(24) NOT NULL DEFAULT '',
+ `itemId` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `amount` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `zeny` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyId1` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount1` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine1` INT(11) NOT NULL DEFAULT '0',
+ `currencyId2` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount2` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine2` INT(11) NOT NULL DEFAULT '0',
+ `currencyId3` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount3` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine3` INT(11) NOT NULL DEFAULT '0',
+ `currencyId4` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount4` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine4` INT(11) NOT NULL DEFAULT '0',
+ `currencyId5` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount5` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine5` INT(11) NOT NULL DEFAULT '0',
+ `currencyId6` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount6` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine6` INT(11) NOT NULL DEFAULT '0',
+ `currencyId7` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount7` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine7` INT(11) NOT NULL DEFAULT '0',
+ `currencyId8` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount8` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine8` INT(11) NOT NULL DEFAULT '0',
+ `currencyId9` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount9` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine9` INT(11) NOT NULL DEFAULT '0',
+ `currencyId10` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyAmount10` INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ `currencyRefine10` INT(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`name`, `itemid`, `zeny`,
+ `currencyId1`, `currencyAmount1`, `currencyRefine1`,
+ `currencyId2`, `currencyAmount2`, `currencyRefine2`,
+ `currencyId3`, `currencyAmount3`, `currencyRefine3`,
+ `currencyId4`, `currencyAmount4`, `currencyRefine4`
+)
+) ENGINE=MyISAM;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1579817630);
diff --git a/sql-files/upgrades/2020-03-22--01-56.sql b/sql-files/upgrades/2020-03-22--01-56.sql
new file mode 100644
index 00000000..58f090a6
--- /dev/null
+++ b/sql-files/upgrades/2020-03-22--01-56.sql
@@ -0,0 +1,23 @@
+#1584838560
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2019-2020 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+ALTER TABLE `ipbanlist` MODIFY `list` VARCHAR(39) NOT NULL DEFAULT '';
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1584838560);
diff --git a/sql-files/upgrades/2020-03-22--03-09.sql b/sql-files/upgrades/2020-03-22--03-09.sql
new file mode 100644
index 00000000..dbdf65c5
--- /dev/null
+++ b/sql-files/upgrades/2020-03-22--03-09.sql
@@ -0,0 +1,24 @@
+#1584842940
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2019-2020 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `login` ALTER `userid` DROP DEFAULT;
+ALTER TABLE `login` DROP INDEX `name`;
+ALTER TABLE `login` ADD CONSTRAINT `name` UNIQUE (`userid`);
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1584842940);
diff --git a/sql-files/upgrades/2020-05-01--04-44.sql b/sql-files/upgrades/2020-05-01--04-44.sql
new file mode 100644
index 00000000..6cb5a30e
--- /dev/null
+++ b/sql-files/upgrades/2020-05-01--04-44.sql
@@ -0,0 +1,25 @@
+#1588301040
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2019-2020 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `acc_reg_str_db` MODIFY `value` VARCHAR(255) NOT NULL DEFAULT '0';
+ALTER TABLE `char_reg_str_db` MODIFY `value` VARCHAR(255) NOT NULL DEFAULT '0';
+ALTER TABLE `global_acc_reg_str_db` MODIFY `value` VARCHAR(255) NOT NULL DEFAULT '0';
+
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1588301040);
diff --git a/sql-files/upgrades/2020-05-10--23-11.sql b/sql-files/upgrades/2020-05-10--23-11.sql
new file mode 100644
index 00000000..9f2755e7
--- /dev/null
+++ b/sql-files/upgrades/2020-05-10--23-11.sql
@@ -0,0 +1,43 @@
+#1589145060
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2019-2020 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+-- Add separate tables for global integer and string variables.
+CREATE TABLE IF NOT EXISTS `map_reg_num_db` (
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT UNSIGNED NOT NULL DEFAULT '0',
+ `value` INT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`key`, `index`)
+) ENGINE=MyISAM;
+CREATE TABLE IF NOT EXISTS `map_reg_str_db` (
+ `key` VARCHAR(32) BINARY NOT NULL DEFAULT '',
+ `index` INT UNSIGNED NOT NULL DEFAULT '0',
+ `value` VARCHAR(255) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`key`, `index`)
+) ENGINE=MyISAM;
+
+-- Copy data from mapreg table to new map_reg_*_db tables.
+INSERT INTO `map_reg_num_db` (`key`, `index`, `value`) SELECT `varname`, `index`, CAST(`value` AS SIGNED) FROM `mapreg` WHERE NOT RIGHT(`varname`, 1)='$';
+INSERT INTO `map_reg_str_db` (`key`, `index`, `value`) SELECT `varname`, `index`, `value` FROM `mapreg` WHERE RIGHT(`varname`, 1)='$';
+
+-- Remove mapreg table.
+DROP TABLE IF EXISTS `mapreg`;
+
+-- Add update timestamp.
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1589145060);
diff --git a/sql-files/upgrades/index.txt b/sql-files/upgrades/index.txt
new file mode 100644
index 00000000..fb889c28
--- /dev/null
+++ b/sql-files/upgrades/index.txt
@@ -0,0 +1,66 @@
+2013-02-14--16-15.sql
+2013-02-15--18-06.sql
+2013-03-05--01-05.sql
+2013-03-06--00-00.sql
+2013-03-09--01-56.sql
+2013-03-27--18-35.sql
+2013-04-16--01-24.sql
+2013-04-16--02-15.sql
+2013-10-09--21-38.sql
+2013-10-10--16-36.sql
+2013-10-27--16-47.sql
+2013-10-30--19-53.sql
+2013-10-30--21-12.sql
+2013-10-31--07-49.sql
+2013-11-09--00-03.sql
+2013-11-15--00-06.sql
+2013-11-15--19-57.sql
+2013-11-16--07-49.sql
+2013-11-18--08-23.sql
+2013-12-24--00-15.sql
+2014-01-04--16-47.sql
+2014-01-06--17-22.sql
+2014-02-19--17-57.sql
+2014-03-25--23-57.sql
+2014-04-07--22-04.sql
+2014-04-26--10-00.sql
+2014-05-17--00-06.sql
+2014-09-01--16-53.sql
+2014-11-03--00-45.sql
+2015-07-02--18-14.sql
+2015-07-08--13-08.sql
+2015-08-27--20-42.sql
+2015-12-16--12-57.sql
+2015-12-17--15-58.sql
+2016-03-10--22-18.sql
+2016-07-08--02-42.sql
+2016-07-08--02-51.sql
+2016-10-03--20-27.sql
+2016-10-26--10-29.sql
+2017-03-02--11-40.sql
+2017-03-05--08-09.sql
+2017-03-15--14-29.sql
+2017-06-04--15-04.sql
+2017-06-04--15-05.sql
+2017-11-04--10-39.sql
+2018-02-26--15-57.sql
+2018-03-10--04-06.sql
+2018-06-03--00-10.sql
+2018-06-03--17-16.sql
+2018-06-05--12-02.sql
+2018-07-24--03-23.sql
+2018-09-01--05-22.sql
+2018-12-14--01-02.sql
+2018-12-29--07-51.sql
+2019-04-08--21-52.sql
+2019-04-25--02-12.sql
+2019-05-09--18-07.sql
+2019-08-08--19-43.sql
+2019-10-05--19-01.sql
+2019-10-12--14-21.sql
+2019-11-22--23-58.sql
+2020-01-24--01-09.sql
+2020-03-22--01-56.sql
+2020-03-22--03-09.sql
+2020-05-01--04-44.sql
+2020-05-10--23-11.sql
diff --git a/test_char b/test_char
new file mode 100755
index 00000000..3e043874
--- /dev/null
+++ b/test_char
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+export dir=../tools/herculeswrapper
+${dir}/char.sh
diff --git a/test_login b/test_login
new file mode 100755
index 00000000..14cfe154
--- /dev/null
+++ b/test_login
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+export dir=../tools/herculeswrapper
+${dir}/login.sh
diff --git a/test_map b/test_map
new file mode 100755
index 00000000..0b20f782
--- /dev/null
+++ b/test_map
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+export dir=../tools/herculeswrapper
+${dir}/map.sh